diff --git a/.gitattributes b/.gitattributes
index 1c344d3c035..0acd2cdd533 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -74,3 +74,8 @@
# auto-generated bazel lock file
/ruby/extractor/cargo-bazel-lock.json linguist-generated=true
/ruby/extractor/cargo-bazel-lock.json -merge
+
+# auto-generated files for the C# build
+/csharp/paket.lock linguist-generated=true
+# needs eol=crlf, as `paket` touches this file and saves it as crlf
+/csharp/.paket/Paket.Restore.targets linguist-generated=true eol=crlf
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index d34d40dd8fa..fbe5338e4ca 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -56,7 +56,9 @@ jobs:
# uses a compiled language
- run: |
- dotnet build csharp
+ cd csharp
+ dotnet tool restore
+ dotnet build .
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@main
diff --git a/.github/workflows/csharp-qltest.yml b/.github/workflows/csharp-qltest.yml
index 557354e96de..2075e10a77a 100644
--- a/.github/workflows/csharp-qltest.yml
+++ b/.github/workflows/csharp-qltest.yml
@@ -81,10 +81,11 @@ jobs:
dotnet-version: 8.0.101
- name: Extractor unit tests
run: |
+ dotnet tool restore
dotnet test -p:RuntimeFrameworkVersion=8.0.1 extractor/Semmle.Util.Tests
dotnet test -p:RuntimeFrameworkVersion=8.0.1 extractor/Semmle.Extraction.Tests
dotnet test -p:RuntimeFrameworkVersion=8.0.1 autobuilder/Semmle.Autobuild.CSharp.Tests
- dotnet test -p:RuntimeFrameworkVersion=8.0.1 "${{ github.workspace }}/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests"
+ dotnet test -p:RuntimeFrameworkVersion=8.0.1 autobuilder/Semmle.Autobuild.Cpp.Tests
shell: bash
stubgentest:
runs-on: ubuntu-latest
diff --git a/.github/workflows/go-tests-other-os.yml b/.github/workflows/go-tests-other-os.yml
index ded53f868b7..9915b0869db 100644
--- a/.github/workflows/go-tests-other-os.yml
+++ b/.github/workflows/go-tests-other-os.yml
@@ -7,8 +7,6 @@ on:
- .github/workflows/go-tests-other-os.yml
- .github/actions/**
- codeql-workspace.yml
-env:
- GO_VERSION: '~1.22.0'
permissions:
contents: read
@@ -18,72 +16,17 @@ jobs:
name: Test MacOS
runs-on: macos-latest
steps:
- - name: Set up Go ${{ env.GO_VERSION }}
- uses: actions/setup-go@v5
- with:
- go-version: ${{ env.GO_VERSION }}
- cache: false
- id: go
-
- name: Check out code
uses: actions/checkout@v4
-
- - name: Set up CodeQL CLI
- uses: ./.github/actions/fetch-codeql
-
- - name: Enable problem matchers in repository
- shell: bash
- run: 'find .github/problem-matchers -name \*.json -exec echo "::add-matcher::{}" \;'
-
- - name: Build
- run: |
- cd go
- make
-
- - name: Cache compilation cache
- id: query-cache
- uses: ./.github/actions/cache-query-compilation
- with:
- key: go-qltest
- - name: Test
- run: |
- cd go
- make test cache="${{ steps.query-cache.outputs.cache-dir }}"
+ - name: Run tests
+ uses: ./go/actions/test
test-win:
if: github.repository_owner == 'github'
name: Test Windows
runs-on: windows-latest-xl
steps:
- - name: Set up Go ${{ env.GO_VERSION }}
- uses: actions/setup-go@v5
- with:
- go-version: ${{ env.GO_VERSION }}
- cache: false
- id: go
-
- name: Check out code
uses: actions/checkout@v4
-
- - name: Set up CodeQL CLI
- uses: ./.github/actions/fetch-codeql
-
- - name: Enable problem matchers in repository
- shell: bash
- run: 'find .github/problem-matchers -name \*.json -exec echo "::add-matcher::{}" \;'
-
- - name: Build
- run: |
- cd go
- make
-
- - name: Cache compilation cache
- id: query-cache
- uses: ./.github/actions/cache-query-compilation
- with:
- key: go-qltest
-
- - name: Test
- run: |
- cd go
- make test cache="${{ steps.query-cache.outputs.cache-dir }}"
+ - name: Run tests
+ uses: ./go/actions/test
diff --git a/.github/workflows/go-tests.yml b/.github/workflows/go-tests.yml
index 6d9cac5dae9..63e2b7c4974 100644
--- a/.github/workflows/go-tests.yml
+++ b/.github/workflows/go-tests.yml
@@ -16,9 +16,6 @@ on:
- .github/actions/**
- codeql-workspace.yml
-env:
- GO_VERSION: '~1.22.0'
-
permissions:
contents: read
@@ -28,51 +25,9 @@ jobs:
name: Test Linux (Ubuntu)
runs-on: ubuntu-latest-xl
steps:
- - name: Set up Go ${{ env.GO_VERSION }}
- uses: actions/setup-go@v5
- with:
- go-version: ${{ env.GO_VERSION }}
- cache: false
- id: go
-
- name: Check out code
uses: actions/checkout@v4
-
- - name: Set up CodeQL CLI
- uses: ./.github/actions/fetch-codeql
-
- - name: Enable problem matchers in repository
- shell: bash
- run: 'find .github/problem-matchers -name \*.json -exec echo "::add-matcher::{}" \;'
-
- - name: Build
- run: |
- cd go
- make
-
- - name: Check that all Go code is autoformatted
- run: |
- cd go
- make check-formatting
-
- - name: Compile qhelp files to markdown
- run: |
- cd go
- env QHELP_OUT_DIR=qhelp-out make qhelp-to-markdown
-
- - name: Upload qhelp markdown
- uses: actions/upload-artifact@v3
+ - name: Run tests
+ uses: ./go/actions/test
with:
- name: qhelp-markdown
- path: go/qhelp-out/**/*.md
-
- - name: Cache compilation cache
- id: query-cache
- uses: ./.github/actions/cache-query-compilation
- with:
- key: go-qltest
-
- - name: Test
- run: |
- cd go
- make test cache="${{ steps.query-cache.outputs.cache-dir }}"
+ run-code-checks: true
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 05104490468..62ac0d95779 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -29,12 +29,13 @@ repos:
entry: bazel run //misc/bazel:buildifier
pass_filenames: false
- - id: go-gen
- name: Check checked in generated files in go
- files: ^go/.*
- language: system
- entry: bazel run //go:gen
- pass_filenames: false
+# DISABLED: can be enabled by copying this config and installing `pre-commit` with `--config` on the copy
+# - id: go-gen
+# name: Check checked in generated files in go
+# files: ^go/.*
+# language: system
+# entry: bazel run //go:gen
+# pass_filenames: false
- id: codeql-format
name: Fix QL file formatting
diff --git a/CODEOWNERS b/CODEOWNERS
index d8539332467..992acbda4ff 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -1,6 +1,7 @@
/cpp/ @github/codeql-c-analysis
-/cpp/autobuilder/ @github/codeql-c-extractor
/csharp/ @github/codeql-csharp
+/csharp/autobuilder/Semmle.Autobuild.Cpp @github/codeql-c-extractor
+/csharp/autobuilder/Semmle.Autobuild.Cpp.Tests @github/codeql-c-extractor
/go/ @github/codeql-go
/java/ @github/codeql-java
/javascript/ @github/codeql-javascript
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 5324ac8f301..a0efca6dec9 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -4,6 +4,8 @@ We welcome contributions to our CodeQL libraries and queries. Got an idea for a
There is lots of useful documentation to help you write queries, ranging from information about query file structure to tutorials for specific target languages. For more information on the documentation available, see [CodeQL queries](https://codeql.github.com/docs/writing-codeql-queries/codeql-queries) on [codeql.github.com](https://codeql.github.com).
+Note that the CodeQL for Visual Studio Code documentation has been migrated to https://docs.github.com/en/code-security/codeql-for-vs-code/, but you can still contribute to it via a different repository. For more information, see [Contributing to GitHub Docs documentation](https://docs.github.com/en/contributing)."
+
## Change notes
Any nontrivial user-visible change to a query pack or library pack should have a change note. For details on how to add a change note for your change, see [this guide](docs/change-notes.md).
@@ -43,7 +45,7 @@ If you have an idea for a query that you would like to share with other CodeQL u
3. **Formatting**
- - The queries and libraries must be autoformatted, for example using the "Format Document" command in [CodeQL for Visual Studio Code](https://codeql.github.com/docs/codeql-for-visual-studio-code/about-codeql-for-visual-studio-code).
+ - The queries and libraries must be autoformatted, for example using the "Format Document" command in [CodeQL for Visual Studio Code](https://docs.github.com/en/code-security/codeql-for-vs-code/).
If you prefer, you can either:
1. install the [pre-commit framework](https://pre-commit.com/) and install the configured hooks on this repo via `pre-commit install`, or
diff --git a/README.md b/README.md
index 57ecf54486c..99433b8ca49 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@ This open source repository contains the standard CodeQL libraries and queries t
## How do I learn CodeQL and run queries?
-There is [extensive documentation](https://codeql.github.com/docs/) on getting started with writing CodeQL using the [CodeQL extension for Visual Studio Code](https://codeql.github.com/docs/codeql-for-visual-studio-code/) and the [CodeQL CLI](https://codeql.github.com/docs/codeql-cli/).
+There is extensive documentation about the [CodeQL language](https://codeql.github.com/docs/), writing CodeQL using the [CodeQL extension for Visual Studio Code](https://docs.github.com/en/code-security/codeql-for-vs-code/) and using the [CodeQL CLI](https://docs.github.com/en/code-security/codeql-cli).
## Contributing
diff --git a/cpp/autobuilder/.gitignore b/cpp/autobuilder/.gitignore
deleted file mode 100644
index f81ecc73dff..00000000000
--- a/cpp/autobuilder/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-obj/
-TestResults/
-*.manifest
-*.pdb
-*.suo
-*.mdb
-*.vsmdi
-csharp.log
-**/bin/Debug
-**/bin/Release
-*.tlog
-.vs
-*.user
\ No newline at end of file
diff --git a/cpp/autobuilder/README.md b/cpp/autobuilder/README.md
new file mode 100644
index 00000000000..a6f213e2bd5
--- /dev/null
+++ b/cpp/autobuilder/README.md
@@ -0,0 +1 @@
+The Windows autobuilder that used to live in this directory moved to `csharp/autobuilder/Semmle.Autobuild.Cpp`.
\ No newline at end of file
diff --git a/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/Semmle.Autobuild.Cpp.Tests.csproj b/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/Semmle.Autobuild.Cpp.Tests.csproj
deleted file mode 100644
index 1fe010dc3fc..00000000000
--- a/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/Semmle.Autobuild.Cpp.Tests.csproj
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
- Exe
- net8.0
- false
- win-x64;linux-x64;osx-x64
- enable
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers
-
-
-
-
-
-
-
-
-
diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md
index bcb7d30a2ed..63aa64f6f77 100644
--- a/cpp/ql/lib/CHANGELOG.md
+++ b/cpp/ql/lib/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.13.1
+
+No user-facing changes.
+
## 0.13.0
### Breaking Changes
diff --git a/cpp/ql/lib/change-notes/released/0.13.1.md b/cpp/ql/lib/change-notes/released/0.13.1.md
new file mode 100644
index 00000000000..ec58ef441c1
--- /dev/null
+++ b/cpp/ql/lib/change-notes/released/0.13.1.md
@@ -0,0 +1,3 @@
+## 0.13.1
+
+No user-facing changes.
diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml
index 5a1b274ee58..92a33894b0b 100644
--- a/cpp/ql/lib/codeql-pack.release.yml
+++ b/cpp/ql/lib/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 0.13.0
+lastReleaseVersion: 0.13.1
diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml
index b87cf42fb6f..f0ef22f89d6 100644
--- a/cpp/ql/lib/qlpack.yml
+++ b/cpp/ql/lib/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/cpp-all
-version: 0.13.1-dev
+version: 0.13.2-dev
groups: cpp
dbscheme: semmlecode.cpp.dbscheme
extractor: cpp
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll
index 924f68ef807..30511ba1285 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll
@@ -9,6 +9,7 @@ private import semmle.code.cpp.models.interfaces.PartialFlow as PartialFlow
private import semmle.code.cpp.models.interfaces.FunctionInputsAndOutputs as FIO
private import semmle.code.cpp.ir.internal.IRCppLanguage
private import semmle.code.cpp.ir.dataflow.internal.ModelUtil
+private import semmle.code.cpp.ir.implementation.raw.internal.TranslatedInitialization
private import DataFlowPrivate
import SsaInternalsCommon
@@ -104,8 +105,8 @@ predicate hasRawIndirectInstruction(Instruction instr, int indirectionIndex) {
cached
private newtype TDefImpl =
TDefAddressImpl(BaseIRVariable v) or
- TDirectDefImpl(BaseSourceVariableInstruction base, Operand address, int indirectionIndex) {
- isDef(_, _, address, base, _, indirectionIndex)
+ TDirectDefImpl(Operand address, int indirectionIndex) {
+ isDef(_, _, address, _, _, indirectionIndex)
} or
TGlobalDefImpl(GlobalLikeVariable v, IRFunction f, int indirectionIndex) {
// Represents the initial "definition" of a global variable when entering
@@ -115,8 +116,8 @@ private newtype TDefImpl =
cached
private newtype TUseImpl =
- TDirectUseImpl(BaseSourceVariableInstruction base, Operand operand, int indirectionIndex) {
- isUse(_, operand, base, _, indirectionIndex) and
+ TDirectUseImpl(Operand operand, int indirectionIndex) {
+ isUse(_, operand, _, _, indirectionIndex) and
not isDef(true, _, operand, _, _, _)
} or
TGlobalUse(GlobalLikeVariable v, IRFunction f, int indirectionIndex) {
@@ -210,19 +211,11 @@ abstract class DefImpl extends TDefImpl {
*/
abstract int getIndirection();
- /**
- * Gets the instruction that computes the base of this definition or use.
- * This is always a `VariableAddressInstruction` or an `CallInstruction`.
- */
- abstract BaseSourceVariableInstruction getBase();
-
/**
* Gets the base source variable (i.e., the variable without
* any indirection) of this definition or use.
*/
- final BaseSourceVariable getBaseSourceVariable() {
- this.getBase().getBaseSourceVariable() = result
- }
+ abstract BaseSourceVariable getBaseSourceVariable();
/** Gets the variable that is defined or used. */
SourceVariable getSourceVariable() {
@@ -282,19 +275,11 @@ abstract class UseImpl extends TUseImpl {
/** Gets the indirection index of this use. */
final int getIndirectionIndex() { result = indirectionIndex }
- /**
- * Gets the instruction that computes the base of this definition or use.
- * This is always a `VariableAddressInstruction` or an `CallInstruction`.
- */
- abstract BaseSourceVariableInstruction getBase();
-
/**
* Gets the base source variable (i.e., the variable without
* any indirection) of this definition or use.
*/
- final BaseSourceVariable getBaseSourceVariable() {
- this.getBase().getBaseSourceVariable() = result
- }
+ abstract BaseSourceVariable getBaseSourceVariable();
/** Gets the variable that is defined or used. */
SourceVariable getSourceVariable() {
@@ -329,6 +314,17 @@ private predicate sourceVariableHasBaseAndIndex(SourceVariable v, BaseSourceVari
v.getIndirection() = ind
}
+/**
+ * Gets the instruction that computes the address that's used to
+ * initialize `v`.
+ */
+private Instruction getInitializationTargetAddress(IRVariable v) {
+ exists(TranslatedVariableInitialization init |
+ init.getIRVariable() = v and
+ result = init.getTargetAddress()
+ )
+}
+
/** An initial definition of an `IRVariable`'s address. */
private class DefAddressImpl extends DefImpl, TDefAddressImpl {
BaseIRVariable v;
@@ -347,8 +343,15 @@ private class DefAddressImpl extends DefImpl, TDefAddressImpl {
final override Node0Impl getValue() { none() }
final override predicate hasIndexInBlock(IRBlock block, int index) {
- block = v.getIRVariable().getEnclosingIRFunction().getEntryBlock() and
- index = 0
+ exists(IRVariable var | var = v.getIRVariable() |
+ block.getInstruction(index) = getInitializationTargetAddress(var)
+ or
+ // If there is no translatated element that does initialization of the
+ // variable we place the SSA definition at the entry block of the function.
+ not exists(getInitializationTargetAddress(var)) and
+ block = var.getEnclosingIRFunction().getEntryBlock() and
+ index = 0
+ )
}
override Cpp::Location getLocation() { result = v.getIRVariable().getLocation() }
@@ -358,14 +361,13 @@ private class DefAddressImpl extends DefImpl, TDefAddressImpl {
result.getIndirection() = 0
}
- final override BaseSourceVariableInstruction getBase() { none() }
+ final override BaseSourceVariable getBaseSourceVariable() { result = v }
}
private class DirectDef extends DefImpl, TDirectDefImpl {
Operand address;
- BaseSourceVariableInstruction base;
- DirectDef() { this = TDirectDefImpl(base, address, indirectionIndex) }
+ DirectDef() { this = TDirectDefImpl(address, indirectionIndex) }
override Cpp::Location getLocation() { result = this.getAddressOperand().getUse().getLocation() }
@@ -377,30 +379,36 @@ private class DirectDef extends DefImpl, TDirectDefImpl {
override Operand getAddressOperand() { result = address }
- override BaseSourceVariableInstruction getBase() { result = base }
+ private BaseSourceVariableInstruction getBase() {
+ isDef(_, _, address, result, _, indirectionIndex)
+ }
- override int getIndirection() { isDef(_, _, address, base, result, indirectionIndex) }
+ override BaseSourceVariable getBaseSourceVariable() {
+ result = this.getBase().getBaseSourceVariable()
+ }
- override Node0Impl getValue() { isDef(_, result, address, base, _, _) }
+ override int getIndirection() { isDef(_, _, address, _, result, indirectionIndex) }
- override predicate isCertain() { isDef(true, _, address, base, _, indirectionIndex) }
+ override Node0Impl getValue() { isDef(_, result, address, _, _, _) }
+
+ override predicate isCertain() { isDef(true, _, address, _, _, indirectionIndex) }
}
private class DirectUseImpl extends UseImpl, TDirectUseImpl {
Operand operand;
- BaseSourceVariableInstruction base;
- DirectUseImpl() { this = TDirectUseImpl(base, operand, indirectionIndex) }
+ DirectUseImpl() { this = TDirectUseImpl(operand, indirectionIndex) }
override string toString() { result = "Use of " + this.getSourceVariable() }
final override predicate hasIndexInBlock(IRBlock block, int index) {
// See the comment in `ssa0`'s `OperandBasedUse` for an explanation of this
// predicate's implementation.
- if base.getAst() = any(Cpp::PostfixCrementOperation c).getOperand()
+ if this.getBase().getAst() = any(Cpp::PostfixCrementOperation c).getOperand()
then
- exists(Operand op, int indirection |
+ exists(Operand op, int indirection, Instruction base |
indirection = this.getIndirection() and
+ base = this.getBase() and
op =
min(Operand cand, int i |
isUse(_, cand, base, indirection, indirectionIndex) and
@@ -413,15 +421,19 @@ private class DirectUseImpl extends UseImpl, TDirectUseImpl {
else operand.getUse() = block.getInstruction(index)
}
- final override BaseSourceVariableInstruction getBase() { result = base }
+ private BaseSourceVariableInstruction getBase() { isUse(_, operand, result, _, indirectionIndex) }
+
+ override BaseSourceVariable getBaseSourceVariable() {
+ result = this.getBase().getBaseSourceVariable()
+ }
final Operand getOperand() { result = operand }
final override Cpp::Location getLocation() { result = operand.getLocation() }
- override int getIndirection() { isUse(_, operand, base, result, indirectionIndex) }
+ override int getIndirection() { isUse(_, operand, _, result, indirectionIndex) }
- override predicate isCertain() { isUse(true, operand, base, _, indirectionIndex) }
+ override predicate isCertain() { isUse(true, operand, _, _, indirectionIndex) }
override Node getNode() { nodeHasOperand(result, operand, indirectionIndex) }
}
@@ -480,13 +492,7 @@ class FinalParameterUse extends UseImpl, TFinalParameterUse {
result instanceof UnknownDefaultLocation
}
- override BaseSourceVariableInstruction getBase() {
- exists(InitializeParameterInstruction init |
- init.getParameter() = p and
- // This is always a `VariableAddressInstruction`
- result = init.getAnOperand().getDef()
- )
- }
+ override BaseIRVariable getBaseSourceVariable() { result.getIRVariable().getAst() = p }
}
/**
@@ -572,8 +578,8 @@ class GlobalUse extends UseImpl, TGlobalUse {
)
}
- override SourceVariable getSourceVariable() {
- sourceVariableIsGlobal(result, global, f, this.getIndirection())
+ override BaseSourceVariable getBaseSourceVariable() {
+ baseSourceVariableIsGlobal(result, global, f)
}
final override Cpp::Location getLocation() { result = f.getLocation() }
@@ -590,8 +596,6 @@ class GlobalUse extends UseImpl, TGlobalUse {
Type getUnderlyingType() { result = global.getUnderlyingType() }
override predicate isCertain() { any() }
-
- override BaseSourceVariableInstruction getBase() { none() }
}
/**
@@ -621,8 +625,8 @@ class GlobalDefImpl extends DefImpl, TGlobalDefImpl {
}
/** Gets the global variable associated with this definition. */
- override SourceVariable getSourceVariable() {
- sourceVariableIsGlobal(result, global, f, this.getIndirection())
+ override BaseSourceVariable getBaseSourceVariable() {
+ baseSourceVariableIsGlobal(result, global, f)
}
override int getIndirection() { result = indirectionIndex }
@@ -645,8 +649,6 @@ class GlobalDefImpl extends DefImpl, TGlobalDefImpl {
override string toString() { result = "Def of " + this.getSourceVariable() }
override Location getLocation() { result = f.getLocation() }
-
- override BaseSourceVariableInstruction getBase() { none() }
}
/**
@@ -959,11 +961,10 @@ predicate fromPhiNode(SsaPhiNode nodeFrom, Node nodeTo) {
)
}
-private predicate sourceVariableIsGlobal(
- SourceVariable sv, GlobalLikeVariable global, IRFunction func, int indirectionIndex
+private predicate baseSourceVariableIsGlobal(
+ BaseIRVariable base, GlobalLikeVariable global, IRFunction func
) {
- exists(IRVariable irVar, BaseIRVariable base |
- sourceVariableHasBaseAndIndex(sv, base, indirectionIndex) and
+ exists(IRVariable irVar |
irVar = base.getIRVariable() and
irVar.getEnclosingIRFunction() = func and
global = irVar.getAst() and
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll
index 7024911a420..4d2b1a95d31 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll
@@ -830,6 +830,12 @@ newtype TTranslatedElement =
not ignoreExpr(dc)
)
} or
+ // The set of destructors to invoke after a handler for a `try` statement. These
+ // need to be special cased because the destructors need to run following an
+ // `ExceptionEdge`, but not following a `GotoEdge` edge.
+ TTranslatedDestructorsAfterHandler(Handler handler) {
+ exists(handler.getAnImplicitDestructorCall())
+ } or
// A precise side effect of an argument to a `Call`
TTranslatedArgumentExprSideEffect(Call call, Expr expr, int n, SideEffectOpcode opcode) {
not ignoreExpr(expr) and
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll
index a43595b08e0..ef7251e8e8a 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll
@@ -1844,9 +1844,6 @@ class TranslatedAssignExpr extends TranslatedNonConstantExpr {
child = this.getRightOperand() and
result = this.getLeftOperand().getFirstInstruction(kind)
or
- child = this.getRightOperand() and
- result = this.getLeftOperand().getFirstInstruction(kind)
- or
kind instanceof GotoEdge and
child = this.getLeftOperand() and
result = this.getInstruction(AssignmentStoreTag())
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll
index 3f77a2b0b45..ad17722477f 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll
@@ -777,6 +777,72 @@ abstract class TranslatedHandler extends TranslatedStmt {
TranslatedStmt getBlock() { result = getTranslatedStmt(stmt.getBlock()) }
}
+/**
+ * The IR translation of the destructor calls of the parent `TranslatedCatchByTypeHandler`.
+ *
+ * This object does not itself generate the destructor calls. Instead, its
+ * children provide the actual calls.
+ */
+class TranslatedDestructorsAfterHandler extends TranslatedElement,
+ TTranslatedDestructorsAfterHandler
+{
+ Handler handler;
+
+ TranslatedDestructorsAfterHandler() { this = TTranslatedDestructorsAfterHandler(handler) }
+
+ override string toString() { result = "Destructor calls after handler: " + handler }
+
+ private TranslatedCall getTranslatedImplicitDestructorCall(int id) {
+ result.getExpr() = handler.getImplicitDestructorCall(id)
+ }
+
+ override Instruction getFirstInstruction(EdgeKind kind) {
+ result = this.getChild(0).getFirstInstruction(kind)
+ }
+
+ override Handler getAst() { result = handler }
+
+ override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() }
+
+ override TranslatedElement getChild(int id) {
+ result = this.getTranslatedImplicitDestructorCall(id)
+ }
+
+ override predicate handlesDestructorsExplicitly() { any() }
+
+ override Declaration getFunction() { result = handler.getEnclosingFunction() }
+
+ override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) {
+ exists(int id | child = this.getChild(id) |
+ // Transition to the next child, if any.
+ result = this.getChild(id + 1).getFirstInstruction(kind)
+ or
+ // And otherwise go to the next handler, if any.
+ not exists(this.getChild(id + 1)) and
+ result =
+ getTranslatedStmt(handler)
+ .getParent()
+ .(TranslatedTryStmt)
+ .getNextHandler(getTranslatedStmt(handler), kind)
+ )
+ }
+
+ override TranslatedElement getLastChild() {
+ result =
+ this.getTranslatedImplicitDestructorCall(max(int id |
+ exists(handler.getImplicitDestructorCall(id))
+ ))
+ }
+
+ override Instruction getALastInstructionInternal() {
+ result = this.getLastChild().getALastInstruction()
+ }
+
+ override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
+ none()
+ }
+}
+
/**
* The IR translation of a C++ `catch` block that catches an exception with a
* specific type (e.g. `catch (const std::exception&)`).
@@ -790,10 +856,14 @@ class TranslatedCatchByTypeHandler extends TranslatedHandler {
resultType = getVoidType()
}
+ override predicate handlesDestructorsExplicitly() { any() }
+
override TranslatedElement getChildInternal(int id) {
result = super.getChildInternal(id)
or
id = 0 and result = this.getParameter()
+ or
+ id = 1 and result = this.getDestructors()
}
override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) {
@@ -810,7 +880,9 @@ class TranslatedCatchByTypeHandler extends TranslatedHandler {
result = this.getParameter().getFirstInstruction(kind)
or
kind instanceof ExceptionEdge and
- result = this.getParent().(TranslatedTryStmt).getNextHandler(this, any(GotoEdge edge))
+ if exists(this.getDestructors())
+ then result = this.getDestructors().getFirstInstruction(any(GotoEdge edge))
+ else result = this.getParent().(TranslatedTryStmt).getNextHandler(this, any(GotoEdge edge))
)
}
@@ -822,6 +894,8 @@ class TranslatedCatchByTypeHandler extends TranslatedHandler {
private TranslatedParameter getParameter() {
result = getTranslatedParameter(stmt.getParameter())
}
+
+ private TranslatedDestructorsAfterHandler getDestructors() { result.getAst() = stmt }
}
/**
@@ -842,9 +916,7 @@ class TranslatedCatchAnyHandler extends TranslatedHandler {
}
}
-class TranslatedIfStmt extends TranslatedStmt, ConditionContext {
- override IfStmt stmt;
-
+abstract class TranslatedIfLikeStmt extends TranslatedStmt, ConditionContext {
override Instruction getFirstInstruction(EdgeKind kind) {
if this.hasInitialization()
then result = this.getInitialization().getFirstInstruction(kind)
@@ -857,6 +929,8 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext {
override TranslatedElement getLastChild() { result = this.getElse() or result = this.getThen() }
+ override predicate handlesDestructorsExplicitly() { any() }
+
override TranslatedElement getChildInternal(int id) {
id = 0 and result = this.getInitialization()
or
@@ -867,25 +941,21 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext {
id = 3 and result = this.getElse()
}
- private predicate hasInitialization() { exists(stmt.getInitialization()) }
+ abstract predicate hasInitialization();
- private TranslatedStmt getInitialization() {
- result = getTranslatedStmt(stmt.getInitialization())
- }
+ abstract TranslatedStmt getInitialization();
- private TranslatedCondition getCondition() {
- result = getTranslatedCondition(stmt.getCondition().getFullyConverted())
- }
+ abstract TranslatedCondition getCondition();
private Instruction getFirstConditionInstruction(EdgeKind kind) {
result = this.getCondition().getFirstInstruction(kind)
}
- private TranslatedStmt getThen() { result = getTranslatedStmt(stmt.getThen()) }
+ abstract TranslatedStmt getThen();
- private TranslatedStmt getElse() { result = getTranslatedStmt(stmt.getElse()) }
+ abstract TranslatedStmt getElse();
- private predicate hasElse() { exists(stmt.getElse()) }
+ abstract predicate hasElse();
override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() }
@@ -898,7 +968,11 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext {
child = this.getCondition() and
if this.hasElse()
then result = this.getElse().getFirstInstruction(kind)
- else result = this.getParent().getChildSuccessor(this, kind)
+ else (
+ if this.hasAnImplicitDestructorCall()
+ then result = this.getChild(this.getFirstDestructorCallIndex()).getFirstInstruction(kind)
+ else result = this.getParent().getChildSuccessor(this, kind)
+ )
}
override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) {
@@ -906,7 +980,24 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext {
result = this.getFirstConditionInstruction(kind)
or
(child = this.getThen() or child = this.getElse()) and
- result = this.getParent().getChildSuccessor(this, kind)
+ (
+ if this.hasAnImplicitDestructorCall()
+ then result = this.getChild(this.getFirstDestructorCallIndex()).getFirstInstruction(kind)
+ else result = this.getParent().getChildSuccessor(this, kind)
+ )
+ or
+ exists(int destructorId |
+ destructorId >= this.getFirstDestructorCallIndex() and
+ child = this.getChild(destructorId) and
+ result = this.getChild(destructorId + 1).getFirstInstruction(kind)
+ )
+ or
+ exists(int lastDestructorIndex |
+ lastDestructorIndex =
+ max(int n | exists(this.getChild(n)) and n >= this.getFirstDestructorCallIndex()) and
+ child = this.getChild(lastDestructorIndex) and
+ result = this.getParent().getChildSuccessor(this, kind)
+ )
}
override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
@@ -914,76 +1005,44 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext {
}
}
-class TranslatedConstExprIfStmt extends TranslatedStmt, ConditionContext {
- override ConstexprIfStmt stmt;
+class TranslatedIfStmt extends TranslatedIfLikeStmt {
+ override IfStmt stmt;
- override Instruction getFirstInstruction(EdgeKind kind) {
- if this.hasInitialization()
- then result = this.getInitialization().getFirstInstruction(kind)
- else result = this.getFirstConditionInstruction(kind)
- }
+ override predicate hasInitialization() { exists(stmt.getInitialization()) }
- override TranslatedElement getChildInternal(int id) {
- id = 0 and result = this.getInitialization()
- or
- id = 1 and result = this.getCondition()
- or
- id = 2 and result = this.getThen()
- or
- id = 3 and result = this.getElse()
- }
-
- private predicate hasInitialization() { exists(stmt.getInitialization()) }
-
- private TranslatedStmt getInitialization() {
+ override TranslatedStmt getInitialization() {
result = getTranslatedStmt(stmt.getInitialization())
}
- private TranslatedCondition getCondition() {
+ override TranslatedCondition getCondition() {
result = getTranslatedCondition(stmt.getCondition().getFullyConverted())
}
- private Instruction getFirstConditionInstruction(EdgeKind kind) {
- result = this.getCondition().getFirstInstruction(kind)
+ override TranslatedStmt getThen() { result = getTranslatedStmt(stmt.getThen()) }
+
+ override TranslatedStmt getElse() { result = getTranslatedStmt(stmt.getElse()) }
+
+ override predicate hasElse() { exists(stmt.getElse()) }
+}
+
+class TranslatedConstExprIfStmt extends TranslatedIfLikeStmt {
+ override ConstexprIfStmt stmt;
+
+ override predicate hasInitialization() { exists(stmt.getInitialization()) }
+
+ override TranslatedStmt getInitialization() {
+ result = getTranslatedStmt(stmt.getInitialization())
}
- private TranslatedStmt getThen() { result = getTranslatedStmt(stmt.getThen()) }
-
- private TranslatedStmt getElse() { result = getTranslatedStmt(stmt.getElse()) }
-
- private predicate hasElse() { exists(stmt.getElse()) }
-
- override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() }
-
- override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) {
- child = this.getCondition() and
- result = this.getThen().getFirstInstruction(kind)
+ override TranslatedCondition getCondition() {
+ result = getTranslatedCondition(stmt.getCondition().getFullyConverted())
}
- override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) {
- child = this.getCondition() and
- if this.hasElse()
- then result = this.getElse().getFirstInstruction(kind)
- else result = this.getParent().getChildSuccessor(this, kind)
- }
+ override TranslatedStmt getThen() { result = getTranslatedStmt(stmt.getThen()) }
- override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) {
- child = this.getInitialization() and
- result = this.getFirstConditionInstruction(kind)
- or
- (child = this.getThen() or child = this.getElse()) and
- result = this.getParent().getChildSuccessor(this, kind)
- }
+ override TranslatedStmt getElse() { result = getTranslatedStmt(stmt.getElse()) }
- override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
- none()
- }
-
- override Instruction getALastInstructionInternal() {
- result = this.getThen().getALastInstruction()
- or
- result = this.getElse().getALastInstruction()
- }
+ override predicate hasElse() { exists(stmt.getElse()) }
}
abstract class TranslatedLoop extends TranslatedStmt, ConditionContext {
diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md
index 52ce33161a7..9bc62270b7e 100644
--- a/cpp/ql/src/CHANGELOG.md
+++ b/cpp/ql/src/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 0.9.12
+
+### New Queries
+
+* Added a new query, `cpp/iterator-to-expired-container`, to detect the creation of iterators owned by a temporary objects that are about to be destroyed.
+
## 0.9.11
### Minor Analysis Improvements
diff --git a/cpp/ql/src/Critical/DoubleFree.qhelp b/cpp/ql/src/Critical/DoubleFree.qhelp
index 0b38858eae4..b8c817617f7 100644
--- a/cpp/ql/src/Critical/DoubleFree.qhelp
+++ b/cpp/ql/src/Critical/DoubleFree.qhelp
@@ -14,13 +14,32 @@ the program, or security vulnerabilities, by allowing an attacker to overwrite a
-Ensure that all execution paths deallocate the allocated memory at most once. If possible, reassign
-the pointer to a null value after deallocating it. This will prevent double-free vulnerabilities since
-most deallocation functions will perform a null-pointer check before attempting to deallocate the memory.
+Ensure that all execution paths deallocate the allocated memory at most once. In complex cases it may
+help to reassign a pointer to a null value after deallocating it. This will prevent double-free vulnerabilities
+since most deallocation functions will perform a null-pointer check before attempting to deallocate memory.
-
+
+
+In the following example, buff is allocated and then freed twice:
+
+
+
+Reviewing the code above, the issue can be fixed by simply deleting the additional call to
+free(buff).
+
+
+
+In the next example, task may be deleted twice, if an exception occurs inside the try
+block after the first delete:
+
+
+
+The problem can be solved by assigning a null value to the pointer after the first delete, as
+calling delete a second time on the null pointer is harmless.
+
+
diff --git a/cpp/ql/src/Critical/DoubleFree.cpp b/cpp/ql/src/Critical/DoubleFreeBad.cpp
similarity index 100%
rename from cpp/ql/src/Critical/DoubleFree.cpp
rename to cpp/ql/src/Critical/DoubleFreeBad.cpp
diff --git a/cpp/ql/src/Critical/DoubleFreeBad2.cpp b/cpp/ql/src/Critical/DoubleFreeBad2.cpp
new file mode 100644
index 00000000000..b63e100434d
--- /dev/null
+++ b/cpp/ql/src/Critical/DoubleFreeBad2.cpp
@@ -0,0 +1,16 @@
+void g() {
+ MyTask *task = nullptr;
+
+ try
+ {
+ task = new MyTask;
+
+ ...
+
+ delete task;
+
+ ...
+ } catch (...) {
+ delete task; // BAD: potential double-free
+ }
+}
diff --git a/cpp/ql/src/Critical/DoubleFreeGood.cpp b/cpp/ql/src/Critical/DoubleFreeGood.cpp
new file mode 100644
index 00000000000..024c7aea493
--- /dev/null
+++ b/cpp/ql/src/Critical/DoubleFreeGood.cpp
@@ -0,0 +1,7 @@
+int* f() {
+ int *buff = malloc(SIZE*sizeof(int));
+ do_stuff(buff);
+ free(buff); // GOOD: buff is only freed once.
+ int *new_buffer = malloc(SIZE*sizeof(int));
+ return new_buffer;
+}
diff --git a/cpp/ql/src/Critical/DoubleFreeGood2.cpp b/cpp/ql/src/Critical/DoubleFreeGood2.cpp
new file mode 100644
index 00000000000..f1abdd01688
--- /dev/null
+++ b/cpp/ql/src/Critical/DoubleFreeGood2.cpp
@@ -0,0 +1,17 @@
+void g() {
+ MyTask *task = nullptr;
+
+ try
+ {
+ task = new MyTask;
+
+ ...
+
+ delete task;
+ task = nullptr;
+
+ ...
+ } catch (...) {
+ delete task; // GOOD: harmless if task is NULL
+ }
+}
diff --git a/cpp/ql/src/Likely Bugs/Format/TooManyFormatArguments.qhelp b/cpp/ql/src/Likely Bugs/Format/TooManyFormatArguments.qhelp
index bbd64254d54..b4df60cbac7 100644
--- a/cpp/ql/src/Likely Bugs/Format/TooManyFormatArguments.qhelp
+++ b/cpp/ql/src/Likely Bugs/Format/TooManyFormatArguments.qhelp
@@ -22,10 +22,8 @@ function.
-cplusplus.com: C++ Functions.
+CERT C Coding Standard: FIO47-C. Use valid format strings.
Microsoft C Runtime Library Reference: printf, wprintf.
-
-
diff --git a/cpp/ql/src/Likely Bugs/Format/WrongNumberOfFormatArguments.qhelp b/cpp/ql/src/Likely Bugs/Format/WrongNumberOfFormatArguments.qhelp
index 66344e93f22..bb4687b2d9a 100644
--- a/cpp/ql/src/Likely Bugs/Format/WrongNumberOfFormatArguments.qhelp
+++ b/cpp/ql/src/Likely Bugs/Format/WrongNumberOfFormatArguments.qhelp
@@ -19,8 +19,8 @@ contents.
-Review the format and arguments expected by the highlighted function calls. Update either
-the format or the arguments so that the expected number of arguments are passed to the
+
Review the format and arguments expected by the highlighted function calls. Update either
+the format or the arguments so that the expected number of arguments are passed to the
function.
@@ -30,11 +30,8 @@ function.
-CERT C Coding
-Standard: FIO30-C. Exclude user input from format strings.
-cplusplus.com: C++ Functions.
+CERT C Coding Standard: FIO47-C. Use valid format strings.
Microsoft C Runtime Library Reference: printf, wprintf.
-
diff --git a/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArguments.cpp b/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArguments.cpp
deleted file mode 100644
index c3dd09c3071..00000000000
--- a/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArguments.cpp
+++ /dev/null
@@ -1,4 +0,0 @@
-int main() {
- printf("%s\n", 42); //printf will treat 42 as a char*, will most likely segfault
- return 0;
-}
diff --git a/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArguments.qhelp b/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArguments.qhelp
index 02bfd391a33..055adeb741f 100644
--- a/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArguments.qhelp
+++ b/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArguments.qhelp
@@ -4,29 +4,33 @@
Each call to the printf function or a related function should include
-the type and sequence of arguments defined by the format. If the function is passed arguments
+the type and sequence of arguments defined by the format. If the function is passed arguments
of a different type or in a different sequence then the arguments are reinterpreted to fit the type and sequence expected, resulting in unpredictable behavior.
-Review the format and arguments expected by the highlighted function calls. Update either
-the format or the arguments so that the expected type and sequence of arguments are passed to
+
Review the format and arguments expected by the highlighted function calls. Update either
+the format or the arguments so that the expected type and sequence of arguments are passed to
the function.
-
+
+
+In the following example, the wrong format specifier is given for an integer format argument:
+
+
+
+The corrected version uses %i as the format specifier for the integer format argument:
+
+
-CERT C Coding
-Standard: FIO30-C. Exclude user input from format strings.
-cplusplus.com: C++ Functions.
-CRT Alphabetical Function Reference: printf, _printf_l, wprintf, _wprintf_l.
-
-
-
+Microsoft Learn: Format specification syntax: printf and wprintf functions.
+cplusplus.com:printf
+CERT C Coding Standard: FIO47-C. Use valid format strings.
diff --git a/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArgumentsBad.cpp b/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArgumentsBad.cpp
new file mode 100644
index 00000000000..046233af1b0
--- /dev/null
+++ b/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArgumentsBad.cpp
@@ -0,0 +1,4 @@
+int main() {
+ printf("%s\n", 42); // BAD: printf will treat 42 as a char*, will most likely segfault
+ return 0;
+}
diff --git a/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArgumentsGood.cpp b/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArgumentsGood.cpp
new file mode 100644
index 00000000000..0bd3fb5c439
--- /dev/null
+++ b/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArgumentsGood.cpp
@@ -0,0 +1,4 @@
+int main() {
+ printf("%i\n", 42); // GOOD: printf will treat 42 as an int
+ return 0;
+}
diff --git a/cpp/ql/src/Likely Bugs/Likely Typos/IncorrectNotOperatorUsage.cpp b/cpp/ql/src/Likely Bugs/Likely Typos/IncorrectNotOperatorUsage.cpp
index c3640a66ab6..29eef7c2b1f 100644
--- a/cpp/ql/src/Likely Bugs/Likely Typos/IncorrectNotOperatorUsage.cpp
+++ b/cpp/ql/src/Likely Bugs/Likely Typos/IncorrectNotOperatorUsage.cpp
@@ -2,19 +2,18 @@
void f_warning(int i)
{
- // The usage of the logical not operator in this case is unlikely to be correct
+ // BAD: the usage of the logical not operator in this case is unlikely to be correct
// as the output is being used as an operator for a bit-wise and operation
- if (i & !FLAGS)
+ if (i & !FLAGS)
{
// code
}
}
-
void f_fixed(int i)
{
- if (i & ~FLAGS) // Changing the logical not operator for the bit-wise not operator would fix this logic
+ if (i & ~FLAGS) // GOOD: Changing the logical not operator for the bit-wise not operator would fix this logic
{
// code
}
-}
\ No newline at end of file
+}
diff --git a/cpp/ql/src/Likely Bugs/Likely Typos/IncorrectNotOperatorUsage.qhelp b/cpp/ql/src/Likely Bugs/Likely Typos/IncorrectNotOperatorUsage.qhelp
index bac09fe9cf1..3b5824c314a 100644
--- a/cpp/ql/src/Likely Bugs/Likely Typos/IncorrectNotOperatorUsage.qhelp
+++ b/cpp/ql/src/Likely Bugs/Likely Typos/IncorrectNotOperatorUsage.qhelp
@@ -16,7 +16,13 @@
Carefully inspect the flagged expressions. Consider the intent in the code logic, and decide whether it is necessary to change the not operator.
-
+
+Here is an example of this issue and how it can be fixed:
+
+
+
+In other cases, particularly when the expressions have bool type, the fix may instead be of the form a && !b.
+
diff --git a/cpp/ql/src/Likely Bugs/Memory Management/StrncpyFlippedArgs.cpp b/cpp/ql/src/Likely Bugs/Memory Management/StrncpyFlippedArgs.cpp
deleted file mode 100644
index 07acc91cd5a..00000000000
--- a/cpp/ql/src/Likely Bugs/Memory Management/StrncpyFlippedArgs.cpp
+++ /dev/null
@@ -1,2 +0,0 @@
-strncpy(dest, src, sizeof(src)); //wrong: size of dest should be used
-strncpy(dest, src, strlen(src)); //wrong: size of dest should be used
diff --git a/cpp/ql/src/Likely Bugs/Memory Management/StrncpyFlippedArgs.qhelp b/cpp/ql/src/Likely Bugs/Memory Management/StrncpyFlippedArgs.qhelp
index 2e297116710..201b9057499 100644
--- a/cpp/ql/src/Likely Bugs/Memory Management/StrncpyFlippedArgs.qhelp
+++ b/cpp/ql/src/Likely Bugs/Memory Management/StrncpyFlippedArgs.qhelp
@@ -3,7 +3,7 @@
"qhelp.dtd">
-The standard library function strncpy copies a source string to a destination buffer. The third argument defines the maximum number of characters to copy and should be less than
+
The standard library function strncpy copies a source string to a destination buffer. The third argument defines the maximum number of characters to copy and should be less than
or equal to the size of the destination buffer. Calls of the form strncpy(dest, src, strlen(src)) or strncpy(dest, src, sizeof(src)) incorrectly set the third argument to the size of the source buffer. Executing a call of this type may cause a buffer overflow. Buffer overflows can lead to anything from a segmentation fault to a security vulnerability.
@@ -12,14 +12,20 @@ or equal to the size of the destination buffer. Calls of the form strncpy(
not the source buffer.
-
+
+In the following examples, the size of the source buffer is incorrectly used as a parameter to strncpy:
+
+The corrected version uses the size of the destination buffer, or a variable containing the size of the destination buffer as the size parameter to strncpy:
+
+
+
-cplusplus.com: strncpy.
+cplusplus.com: strncpy.
I. Gerg. An Overview and Example of the Buffer-Overflow Exploit. IANewsletter vol 7 no 4. 2005.
diff --git a/cpp/ql/src/Likely Bugs/Memory Management/StrncpyFlippedArgsBad.cpp b/cpp/ql/src/Likely Bugs/Memory Management/StrncpyFlippedArgsBad.cpp
new file mode 100644
index 00000000000..952550b2638
--- /dev/null
+++ b/cpp/ql/src/Likely Bugs/Memory Management/StrncpyFlippedArgsBad.cpp
@@ -0,0 +1,9 @@
+char src[256];
+char dest1[128];
+
+...
+
+strncpy(dest1, src, sizeof(src)); // wrong: size of dest should be used
+
+char *dest2 = (char *)malloc(sz1 + sz2 + sz3);
+strncpy(dest2, src, strlen(src)); // wrong: size of dest should be used
diff --git a/cpp/ql/src/Likely Bugs/Memory Management/StrncpyFlippedArgsGood.cpp b/cpp/ql/src/Likely Bugs/Memory Management/StrncpyFlippedArgsGood.cpp
new file mode 100644
index 00000000000..22fc4ebd222
--- /dev/null
+++ b/cpp/ql/src/Likely Bugs/Memory Management/StrncpyFlippedArgsGood.cpp
@@ -0,0 +1,10 @@
+char src[256];
+char dest1[128];
+
+...
+
+strncpy(dest1, src, sizeof(dest1)); // correct
+
+size_t destSize = sz1 + sz2 + sz3;
+char *dest2 = (char *)malloc(destSize);
+strncpy(dest2, src, destSize); // correct
diff --git a/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.c b/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.c
deleted file mode 100644
index 63856888ebb..00000000000
--- a/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.c
+++ /dev/null
@@ -1,22 +0,0 @@
-int main(int argc, char** argv) {
- char *userAndFile = argv[2];
-
- {
- char fileBuffer[FILENAME_MAX] = "/home/";
- char *fileName = fileBuffer;
- size_t len = strlen(fileName);
- strncat(fileName+len, userAndFile, FILENAME_MAX-len-1);
- // BAD: a string from the user is used in a filename
- fopen(fileName, "wb+");
- }
-
- {
- char fileBuffer[FILENAME_MAX] = "/home/";
- char *fileName = fileBuffer;
- size_t len = strlen(fileName);
- // GOOD: use a fixed file
- char* fixed = "jim/file.txt";
- strncat(fileName+len, fixed, FILENAME_MAX-len-1);
- fopen(fileName, "wb+");
- }
-}
diff --git a/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp b/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp
index eba2ede58f5..4d6238ac335 100644
--- a/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp
+++ b/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp
@@ -3,36 +3,57 @@
"qhelp.dtd">
-Accessing paths controlled by users can allow an attacker to access unexpected resources. This
+
Accessing paths controlled by users can allow an attacker to access unexpected resources. This
can result in sensitive information being revealed or deleted, or an attacker being able to influence
behavior by modifying unexpected files.
-Paths that are naively constructed from data controlled by a user may contain unexpected special characters,
-such as "..". Such a path may potentially point to any directory on the filesystem.
+Paths that are naively constructed from data controlled by a user may be absolute paths, or may contain
+unexpected special characters such as "..". Such a path could point anywhere on the file system.
-Validate user input before using it to construct a filepath. Ideally, follow these rules:
+Validate user input before using it to construct a file path.
-
-- Do not allow more than a single "." character.
-- Do not allow directory separators such as "/" or "\" (depending on the filesystem).
-- Do not rely on simply replacing problematic sequences such as "../". For example, after applying this filter to
-".../...//" the resulting string would still be "../".
-- Ideally use a whitelist of known good patterns.
-
+Common validation methods include checking that the normalized path is relative and does not contain
+any ".." components, or checking that the path is contained within a safe folder. The method you should use depends
+on how the path is used in the application, and whether the path should be a single path component.
+
+
+If the path should be a single path component (such as a file name), you can check for the existence
+of any path separators ("/" or "\"), or ".." sequences in the input, and reject the input if any are found.
+
+
+
+Note that removing "../" sequences is not sufficient, since the input could still contain a path separator
+followed by "..". For example, the input ".../...//" would still result in the string "../" if only "../" sequences
+are removed.
+
+
+Finally, the simplest (but most restrictive) option is to use an allow list of safe patterns and make sure that
+the user input matches one of these patterns.
-In this example, a username and file are read from the arguments to main and then used to access a file in the
-user's home directory. However, a malicious user could enter a filename which contains special
-characters. For example, the string "../../etc/passwd" will result in the code reading the file located at
-"/home/[user]/../../etc/passwd", which is the system's password file. This could potentially allow them to
-access all the system's passwords.
+In this example, a file name is read from a user and then used to access a file.
+However, a malicious user could enter a file name anywhere on the file system,
+such as "/etc/passwd" or "../../../etc/passwd".
-
+
+
+
+If the input should only be a file name, you can check that it doesn't contain any path separators or ".." sequences.
+
+
+
+
+
+If the input should be within a specific directory, you can check that the resolved path
+is still contained within that directory.
+
+
+
@@ -41,6 +62,7 @@ access all the system's passwords.
OWASP:
Path Traversal.
+Linux man pages: realpath(3).
diff --git a/cpp/ql/src/Security/CWE/CWE-022/examples/TaintedPath.c b/cpp/ql/src/Security/CWE/CWE-022/examples/TaintedPath.c
new file mode 100644
index 00000000000..ff309d7d9d8
--- /dev/null
+++ b/cpp/ql/src/Security/CWE/CWE-022/examples/TaintedPath.c
@@ -0,0 +1,10 @@
+int main(int argc, char** argv) {
+ char *userAndFile = argv[2];
+
+ {
+ char fileBuffer[PATH_MAX];
+ snprintf(fileBuffer, sizeof(fileBuffer), "/home/%s", userAndFile);
+ // BAD: a string from the user is used in a filename
+ fopen(fileBuffer, "wb+");
+ }
+}
diff --git a/cpp/ql/src/Security/CWE/CWE-022/examples/TaintedPathFolder.c b/cpp/ql/src/Security/CWE/CWE-022/examples/TaintedPathFolder.c
new file mode 100644
index 00000000000..1970e515d02
--- /dev/null
+++ b/cpp/ql/src/Security/CWE/CWE-022/examples/TaintedPathFolder.c
@@ -0,0 +1,28 @@
+#include
+#include
+
+int main(int argc, char** argv) {
+ char *userAndFile = argv[2];
+ const char *baseDir = "/home/user/public/";
+ char fullPath[PATH_MAX];
+
+ // Attempt to concatenate the base directory and the user-supplied path
+ snprintf(fullPath, sizeof(fullPath), "%s%s", baseDir, userAndFile);
+
+ // Resolve the absolute path, normalizing any ".." or "."
+ char *resolvedPath = realpath(fullPath, NULL);
+ if (resolvedPath == NULL) {
+ perror("Error resolving path");
+ return 1;
+ }
+
+ // Check if the resolved path starts with the base directory
+ if (strncmp(baseDir, resolvedPath, strlen(baseDir)) != 0) {
+ free(resolvedPath);
+ return 1;
+ }
+
+ // GOOD: Path is within the intended directory
+ FILE *file = fopen(resolvedPath, "wb+");
+ free(resolvedPath);
+}
\ No newline at end of file
diff --git a/cpp/ql/src/Security/CWE/CWE-022/examples/TaintedPathNormalize.c b/cpp/ql/src/Security/CWE/CWE-022/examples/TaintedPathNormalize.c
new file mode 100644
index 00000000000..ab7607cdd3d
--- /dev/null
+++ b/cpp/ql/src/Security/CWE/CWE-022/examples/TaintedPathNormalize.c
@@ -0,0 +1,16 @@
+#include
+#include
+
+int main(int argc, char** argv) {
+ char *fileName = argv[2];
+ // Check for invalid sequences in the user input
+ if (strstr(fileName , "..") || strchr(fileName , '/') || strchr(fileName , '\\')) {
+ printf("Invalid filename.\n");
+ return 1;
+ }
+
+ char fileBuffer[PATH_MAX];
+ snprintf(fileBuffer, sizeof(fileBuffer), "/home/user/files/%s", fileName);
+ // GOOD: We know that the filename is safe and stays within the public folder
+ FILE *file = fopen(fileBuffer, "wb+");
+}
\ No newline at end of file
diff --git a/cpp/ql/src/change-notes/2024-04-29-iterator-to-expired-container.md b/cpp/ql/src/change-notes/released/0.9.12.md
similarity index 84%
rename from cpp/ql/src/change-notes/2024-04-29-iterator-to-expired-container.md
rename to cpp/ql/src/change-notes/released/0.9.12.md
index ce06805a8f3..0a66e72ed44 100644
--- a/cpp/ql/src/change-notes/2024-04-29-iterator-to-expired-container.md
+++ b/cpp/ql/src/change-notes/released/0.9.12.md
@@ -1,4 +1,5 @@
----
-category: newQuery
----
+## 0.9.12
+
+### New Queries
+
* Added a new query, `cpp/iterator-to-expired-container`, to detect the creation of iterators owned by a temporary objects that are about to be destroyed.
diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml
index 47eb8b55bab..12f1a311eca 100644
--- a/cpp/ql/src/codeql-pack.release.yml
+++ b/cpp/ql/src/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 0.9.11
+lastReleaseVersion: 0.9.12
diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml
index e3f87e5a635..e6cfba5e9da 100644
--- a/cpp/ql/src/qlpack.yml
+++ b/cpp/ql/src/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/cpp-queries
-version: 0.9.12-dev
+version: 0.9.13-dev
groups:
- cpp
- queries
diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
index cf5125b1ccf..d7b240c8949 100644
--- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
+++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
@@ -12159,8 +12159,12 @@ ir.cpp:
# 1109| Type = [IntType] int
# 1110| [Destructor] void std::vector::~vector()
# 1110| :
+# 1110| [Destructor] void std::vector::~vector()
+# 1110| :
# 1110| [Destructor] void std::vector::~vector()
# 1110| :
+# 1110| [Destructor] void std::vector::~vector()
+# 1110| :
# 1110| [Destructor] void std::vector::~vector()
# 1110| :
# 1115| [ConstMemberFunction] std::vector::iterator std::vector::begin() const
@@ -19307,193 +19311,195 @@ ir.cpp:
# 2193| getQualifier(): [ThisExpr] this
# 2193| Type = [PointerType] ClassWithDestructor *
# 2193| ValueCategory = prvalue(load)
-# 2196| [GlobalVariable] bool initialization_with_destructor_bool
-# 2196| getInitializer(): [Initializer] initializer for initialization_with_destructor_bool
-# 2196| getExpr(): [Literal] 1
-# 2196| Type = [BoolType] bool
-# 2196| Value = [Literal] 1
-# 2196| ValueCategory = prvalue
-# 2198| [TopLevelFunction] void initialization_with_destructor(bool, char)
-# 2198| :
-# 2198| getParameter(0): [Parameter] b
-# 2198| Type = [BoolType] bool
-# 2198| getParameter(1): [Parameter] c
-# 2198| Type = [PlainCharType] char
-# 2198| getEntryPoint(): [BlockStmt] { ... }
-# 2199| getStmt(0): [IfStmt] if (...) ...
-# 2199| getInitialization(): [DeclStmt] declaration
-# 2199| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
-# 2199| Type = [Class] ClassWithDestructor
-# 2199| getVariable().getInitializer(): [Initializer] initializer for x
-# 2199| getExpr(): [ConstructorCall] call to ClassWithDestructor
-# 2199| Type = [VoidType] void
-# 2199| ValueCategory = prvalue
-# 2199| getCondition(): [VariableAccess] b
-# 2199| Type = [BoolType] bool
-# 2199| ValueCategory = prvalue(load)
-# 2200| getThen(): [ExprStmt] ExprStmt
-# 2200| getExpr(): [FunctionCall] call to set_x
-# 2200| Type = [VoidType] void
-# 2200| ValueCategory = prvalue
-# 2200| getQualifier(): [VariableAccess] x
-# 2200| Type = [Class] ClassWithDestructor
-# 2200| ValueCategory = lvalue
-# 2200| getArgument(0): [CharLiteral] 97
-# 2200| Type = [PlainCharType] char
-# 2200| Value = [CharLiteral] 97
-# 2200| ValueCategory = prvalue
-# 2200| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2200| Type = [VoidType] void
-# 2200| ValueCategory = prvalue
-# 2200| getQualifier(): [VariableAccess] x
+# 2194| [ConstMemberFunction,ConversionOperator] bool ClassWithDestructor::operator bool() const
+# 2194| :
+# 2197| [GlobalVariable] bool initialization_with_destructor_bool
+# 2197| getInitializer(): [Initializer] initializer for initialization_with_destructor_bool
+# 2197| getExpr(): [Literal] 1
+# 2197| Type = [BoolType] bool
+# 2197| Value = [Literal] 1
+# 2197| ValueCategory = prvalue
+# 2199| [TopLevelFunction] void initialization_with_destructor(bool, char)
+# 2199| :
+# 2199| getParameter(0): [Parameter] b
+# 2199| Type = [BoolType] bool
+# 2199| getParameter(1): [Parameter] c
+# 2199| Type = [PlainCharType] char
+# 2199| getEntryPoint(): [BlockStmt] { ... }
+# 2200| getStmt(0): [IfStmt] if (...) ...
+# 2200| getInitialization(): [DeclStmt] declaration
+# 2200| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
# 2200| Type = [Class] ClassWithDestructor
-# 2200| ValueCategory = lvalue
-# 2202| getStmt(1): [ConstexprIfStmt] if constexpr (...) ...
-# 2202| getInitialization(): [DeclStmt] declaration
-# 2202| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
-# 2202| Type = [Class] ClassWithDestructor
-# 2202| getVariable().getInitializer(): [Initializer] initializer for x
-# 2202| getExpr(): [ConstructorCall] call to ClassWithDestructor
-# 2202| Type = [VoidType] void
-# 2202| ValueCategory = prvalue
-# 2202| getCondition(): [VariableAccess] initialization_with_destructor_bool
-# 2202| Type = [BoolType] bool
-# 2202| Value = [VariableAccess] 1
-# 2202| ValueCategory = prvalue(load)
-# 2203| getThen(): [ExprStmt] ExprStmt
-# 2203| getExpr(): [FunctionCall] call to set_x
-# 2203| Type = [VoidType] void
-# 2203| ValueCategory = prvalue
-# 2203| getQualifier(): [VariableAccess] x
-# 2203| Type = [Class] ClassWithDestructor
-# 2203| ValueCategory = lvalue
-# 2203| getArgument(0): [CharLiteral] 97
-# 2203| Type = [PlainCharType] char
-# 2203| Value = [CharLiteral] 97
-# 2203| ValueCategory = prvalue
-# 2203| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2203| Type = [VoidType] void
-# 2203| ValueCategory = prvalue
-# 2203| getQualifier(): [VariableAccess] x
+# 2200| getVariable().getInitializer(): [Initializer] initializer for x
+# 2200| getExpr(): [ConstructorCall] call to ClassWithDestructor
+# 2200| Type = [VoidType] void
+# 2200| ValueCategory = prvalue
+# 2200| getCondition(): [VariableAccess] b
+# 2200| Type = [BoolType] bool
+# 2200| ValueCategory = prvalue(load)
+# 2201| getThen(): [ExprStmt] ExprStmt
+# 2201| getExpr(): [FunctionCall] call to set_x
+# 2201| Type = [VoidType] void
+# 2201| ValueCategory = prvalue
+# 2201| getQualifier(): [VariableAccess] x
+# 2201| Type = [Class] ClassWithDestructor
+# 2201| ValueCategory = lvalue
+# 2201| getArgument(0): [CharLiteral] 97
+# 2201| Type = [PlainCharType] char
+# 2201| Value = [CharLiteral] 97
+# 2201| ValueCategory = prvalue
+# 2201| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2201| Type = [VoidType] void
+# 2201| ValueCategory = prvalue
+# 2201| getQualifier(): [VariableAccess] x
+# 2201| Type = [Class] ClassWithDestructor
+# 2201| ValueCategory = lvalue
+# 2203| getStmt(1): [ConstexprIfStmt] if constexpr (...) ...
+# 2203| getInitialization(): [DeclStmt] declaration
+# 2203| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
# 2203| Type = [Class] ClassWithDestructor
-# 2203| ValueCategory = lvalue
-# 2205| getStmt(2): [SwitchStmt] switch (...) ...
-# 2205| getInitialization(): [DeclStmt] declaration
-# 2205| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
-# 2205| Type = [Class] ClassWithDestructor
-# 2205| getVariable().getInitializer(): [Initializer] initializer for x
-# 2205| getExpr(): [ConstructorCall] call to ClassWithDestructor
-# 2205| Type = [VoidType] void
-# 2205| ValueCategory = prvalue
-# 2205| getExpr(): [VariableAccess] c
-# 2205| Type = [PlainCharType] char
-# 2205| ValueCategory = prvalue(load)
-# 2205| getStmt(): [BlockStmt] { ... }
-# 2206| getStmt(0): [SwitchCase] case ...:
-# 2206| getExpr(): [CharLiteral] 97
-# 2206| Type = [PlainCharType] char
-# 2206| Value = [CharLiteral] 97
-# 2206| ValueCategory = prvalue
-# 2206| getExpr().getFullyConverted(): [CStyleCast] (int)...
-# 2206| Conversion = [IntegralConversion] integral conversion
-# 2206| Type = [IntType] int
-# 2206| Value = [CStyleCast] 97
-# 2206| ValueCategory = prvalue
-# 2207| getStmt(1): [ExprStmt] ExprStmt
-# 2207| getExpr(): [FunctionCall] call to set_x
-# 2207| Type = [VoidType] void
+# 2203| getVariable().getInitializer(): [Initializer] initializer for x
+# 2203| getExpr(): [ConstructorCall] call to ClassWithDestructor
+# 2203| Type = [VoidType] void
+# 2203| ValueCategory = prvalue
+# 2203| getCondition(): [VariableAccess] initialization_with_destructor_bool
+# 2203| Type = [BoolType] bool
+# 2203| Value = [VariableAccess] 1
+# 2203| ValueCategory = prvalue(load)
+# 2204| getThen(): [ExprStmt] ExprStmt
+# 2204| getExpr(): [FunctionCall] call to set_x
+# 2204| Type = [VoidType] void
+# 2204| ValueCategory = prvalue
+# 2204| getQualifier(): [VariableAccess] x
+# 2204| Type = [Class] ClassWithDestructor
+# 2204| ValueCategory = lvalue
+# 2204| getArgument(0): [CharLiteral] 97
+# 2204| Type = [PlainCharType] char
+# 2204| Value = [CharLiteral] 97
+# 2204| ValueCategory = prvalue
+# 2204| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2204| Type = [VoidType] void
+# 2204| ValueCategory = prvalue
+# 2204| getQualifier(): [VariableAccess] x
+# 2204| Type = [Class] ClassWithDestructor
+# 2204| ValueCategory = lvalue
+# 2206| getStmt(2): [SwitchStmt] switch (...) ...
+# 2206| getInitialization(): [DeclStmt] declaration
+# 2206| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
+# 2206| Type = [Class] ClassWithDestructor
+# 2206| getVariable().getInitializer(): [Initializer] initializer for x
+# 2206| getExpr(): [ConstructorCall] call to ClassWithDestructor
+# 2206| Type = [VoidType] void
+# 2206| ValueCategory = prvalue
+# 2206| getExpr(): [VariableAccess] c
+# 2206| Type = [PlainCharType] char
+# 2206| ValueCategory = prvalue(load)
+# 2206| getStmt(): [BlockStmt] { ... }
+# 2207| getStmt(0): [SwitchCase] case ...:
+# 2207| getExpr(): [CharLiteral] 97
+# 2207| Type = [PlainCharType] char
+# 2207| Value = [CharLiteral] 97
# 2207| ValueCategory = prvalue
-# 2207| getQualifier(): [VariableAccess] x
-# 2207| Type = [Class] ClassWithDestructor
-# 2207| ValueCategory = lvalue
-# 2207| getArgument(0): [CharLiteral] 97
-# 2207| Type = [PlainCharType] char
-# 2207| Value = [CharLiteral] 97
-# 2207| ValueCategory = prvalue
-# 2208| getStmt(2): [BreakStmt] break;
-# 2212| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2212| Type = [VoidType] void
-# 2212| ValueCategory = prvalue
-# 2212| getQualifier(): [VariableAccess] x
-# 2212| Type = [Class] ClassWithDestructor
-# 2212| ValueCategory = lvalue
-# 2209| getStmt(3): [SwitchCase] default:
-# 2210| getStmt(4): [ExprStmt] ExprStmt
-# 2210| getExpr(): [FunctionCall] call to set_x
-# 2210| Type = [VoidType] void
-# 2210| ValueCategory = prvalue
-# 2210| getQualifier(): [VariableAccess] x
-# 2210| Type = [Class] ClassWithDestructor
-# 2210| ValueCategory = lvalue
-# 2210| getArgument(0): [CharLiteral] 98
-# 2210| Type = [PlainCharType] char
-# 2210| Value = [CharLiteral] 98
-# 2210| ValueCategory = prvalue
-# 2211| getStmt(5): [BreakStmt] break;
-# 2212| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2212| Type = [VoidType] void
-# 2212| ValueCategory = prvalue
-# 2212| getQualifier(): [VariableAccess] x
-# 2212| Type = [Class] ClassWithDestructor
-# 2212| ValueCategory = lvalue
-# 2212| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2212| Type = [VoidType] void
-# 2212| ValueCategory = prvalue
-# 2212| getQualifier(): [VariableAccess] x
-# 2212| Type = [Class] ClassWithDestructor
-# 2212| ValueCategory = lvalue
-# 2205| getExpr().getFullyConverted(): [CStyleCast] (int)...
-# 2205| Conversion = [IntegralConversion] integral conversion
-# 2205| Type = [IntType] int
-# 2205| ValueCategory = prvalue
-# 2212| getStmt(3): [LabelStmt] label ...:
-# 2214| getStmt(4): [DeclStmt] declaration
-# 2214| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
-# 2214| Type = [Class] ClassWithDestructor
-# 2214| getVariable().getInitializer(): [Initializer] initializer for x
-# 2214| getExpr(): [ConstructorCall] call to ClassWithDestructor
-# 2214| Type = [VoidType] void
-# 2214| ValueCategory = prvalue
-# 2215| getStmt(5): [RangeBasedForStmt] for(...:...) ...
-# 2215| getInitialization(): [DeclStmt] declaration
-# 2215| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys
-# 2215| Type = [ClassTemplateInstantiation,Struct] vector
-# 2215| getVariable().getInitializer(): [Initializer] initializer for ys
-# 2215| getExpr(): [ConstructorCall] call to vector
-# 2215| Type = [VoidType] void
-# 2215| ValueCategory = prvalue
-# 2215| getArgument(0): [VariableAccess] x
-# 2215| Type = [Class] ClassWithDestructor
-# 2215| ValueCategory = prvalue(load)
-# 2215| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2215| Type = [VoidType] void
-# 2215| ValueCategory = prvalue
-# 2215| getQualifier(): [ReuseExpr] reuse of temporary object
-# 2215| Type = [Class] ClassWithDestructor
-# 2215| ValueCategory = xvalue
-# 2215| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
-# 2215| Type = [Class] ClassWithDestructor
-# 2215| ValueCategory = lvalue
-# 2215| getChild(1): [DeclStmt] declaration
-# 2215| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range)
-# 2215| Type = [LValueReferenceType] vector &
+# 2207| getExpr().getFullyConverted(): [CStyleCast] (int)...
+# 2207| Conversion = [IntegralConversion] integral conversion
+# 2207| Type = [IntType] int
+# 2207| Value = [CStyleCast] 97
+# 2207| ValueCategory = prvalue
+# 2208| getStmt(1): [ExprStmt] ExprStmt
+# 2208| getExpr(): [FunctionCall] call to set_x
+# 2208| Type = [VoidType] void
+# 2208| ValueCategory = prvalue
+# 2208| getQualifier(): [VariableAccess] x
+# 2208| Type = [Class] ClassWithDestructor
+# 2208| ValueCategory = lvalue
+# 2208| getArgument(0): [CharLiteral] 97
+# 2208| Type = [PlainCharType] char
+# 2208| Value = [CharLiteral] 97
+# 2208| ValueCategory = prvalue
+# 2209| getStmt(2): [BreakStmt] break;
+# 2213| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2213| Type = [VoidType] void
+# 2213| ValueCategory = prvalue
+# 2213| getQualifier(): [VariableAccess] x
+# 2213| Type = [Class] ClassWithDestructor
+# 2213| ValueCategory = lvalue
+# 2210| getStmt(3): [SwitchCase] default:
+# 2211| getStmt(4): [ExprStmt] ExprStmt
+# 2211| getExpr(): [FunctionCall] call to set_x
+# 2211| Type = [VoidType] void
+# 2211| ValueCategory = prvalue
+# 2211| getQualifier(): [VariableAccess] x
+# 2211| Type = [Class] ClassWithDestructor
+# 2211| ValueCategory = lvalue
+# 2211| getArgument(0): [CharLiteral] 98
+# 2211| Type = [PlainCharType] char
+# 2211| Value = [CharLiteral] 98
+# 2211| ValueCategory = prvalue
+# 2212| getStmt(5): [BreakStmt] break;
+# 2213| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2213| Type = [VoidType] void
+# 2213| ValueCategory = prvalue
+# 2213| getQualifier(): [VariableAccess] x
+# 2213| Type = [Class] ClassWithDestructor
+# 2213| ValueCategory = lvalue
+# 2213| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2213| Type = [VoidType] void
+# 2213| ValueCategory = prvalue
+# 2213| getQualifier(): [VariableAccess] x
+# 2213| Type = [Class] ClassWithDestructor
+# 2213| ValueCategory = lvalue
+# 2206| getExpr().getFullyConverted(): [CStyleCast] (int)...
+# 2206| Conversion = [IntegralConversion] integral conversion
+# 2206| Type = [IntType] int
+# 2206| ValueCategory = prvalue
+# 2213| getStmt(3): [LabelStmt] label ...:
+# 2215| getStmt(4): [DeclStmt] declaration
+# 2215| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
+# 2215| Type = [Class] ClassWithDestructor
+# 2215| getVariable().getInitializer(): [Initializer] initializer for x
+# 2215| getExpr(): [ConstructorCall] call to ClassWithDestructor
+# 2215| Type = [VoidType] void
+# 2215| ValueCategory = prvalue
+# 2216| getStmt(5): [RangeBasedForStmt] for(...:...) ...
+# 2216| getInitialization(): [DeclStmt] declaration
+# 2216| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys
+# 2216| Type = [ClassTemplateInstantiation,Struct] vector
+# 2216| getVariable().getInitializer(): [Initializer] initializer for ys
+# 2216| getExpr(): [ConstructorCall] call to vector
+# 2216| Type = [VoidType] void
+# 2216| ValueCategory = prvalue
+# 2216| getArgument(0): [VariableAccess] x
+# 2216| Type = [Class] ClassWithDestructor
+# 2216| ValueCategory = prvalue(load)
+# 2216| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2216| Type = [VoidType] void
+# 2216| ValueCategory = prvalue
+# 2216| getQualifier(): [ReuseExpr] reuse of temporary object
+# 2216| Type = [Class] ClassWithDestructor
+# 2216| ValueCategory = xvalue
+# 2216| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
+# 2216| Type = [Class] ClassWithDestructor
+# 2216| ValueCategory = lvalue
+# 2216| getChild(1): [DeclStmt] declaration
+# 2216| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range)
+# 2216| Type = [LValueReferenceType] vector &
#-----| getVariable().getInitializer(): [Initializer] initializer for (__range)
-# 2215| getExpr(): [VariableAccess] ys
-# 2215| Type = [ClassTemplateInstantiation,Struct] vector
-# 2215| ValueCategory = lvalue
-# 2215| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
-# 2215| Type = [LValueReferenceType] vector &
-# 2215| ValueCategory = prvalue
-# 2215| getBeginEndDeclaration(): [DeclStmt] declaration
-# 2215| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin)
-# 2215| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2216| getExpr(): [VariableAccess] ys
+# 2216| Type = [ClassTemplateInstantiation,Struct] vector
+# 2216| ValueCategory = lvalue
+# 2216| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
+# 2216| Type = [LValueReferenceType] vector &
+# 2216| ValueCategory = prvalue
+# 2216| getBeginEndDeclaration(): [DeclStmt] declaration
+# 2216| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin)
+# 2216| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin)
-# 2215| getExpr(): [FunctionCall] call to begin
-# 2215| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2215| ValueCategory = prvalue
-# 2215| getQualifier(): [VariableAccess] (__range)
-# 2215| Type = [LValueReferenceType] vector &
-# 2215| ValueCategory = prvalue(load)
+# 2216| getExpr(): [FunctionCall] call to begin
+# 2216| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2216| ValueCategory = prvalue
+# 2216| getQualifier(): [VariableAccess] (__range)
+# 2216| Type = [LValueReferenceType] vector &
+# 2216| ValueCategory = prvalue(load)
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const vector
@@ -19501,15 +19507,15 @@ ir.cpp:
#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
#-----| Type = [ClassTemplateInstantiation,Struct] vector
#-----| ValueCategory = lvalue
-# 2215| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end)
-# 2215| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2216| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end)
+# 2216| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
#-----| getVariable().getInitializer(): [Initializer] initializer for (__end)
-# 2215| getExpr(): [FunctionCall] call to end
-# 2215| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2215| ValueCategory = prvalue
-# 2215| getQualifier(): [VariableAccess] (__range)
-# 2215| Type = [LValueReferenceType] vector &
-# 2215| ValueCategory = prvalue(load)
+# 2216| getExpr(): [FunctionCall] call to end
+# 2216| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2216| ValueCategory = prvalue
+# 2216| getQualifier(): [VariableAccess] (__range)
+# 2216| Type = [LValueReferenceType] vector &
+# 2216| ValueCategory = prvalue(load)
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const vector
@@ -19517,18 +19523,18 @@ ir.cpp:
#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
#-----| Type = [ClassTemplateInstantiation,Struct] vector
#-----| ValueCategory = lvalue
-# 2215| getCondition(): [FunctionCall] call to operator!=
-# 2215| Type = [BoolType] bool
-# 2215| ValueCategory = prvalue
-# 2215| getQualifier(): [VariableAccess] (__begin)
-# 2215| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2215| ValueCategory = lvalue
-# 2215| getArgument(0): [ConstructorCall] call to iterator
-# 2215| Type = [VoidType] void
-# 2215| ValueCategory = prvalue
-# 2215| getArgument(0): [VariableAccess] (__end)
-# 2215| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2215| ValueCategory = lvalue
+# 2216| getCondition(): [FunctionCall] call to operator!=
+# 2216| Type = [BoolType] bool
+# 2216| ValueCategory = prvalue
+# 2216| getQualifier(): [VariableAccess] (__begin)
+# 2216| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2216| ValueCategory = lvalue
+# 2216| getArgument(0): [ConstructorCall] call to iterator
+# 2216| Type = [VoidType] void
+# 2216| ValueCategory = prvalue
+# 2216| getArgument(0): [VariableAccess] (__end)
+# 2216| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2216| ValueCategory = lvalue
#-----| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
#-----| Type = [LValueReferenceType] const iterator &
#-----| ValueCategory = prvalue
@@ -19543,95 +19549,95 @@ ir.cpp:
#-----| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
#-----| Type = [ClassTemplateInstantiation,Struct] iterator
#-----| ValueCategory = lvalue
-# 2215| getUpdate(): [FunctionCall] call to operator++
-# 2215| Type = [LValueReferenceType] iterator &
-# 2215| ValueCategory = prvalue
-# 2215| getQualifier(): [VariableAccess] (__begin)
-# 2215| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2215| ValueCategory = lvalue
-# 2215| getChild(5): [DeclStmt] declaration
-# 2215| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
-# 2215| Type = [Class] ClassWithDestructor
-# 2215| getVariable().getInitializer(): [Initializer] initializer for y
-# 2215| getExpr(): [OverloadedPointerDereferenceExpr] call to operator*
-# 2215| Type = [LValueReferenceType] ClassWithDestructor &
-# 2215| ValueCategory = prvalue
-# 2215| getQualifier(): [VariableAccess] (__begin)
-# 2215| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2215| ValueCategory = lvalue
+# 2216| getUpdate(): [FunctionCall] call to operator++
+# 2216| Type = [LValueReferenceType] iterator &
+# 2216| ValueCategory = prvalue
+# 2216| getQualifier(): [VariableAccess] (__begin)
+# 2216| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2216| ValueCategory = lvalue
+# 2216| getChild(5): [DeclStmt] declaration
+# 2216| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
+# 2216| Type = [Class] ClassWithDestructor
+# 2216| getVariable().getInitializer(): [Initializer] initializer for y
+# 2216| getExpr(): [OverloadedPointerDereferenceExpr] call to operator*
+# 2216| Type = [LValueReferenceType] ClassWithDestructor &
+# 2216| ValueCategory = prvalue
+# 2216| getQualifier(): [VariableAccess] (__begin)
+# 2216| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2216| ValueCategory = lvalue
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const iterator
#-----| ValueCategory = lvalue
-# 2215| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
-# 2215| Type = [Class] ClassWithDestructor
-# 2215| ValueCategory = prvalue(load)
-# 2216| getStmt(): [ExprStmt] ExprStmt
-# 2216| getExpr(): [FunctionCall] call to set_x
+# 2216| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
+# 2216| Type = [Class] ClassWithDestructor
+# 2216| ValueCategory = prvalue(load)
+# 2217| getStmt(): [ExprStmt] ExprStmt
+# 2217| getExpr(): [FunctionCall] call to set_x
+# 2217| Type = [VoidType] void
+# 2217| ValueCategory = prvalue
+# 2217| getQualifier(): [VariableAccess] y
+# 2217| Type = [Class] ClassWithDestructor
+# 2217| ValueCategory = lvalue
+# 2217| getArgument(0): [CharLiteral] 97
+# 2217| Type = [PlainCharType] char
+# 2217| Value = [CharLiteral] 97
+# 2217| ValueCategory = prvalue
+# 2216| getImplicitDestructorCall(0): [DestructorCall] call to ~vector
+# 2216| Type = [VoidType] void
+# 2216| ValueCategory = prvalue
+# 2216| getQualifier(): [VariableAccess] ys
+# 2216| Type = [ClassTemplateInstantiation,Struct] vector
+# 2216| ValueCategory = lvalue
+# 2216| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
+# 2216| Type = [ClassTemplateInstantiation,Struct] iterator
+# 2216| ValueCategory = lvalue
+# 2216| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
# 2216| Type = [VoidType] void
# 2216| ValueCategory = prvalue
# 2216| getQualifier(): [VariableAccess] y
# 2216| Type = [Class] ClassWithDestructor
# 2216| ValueCategory = lvalue
-# 2216| getArgument(0): [CharLiteral] 97
-# 2216| Type = [PlainCharType] char
-# 2216| Value = [CharLiteral] 97
-# 2216| ValueCategory = prvalue
-# 2215| getImplicitDestructorCall(0): [DestructorCall] call to ~vector
-# 2215| Type = [VoidType] void
-# 2215| ValueCategory = prvalue
-# 2215| getQualifier(): [VariableAccess] ys
-# 2215| Type = [ClassTemplateInstantiation,Struct] vector
-# 2215| ValueCategory = lvalue
-# 2215| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
-# 2215| Type = [ClassTemplateInstantiation,Struct] iterator
-# 2215| ValueCategory = lvalue
-# 2215| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2215| Type = [VoidType] void
-# 2215| ValueCategory = prvalue
-# 2215| getQualifier(): [VariableAccess] y
-# 2215| Type = [Class] ClassWithDestructor
-# 2215| ValueCategory = lvalue
-# 2218| getStmt(6): [RangeBasedForStmt] for(...:...) ...
-# 2218| getInitialization(): [DeclStmt] declaration
-# 2218| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys
-# 2218| Type = [ClassTemplateInstantiation,Struct] vector
-# 2218| getVariable().getInitializer(): [Initializer] initializer for ys
-# 2218| getExpr(): [ConstructorCall] call to vector
-# 2218| Type = [VoidType] void
-# 2218| ValueCategory = prvalue
-# 2218| getArgument(0): [VariableAccess] x
-# 2218| Type = [Class] ClassWithDestructor
-# 2218| ValueCategory = prvalue(load)
-# 2218| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2218| Type = [VoidType] void
-# 2218| ValueCategory = prvalue
-# 2218| getQualifier(): [ReuseExpr] reuse of temporary object
-# 2218| Type = [Class] ClassWithDestructor
-# 2218| ValueCategory = xvalue
-# 2218| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
-# 2218| Type = [Class] ClassWithDestructor
-# 2218| ValueCategory = lvalue
-# 2218| getChild(1): [DeclStmt] declaration
-# 2218| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range)
-# 2218| Type = [LValueReferenceType] vector &
+# 2219| getStmt(6): [RangeBasedForStmt] for(...:...) ...
+# 2219| getInitialization(): [DeclStmt] declaration
+# 2219| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys
+# 2219| Type = [ClassTemplateInstantiation,Struct] vector
+# 2219| getVariable().getInitializer(): [Initializer] initializer for ys
+# 2219| getExpr(): [ConstructorCall] call to vector
+# 2219| Type = [VoidType] void
+# 2219| ValueCategory = prvalue
+# 2219| getArgument(0): [VariableAccess] x
+# 2219| Type = [Class] ClassWithDestructor
+# 2219| ValueCategory = prvalue(load)
+# 2219| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2219| Type = [VoidType] void
+# 2219| ValueCategory = prvalue
+# 2219| getQualifier(): [ReuseExpr] reuse of temporary object
+# 2219| Type = [Class] ClassWithDestructor
+# 2219| ValueCategory = xvalue
+# 2219| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
+# 2219| Type = [Class] ClassWithDestructor
+# 2219| ValueCategory = lvalue
+# 2219| getChild(1): [DeclStmt] declaration
+# 2219| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range)
+# 2219| Type = [LValueReferenceType] vector &
#-----| getVariable().getInitializer(): [Initializer] initializer for (__range)
-# 2218| getExpr(): [VariableAccess] ys
-# 2218| Type = [ClassTemplateInstantiation,Struct] vector
-# 2218| ValueCategory = lvalue
-# 2218| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
-# 2218| Type = [LValueReferenceType] vector &
-# 2218| ValueCategory = prvalue
-# 2218| getBeginEndDeclaration(): [DeclStmt] declaration
-# 2218| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin)
-# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2219| getExpr(): [VariableAccess] ys
+# 2219| Type = [ClassTemplateInstantiation,Struct] vector
+# 2219| ValueCategory = lvalue
+# 2219| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
+# 2219| Type = [LValueReferenceType] vector &
+# 2219| ValueCategory = prvalue
+# 2219| getBeginEndDeclaration(): [DeclStmt] declaration
+# 2219| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin)
+# 2219| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin)
-# 2218| getExpr(): [FunctionCall] call to begin
-# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2218| ValueCategory = prvalue
-# 2218| getQualifier(): [VariableAccess] (__range)
-# 2218| Type = [LValueReferenceType] vector &
-# 2218| ValueCategory = prvalue(load)
+# 2219| getExpr(): [FunctionCall] call to begin
+# 2219| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2219| ValueCategory = prvalue
+# 2219| getQualifier(): [VariableAccess] (__range)
+# 2219| Type = [LValueReferenceType] vector &
+# 2219| ValueCategory = prvalue(load)
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const vector
@@ -19639,15 +19645,15 @@ ir.cpp:
#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
#-----| Type = [ClassTemplateInstantiation,Struct] vector
#-----| ValueCategory = lvalue
-# 2218| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end)
-# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2219| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end)
+# 2219| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
#-----| getVariable().getInitializer(): [Initializer] initializer for (__end)
-# 2218| getExpr(): [FunctionCall] call to end
-# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2218| ValueCategory = prvalue
-# 2218| getQualifier(): [VariableAccess] (__range)
-# 2218| Type = [LValueReferenceType] vector &
-# 2218| ValueCategory = prvalue(load)
+# 2219| getExpr(): [FunctionCall] call to end
+# 2219| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2219| ValueCategory = prvalue
+# 2219| getQualifier(): [VariableAccess] (__range)
+# 2219| Type = [LValueReferenceType] vector &
+# 2219| ValueCategory = prvalue(load)
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const vector
@@ -19655,18 +19661,18 @@ ir.cpp:
#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
#-----| Type = [ClassTemplateInstantiation,Struct] vector
#-----| ValueCategory = lvalue
-# 2218| getCondition(): [FunctionCall] call to operator!=
-# 2218| Type = [BoolType] bool
-# 2218| ValueCategory = prvalue
-# 2218| getQualifier(): [VariableAccess] (__begin)
-# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2218| ValueCategory = lvalue
-# 2218| getArgument(0): [ConstructorCall] call to iterator
-# 2218| Type = [VoidType] void
-# 2218| ValueCategory = prvalue
-# 2218| getArgument(0): [VariableAccess] (__end)
-# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2218| ValueCategory = lvalue
+# 2219| getCondition(): [FunctionCall] call to operator!=
+# 2219| Type = [BoolType] bool
+# 2219| ValueCategory = prvalue
+# 2219| getQualifier(): [VariableAccess] (__begin)
+# 2219| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2219| ValueCategory = lvalue
+# 2219| getArgument(0): [ConstructorCall] call to iterator
+# 2219| Type = [VoidType] void
+# 2219| ValueCategory = prvalue
+# 2219| getArgument(0): [VariableAccess] (__end)
+# 2219| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2219| ValueCategory = lvalue
#-----| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
#-----| Type = [LValueReferenceType] const iterator &
#-----| ValueCategory = prvalue
@@ -19681,130 +19687,130 @@ ir.cpp:
#-----| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
#-----| Type = [ClassTemplateInstantiation,Struct] iterator
#-----| ValueCategory = lvalue
-# 2218| getUpdate(): [FunctionCall] call to operator++
-# 2218| Type = [LValueReferenceType] iterator &
-# 2218| ValueCategory = prvalue
-# 2218| getQualifier(): [VariableAccess] (__begin)
-# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2218| ValueCategory = lvalue
-# 2218| getChild(5): [DeclStmt] declaration
-# 2218| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
-# 2218| Type = [Class] ClassWithDestructor
-# 2218| getVariable().getInitializer(): [Initializer] initializer for y
-# 2218| getExpr(): [OverloadedPointerDereferenceExpr] call to operator*
-# 2218| Type = [LValueReferenceType] ClassWithDestructor &
-# 2218| ValueCategory = prvalue
-# 2218| getQualifier(): [VariableAccess] (__begin)
-# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2218| ValueCategory = lvalue
+# 2219| getUpdate(): [FunctionCall] call to operator++
+# 2219| Type = [LValueReferenceType] iterator &
+# 2219| ValueCategory = prvalue
+# 2219| getQualifier(): [VariableAccess] (__begin)
+# 2219| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2219| ValueCategory = lvalue
+# 2219| getChild(5): [DeclStmt] declaration
+# 2219| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
+# 2219| Type = [Class] ClassWithDestructor
+# 2219| getVariable().getInitializer(): [Initializer] initializer for y
+# 2219| getExpr(): [OverloadedPointerDereferenceExpr] call to operator*
+# 2219| Type = [LValueReferenceType] ClassWithDestructor &
+# 2219| ValueCategory = prvalue
+# 2219| getQualifier(): [VariableAccess] (__begin)
+# 2219| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2219| ValueCategory = lvalue
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const iterator
#-----| ValueCategory = lvalue
-# 2218| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
-# 2218| Type = [Class] ClassWithDestructor
-# 2218| ValueCategory = prvalue(load)
-# 2218| getStmt(): [BlockStmt] { ... }
-# 2219| getStmt(0): [ExprStmt] ExprStmt
-# 2219| getExpr(): [FunctionCall] call to set_x
-# 2219| Type = [VoidType] void
-# 2219| ValueCategory = prvalue
-# 2219| getQualifier(): [VariableAccess] y
+# 2219| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 2219| Type = [Class] ClassWithDestructor
-# 2219| ValueCategory = lvalue
-# 2219| getArgument(0): [CharLiteral] 97
-# 2219| Type = [PlainCharType] char
-# 2219| Value = [CharLiteral] 97
-# 2219| ValueCategory = prvalue
-# 2220| getStmt(1): [IfStmt] if (...) ...
-# 2220| getCondition(): [EQExpr] ... == ...
-# 2220| Type = [BoolType] bool
+# 2219| ValueCategory = prvalue(load)
+# 2219| getStmt(): [BlockStmt] { ... }
+# 2220| getStmt(0): [ExprStmt] ExprStmt
+# 2220| getExpr(): [FunctionCall] call to set_x
+# 2220| Type = [VoidType] void
# 2220| ValueCategory = prvalue
-# 2220| getLeftOperand(): [FunctionCall] call to get_x
+# 2220| getQualifier(): [VariableAccess] y
+# 2220| Type = [Class] ClassWithDestructor
+# 2220| ValueCategory = lvalue
+# 2220| getArgument(0): [CharLiteral] 97
# 2220| Type = [PlainCharType] char
+# 2220| Value = [CharLiteral] 97
# 2220| ValueCategory = prvalue
-# 2220| getQualifier(): [VariableAccess] y
-# 2220| Type = [Class] ClassWithDestructor
-# 2220| ValueCategory = lvalue
-# 2220| getRightOperand(): [CharLiteral] 98
-# 2220| Type = [PlainCharType] char
-# 2220| Value = [CharLiteral] 98
-# 2220| ValueCategory = prvalue
-# 2220| getLeftOperand().getFullyConverted(): [CStyleCast] (int)...
-# 2220| Conversion = [IntegralConversion] integral conversion
-# 2220| Type = [IntType] int
-# 2220| ValueCategory = prvalue
-# 2220| getRightOperand().getFullyConverted(): [CStyleCast] (int)...
-# 2220| Conversion = [IntegralConversion] integral conversion
-# 2220| Type = [IntType] int
-# 2220| Value = [CStyleCast] 98
-# 2220| ValueCategory = prvalue
-# 2221| getThen(): [ReturnStmt] return ...
-# 2218| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2218| Type = [VoidType] void
-# 2218| ValueCategory = prvalue
-# 2218| getQualifier(): [VariableAccess] y
-# 2218| Type = [Class] ClassWithDestructor
-# 2218| ValueCategory = lvalue
-# 2218| getImplicitDestructorCall(1): [DestructorCall] call to ~vector
-# 2218| Type = [VoidType] void
-# 2218| ValueCategory = prvalue
-# 2218| getQualifier(): [VariableAccess] ys
-# 2218| Type = [ClassTemplateInstantiation,Struct] vector
-# 2218| ValueCategory = lvalue
-# 2233| getImplicitDestructorCall(2): [DestructorCall] call to ~ClassWithDestructor
-# 2233| Type = [VoidType] void
-# 2233| ValueCategory = prvalue
-# 2233| getQualifier(): [VariableAccess] x
-# 2233| Type = [Class] ClassWithDestructor
-# 2233| ValueCategory = lvalue
-# 2218| getImplicitDestructorCall(0): [DestructorCall] call to ~vector
-# 2218| Type = [VoidType] void
-# 2218| ValueCategory = prvalue
-# 2218| getQualifier(): [VariableAccess] ys
-# 2218| Type = [ClassTemplateInstantiation,Struct] vector
-# 2218| ValueCategory = lvalue
-# 2218| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
-# 2218| Type = [ClassTemplateInstantiation,Struct] iterator
-# 2218| ValueCategory = lvalue
-# 2218| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2218| Type = [VoidType] void
-# 2218| ValueCategory = prvalue
-# 2218| getQualifier(): [VariableAccess] y
-# 2218| Type = [Class] ClassWithDestructor
-# 2218| ValueCategory = lvalue
-# 2224| getStmt(7): [RangeBasedForStmt] for(...:...) ...
-# 2224| getInitialization(): [DeclStmt] declaration
-# 2224| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys
-# 2224| Type = [ClassTemplateInstantiation,Struct] vector
-# 2224| getVariable().getInitializer(): [Initializer] initializer for ys
-# 2224| getExpr(): [ConstructorCall] call to vector
-# 2224| Type = [VoidType] void
-# 2224| ValueCategory = prvalue
-# 2224| getArgument(0): [Literal] 1
-# 2224| Type = [IntType] int
-# 2224| Value = [Literal] 1
-# 2224| ValueCategory = prvalue
-# 2224| getChild(1): [DeclStmt] declaration
-# 2224| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range)
-# 2224| Type = [LValueReferenceType] vector &
+# 2221| getStmt(1): [IfStmt] if (...) ...
+# 2221| getCondition(): [EQExpr] ... == ...
+# 2221| Type = [BoolType] bool
+# 2221| ValueCategory = prvalue
+# 2221| getLeftOperand(): [FunctionCall] call to get_x
+# 2221| Type = [PlainCharType] char
+# 2221| ValueCategory = prvalue
+# 2221| getQualifier(): [VariableAccess] y
+# 2221| Type = [Class] ClassWithDestructor
+# 2221| ValueCategory = lvalue
+# 2221| getRightOperand(): [CharLiteral] 98
+# 2221| Type = [PlainCharType] char
+# 2221| Value = [CharLiteral] 98
+# 2221| ValueCategory = prvalue
+# 2221| getLeftOperand().getFullyConverted(): [CStyleCast] (int)...
+# 2221| Conversion = [IntegralConversion] integral conversion
+# 2221| Type = [IntType] int
+# 2221| ValueCategory = prvalue
+# 2221| getRightOperand().getFullyConverted(): [CStyleCast] (int)...
+# 2221| Conversion = [IntegralConversion] integral conversion
+# 2221| Type = [IntType] int
+# 2221| Value = [CStyleCast] 98
+# 2221| ValueCategory = prvalue
+# 2222| getThen(): [ReturnStmt] return ...
+# 2219| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2219| Type = [VoidType] void
+# 2219| ValueCategory = prvalue
+# 2219| getQualifier(): [VariableAccess] y
+# 2219| Type = [Class] ClassWithDestructor
+# 2219| ValueCategory = lvalue
+# 2219| getImplicitDestructorCall(1): [DestructorCall] call to ~vector
+# 2219| Type = [VoidType] void
+# 2219| ValueCategory = prvalue
+# 2219| getQualifier(): [VariableAccess] ys
+# 2219| Type = [ClassTemplateInstantiation,Struct] vector
+# 2219| ValueCategory = lvalue
+# 2234| getImplicitDestructorCall(2): [DestructorCall] call to ~ClassWithDestructor
+# 2234| Type = [VoidType] void
+# 2234| ValueCategory = prvalue
+# 2234| getQualifier(): [VariableAccess] x
+# 2234| Type = [Class] ClassWithDestructor
+# 2234| ValueCategory = lvalue
+# 2219| getImplicitDestructorCall(0): [DestructorCall] call to ~vector
+# 2219| Type = [VoidType] void
+# 2219| ValueCategory = prvalue
+# 2219| getQualifier(): [VariableAccess] ys
+# 2219| Type = [ClassTemplateInstantiation,Struct] vector
+# 2219| ValueCategory = lvalue
+# 2219| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
+# 2219| Type = [ClassTemplateInstantiation,Struct] iterator
+# 2219| ValueCategory = lvalue
+# 2219| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2219| Type = [VoidType] void
+# 2219| ValueCategory = prvalue
+# 2219| getQualifier(): [VariableAccess] y
+# 2219| Type = [Class] ClassWithDestructor
+# 2219| ValueCategory = lvalue
+# 2225| getStmt(7): [RangeBasedForStmt] for(...:...) ...
+# 2225| getInitialization(): [DeclStmt] declaration
+# 2225| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys
+# 2225| Type = [ClassTemplateInstantiation,Struct] vector
+# 2225| getVariable().getInitializer(): [Initializer] initializer for ys
+# 2225| getExpr(): [ConstructorCall] call to vector
+# 2225| Type = [VoidType] void
+# 2225| ValueCategory = prvalue
+# 2225| getArgument(0): [Literal] 1
+# 2225| Type = [IntType] int
+# 2225| Value = [Literal] 1
+# 2225| ValueCategory = prvalue
+# 2225| getChild(1): [DeclStmt] declaration
+# 2225| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range)
+# 2225| Type = [LValueReferenceType] vector &
#-----| getVariable().getInitializer(): [Initializer] initializer for (__range)
-# 2224| getExpr(): [VariableAccess] ys
-# 2224| Type = [ClassTemplateInstantiation,Struct] vector
-# 2224| ValueCategory = lvalue
-# 2224| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
-# 2224| Type = [LValueReferenceType] vector &
-# 2224| ValueCategory = prvalue
-# 2224| getBeginEndDeclaration(): [DeclStmt] declaration
-# 2224| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin)
-# 2224| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2225| getExpr(): [VariableAccess] ys
+# 2225| Type = [ClassTemplateInstantiation,Struct] vector
+# 2225| ValueCategory = lvalue
+# 2225| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
+# 2225| Type = [LValueReferenceType] vector &
+# 2225| ValueCategory = prvalue
+# 2225| getBeginEndDeclaration(): [DeclStmt] declaration
+# 2225| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin)
+# 2225| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin)
-# 2224| getExpr(): [FunctionCall] call to begin
-# 2224| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2224| ValueCategory = prvalue
-# 2224| getQualifier(): [VariableAccess] (__range)
-# 2224| Type = [LValueReferenceType] vector &
-# 2224| ValueCategory = prvalue(load)
+# 2225| getExpr(): [FunctionCall] call to begin
+# 2225| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2225| ValueCategory = prvalue
+# 2225| getQualifier(): [VariableAccess] (__range)
+# 2225| Type = [LValueReferenceType] vector &
+# 2225| ValueCategory = prvalue(load)
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const vector
@@ -19812,15 +19818,15 @@ ir.cpp:
#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
#-----| Type = [ClassTemplateInstantiation,Struct] vector
#-----| ValueCategory = lvalue
-# 2224| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end)
-# 2224| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2225| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end)
+# 2225| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
#-----| getVariable().getInitializer(): [Initializer] initializer for (__end)
-# 2224| getExpr(): [FunctionCall] call to end
-# 2224| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2224| ValueCategory = prvalue
-# 2224| getQualifier(): [VariableAccess] (__range)
-# 2224| Type = [LValueReferenceType] vector &
-# 2224| ValueCategory = prvalue(load)
+# 2225| getExpr(): [FunctionCall] call to end
+# 2225| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2225| ValueCategory = prvalue
+# 2225| getQualifier(): [VariableAccess] (__range)
+# 2225| Type = [LValueReferenceType] vector &
+# 2225| ValueCategory = prvalue(load)
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const vector
@@ -19828,18 +19834,18 @@ ir.cpp:
#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
#-----| Type = [ClassTemplateInstantiation,Struct] vector
#-----| ValueCategory = lvalue
-# 2224| getCondition(): [FunctionCall] call to operator!=
-# 2224| Type = [BoolType] bool
-# 2224| ValueCategory = prvalue
-# 2224| getQualifier(): [VariableAccess] (__begin)
-# 2224| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2224| ValueCategory = lvalue
-# 2224| getArgument(0): [ConstructorCall] call to iterator
-# 2224| Type = [VoidType] void
-# 2224| ValueCategory = prvalue
-# 2224| getArgument(0): [VariableAccess] (__end)
-# 2224| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2224| ValueCategory = lvalue
+# 2225| getCondition(): [FunctionCall] call to operator!=
+# 2225| Type = [BoolType] bool
+# 2225| ValueCategory = prvalue
+# 2225| getQualifier(): [VariableAccess] (__begin)
+# 2225| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2225| ValueCategory = lvalue
+# 2225| getArgument(0): [ConstructorCall] call to iterator
+# 2225| Type = [VoidType] void
+# 2225| ValueCategory = prvalue
+# 2225| getArgument(0): [VariableAccess] (__end)
+# 2225| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2225| ValueCategory = lvalue
#-----| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
#-----| Type = [LValueReferenceType] const iterator &
#-----| ValueCategory = prvalue
@@ -19854,103 +19860,103 @@ ir.cpp:
#-----| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
#-----| Type = [ClassTemplateInstantiation,Struct] iterator
#-----| ValueCategory = lvalue
-# 2224| getUpdate(): [FunctionCall] call to operator++
-# 2224| Type = [LValueReferenceType] iterator &
-# 2224| ValueCategory = prvalue
-# 2224| getQualifier(): [VariableAccess] (__begin)
-# 2224| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2224| ValueCategory = lvalue
-# 2224| getChild(5): [DeclStmt] declaration
-# 2224| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
-# 2224| Type = [IntType] int
-# 2224| getVariable().getInitializer(): [Initializer] initializer for y
-# 2224| getExpr(): [OverloadedPointerDereferenceExpr] call to operator*
-# 2224| Type = [LValueReferenceType] int &
-# 2224| ValueCategory = prvalue
-# 2224| getQualifier(): [VariableAccess] (__begin)
-# 2224| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2224| ValueCategory = lvalue
+# 2225| getUpdate(): [FunctionCall] call to operator++
+# 2225| Type = [LValueReferenceType] iterator &
+# 2225| ValueCategory = prvalue
+# 2225| getQualifier(): [VariableAccess] (__begin)
+# 2225| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2225| ValueCategory = lvalue
+# 2225| getChild(5): [DeclStmt] declaration
+# 2225| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
+# 2225| Type = [IntType] int
+# 2225| getVariable().getInitializer(): [Initializer] initializer for y
+# 2225| getExpr(): [OverloadedPointerDereferenceExpr] call to operator*
+# 2225| Type = [LValueReferenceType] int &
+# 2225| ValueCategory = prvalue
+# 2225| getQualifier(): [VariableAccess] (__begin)
+# 2225| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2225| ValueCategory = lvalue
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const iterator
#-----| ValueCategory = lvalue
-# 2224| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
-# 2224| Type = [IntType] int
-# 2224| ValueCategory = prvalue(load)
-# 2224| getStmt(): [BlockStmt] { ... }
-# 2225| getStmt(0): [IfStmt] if (...) ...
-# 2225| getCondition(): [EQExpr] ... == ...
-# 2225| Type = [BoolType] bool
-# 2225| ValueCategory = prvalue
-# 2225| getLeftOperand(): [VariableAccess] y
+# 2225| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 2225| Type = [IntType] int
# 2225| ValueCategory = prvalue(load)
-# 2225| getRightOperand(): [Literal] 1
-# 2225| Type = [IntType] int
-# 2225| Value = [Literal] 1
+# 2225| getStmt(): [BlockStmt] { ... }
+# 2226| getStmt(0): [IfStmt] if (...) ...
+# 2226| getCondition(): [EQExpr] ... == ...
+# 2226| Type = [BoolType] bool
+# 2226| ValueCategory = prvalue
+# 2226| getLeftOperand(): [VariableAccess] y
+# 2226| Type = [IntType] int
+# 2226| ValueCategory = prvalue(load)
+# 2226| getRightOperand(): [Literal] 1
+# 2226| Type = [IntType] int
+# 2226| Value = [Literal] 1
+# 2226| ValueCategory = prvalue
+# 2227| getThen(): [ReturnStmt] return ...
+# 2225| getImplicitDestructorCall(0): [DestructorCall] call to ~vector
+# 2225| Type = [VoidType] void
# 2225| ValueCategory = prvalue
-# 2226| getThen(): [ReturnStmt] return ...
-# 2224| getImplicitDestructorCall(0): [DestructorCall] call to ~vector
-# 2224| Type = [VoidType] void
-# 2224| ValueCategory = prvalue
-# 2224| getQualifier(): [VariableAccess] ys
-# 2224| Type = [ClassTemplateInstantiation,Struct] vector
-# 2224| ValueCategory = lvalue
-# 2233| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor
-# 2233| Type = [VoidType] void
-# 2233| ValueCategory = prvalue
-# 2233| getQualifier(): [VariableAccess] x
-# 2233| Type = [Class] ClassWithDestructor
-# 2233| ValueCategory = lvalue
-# 2224| getImplicitDestructorCall(0): [DestructorCall] call to ~vector
-# 2224| Type = [VoidType] void
-# 2224| ValueCategory = prvalue
-# 2224| getQualifier(): [VariableAccess] ys
-# 2224| Type = [ClassTemplateInstantiation,Struct] vector
-# 2224| ValueCategory = lvalue
-# 2224| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
-# 2224| Type = [ClassTemplateInstantiation,Struct] iterator
-# 2224| ValueCategory = lvalue
-# 2229| getStmt(8): [RangeBasedForStmt] for(...:...) ...
-# 2229| getInitialization(): [DeclStmt] declaration
-# 2229| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys
-# 2229| Type = [ClassTemplateInstantiation,Struct] vector
-# 2229| getVariable().getInitializer(): [Initializer] initializer for ys
-# 2229| getExpr(): [ConstructorCall] call to vector
-# 2229| Type = [VoidType] void
-# 2229| ValueCategory = prvalue
-# 2229| getArgument(0): [VariableAccess] x
-# 2229| Type = [Class] ClassWithDestructor
-# 2229| ValueCategory = prvalue(load)
-# 2229| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2229| Type = [VoidType] void
-# 2229| ValueCategory = prvalue
-# 2229| getQualifier(): [ReuseExpr] reuse of temporary object
-# 2229| Type = [Class] ClassWithDestructor
-# 2229| ValueCategory = xvalue
-# 2229| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
-# 2229| Type = [Class] ClassWithDestructor
-# 2229| ValueCategory = lvalue
-# 2229| getChild(1): [DeclStmt] declaration
-# 2229| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range)
-# 2229| Type = [LValueReferenceType] vector &
+# 2225| getQualifier(): [VariableAccess] ys
+# 2225| Type = [ClassTemplateInstantiation,Struct] vector
+# 2225| ValueCategory = lvalue
+# 2234| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor
+# 2234| Type = [VoidType] void
+# 2234| ValueCategory = prvalue
+# 2234| getQualifier(): [VariableAccess] x
+# 2234| Type = [Class] ClassWithDestructor
+# 2234| ValueCategory = lvalue
+# 2225| getImplicitDestructorCall(0): [DestructorCall] call to ~vector
+# 2225| Type = [VoidType] void
+# 2225| ValueCategory = prvalue
+# 2225| getQualifier(): [VariableAccess] ys
+# 2225| Type = [ClassTemplateInstantiation,Struct] vector
+# 2225| ValueCategory = lvalue
+# 2225| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
+# 2225| Type = [ClassTemplateInstantiation,Struct] iterator
+# 2225| ValueCategory = lvalue
+# 2230| getStmt(8): [RangeBasedForStmt] for(...:...) ...
+# 2230| getInitialization(): [DeclStmt] declaration
+# 2230| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys
+# 2230| Type = [ClassTemplateInstantiation,Struct] vector
+# 2230| getVariable().getInitializer(): [Initializer] initializer for ys
+# 2230| getExpr(): [ConstructorCall] call to vector
+# 2230| Type = [VoidType] void
+# 2230| ValueCategory = prvalue
+# 2230| getArgument(0): [VariableAccess] x
+# 2230| Type = [Class] ClassWithDestructor
+# 2230| ValueCategory = prvalue(load)
+# 2230| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2230| Type = [VoidType] void
+# 2230| ValueCategory = prvalue
+# 2230| getQualifier(): [ReuseExpr] reuse of temporary object
+# 2230| Type = [Class] ClassWithDestructor
+# 2230| ValueCategory = xvalue
+# 2230| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
+# 2230| Type = [Class] ClassWithDestructor
+# 2230| ValueCategory = lvalue
+# 2230| getChild(1): [DeclStmt] declaration
+# 2230| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range)
+# 2230| Type = [LValueReferenceType] vector &
#-----| getVariable().getInitializer(): [Initializer] initializer for (__range)
-# 2229| getExpr(): [VariableAccess] ys
-# 2229| Type = [ClassTemplateInstantiation,Struct] vector
-# 2229| ValueCategory = lvalue
-# 2229| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
-# 2229| Type = [LValueReferenceType] vector &
-# 2229| ValueCategory = prvalue
-# 2229| getBeginEndDeclaration(): [DeclStmt] declaration
-# 2229| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin)
-# 2229| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2230| getExpr(): [VariableAccess] ys
+# 2230| Type = [ClassTemplateInstantiation,Struct] vector
+# 2230| ValueCategory = lvalue
+# 2230| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
+# 2230| Type = [LValueReferenceType] vector &
+# 2230| ValueCategory = prvalue
+# 2230| getBeginEndDeclaration(): [DeclStmt] declaration
+# 2230| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin)
+# 2230| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin)
-# 2229| getExpr(): [FunctionCall] call to begin
-# 2229| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2229| ValueCategory = prvalue
-# 2229| getQualifier(): [VariableAccess] (__range)
-# 2229| Type = [LValueReferenceType] vector &
-# 2229| ValueCategory = prvalue(load)
+# 2230| getExpr(): [FunctionCall] call to begin
+# 2230| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2230| ValueCategory = prvalue
+# 2230| getQualifier(): [VariableAccess] (__range)
+# 2230| Type = [LValueReferenceType] vector &
+# 2230| ValueCategory = prvalue(load)
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const vector
@@ -19958,15 +19964,15 @@ ir.cpp:
#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
#-----| Type = [ClassTemplateInstantiation,Struct] vector
#-----| ValueCategory = lvalue
-# 2229| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end)
-# 2229| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2230| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end)
+# 2230| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
#-----| getVariable().getInitializer(): [Initializer] initializer for (__end)
-# 2229| getExpr(): [FunctionCall] call to end
-# 2229| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2229| ValueCategory = prvalue
-# 2229| getQualifier(): [VariableAccess] (__range)
-# 2229| Type = [LValueReferenceType] vector &
-# 2229| ValueCategory = prvalue(load)
+# 2230| getExpr(): [FunctionCall] call to end
+# 2230| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2230| ValueCategory = prvalue
+# 2230| getQualifier(): [VariableAccess] (__range)
+# 2230| Type = [LValueReferenceType] vector &
+# 2230| ValueCategory = prvalue(load)
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const vector
@@ -19974,18 +19980,18 @@ ir.cpp:
#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
#-----| Type = [ClassTemplateInstantiation,Struct] vector
#-----| ValueCategory = lvalue
-# 2229| getCondition(): [FunctionCall] call to operator!=
-# 2229| Type = [BoolType] bool
-# 2229| ValueCategory = prvalue
-# 2229| getQualifier(): [VariableAccess] (__begin)
-# 2229| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2229| ValueCategory = lvalue
-# 2229| getArgument(0): [ConstructorCall] call to iterator
-# 2229| Type = [VoidType] void
-# 2229| ValueCategory = prvalue
-# 2229| getArgument(0): [VariableAccess] (__end)
-# 2229| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2229| ValueCategory = lvalue
+# 2230| getCondition(): [FunctionCall] call to operator!=
+# 2230| Type = [BoolType] bool
+# 2230| ValueCategory = prvalue
+# 2230| getQualifier(): [VariableAccess] (__begin)
+# 2230| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2230| ValueCategory = lvalue
+# 2230| getArgument(0): [ConstructorCall] call to iterator
+# 2230| Type = [VoidType] void
+# 2230| ValueCategory = prvalue
+# 2230| getArgument(0): [VariableAccess] (__end)
+# 2230| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2230| ValueCategory = lvalue
#-----| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
#-----| Type = [LValueReferenceType] const iterator &
#-----| ValueCategory = prvalue
@@ -20000,584 +20006,584 @@ ir.cpp:
#-----| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
#-----| Type = [ClassTemplateInstantiation,Struct] iterator
#-----| ValueCategory = lvalue
-# 2229| getUpdate(): [FunctionCall] call to operator++
-# 2229| Type = [LValueReferenceType] iterator &
-# 2229| ValueCategory = prvalue
-# 2229| getQualifier(): [VariableAccess] (__begin)
-# 2229| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2229| ValueCategory = lvalue
-# 2229| getChild(5): [DeclStmt] declaration
-# 2229| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
-# 2229| Type = [Class] ClassWithDestructor
-# 2229| getVariable().getInitializer(): [Initializer] initializer for y
-# 2229| getExpr(): [OverloadedPointerDereferenceExpr] call to operator*
-# 2229| Type = [LValueReferenceType] ClassWithDestructor &
-# 2229| ValueCategory = prvalue
-# 2229| getQualifier(): [VariableAccess] (__begin)
-# 2229| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2229| ValueCategory = lvalue
+# 2230| getUpdate(): [FunctionCall] call to operator++
+# 2230| Type = [LValueReferenceType] iterator &
+# 2230| ValueCategory = prvalue
+# 2230| getQualifier(): [VariableAccess] (__begin)
+# 2230| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2230| ValueCategory = lvalue
+# 2230| getChild(5): [DeclStmt] declaration
+# 2230| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
+# 2230| Type = [Class] ClassWithDestructor
+# 2230| getVariable().getInitializer(): [Initializer] initializer for y
+# 2230| getExpr(): [OverloadedPointerDereferenceExpr] call to operator*
+# 2230| Type = [LValueReferenceType] ClassWithDestructor &
+# 2230| ValueCategory = prvalue
+# 2230| getQualifier(): [VariableAccess] (__begin)
+# 2230| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2230| ValueCategory = lvalue
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const iterator
#-----| ValueCategory = lvalue
-# 2229| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
-# 2229| Type = [Class] ClassWithDestructor
-# 2229| ValueCategory = prvalue(load)
-# 2229| getStmt(): [BlockStmt] { ... }
-# 2230| getStmt(0): [DeclStmt] declaration
-# 2230| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z1
-# 2230| Type = [Class] ClassWithDestructor
-# 2230| getVariable().getInitializer(): [Initializer] initializer for z1
-# 2230| getExpr(): [ConstructorCall] call to ClassWithDestructor
-# 2230| Type = [VoidType] void
-# 2230| ValueCategory = prvalue
-# 2231| getStmt(1): [DeclStmt] declaration
-# 2231| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z2
+# 2230| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
+# 2230| Type = [Class] ClassWithDestructor
+# 2230| ValueCategory = prvalue(load)
+# 2230| getStmt(): [BlockStmt] { ... }
+# 2231| getStmt(0): [DeclStmt] declaration
+# 2231| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z1
# 2231| Type = [Class] ClassWithDestructor
-# 2231| getVariable().getInitializer(): [Initializer] initializer for z2
+# 2231| getVariable().getInitializer(): [Initializer] initializer for z1
# 2231| getExpr(): [ConstructorCall] call to ClassWithDestructor
# 2231| Type = [VoidType] void
# 2231| ValueCategory = prvalue
-# 2232| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2232| Type = [VoidType] void
-# 2232| ValueCategory = prvalue
-# 2232| getQualifier(): [VariableAccess] z2
+# 2232| getStmt(1): [DeclStmt] declaration
+# 2232| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z2
# 2232| Type = [Class] ClassWithDestructor
-# 2232| ValueCategory = lvalue
-# 2232| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor
-# 2232| Type = [VoidType] void
-# 2232| ValueCategory = prvalue
-# 2232| getQualifier(): [VariableAccess] z1
-# 2232| Type = [Class] ClassWithDestructor
-# 2232| ValueCategory = lvalue
-# 2229| getImplicitDestructorCall(0): [DestructorCall] call to ~vector
-# 2229| Type = [VoidType] void
-# 2229| ValueCategory = prvalue
-# 2229| getQualifier(): [VariableAccess] ys
-# 2229| Type = [ClassTemplateInstantiation,Struct] vector
-# 2229| ValueCategory = lvalue
-# 2229| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
-# 2229| Type = [ClassTemplateInstantiation,Struct] iterator
-# 2229| ValueCategory = lvalue
-# 2229| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2229| Type = [VoidType] void
-# 2229| ValueCategory = prvalue
-# 2229| getQualifier(): [VariableAccess] y
-# 2229| Type = [Class] ClassWithDestructor
-# 2229| ValueCategory = lvalue
-# 2233| getStmt(9): [ReturnStmt] return ...
-# 2233| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2233| Type = [VoidType] void
-# 2233| ValueCategory = prvalue
-# 2233| getQualifier(): [VariableAccess] x
-# 2233| Type = [Class] ClassWithDestructor
-# 2233| ValueCategory = lvalue
-# 2235| [TopLevelFunction] void static_variable_with_destructor_1()
-# 2235| :
-# 2235| getEntryPoint(): [BlockStmt] { ... }
-# 2236| getStmt(0): [DeclStmt] declaration
-# 2236| getDeclarationEntry(0): [VariableDeclarationEntry] definition of a
-# 2236| Type = [Class] ClassWithDestructor
-# 2236| getVariable().getInitializer(): [Initializer] initializer for a
-# 2236| getExpr(): [ConstructorCall] call to ClassWithDestructor
-# 2236| Type = [VoidType] void
-# 2236| ValueCategory = prvalue
-# 2237| getStmt(1): [DeclStmt] declaration
-# 2237| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b
+# 2232| getVariable().getInitializer(): [Initializer] initializer for z2
+# 2232| getExpr(): [ConstructorCall] call to ClassWithDestructor
+# 2232| Type = [VoidType] void
+# 2232| ValueCategory = prvalue
+# 2233| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2233| Type = [VoidType] void
+# 2233| ValueCategory = prvalue
+# 2233| getQualifier(): [VariableAccess] z2
+# 2233| Type = [Class] ClassWithDestructor
+# 2233| ValueCategory = lvalue
+# 2233| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor
+# 2233| Type = [VoidType] void
+# 2233| ValueCategory = prvalue
+# 2233| getQualifier(): [VariableAccess] z1
+# 2233| Type = [Class] ClassWithDestructor
+# 2233| ValueCategory = lvalue
+# 2230| getImplicitDestructorCall(0): [DestructorCall] call to ~vector
+# 2230| Type = [VoidType] void
+# 2230| ValueCategory = prvalue
+# 2230| getQualifier(): [VariableAccess] ys
+# 2230| Type = [ClassTemplateInstantiation,Struct] vector
+# 2230| ValueCategory = lvalue
+# 2230| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
+# 2230| Type = [ClassTemplateInstantiation,Struct] iterator
+# 2230| ValueCategory = lvalue
+# 2230| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2230| Type = [VoidType] void
+# 2230| ValueCategory = prvalue
+# 2230| getQualifier(): [VariableAccess] y
+# 2230| Type = [Class] ClassWithDestructor
+# 2230| ValueCategory = lvalue
+# 2234| getStmt(9): [ReturnStmt] return ...
+# 2234| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2234| Type = [VoidType] void
+# 2234| ValueCategory = prvalue
+# 2234| getQualifier(): [VariableAccess] x
+# 2234| Type = [Class] ClassWithDestructor
+# 2234| ValueCategory = lvalue
+# 2236| [TopLevelFunction] void static_variable_with_destructor_1()
+# 2236| :
+# 2236| getEntryPoint(): [BlockStmt] { ... }
+# 2237| getStmt(0): [DeclStmt] declaration
+# 2237| getDeclarationEntry(0): [VariableDeclarationEntry] definition of a
# 2237| Type = [Class] ClassWithDestructor
+# 2237| getVariable().getInitializer(): [Initializer] initializer for a
+# 2237| getExpr(): [ConstructorCall] call to ClassWithDestructor
+# 2237| Type = [VoidType] void
+# 2237| ValueCategory = prvalue
+# 2238| getStmt(1): [DeclStmt] declaration
+# 2238| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b
+# 2238| Type = [Class] ClassWithDestructor
#-----| getVariable().getInitializer(): [Initializer] initializer for b
#-----| getExpr(): [ConstructorCall] call to ClassWithDestructor
#-----| Type = [VoidType] void
#-----| ValueCategory = prvalue
-# 2238| getStmt(2): [ReturnStmt] return ...
-# 2238| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2238| Type = [VoidType] void
-# 2238| ValueCategory = prvalue
-# 2238| getQualifier(): [VariableAccess] a
-# 2238| Type = [Class] ClassWithDestructor
-# 2238| ValueCategory = lvalue
-# 2240| [TopLevelFunction] void static_variable_with_destructor_2()
-# 2240| :
-# 2240| getEntryPoint(): [BlockStmt] { ... }
-# 2241| getStmt(0): [DeclStmt] declaration
-# 2241| getDeclarationEntry(0): [VariableDeclarationEntry] definition of a
-# 2241| Type = [Class] ClassWithDestructor
+# 2239| getStmt(2): [ReturnStmt] return ...
+# 2239| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2239| Type = [VoidType] void
+# 2239| ValueCategory = prvalue
+# 2239| getQualifier(): [VariableAccess] a
+# 2239| Type = [Class] ClassWithDestructor
+# 2239| ValueCategory = lvalue
+# 2241| [TopLevelFunction] void static_variable_with_destructor_2()
+# 2241| :
+# 2241| getEntryPoint(): [BlockStmt] { ... }
+# 2242| getStmt(0): [DeclStmt] declaration
+# 2242| getDeclarationEntry(0): [VariableDeclarationEntry] definition of a
+# 2242| Type = [Class] ClassWithDestructor
#-----| getVariable().getInitializer(): [Initializer] initializer for a
#-----| getExpr(): [ConstructorCall] call to ClassWithDestructor
#-----| Type = [VoidType] void
#-----| ValueCategory = prvalue
-# 2242| getStmt(1): [DeclStmt] declaration
-# 2242| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b
-# 2242| Type = [Class] ClassWithDestructor
-# 2242| getVariable().getInitializer(): [Initializer] initializer for b
-# 2242| getExpr(): [ConstructorCall] call to ClassWithDestructor
-# 2242| Type = [VoidType] void
-# 2242| ValueCategory = prvalue
-# 2243| getStmt(2): [ReturnStmt] return ...
-# 2243| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2243| Type = [VoidType] void
-# 2243| ValueCategory = prvalue
-# 2243| getQualifier(): [VariableAccess] b
-# 2243| Type = [Class] ClassWithDestructor
-# 2243| ValueCategory = lvalue
-# 2245| [TopLevelFunction] void static_variable_with_destructor_3()
-# 2245| :
-# 2245| getEntryPoint(): [BlockStmt] { ... }
-# 2246| getStmt(0): [DeclStmt] declaration
-# 2246| getDeclarationEntry(0): [VariableDeclarationEntry] definition of a
-# 2246| Type = [Class] ClassWithDestructor
-# 2246| getVariable().getInitializer(): [Initializer] initializer for a
-# 2246| getExpr(): [ConstructorCall] call to ClassWithDestructor
-# 2246| Type = [VoidType] void
-# 2246| ValueCategory = prvalue
-# 2247| getStmt(1): [DeclStmt] declaration
-# 2247| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b
+# 2243| getStmt(1): [DeclStmt] declaration
+# 2243| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b
+# 2243| Type = [Class] ClassWithDestructor
+# 2243| getVariable().getInitializer(): [Initializer] initializer for b
+# 2243| getExpr(): [ConstructorCall] call to ClassWithDestructor
+# 2243| Type = [VoidType] void
+# 2243| ValueCategory = prvalue
+# 2244| getStmt(2): [ReturnStmt] return ...
+# 2244| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2244| Type = [VoidType] void
+# 2244| ValueCategory = prvalue
+# 2244| getQualifier(): [VariableAccess] b
+# 2244| Type = [Class] ClassWithDestructor
+# 2244| ValueCategory = lvalue
+# 2246| [TopLevelFunction] void static_variable_with_destructor_3()
+# 2246| :
+# 2246| getEntryPoint(): [BlockStmt] { ... }
+# 2247| getStmt(0): [DeclStmt] declaration
+# 2247| getDeclarationEntry(0): [VariableDeclarationEntry] definition of a
# 2247| Type = [Class] ClassWithDestructor
-# 2247| getVariable().getInitializer(): [Initializer] initializer for b
+# 2247| getVariable().getInitializer(): [Initializer] initializer for a
# 2247| getExpr(): [ConstructorCall] call to ClassWithDestructor
# 2247| Type = [VoidType] void
# 2247| ValueCategory = prvalue
-# 2248| getStmt(2): [DeclStmt] declaration
-# 2248| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c
+# 2248| getStmt(1): [DeclStmt] declaration
+# 2248| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b
# 2248| Type = [Class] ClassWithDestructor
+# 2248| getVariable().getInitializer(): [Initializer] initializer for b
+# 2248| getExpr(): [ConstructorCall] call to ClassWithDestructor
+# 2248| Type = [VoidType] void
+# 2248| ValueCategory = prvalue
+# 2249| getStmt(2): [DeclStmt] declaration
+# 2249| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c
+# 2249| Type = [Class] ClassWithDestructor
#-----| getVariable().getInitializer(): [Initializer] initializer for c
#-----| getExpr(): [ConstructorCall] call to ClassWithDestructor
#-----| Type = [VoidType] void
#-----| ValueCategory = prvalue
-# 2249| getStmt(3): [ReturnStmt] return ...
-# 2249| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2249| Type = [VoidType] void
-# 2249| ValueCategory = prvalue
-# 2249| getQualifier(): [VariableAccess] b
-# 2249| Type = [Class] ClassWithDestructor
-# 2249| ValueCategory = lvalue
-# 2249| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor
-# 2249| Type = [VoidType] void
-# 2249| ValueCategory = prvalue
-# 2249| getQualifier(): [VariableAccess] a
-# 2249| Type = [Class] ClassWithDestructor
-# 2249| ValueCategory = lvalue
-# 2251| [GlobalVariable] ClassWithDestructor global_class_with_destructor
-# 2251| getInitializer(): [Initializer] initializer for global_class_with_destructor
-# 2251| getExpr(): [ConstructorCall] call to ClassWithDestructor
-# 2251| Type = [VoidType] void
-# 2251| ValueCategory = prvalue
-# 2255| [FunctionTemplateInstantiation,TopLevelFunction] ClassWithDestructor& vacuous_destructor_call::get(ClassWithDestructor&)
-# 2255| :
-# 2255| getParameter(0): [Parameter] t
-# 2255| Type = [LValueReferenceType] ClassWithDestructor &
-# 2255| getEntryPoint(): [BlockStmt] { ... }
-# 2255| getStmt(0): [ReturnStmt] return ...
-# 2255| getExpr(): [VariableAccess] t
-# 2255| Type = [LValueReferenceType] ClassWithDestructor &
-# 2255| ValueCategory = prvalue(load)
-# 2255| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
-# 2255| Type = [LValueReferenceType] ClassWithDestructor &
-# 2255| ValueCategory = prvalue
-# 2255| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
-# 2255| Type = [Class] ClassWithDestructor
-# 2255| ValueCategory = lvalue
-# 2255| [TemplateFunction,TopLevelFunction] T& vacuous_destructor_call::get(T&)
-# 2255| :
-# 2255| getParameter(0): [Parameter] t
-# 2255| Type = [LValueReferenceType] T &
-# 2255| getEntryPoint(): [BlockStmt] { ... }
-# 2255| getStmt(0): [ReturnStmt] return ...
-# 2255| getExpr(): [VariableAccess] t
-# 2255| Type = [LValueReferenceType] T &
-# 2255| ValueCategory = prvalue(load)
-# 2255| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
-# 2255| Type = [TemplateParameter] T
-# 2255| ValueCategory = lvalue
-# 2255| [FunctionTemplateInstantiation,TopLevelFunction] int& vacuous_destructor_call::get(int&)
-# 2255| :
-# 2255| getParameter(0): [Parameter] t
-# 2255| Type = [LValueReferenceType] int &
-# 2255| getEntryPoint(): [BlockStmt] { ... }
-# 2255| getStmt(0): [ReturnStmt] return ...
-# 2255| getExpr(): [VariableAccess] t
-# 2255| Type = [LValueReferenceType] int &
-# 2255| ValueCategory = prvalue(load)
-# 2255| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
-# 2255| Type = [LValueReferenceType] int &
-# 2255| ValueCategory = prvalue
-# 2255| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
-# 2255| Type = [IntType] int
-# 2255| ValueCategory = lvalue
-# 2258| [FunctionTemplateInstantiation,TopLevelFunction] void vacuous_destructor_call::call_destructor(ClassWithDestructor&)
-# 2258| :
-# 2258| getParameter(0): [Parameter] t
-# 2258| Type = [LValueReferenceType] ClassWithDestructor &
-# 2258| getEntryPoint(): [BlockStmt] { ... }
-# 2259| getStmt(0): [ExprStmt] ExprStmt
-# 2259| getExpr(): [DestructorCall] call to ~ClassWithDestructor
-# 2259| Type = [VoidType] void
-# 2259| ValueCategory = prvalue
-# 2259| getQualifier(): [FunctionCall] call to get
-# 2259| Type = [LValueReferenceType] ClassWithDestructor &
-# 2259| ValueCategory = prvalue
-# 2259| getArgument(0): [VariableAccess] t
-# 2259| Type = [LValueReferenceType] ClassWithDestructor &
-# 2259| ValueCategory = prvalue(load)
-# 2259| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
-# 2259| Type = [LValueReferenceType] ClassWithDestructor &
-# 2259| ValueCategory = prvalue
-# 2259| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
-# 2259| Type = [Class] ClassWithDestructor
-# 2259| ValueCategory = lvalue
-# 2259| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
-# 2259| Type = [Class] ClassWithDestructor
-# 2259| ValueCategory = lvalue
-# 2260| getStmt(1): [ReturnStmt] return ...
-# 2258| [TemplateFunction,TopLevelFunction] void vacuous_destructor_call::call_destructor(T&)
-# 2258| :
-# 2258| getParameter(0): [Parameter] t
-# 2258| Type = [LValueReferenceType] T &
-# 2258| getEntryPoint(): [BlockStmt] { ... }
-# 2259| getStmt(0): [ExprStmt] ExprStmt
-# 2259| getExpr(): [ExprCall] call to expression
-# 2259| Type = [UnknownType] unknown
-# 2259| ValueCategory = prvalue
-# 2259| getExpr(): [Literal] Unknown literal
-# 2259| Type = [UnknownType] unknown
-# 2259| ValueCategory = prvalue
-# 2259| getChild(-1): [ExprCall] call to expression
-# 2259| Type = [UnknownType] unknown
-# 2259| ValueCategory = prvalue
-# 2259| getExpr(): [Literal] Unknown literal
-# 2259| Type = [UnknownType] unknown
-# 2259| ValueCategory = prvalue
-# 2259| getArgument(0): [VariableAccess] t
-# 2259| Type = [LValueReferenceType] T &
-# 2259| ValueCategory = prvalue(load)
-# 2259| getArgument(0).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
-# 2259| Type = [TemplateParameter] T
-# 2259| ValueCategory = lvalue
-# 2260| getStmt(1): [ReturnStmt] return ...
-# 2258| [FunctionTemplateInstantiation,TopLevelFunction] void vacuous_destructor_call::call_destructor(int&)
-# 2258| :
-# 2258| getParameter(0): [Parameter] t
-# 2258| Type = [LValueReferenceType] int &
-# 2258| getEntryPoint(): [BlockStmt] { ... }
-# 2259| getStmt(0): [ExprStmt] ExprStmt
-# 2259| getExpr(): [VacuousDestructorCall] (vacuous destructor call)
-# 2259| Type = [VoidType] void
-# 2259| ValueCategory = prvalue
-# 2259| getChild(0): [FunctionCall] call to get
-# 2259| Type = [LValueReferenceType] int &
-# 2259| ValueCategory = prvalue
-# 2259| getArgument(0): [VariableAccess] t
-# 2259| Type = [LValueReferenceType] int &
-# 2259| ValueCategory = prvalue(load)
-# 2259| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
-# 2259| Type = [LValueReferenceType] int &
-# 2259| ValueCategory = prvalue
-# 2259| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
-# 2259| Type = [IntType] int
-# 2259| ValueCategory = lvalue
-# 2259| getChild(0).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
-# 2259| Type = [IntType] int
-# 2259| ValueCategory = lvalue
-# 2260| getStmt(1): [ReturnStmt] return ...
-# 2262| [TopLevelFunction] void vacuous_destructor_call::non_vacuous_destructor_call()
-# 2262| :
-# 2262| getEntryPoint(): [BlockStmt] { ... }
-# 2263| getStmt(0): [DeclStmt] declaration
-# 2263| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c
-# 2263| Type = [Class] ClassWithDestructor
-# 2263| getVariable().getInitializer(): [Initializer] initializer for c
-# 2263| getExpr(): [ConstructorCall] call to ClassWithDestructor
-# 2263| Type = [VoidType] void
-# 2263| ValueCategory = prvalue
-# 2264| getStmt(1): [ExprStmt] ExprStmt
-# 2264| getExpr(): [FunctionCall] call to call_destructor
-# 2264| Type = [VoidType] void
-# 2264| ValueCategory = prvalue
-# 2264| getArgument(0): [VariableAccess] c
-# 2264| Type = [Class] ClassWithDestructor
-# 2264| ValueCategory = lvalue
-# 2264| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
-# 2264| Type = [LValueReferenceType] ClassWithDestructor &
-# 2264| ValueCategory = prvalue
-# 2265| getStmt(2): [ReturnStmt] return ...
-# 2265| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2250| getStmt(3): [ReturnStmt] return ...
+# 2250| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2250| Type = [VoidType] void
+# 2250| ValueCategory = prvalue
+# 2250| getQualifier(): [VariableAccess] b
+# 2250| Type = [Class] ClassWithDestructor
+# 2250| ValueCategory = lvalue
+# 2250| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor
+# 2250| Type = [VoidType] void
+# 2250| ValueCategory = prvalue
+# 2250| getQualifier(): [VariableAccess] a
+# 2250| Type = [Class] ClassWithDestructor
+# 2250| ValueCategory = lvalue
+# 2252| [GlobalVariable] ClassWithDestructor global_class_with_destructor
+# 2252| getInitializer(): [Initializer] initializer for global_class_with_destructor
+# 2252| getExpr(): [ConstructorCall] call to ClassWithDestructor
+# 2252| Type = [VoidType] void
+# 2252| ValueCategory = prvalue
+# 2256| [FunctionTemplateInstantiation,TopLevelFunction] ClassWithDestructor& vacuous_destructor_call::get(ClassWithDestructor&)
+# 2256| :
+# 2256| getParameter(0): [Parameter] t
+# 2256| Type = [LValueReferenceType] ClassWithDestructor &
+# 2256| getEntryPoint(): [BlockStmt] { ... }
+# 2256| getStmt(0): [ReturnStmt] return ...
+# 2256| getExpr(): [VariableAccess] t
+# 2256| Type = [LValueReferenceType] ClassWithDestructor &
+# 2256| ValueCategory = prvalue(load)
+# 2256| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
+# 2256| Type = [LValueReferenceType] ClassWithDestructor &
+# 2256| ValueCategory = prvalue
+# 2256| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
+# 2256| Type = [Class] ClassWithDestructor
+# 2256| ValueCategory = lvalue
+# 2256| [TemplateFunction,TopLevelFunction] T& vacuous_destructor_call::get(T&)
+# 2256| :
+# 2256| getParameter(0): [Parameter] t
+# 2256| Type = [LValueReferenceType] T &
+# 2256| getEntryPoint(): [BlockStmt] { ... }
+# 2256| getStmt(0): [ReturnStmt] return ...
+# 2256| getExpr(): [VariableAccess] t
+# 2256| Type = [LValueReferenceType] T &
+# 2256| ValueCategory = prvalue(load)
+# 2256| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
+# 2256| Type = [TemplateParameter] T
+# 2256| ValueCategory = lvalue
+# 2256| [FunctionTemplateInstantiation,TopLevelFunction] int& vacuous_destructor_call::get(int&)
+# 2256| :
+# 2256| getParameter(0): [Parameter] t
+# 2256| Type = [LValueReferenceType] int &
+# 2256| getEntryPoint(): [BlockStmt] { ... }
+# 2256| getStmt(0): [ReturnStmt] return ...
+# 2256| getExpr(): [VariableAccess] t
+# 2256| Type = [LValueReferenceType] int &
+# 2256| ValueCategory = prvalue(load)
+# 2256| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
+# 2256| Type = [LValueReferenceType] int &
+# 2256| ValueCategory = prvalue
+# 2256| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
+# 2256| Type = [IntType] int
+# 2256| ValueCategory = lvalue
+# 2259| [FunctionTemplateInstantiation,TopLevelFunction] void vacuous_destructor_call::call_destructor(ClassWithDestructor&)
+# 2259| :
+# 2259| getParameter(0): [Parameter] t
+# 2259| Type = [LValueReferenceType] ClassWithDestructor &
+# 2259| getEntryPoint(): [BlockStmt] { ... }
+# 2260| getStmt(0): [ExprStmt] ExprStmt
+# 2260| getExpr(): [DestructorCall] call to ~ClassWithDestructor
+# 2260| Type = [VoidType] void
+# 2260| ValueCategory = prvalue
+# 2260| getQualifier(): [FunctionCall] call to get
+# 2260| Type = [LValueReferenceType] ClassWithDestructor &
+# 2260| ValueCategory = prvalue
+# 2260| getArgument(0): [VariableAccess] t
+# 2260| Type = [LValueReferenceType] ClassWithDestructor &
+# 2260| ValueCategory = prvalue(load)
+# 2260| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
+# 2260| Type = [LValueReferenceType] ClassWithDestructor &
+# 2260| ValueCategory = prvalue
+# 2260| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
+# 2260| Type = [Class] ClassWithDestructor
+# 2260| ValueCategory = lvalue
+# 2260| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
+# 2260| Type = [Class] ClassWithDestructor
+# 2260| ValueCategory = lvalue
+# 2261| getStmt(1): [ReturnStmt] return ...
+# 2259| [TemplateFunction,TopLevelFunction] void vacuous_destructor_call::call_destructor(T&)
+# 2259| :
+# 2259| getParameter(0): [Parameter] t
+# 2259| Type = [LValueReferenceType] T &
+# 2259| getEntryPoint(): [BlockStmt] { ... }
+# 2260| getStmt(0): [ExprStmt] ExprStmt
+# 2260| getExpr(): [ExprCall] call to expression
+# 2260| Type = [UnknownType] unknown
+# 2260| ValueCategory = prvalue
+# 2260| getExpr(): [Literal] Unknown literal
+# 2260| Type = [UnknownType] unknown
+# 2260| ValueCategory = prvalue
+# 2260| getChild(-1): [ExprCall] call to expression
+# 2260| Type = [UnknownType] unknown
+# 2260| ValueCategory = prvalue
+# 2260| getExpr(): [Literal] Unknown literal
+# 2260| Type = [UnknownType] unknown
+# 2260| ValueCategory = prvalue
+# 2260| getArgument(0): [VariableAccess] t
+# 2260| Type = [LValueReferenceType] T &
+# 2260| ValueCategory = prvalue(load)
+# 2260| getArgument(0).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
+# 2260| Type = [TemplateParameter] T
+# 2260| ValueCategory = lvalue
+# 2261| getStmt(1): [ReturnStmt] return ...
+# 2259| [FunctionTemplateInstantiation,TopLevelFunction] void vacuous_destructor_call::call_destructor(int&)
+# 2259| :
+# 2259| getParameter(0): [Parameter] t
+# 2259| Type = [LValueReferenceType] int &
+# 2259| getEntryPoint(): [BlockStmt] { ... }
+# 2260| getStmt(0): [ExprStmt] ExprStmt
+# 2260| getExpr(): [VacuousDestructorCall] (vacuous destructor call)
+# 2260| Type = [VoidType] void
+# 2260| ValueCategory = prvalue
+# 2260| getChild(0): [FunctionCall] call to get
+# 2260| Type = [LValueReferenceType] int &
+# 2260| ValueCategory = prvalue
+# 2260| getArgument(0): [VariableAccess] t
+# 2260| Type = [LValueReferenceType] int &
+# 2260| ValueCategory = prvalue(load)
+# 2260| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
+# 2260| Type = [LValueReferenceType] int &
+# 2260| ValueCategory = prvalue
+# 2260| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
+# 2260| Type = [IntType] int
+# 2260| ValueCategory = lvalue
+# 2260| getChild(0).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
+# 2260| Type = [IntType] int
+# 2260| ValueCategory = lvalue
+# 2261| getStmt(1): [ReturnStmt] return ...
+# 2263| [TopLevelFunction] void vacuous_destructor_call::non_vacuous_destructor_call()
+# 2263| :
+# 2263| getEntryPoint(): [BlockStmt] { ... }
+# 2264| getStmt(0): [DeclStmt] declaration
+# 2264| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c
+# 2264| Type = [Class] ClassWithDestructor
+# 2264| getVariable().getInitializer(): [Initializer] initializer for c
+# 2264| getExpr(): [ConstructorCall] call to ClassWithDestructor
+# 2264| Type = [VoidType] void
+# 2264| ValueCategory = prvalue
+# 2265| getStmt(1): [ExprStmt] ExprStmt
+# 2265| getExpr(): [FunctionCall] call to call_destructor
# 2265| Type = [VoidType] void
# 2265| ValueCategory = prvalue
-# 2265| getQualifier(): [VariableAccess] c
+# 2265| getArgument(0): [VariableAccess] c
# 2265| Type = [Class] ClassWithDestructor
# 2265| ValueCategory = lvalue
-# 2267| [TopLevelFunction] void vacuous_destructor_call::vacuous_destructor_call()
-# 2267| :
-# 2267| getEntryPoint(): [BlockStmt] { ... }
-# 2268| getStmt(0): [DeclStmt] declaration
-# 2268| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i
-# 2268| Type = [IntType] int
-# 2269| getStmt(1): [ExprStmt] ExprStmt
-# 2269| getExpr(): [FunctionCall] call to call_destructor
-# 2269| Type = [VoidType] void
-# 2269| ValueCategory = prvalue
-# 2269| getArgument(0): [VariableAccess] i
-# 2269| Type = [IntType] int
-# 2269| ValueCategory = lvalue
-# 2269| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
-# 2269| Type = [LValueReferenceType] int &
-# 2269| ValueCategory = prvalue
-# 2270| getStmt(2): [ReturnStmt] return ...
-# 2273| [TopLevelFunction] void TryCatchDestructors(bool)
-# 2273| :
-# 2273| getParameter(0): [Parameter] b
-# 2273| Type = [BoolType] bool
-# 2273| getEntryPoint(): [BlockStmt] { ... }
-# 2274| getStmt(0): [TryStmt] try { ... }
-# 2274| getStmt(): [BlockStmt] { ... }
-# 2275| getStmt(0): [DeclStmt] declaration
-# 2275| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
-# 2275| Type = [Struct] String
-# 2275| getVariable().getInitializer(): [Initializer] initializer for s
-# 2275| getExpr(): [ConstructorCall] call to String
-# 2275| Type = [VoidType] void
-# 2275| ValueCategory = prvalue
-# 2276| getStmt(1): [IfStmt] if (...) ...
-# 2276| getCondition(): [VariableAccess] b
-# 2276| Type = [BoolType] bool
-# 2276| ValueCategory = prvalue(load)
-# 2276| getThen(): [BlockStmt] { ... }
-# 2277| getStmt(0): [ExprStmt] ExprStmt
-# 2277| getExpr(): [ThrowExpr] throw ...
-# 2277| Type = [PointerType] const char *
-# 2277| ValueCategory = prvalue
-# 2277| getExpr(): string literal
-# 2277| Type = [ArrayType] const char[15]
-# 2277| Value = [StringLiteral] "string literal"
-# 2277| ValueCategory = lvalue
-# 2280| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2280| Type = [VoidType] void
-# 2280| ValueCategory = prvalue
-# 2280| getQualifier(): [VariableAccess] s
-# 2280| Type = [Struct] String
-# 2280| ValueCategory = lvalue
-# 2277| getExpr().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
-# 2277| Type = [PointerType] const char *
-# 2277| ValueCategory = prvalue
-# 2279| getStmt(2): [DeclStmt] declaration
-# 2279| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2
-# 2279| Type = [Struct] String
-# 2279| getVariable().getInitializer(): [Initializer] initializer for s2
-# 2279| getExpr(): [ConstructorCall] call to String
-# 2279| Type = [VoidType] void
-# 2279| ValueCategory = prvalue
-# 2280| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2280| Type = [VoidType] void
-# 2280| ValueCategory = prvalue
-# 2280| getQualifier(): [VariableAccess] s2
+# 2265| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
+# 2265| Type = [LValueReferenceType] ClassWithDestructor &
+# 2265| ValueCategory = prvalue
+# 2266| getStmt(2): [ReturnStmt] return ...
+# 2266| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2266| Type = [VoidType] void
+# 2266| ValueCategory = prvalue
+# 2266| getQualifier(): [VariableAccess] c
+# 2266| Type = [Class] ClassWithDestructor
+# 2266| ValueCategory = lvalue
+# 2268| [TopLevelFunction] void vacuous_destructor_call::vacuous_destructor_call()
+# 2268| :
+# 2268| getEntryPoint(): [BlockStmt] { ... }
+# 2269| getStmt(0): [DeclStmt] declaration
+# 2269| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i
+# 2269| Type = [IntType] int
+# 2270| getStmt(1): [ExprStmt] ExprStmt
+# 2270| getExpr(): [FunctionCall] call to call_destructor
+# 2270| Type = [VoidType] void
+# 2270| ValueCategory = prvalue
+# 2270| getArgument(0): [VariableAccess] i
+# 2270| Type = [IntType] int
+# 2270| ValueCategory = lvalue
+# 2270| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
+# 2270| Type = [LValueReferenceType] int &
+# 2270| ValueCategory = prvalue
+# 2271| getStmt(2): [ReturnStmt] return ...
+# 2274| [TopLevelFunction] void TryCatchDestructors(bool)
+# 2274| :
+# 2274| getParameter(0): [Parameter] b
+# 2274| Type = [BoolType] bool
+# 2274| getEntryPoint(): [BlockStmt] { ... }
+# 2275| getStmt(0): [TryStmt] try { ... }
+# 2275| getStmt(): [BlockStmt] { ... }
+# 2276| getStmt(0): [DeclStmt] declaration
+# 2276| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
+# 2276| Type = [Struct] String
+# 2276| getVariable().getInitializer(): [Initializer] initializer for s
+# 2276| getExpr(): [ConstructorCall] call to String
+# 2276| Type = [VoidType] void
+# 2276| ValueCategory = prvalue
+# 2277| getStmt(1): [IfStmt] if (...) ...
+# 2277| getCondition(): [VariableAccess] b
+# 2277| Type = [BoolType] bool
+# 2277| ValueCategory = prvalue(load)
+# 2277| getThen(): [BlockStmt] { ... }
+# 2278| getStmt(0): [ExprStmt] ExprStmt
+# 2278| getExpr(): [ThrowExpr] throw ...
+# 2278| Type = [PointerType] const char *
+# 2278| ValueCategory = prvalue
+# 2278| getExpr(): string literal
+# 2278| Type = [ArrayType] const char[15]
+# 2278| Value = [StringLiteral] "string literal"
+# 2278| ValueCategory = lvalue
+# 2281| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2281| Type = [VoidType] void
+# 2281| ValueCategory = prvalue
+# 2281| getQualifier(): [VariableAccess] s
+# 2281| Type = [Struct] String
+# 2281| ValueCategory = lvalue
+# 2278| getExpr().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2278| Type = [PointerType] const char *
+# 2278| ValueCategory = prvalue
+# 2280| getStmt(2): [DeclStmt] declaration
+# 2280| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2
# 2280| Type = [Struct] String
-# 2280| ValueCategory = lvalue
-# 2280| getImplicitDestructorCall(1): [DestructorCall] call to ~String
-# 2280| Type = [VoidType] void
-# 2280| ValueCategory = prvalue
-# 2280| getQualifier(): [VariableAccess] s
-# 2280| Type = [Struct] String
-# 2280| ValueCategory = lvalue
-# 2281| getChild(1): [Handler]
-# 2281| getBlock(): [CatchBlock] { ... }
-# 2282| getStmt(0): [ExprStmt] ExprStmt
-# 2282| getExpr(): [ThrowExpr] throw ...
-# 2282| Type = [Struct] String
-# 2282| ValueCategory = prvalue
-# 2282| getExpr(): [ConstructorCall] call to String
-# 2282| Type = [VoidType] void
-# 2282| ValueCategory = prvalue
-# 2282| getArgument(0): [VariableAccess] s
-# 2282| Type = [PointerType] const char *
-# 2282| ValueCategory = prvalue(load)
-# 2284| getChild(2): [Handler]
-# 2284| getBlock(): [CatchBlock] { ... }
-# 2286| getChild(3): [Handler]
-# 2286| getBlock(): [CatchAnyBlock] { ... }
-# 2287| getStmt(0): [ExprStmt] ExprStmt
-# 2287| getExpr(): [ReThrowExpr] re-throw exception
-# 2287| Type = [VoidType] void
-# 2287| ValueCategory = prvalue
-# 2289| getStmt(1): [ReturnStmt] return ...
-# 2291| [TopLevelFunction] void IfDestructors(bool)
-# 2291| :
-# 2291| getParameter(0): [Parameter] b
-# 2291| Type = [BoolType] bool
-# 2291| getEntryPoint(): [BlockStmt] { ... }
-# 2292| getStmt(0): [DeclStmt] declaration
-# 2292| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s1
-# 2292| Type = [Struct] String
-# 2292| getVariable().getInitializer(): [Initializer] initializer for s1
-# 2292| getExpr(): [ConstructorCall] call to String
-# 2292| Type = [VoidType] void
-# 2292| ValueCategory = prvalue
-# 2293| getStmt(1): [IfStmt] if (...) ...
-# 2293| getCondition(): [VariableAccess] b
-# 2293| Type = [BoolType] bool
-# 2293| ValueCategory = prvalue(load)
-# 2293| getThen(): [BlockStmt] { ... }
-# 2294| getStmt(0): [DeclStmt] declaration
-# 2294| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2
-# 2294| Type = [Struct] String
-# 2294| getVariable().getInitializer(): [Initializer] initializer for s2
-# 2294| getExpr(): [ConstructorCall] call to String
-# 2294| Type = [VoidType] void
-# 2294| ValueCategory = prvalue
-# 2295| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2295| Type = [VoidType] void
-# 2295| ValueCategory = prvalue
-# 2295| getQualifier(): [VariableAccess] s2
+# 2280| getVariable().getInitializer(): [Initializer] initializer for s2
+# 2280| getExpr(): [ConstructorCall] call to String
+# 2280| Type = [VoidType] void
+# 2280| ValueCategory = prvalue
+# 2281| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2281| Type = [VoidType] void
+# 2281| ValueCategory = prvalue
+# 2281| getQualifier(): [VariableAccess] s2
+# 2281| Type = [Struct] String
+# 2281| ValueCategory = lvalue
+# 2281| getImplicitDestructorCall(1): [DestructorCall] call to ~String
+# 2281| Type = [VoidType] void
+# 2281| ValueCategory = prvalue
+# 2281| getQualifier(): [VariableAccess] s
+# 2281| Type = [Struct] String
+# 2281| ValueCategory = lvalue
+# 2282| getChild(1): [Handler]
+# 2282| getBlock(): [CatchBlock] { ... }
+# 2283| getStmt(0): [ExprStmt] ExprStmt
+# 2283| getExpr(): [ThrowExpr] throw ...
+# 2283| Type = [Struct] String
+# 2283| ValueCategory = prvalue
+# 2283| getExpr(): [ConstructorCall] call to String
+# 2283| Type = [VoidType] void
+# 2283| ValueCategory = prvalue
+# 2283| getArgument(0): [VariableAccess] s
+# 2283| Type = [PointerType] const char *
+# 2283| ValueCategory = prvalue(load)
+# 2285| getChild(2): [Handler]
+# 2285| getBlock(): [CatchBlock] { ... }
+# 2287| getChild(3): [Handler]
+# 2287| getBlock(): [CatchAnyBlock] { ... }
+# 2288| getStmt(0): [ExprStmt] ExprStmt
+# 2288| getExpr(): [ReThrowExpr] re-throw exception
+# 2288| Type = [VoidType] void
+# 2288| ValueCategory = prvalue
+# 2290| getStmt(1): [ReturnStmt] return ...
+# 2292| [TopLevelFunction] void IfDestructors(bool)
+# 2292| :
+# 2292| getParameter(0): [Parameter] b
+# 2292| Type = [BoolType] bool
+# 2292| getEntryPoint(): [BlockStmt] { ... }
+# 2293| getStmt(0): [DeclStmt] declaration
+# 2293| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s1
+# 2293| Type = [Struct] String
+# 2293| getVariable().getInitializer(): [Initializer] initializer for s1
+# 2293| getExpr(): [ConstructorCall] call to String
+# 2293| Type = [VoidType] void
+# 2293| ValueCategory = prvalue
+# 2294| getStmt(1): [IfStmt] if (...) ...
+# 2294| getCondition(): [VariableAccess] b
+# 2294| Type = [BoolType] bool
+# 2294| ValueCategory = prvalue(load)
+# 2294| getThen(): [BlockStmt] { ... }
+# 2295| getStmt(0): [DeclStmt] declaration
+# 2295| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2
# 2295| Type = [Struct] String
-# 2295| ValueCategory = lvalue
-# 2295| getElse(): [BlockStmt] { ... }
-# 2296| getStmt(0): [DeclStmt] declaration
-# 2296| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s3
+# 2295| getVariable().getInitializer(): [Initializer] initializer for s2
+# 2295| getExpr(): [ConstructorCall] call to String
+# 2295| Type = [VoidType] void
+# 2295| ValueCategory = prvalue
+# 2296| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2296| Type = [VoidType] void
+# 2296| ValueCategory = prvalue
+# 2296| getQualifier(): [VariableAccess] s2
# 2296| Type = [Struct] String
-# 2296| getVariable().getInitializer(): [Initializer] initializer for s3
-# 2296| getExpr(): [ConstructorCall] call to String
-# 2296| Type = [VoidType] void
-# 2296| ValueCategory = prvalue
-# 2297| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2297| Type = [VoidType] void
-# 2297| ValueCategory = prvalue
-# 2297| getQualifier(): [VariableAccess] s3
+# 2296| ValueCategory = lvalue
+# 2296| getElse(): [BlockStmt] { ... }
+# 2297| getStmt(0): [DeclStmt] declaration
+# 2297| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s3
# 2297| Type = [Struct] String
-# 2297| ValueCategory = lvalue
-# 2298| getStmt(2): [DeclStmt] declaration
-# 2298| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s4
-# 2298| Type = [Struct] String
-# 2298| getVariable().getInitializer(): [Initializer] initializer for s4
-# 2298| getExpr(): [ConstructorCall] call to String
-# 2298| Type = [VoidType] void
-# 2298| ValueCategory = prvalue
-# 2299| getStmt(3): [ReturnStmt] return ...
-# 2299| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2299| Type = [VoidType] void
-# 2299| ValueCategory = prvalue
-# 2299| getQualifier(): [VariableAccess] s4
-# 2299| Type = [Struct] String
-# 2299| ValueCategory = lvalue
-# 2299| getImplicitDestructorCall(1): [DestructorCall] call to ~String
-# 2299| Type = [VoidType] void
-# 2299| ValueCategory = prvalue
-# 2299| getQualifier(): [VariableAccess] s1
-# 2299| Type = [Struct] String
-# 2299| ValueCategory = lvalue
-# 2301| [TopLevelFunction] void ForDestructors()
-# 2301| :
-# 2301| getEntryPoint(): [BlockStmt] { ... }
-# 2302| getStmt(0): [DeclStmt] declaration
-# 2302| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c
-# 2302| Type = [PlainCharType] char
-# 2302| getVariable().getInitializer(): [Initializer] initializer for c
-# 2302| getExpr(): [CharLiteral] 97
-# 2302| Type = [PlainCharType] char
-# 2302| Value = [CharLiteral] 97
-# 2302| ValueCategory = prvalue
-# 2303| getStmt(1): [ForStmt] for(...;...;...) ...
-# 2303| getInitialization(): [DeclStmt] declaration
-# 2303| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
-# 2303| Type = [Struct] String
-# 2303| getVariable().getInitializer(): [Initializer] initializer for s
-# 2303| getExpr(): [ConstructorCall] call to String
-# 2303| Type = [VoidType] void
-# 2303| ValueCategory = prvalue
-# 2303| getArgument(0): hello
-# 2303| Type = [ArrayType] const char[6]
-# 2303| Value = [StringLiteral] "hello"
-# 2303| ValueCategory = lvalue
-# 2303| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
-# 2303| Type = [PointerType] const char *
-# 2303| ValueCategory = prvalue
-# 2303| getCondition(): [NEExpr] ... != ...
-# 2303| Type = [BoolType] bool
-# 2303| ValueCategory = prvalue
-# 2303| getLeftOperand(): [VariableAccess] c
-# 2303| Type = [PlainCharType] char
-# 2303| ValueCategory = prvalue(load)
-# 2303| getRightOperand(): [Literal] 0
-# 2303| Type = [IntType] int
-# 2303| Value = [Literal] 0
-# 2303| ValueCategory = prvalue
-# 2303| getLeftOperand().getFullyConverted(): [CStyleCast] (int)...
-# 2303| Conversion = [IntegralConversion] integral conversion
-# 2303| Type = [IntType] int
-# 2303| ValueCategory = prvalue
-# 2303| getUpdate(): [AssignExpr] ... = ...
+# 2297| getVariable().getInitializer(): [Initializer] initializer for s3
+# 2297| getExpr(): [ConstructorCall] call to String
+# 2297| Type = [VoidType] void
+# 2297| ValueCategory = prvalue
+# 2298| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2298| Type = [VoidType] void
+# 2298| ValueCategory = prvalue
+# 2298| getQualifier(): [VariableAccess] s3
+# 2298| Type = [Struct] String
+# 2298| ValueCategory = lvalue
+# 2299| getStmt(2): [DeclStmt] declaration
+# 2299| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s4
+# 2299| Type = [Struct] String
+# 2299| getVariable().getInitializer(): [Initializer] initializer for s4
+# 2299| getExpr(): [ConstructorCall] call to String
+# 2299| Type = [VoidType] void
+# 2299| ValueCategory = prvalue
+# 2300| getStmt(3): [ReturnStmt] return ...
+# 2300| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2300| Type = [VoidType] void
+# 2300| ValueCategory = prvalue
+# 2300| getQualifier(): [VariableAccess] s4
+# 2300| Type = [Struct] String
+# 2300| ValueCategory = lvalue
+# 2300| getImplicitDestructorCall(1): [DestructorCall] call to ~String
+# 2300| Type = [VoidType] void
+# 2300| ValueCategory = prvalue
+# 2300| getQualifier(): [VariableAccess] s1
+# 2300| Type = [Struct] String
+# 2300| ValueCategory = lvalue
+# 2302| [TopLevelFunction] void ForDestructors()
+# 2302| :
+# 2302| getEntryPoint(): [BlockStmt] { ... }
+# 2303| getStmt(0): [DeclStmt] declaration
+# 2303| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c
# 2303| Type = [PlainCharType] char
-# 2303| ValueCategory = lvalue
-# 2303| getLValue(): [VariableAccess] c
-# 2303| Type = [PlainCharType] char
-# 2303| ValueCategory = lvalue
-# 2303| getRValue(): [FunctionCall] call to pop_back
-# 2303| Type = [PlainCharType] char
-# 2303| ValueCategory = prvalue
-# 2303| getQualifier(): [VariableAccess] s
-# 2303| Type = [Struct] String
-# 2303| ValueCategory = lvalue
-# 2303| getStmt(): [BlockStmt] { ... }
-# 2304| getStmt(0): [DeclStmt] declaration
-# 2304| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2
-# 2304| Type = [Struct] String
-# 2304| getVariable().getInitializer(): [Initializer] initializer for s2
-# 2304| getExpr(): [ConstructorCall] call to String
-# 2304| Type = [VoidType] void
+# 2303| getVariable().getInitializer(): [Initializer] initializer for c
+# 2303| getExpr(): [CharLiteral] 97
+# 2303| Type = [PlainCharType] char
+# 2303| Value = [CharLiteral] 97
+# 2303| ValueCategory = prvalue
+# 2304| getStmt(1): [ForStmt] for(...;...;...) ...
+# 2304| getInitialization(): [DeclStmt] declaration
+# 2304| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
+# 2304| Type = [Struct] String
+# 2304| getVariable().getInitializer(): [Initializer] initializer for s
+# 2304| getExpr(): [ConstructorCall] call to String
+# 2304| Type = [VoidType] void
+# 2304| ValueCategory = prvalue
+# 2304| getArgument(0): hello
+# 2304| Type = [ArrayType] const char[6]
+# 2304| Value = [StringLiteral] "hello"
+# 2304| ValueCategory = lvalue
+# 2304| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2304| Type = [PointerType] const char *
# 2304| ValueCategory = prvalue
-# 2305| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2305| Type = [VoidType] void
-# 2305| ValueCategory = prvalue
-# 2305| getQualifier(): [VariableAccess] s2
+# 2304| getCondition(): [NEExpr] ... != ...
+# 2304| Type = [BoolType] bool
+# 2304| ValueCategory = prvalue
+# 2304| getLeftOperand(): [VariableAccess] c
+# 2304| Type = [PlainCharType] char
+# 2304| ValueCategory = prvalue(load)
+# 2304| getRightOperand(): [Literal] 0
+# 2304| Type = [IntType] int
+# 2304| Value = [Literal] 0
+# 2304| ValueCategory = prvalue
+# 2304| getLeftOperand().getFullyConverted(): [CStyleCast] (int)...
+# 2304| Conversion = [IntegralConversion] integral conversion
+# 2304| Type = [IntType] int
+# 2304| ValueCategory = prvalue
+# 2304| getUpdate(): [AssignExpr] ... = ...
+# 2304| Type = [PlainCharType] char
+# 2304| ValueCategory = lvalue
+# 2304| getLValue(): [VariableAccess] c
+# 2304| Type = [PlainCharType] char
+# 2304| ValueCategory = lvalue
+# 2304| getRValue(): [FunctionCall] call to pop_back
+# 2304| Type = [PlainCharType] char
+# 2304| ValueCategory = prvalue
+# 2304| getQualifier(): [VariableAccess] s
+# 2304| Type = [Struct] String
+# 2304| ValueCategory = lvalue
+# 2304| getStmt(): [BlockStmt] { ... }
+# 2305| getStmt(0): [DeclStmt] declaration
+# 2305| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2
# 2305| Type = [Struct] String
-# 2305| ValueCategory = lvalue
-# 2303| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2303| Type = [VoidType] void
-# 2303| ValueCategory = prvalue
-# 2303| getQualifier(): [VariableAccess] s
-# 2303| Type = [Struct] String
-# 2303| ValueCategory = lvalue
-# 2307| getStmt(2): [RangeBasedForStmt] for(...:...) ...
-# 2307| getChild(1): [DeclStmt] declaration
-# 2307| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range)
-# 2307| Type = [RValueReferenceType] vector &&
+# 2305| getVariable().getInitializer(): [Initializer] initializer for s2
+# 2305| getExpr(): [ConstructorCall] call to String
+# 2305| Type = [VoidType] void
+# 2305| ValueCategory = prvalue
+# 2306| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2306| Type = [VoidType] void
+# 2306| ValueCategory = prvalue
+# 2306| getQualifier(): [VariableAccess] s2
+# 2306| Type = [Struct] String
+# 2306| ValueCategory = lvalue
+# 2304| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2304| Type = [VoidType] void
+# 2304| ValueCategory = prvalue
+# 2304| getQualifier(): [VariableAccess] s
+# 2304| Type = [Struct] String
+# 2304| ValueCategory = lvalue
+# 2308| getStmt(2): [RangeBasedForStmt] for(...:...) ...
+# 2308| getChild(1): [DeclStmt] declaration
+# 2308| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range)
+# 2308| Type = [RValueReferenceType] vector &&
#-----| getVariable().getInitializer(): [Initializer] initializer for (__range)
-# 2307| getExpr(): [ConstructorCall] call to vector
-# 2307| Type = [VoidType] void
-# 2307| ValueCategory = prvalue
-# 2307| getArgument(0): [ConstructorCall] call to String
-# 2307| Type = [VoidType] void
-# 2307| ValueCategory = prvalue
-# 2307| getArgument(0): hello
-# 2307| Type = [ArrayType] const char[6]
-# 2307| Value = [StringLiteral] "hello"
-# 2307| ValueCategory = lvalue
-# 2307| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
-# 2307| Type = [PointerType] const char *
-# 2307| ValueCategory = prvalue
-# 2307| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
-# 2307| Type = [Struct] String
-# 2307| ValueCategory = lvalue
-# 2307| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
-# 2307| Type = [LValueReferenceType] vector &
-# 2307| ValueCategory = prvalue
-# 2307| getExpr(): [TemporaryObjectExpr] temporary object
-# 2307| Type = [ClassTemplateInstantiation,Struct] vector
-# 2307| ValueCategory = xvalue
-# 2307| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2307| Type = [VoidType] void
-# 2307| ValueCategory = prvalue
-# 2307| getQualifier(): [ReuseExpr] reuse of temporary object
-# 2307| Type = [Struct] String
-# 2307| ValueCategory = xvalue
-# 2307| getBeginEndDeclaration(): [DeclStmt] declaration
-# 2307| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin)
-# 2307| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2308| getExpr(): [ConstructorCall] call to vector
+# 2308| Type = [VoidType] void
+# 2308| ValueCategory = prvalue
+# 2308| getArgument(0): [ConstructorCall] call to String
+# 2308| Type = [VoidType] void
+# 2308| ValueCategory = prvalue
+# 2308| getArgument(0): hello
+# 2308| Type = [ArrayType] const char[6]
+# 2308| Value = [StringLiteral] "hello"
+# 2308| ValueCategory = lvalue
+# 2308| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2308| Type = [PointerType] const char *
+# 2308| ValueCategory = prvalue
+# 2308| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
+# 2308| Type = [Struct] String
+# 2308| ValueCategory = lvalue
+# 2308| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
+# 2308| Type = [LValueReferenceType] vector &
+# 2308| ValueCategory = prvalue
+# 2308| getExpr(): [TemporaryObjectExpr] temporary object
+# 2308| Type = [ClassTemplateInstantiation,Struct] vector
+# 2308| ValueCategory = xvalue
+# 2308| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2308| Type = [VoidType] void
+# 2308| ValueCategory = prvalue
+# 2308| getQualifier(): [ReuseExpr] reuse of temporary object
+# 2308| Type = [Struct] String
+# 2308| ValueCategory = xvalue
+# 2308| getBeginEndDeclaration(): [DeclStmt] declaration
+# 2308| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin)
+# 2308| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin)
-# 2307| getExpr(): [FunctionCall] call to begin
-# 2307| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2307| ValueCategory = prvalue
-# 2307| getQualifier(): [VariableAccess] (__range)
-# 2307| Type = [RValueReferenceType] vector &&
-# 2307| ValueCategory = prvalue(load)
+# 2308| getExpr(): [FunctionCall] call to begin
+# 2308| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2308| ValueCategory = prvalue
+# 2308| getQualifier(): [VariableAccess] (__range)
+# 2308| Type = [RValueReferenceType] vector &&
+# 2308| ValueCategory = prvalue(load)
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const vector
@@ -20585,15 +20591,15 @@ ir.cpp:
#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
#-----| Type = [ClassTemplateInstantiation,Struct] vector
#-----| ValueCategory = lvalue
-# 2307| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end)
-# 2307| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2308| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end)
+# 2308| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
#-----| getVariable().getInitializer(): [Initializer] initializer for (__end)
-# 2307| getExpr(): [FunctionCall] call to end
-# 2307| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2307| ValueCategory = prvalue
-# 2307| getQualifier(): [VariableAccess] (__range)
-# 2307| Type = [RValueReferenceType] vector &&
-# 2307| ValueCategory = prvalue(load)
+# 2308| getExpr(): [FunctionCall] call to end
+# 2308| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2308| ValueCategory = prvalue
+# 2308| getQualifier(): [VariableAccess] (__range)
+# 2308| Type = [RValueReferenceType] vector &&
+# 2308| ValueCategory = prvalue(load)
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const vector
@@ -20601,18 +20607,18 @@ ir.cpp:
#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
#-----| Type = [ClassTemplateInstantiation,Struct] vector
#-----| ValueCategory = lvalue
-# 2307| getCondition(): [FunctionCall] call to operator!=
-# 2307| Type = [BoolType] bool
-# 2307| ValueCategory = prvalue
-# 2307| getQualifier(): [VariableAccess] (__begin)
-# 2307| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2307| ValueCategory = lvalue
-# 2307| getArgument(0): [ConstructorCall] call to iterator
-# 2307| Type = [VoidType] void
-# 2307| ValueCategory = prvalue
-# 2307| getArgument(0): [VariableAccess] (__end)
-# 2307| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2307| ValueCategory = lvalue
+# 2308| getCondition(): [FunctionCall] call to operator!=
+# 2308| Type = [BoolType] bool
+# 2308| ValueCategory = prvalue
+# 2308| getQualifier(): [VariableAccess] (__begin)
+# 2308| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2308| ValueCategory = lvalue
+# 2308| getArgument(0): [ConstructorCall] call to iterator
+# 2308| Type = [VoidType] void
+# 2308| ValueCategory = prvalue
+# 2308| getArgument(0): [VariableAccess] (__end)
+# 2308| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2308| ValueCategory = lvalue
#-----| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
#-----| Type = [LValueReferenceType] const iterator &
#-----| ValueCategory = prvalue
@@ -20627,1491 +20633,1497 @@ ir.cpp:
#-----| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
#-----| Type = [ClassTemplateInstantiation,Struct] iterator
#-----| ValueCategory = lvalue
-# 2307| getUpdate(): [FunctionCall] call to operator++
-# 2307| Type = [LValueReferenceType] iterator &
-# 2307| ValueCategory = prvalue
-# 2307| getQualifier(): [VariableAccess] (__begin)
-# 2307| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2307| ValueCategory = lvalue
-# 2307| getChild(5): [DeclStmt] declaration
-# 2307| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
-# 2307| Type = [Struct] String
-# 2307| getVariable().getInitializer(): [Initializer] initializer for s
-# 2307| getExpr(): [ConstructorCall] call to String
-# 2307| Type = [VoidType] void
-# 2307| ValueCategory = prvalue
-# 2307| getArgument(0): [OverloadedPointerDereferenceExpr] call to operator*
-# 2307| Type = [LValueReferenceType] String &
-# 2307| ValueCategory = prvalue
-# 2307| getQualifier(): [VariableAccess] (__begin)
-# 2307| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2307| ValueCategory = lvalue
+# 2308| getUpdate(): [FunctionCall] call to operator++
+# 2308| Type = [LValueReferenceType] iterator &
+# 2308| ValueCategory = prvalue
+# 2308| getQualifier(): [VariableAccess] (__begin)
+# 2308| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2308| ValueCategory = lvalue
+# 2308| getChild(5): [DeclStmt] declaration
+# 2308| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
+# 2308| Type = [Struct] String
+# 2308| getVariable().getInitializer(): [Initializer] initializer for s
+# 2308| getExpr(): [ConstructorCall] call to String
+# 2308| Type = [VoidType] void
+# 2308| ValueCategory = prvalue
+# 2308| getArgument(0): [OverloadedPointerDereferenceExpr] call to operator*
+# 2308| Type = [LValueReferenceType] String &
+# 2308| ValueCategory = prvalue
+# 2308| getQualifier(): [VariableAccess] (__begin)
+# 2308| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2308| ValueCategory = lvalue
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const iterator
#-----| ValueCategory = lvalue
-# 2307| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
-# 2307| Type = [LValueReferenceType] const String &
-# 2307| ValueCategory = prvalue
-# 2307| getExpr(): [CStyleCast] (const String)...
-# 2307| Conversion = [GlvalueConversion] glvalue conversion
-# 2307| Type = [SpecifiedType] const String
-# 2307| ValueCategory = lvalue
-# 2307| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
-# 2307| Type = [Struct] String
-# 2307| ValueCategory = lvalue
-# 2307| getStmt(): [BlockStmt] { ... }
-# 2308| getStmt(0): [DeclStmt] declaration
-# 2308| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2
-# 2308| Type = [Struct] String
-# 2308| getVariable().getInitializer(): [Initializer] initializer for s2
-# 2308| getExpr(): [ConstructorCall] call to String
-# 2308| Type = [VoidType] void
+# 2308| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
+# 2308| Type = [LValueReferenceType] const String &
# 2308| ValueCategory = prvalue
-# 2309| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2309| Type = [VoidType] void
-# 2309| ValueCategory = prvalue
-# 2309| getQualifier(): [VariableAccess] s2
+# 2308| getExpr(): [CStyleCast] (const String)...
+# 2308| Conversion = [GlvalueConversion] glvalue conversion
+# 2308| Type = [SpecifiedType] const String
+# 2308| ValueCategory = lvalue
+# 2308| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
+# 2308| Type = [Struct] String
+# 2308| ValueCategory = lvalue
+# 2308| getStmt(): [BlockStmt] { ... }
+# 2309| getStmt(0): [DeclStmt] declaration
+# 2309| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2
# 2309| Type = [Struct] String
-# 2309| ValueCategory = lvalue
-# 2307| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
-# 2307| Type = [ClassTemplateInstantiation,Struct] iterator
-# 2307| ValueCategory = lvalue
-# 2307| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2307| Type = [VoidType] void
-# 2307| ValueCategory = prvalue
-# 2307| getQualifier(): [VariableAccess] s
-# 2307| Type = [Struct] String
-# 2307| ValueCategory = lvalue
-# 2311| getStmt(3): [ForStmt] for(...;...;...) ...
-# 2311| getInitialization(): [DeclStmt] declaration
-# 2311| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
-# 2311| Type = [Struct] String
-# 2311| getVariable().getInitializer(): [Initializer] initializer for s
-# 2311| getExpr(): [ConstructorCall] call to String
-# 2311| Type = [VoidType] void
-# 2311| ValueCategory = prvalue
-# 2311| getArgument(0): hello
-# 2311| Type = [ArrayType] const char[6]
-# 2311| Value = [StringLiteral] "hello"
-# 2311| ValueCategory = lvalue
-# 2311| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
-# 2311| Type = [PointerType] const char *
-# 2311| ValueCategory = prvalue
-# 2311| getDeclarationEntry(1): [VariableDeclarationEntry] definition of s2
-# 2311| Type = [Struct] String
-# 2311| getVariable().getInitializer(): [Initializer] initializer for s2
-# 2311| getExpr(): [ConstructorCall] call to String
-# 2311| Type = [VoidType] void
-# 2311| ValueCategory = prvalue
-# 2311| getArgument(0): world
-# 2311| Type = [ArrayType] const char[6]
-# 2311| Value = [StringLiteral] "world"
-# 2311| ValueCategory = lvalue
-# 2311| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
-# 2311| Type = [PointerType] const char *
-# 2311| ValueCategory = prvalue
-# 2311| getCondition(): [NEExpr] ... != ...
-# 2311| Type = [BoolType] bool
-# 2311| ValueCategory = prvalue
-# 2311| getLeftOperand(): [VariableAccess] c
-# 2311| Type = [PlainCharType] char
-# 2311| ValueCategory = prvalue(load)
-# 2311| getRightOperand(): [Literal] 0
-# 2311| Type = [IntType] int
-# 2311| Value = [Literal] 0
-# 2311| ValueCategory = prvalue
-# 2311| getLeftOperand().getFullyConverted(): [CStyleCast] (int)...
-# 2311| Conversion = [IntegralConversion] integral conversion
-# 2311| Type = [IntType] int
-# 2311| ValueCategory = prvalue
-# 2311| getUpdate(): [AssignExpr] ... = ...
-# 2311| Type = [PlainCharType] char
-# 2311| ValueCategory = lvalue
-# 2311| getLValue(): [VariableAccess] c
-# 2311| Type = [PlainCharType] char
-# 2311| ValueCategory = lvalue
-# 2311| getRValue(): [FunctionCall] call to pop_back
-# 2311| Type = [PlainCharType] char
-# 2311| ValueCategory = prvalue
-# 2311| getQualifier(): [VariableAccess] s
-# 2311| Type = [Struct] String
-# 2311| ValueCategory = lvalue
-# 2311| getStmt(): [BlockStmt] { ... }
-# 2312| getStmt(0): [ExprStmt] ExprStmt
-# 2312| getExpr(): [AssignExpr] ... = ...
-# 2312| Type = [PlainCharType] char
+# 2309| getVariable().getInitializer(): [Initializer] initializer for s2
+# 2309| getExpr(): [ConstructorCall] call to String
+# 2309| Type = [VoidType] void
+# 2309| ValueCategory = prvalue
+# 2310| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2310| Type = [VoidType] void
+# 2310| ValueCategory = prvalue
+# 2310| getQualifier(): [VariableAccess] s2
+# 2310| Type = [Struct] String
+# 2310| ValueCategory = lvalue
+# 2308| getImplicitDestructorCall(0): [DestructorCall] call to ~vector
+# 2308| Type = [VoidType] void
+# 2308| ValueCategory = prvalue
+# 2308| getQualifier(): [ReuseExpr] reuse of temporary object
+# 2308| Type = [ClassTemplateInstantiation,Struct] vector
+# 2308| ValueCategory = xvalue
+# 2308| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
+# 2308| Type = [ClassTemplateInstantiation,Struct] iterator
+# 2308| ValueCategory = lvalue
+# 2308| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2308| Type = [VoidType] void
+# 2308| ValueCategory = prvalue
+# 2308| getQualifier(): [VariableAccess] s
+# 2308| Type = [Struct] String
+# 2308| ValueCategory = lvalue
+# 2312| getStmt(3): [ForStmt] for(...;...;...) ...
+# 2312| getInitialization(): [DeclStmt] declaration
+# 2312| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
+# 2312| Type = [Struct] String
+# 2312| getVariable().getInitializer(): [Initializer] initializer for s
+# 2312| getExpr(): [ConstructorCall] call to String
+# 2312| Type = [VoidType] void
+# 2312| ValueCategory = prvalue
+# 2312| getArgument(0): hello
+# 2312| Type = [ArrayType] const char[6]
+# 2312| Value = [StringLiteral] "hello"
+# 2312| ValueCategory = lvalue
+# 2312| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2312| Type = [PointerType] const char *
+# 2312| ValueCategory = prvalue
+# 2312| getDeclarationEntry(1): [VariableDeclarationEntry] definition of s2
+# 2312| Type = [Struct] String
+# 2312| getVariable().getInitializer(): [Initializer] initializer for s2
+# 2312| getExpr(): [ConstructorCall] call to String
+# 2312| Type = [VoidType] void
+# 2312| ValueCategory = prvalue
+# 2312| getArgument(0): world
+# 2312| Type = [ArrayType] const char[6]
+# 2312| Value = [StringLiteral] "world"
+# 2312| ValueCategory = lvalue
+# 2312| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2312| Type = [PointerType] const char *
+# 2312| ValueCategory = prvalue
+# 2312| getCondition(): [NEExpr] ... != ...
+# 2312| Type = [BoolType] bool
+# 2312| ValueCategory = prvalue
+# 2312| getLeftOperand(): [VariableAccess] c
+# 2312| Type = [PlainCharType] char
+# 2312| ValueCategory = prvalue(load)
+# 2312| getRightOperand(): [Literal] 0
+# 2312| Type = [IntType] int
+# 2312| Value = [Literal] 0
+# 2312| ValueCategory = prvalue
+# 2312| getLeftOperand().getFullyConverted(): [CStyleCast] (int)...
+# 2312| Conversion = [IntegralConversion] integral conversion
+# 2312| Type = [IntType] int
+# 2312| ValueCategory = prvalue
+# 2312| getUpdate(): [AssignExpr] ... = ...
+# 2312| Type = [PlainCharType] char
+# 2312| ValueCategory = lvalue
+# 2312| getLValue(): [VariableAccess] c
+# 2312| Type = [PlainCharType] char
+# 2312| ValueCategory = lvalue
+# 2312| getRValue(): [FunctionCall] call to pop_back
+# 2312| Type = [PlainCharType] char
+# 2312| ValueCategory = prvalue
+# 2312| getQualifier(): [VariableAccess] s
+# 2312| Type = [Struct] String
# 2312| ValueCategory = lvalue
-# 2312| getLValue(): [VariableAccess] c
-# 2312| Type = [PlainCharType] char
-# 2312| ValueCategory = lvalue
-# 2312| getRValue(): [Literal] 0
-# 2312| Type = [IntType] int
-# 2312| Value = [Literal] 0
-# 2312| ValueCategory = prvalue
-# 2312| getRValue().getFullyConverted(): [CStyleCast] (char)...
-# 2312| Conversion = [IntegralConversion] integral conversion
-# 2312| Type = [PlainCharType] char
-# 2312| Value = [CStyleCast] 0
-# 2312| ValueCategory = prvalue
-# 2311| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2311| Type = [VoidType] void
-# 2311| ValueCategory = prvalue
-# 2311| getQualifier(): [VariableAccess] s2
-# 2311| Type = [Struct] String
-# 2311| ValueCategory = lvalue
-# 2311| getImplicitDestructorCall(1): [DestructorCall] call to ~String
-# 2311| Type = [VoidType] void
-# 2311| ValueCategory = prvalue
-# 2311| getQualifier(): [VariableAccess] s
-# 2311| Type = [Struct] String
-# 2311| ValueCategory = lvalue
-# 2314| getStmt(4): [ReturnStmt] return ...
-# 2316| [TopLevelFunction] void IfDestructors2(bool)
-# 2316| :
-# 2316| getParameter(0): [Parameter] b
-# 2316| Type = [BoolType] bool
-# 2316| getEntryPoint(): [BlockStmt] { ... }
-# 2317| getStmt(0): [IfStmt] if (...) ...
-# 2317| getInitialization(): [DeclStmt] declaration
-# 2317| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
-# 2317| Type = [Struct] String
-# 2317| getVariable().getInitializer(): [Initializer] initializer for s
-# 2317| getExpr(): [ConstructorCall] call to String
-# 2317| Type = [VoidType] void
-# 2317| ValueCategory = prvalue
-# 2317| getArgument(0): hello
-# 2317| Type = [ArrayType] const char[6]
-# 2317| Value = [StringLiteral] "hello"
-# 2317| ValueCategory = lvalue
-# 2317| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
-# 2317| Type = [PointerType] const char *
-# 2317| ValueCategory = prvalue
-# 2317| getCondition(): [VariableAccess] b
-# 2317| Type = [BoolType] bool
-# 2317| ValueCategory = prvalue(load)
-# 2317| getThen(): [BlockStmt] { ... }
-# 2318| getStmt(0): [DeclStmt] declaration
-# 2318| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
-# 2318| Type = [IntType] int
-# 2318| getVariable().getInitializer(): [Initializer] initializer for x
-# 2318| getExpr(): [Literal] 0
-# 2318| Type = [IntType] int
-# 2318| Value = [Literal] 0
+# 2312| getStmt(): [BlockStmt] { ... }
+# 2313| getStmt(0): [ExprStmt] ExprStmt
+# 2313| getExpr(): [AssignExpr] ... = ...
+# 2313| Type = [PlainCharType] char
+# 2313| ValueCategory = lvalue
+# 2313| getLValue(): [VariableAccess] c
+# 2313| Type = [PlainCharType] char
+# 2313| ValueCategory = lvalue
+# 2313| getRValue(): [Literal] 0
+# 2313| Type = [IntType] int
+# 2313| Value = [Literal] 0
+# 2313| ValueCategory = prvalue
+# 2313| getRValue().getFullyConverted(): [CStyleCast] (char)...
+# 2313| Conversion = [IntegralConversion] integral conversion
+# 2313| Type = [PlainCharType] char
+# 2313| Value = [CStyleCast] 0
+# 2313| ValueCategory = prvalue
+# 2312| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2312| Type = [VoidType] void
+# 2312| ValueCategory = prvalue
+# 2312| getQualifier(): [VariableAccess] s2
+# 2312| Type = [Struct] String
+# 2312| ValueCategory = lvalue
+# 2312| getImplicitDestructorCall(1): [DestructorCall] call to ~String
+# 2312| Type = [VoidType] void
+# 2312| ValueCategory = prvalue
+# 2312| getQualifier(): [VariableAccess] s
+# 2312| Type = [Struct] String
+# 2312| ValueCategory = lvalue
+# 2315| getStmt(4): [ReturnStmt] return ...
+# 2317| [TopLevelFunction] void IfDestructors2(bool)
+# 2317| :
+# 2317| getParameter(0): [Parameter] b
+# 2317| Type = [BoolType] bool
+# 2317| getEntryPoint(): [BlockStmt] { ... }
+# 2318| getStmt(0): [IfStmt] if (...) ...
+# 2318| getInitialization(): [DeclStmt] declaration
+# 2318| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
+# 2318| Type = [Struct] String
+# 2318| getVariable().getInitializer(): [Initializer] initializer for s
+# 2318| getExpr(): [ConstructorCall] call to String
+# 2318| Type = [VoidType] void
+# 2318| ValueCategory = prvalue
+# 2318| getArgument(0): hello
+# 2318| Type = [ArrayType] const char[6]
+# 2318| Value = [StringLiteral] "hello"
+# 2318| ValueCategory = lvalue
+# 2318| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2318| Type = [PointerType] const char *
# 2318| ValueCategory = prvalue
-# 2319| getElse(): [BlockStmt] { ... }
-# 2320| getStmt(0): [DeclStmt] declaration
-# 2320| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
-# 2320| Type = [IntType] int
-# 2320| getVariable().getInitializer(): [Initializer] initializer for y
-# 2320| getExpr(): [Literal] 0
-# 2320| Type = [IntType] int
-# 2320| Value = [Literal] 0
-# 2320| ValueCategory = prvalue
-# 2321| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2321| Type = [VoidType] void
-# 2321| ValueCategory = prvalue
-# 2321| getQualifier(): [VariableAccess] s
-# 2321| Type = [Struct] String
-# 2321| ValueCategory = lvalue
-# 2322| getStmt(1): [ReturnStmt] return ...
-# 2324| [CopyAssignmentOperator] Bool& Bool::operator=(Bool const&)
-# 2324| :
+# 2318| getCondition(): [VariableAccess] b
+# 2318| Type = [BoolType] bool
+# 2318| ValueCategory = prvalue(load)
+# 2318| getThen(): [BlockStmt] { ... }
+# 2319| getStmt(0): [DeclStmt] declaration
+# 2319| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
+# 2319| Type = [IntType] int
+# 2319| getVariable().getInitializer(): [Initializer] initializer for x
+# 2319| getExpr(): [Literal] 0
+# 2319| Type = [IntType] int
+# 2319| Value = [Literal] 0
+# 2319| ValueCategory = prvalue
+# 2320| getElse(): [BlockStmt] { ... }
+# 2321| getStmt(0): [DeclStmt] declaration
+# 2321| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
+# 2321| Type = [IntType] int
+# 2321| getVariable().getInitializer(): [Initializer] initializer for y
+# 2321| getExpr(): [Literal] 0
+# 2321| Type = [IntType] int
+# 2321| Value = [Literal] 0
+# 2321| ValueCategory = prvalue
+# 2322| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2322| Type = [VoidType] void
+# 2322| ValueCategory = prvalue
+# 2322| getQualifier(): [VariableAccess] s
+# 2322| Type = [Struct] String
+# 2322| ValueCategory = lvalue
+# 2323| getStmt(1): [ReturnStmt] return ...
+# 2325| [CopyAssignmentOperator] Bool& Bool::operator=(Bool const&)
+# 2325| :
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const Bool &
-# 2324| [CopyConstructor] void Bool::Bool(Bool const&)
-# 2324| :
+# 2325| [CopyConstructor] void Bool::Bool(Bool const&)
+# 2325| :
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const Bool &
-# 2326| [Constructor] void Bool::Bool(bool)
-# 2326| :
-# 2326| getParameter(0): [Parameter] b_
-# 2326| Type = [BoolType] bool
-# 2327| [ConversionOperator] bool Bool::operator bool()
+# 2327| [Constructor] void Bool::Bool(bool)
# 2327| :
-# 2328| [Destructor] void Bool::~Bool()
+# 2327| getParameter(0): [Parameter] b_
+# 2327| Type = [BoolType] bool
+# 2328| [ConversionOperator] bool Bool::operator bool()
# 2328| :
-# 2331| [TopLevelFunction] void IfDestructors3(bool)
-# 2331| :
-# 2331| getParameter(0): [Parameter] b
-# 2331| Type = [BoolType] bool
-# 2331| getEntryPoint(): [BlockStmt] { ... }
-# 2332| getStmt(0): [IfStmt] if (...) ...
-# 2332| getCondition(): [ConditionDeclExpr] (condition decl)
-# 2332| Type = [BoolType] bool
-# 2332| ValueCategory = prvalue
-# 2332| getChild(0): [FunctionCall] call to operator bool
-# 2332| Type = [BoolType] bool
-# 2332| ValueCategory = prvalue
-# 2332| getQualifier(): [VariableAccess] B
-# 2332| Type = [Class] Bool
-# 2332| ValueCategory = prvalue(load)
-# 2332| getInitializingExpr(): [ConstructorCall] call to Bool
-# 2332| Type = [VoidType] void
-# 2332| ValueCategory = prvalue
-# 2332| getArgument(0): [VariableAccess] b
-# 2332| Type = [BoolType] bool
-# 2332| ValueCategory = prvalue(load)
-# 2332| getThen(): [BlockStmt] { ... }
-# 2333| getStmt(0): [DeclStmt] declaration
-# 2333| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s1
-# 2333| Type = [Struct] String
-# 2333| getVariable().getInitializer(): [Initializer] initializer for s1
-# 2333| getExpr(): [ConstructorCall] call to String
-# 2333| Type = [VoidType] void
-# 2333| ValueCategory = prvalue
-# 2334| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2334| Type = [VoidType] void
-# 2334| ValueCategory = prvalue
-# 2334| getQualifier(): [VariableAccess] s1
+# 2329| [Destructor] void Bool::~Bool()
+# 2329| :
+# 2332| [TopLevelFunction] void IfDestructors3(bool)
+# 2332| :
+# 2332| getParameter(0): [Parameter] b
+# 2332| Type = [BoolType] bool
+# 2332| getEntryPoint(): [BlockStmt] { ... }
+# 2333| getStmt(0): [IfStmt] if (...) ...
+# 2333| getCondition(): [ConditionDeclExpr] (condition decl)
+# 2333| Type = [BoolType] bool
+# 2333| ValueCategory = prvalue
+# 2333| getChild(0): [FunctionCall] call to operator bool
+# 2333| Type = [BoolType] bool
+# 2333| ValueCategory = prvalue
+# 2333| getQualifier(): [VariableAccess] B
+# 2333| Type = [Class] Bool
+# 2333| ValueCategory = prvalue(load)
+# 2333| getInitializingExpr(): [ConstructorCall] call to Bool
+# 2333| Type = [VoidType] void
+# 2333| ValueCategory = prvalue
+# 2333| getArgument(0): [VariableAccess] b
+# 2333| Type = [BoolType] bool
+# 2333| ValueCategory = prvalue(load)
+# 2333| getThen(): [BlockStmt] { ... }
+# 2334| getStmt(0): [DeclStmt] declaration
+# 2334| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s1
# 2334| Type = [Struct] String
-# 2334| ValueCategory = lvalue
-# 2334| getElse(): [BlockStmt] { ... }
-# 2335| getStmt(0): [DeclStmt] declaration
-# 2335| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2
+# 2334| getVariable().getInitializer(): [Initializer] initializer for s1
+# 2334| getExpr(): [ConstructorCall] call to String
+# 2334| Type = [VoidType] void
+# 2334| ValueCategory = prvalue
+# 2335| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2335| Type = [VoidType] void
+# 2335| ValueCategory = prvalue
+# 2335| getQualifier(): [VariableAccess] s1
# 2335| Type = [Struct] String
-# 2335| getVariable().getInitializer(): [Initializer] initializer for s2
-# 2335| getExpr(): [ConstructorCall] call to String
-# 2335| Type = [VoidType] void
-# 2335| ValueCategory = prvalue
-# 2336| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2336| Type = [VoidType] void
-# 2336| ValueCategory = prvalue
-# 2336| getQualifier(): [VariableAccess] s2
+# 2335| ValueCategory = lvalue
+# 2335| getElse(): [BlockStmt] { ... }
+# 2336| getStmt(0): [DeclStmt] declaration
+# 2336| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2
# 2336| Type = [Struct] String
-# 2336| ValueCategory = lvalue
-# 2336| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool
-# 2336| Type = [VoidType] void
-# 2336| ValueCategory = prvalue
-# 2336| getQualifier(): [VariableAccess] B
-# 2336| Type = [Class] Bool
-# 2336| ValueCategory = lvalue
-# 2337| getStmt(1): [ReturnStmt] return ...
-# 2339| [TopLevelFunction] void WhileLoopDestructors(bool)
-# 2339| :
-# 2339| getParameter(0): [Parameter] b
-# 2339| Type = [BoolType] bool
-# 2339| getEntryPoint(): [BlockStmt] { ... }
-# 2340| getStmt(0): [BlockStmt] { ... }
-# 2341| getStmt(0): [DeclStmt] declaration
-# 2341| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
-# 2341| Type = [Struct] String
-# 2341| getVariable().getInitializer(): [Initializer] initializer for s
-# 2341| getExpr(): [ConstructorCall] call to String
-# 2341| Type = [VoidType] void
-# 2341| ValueCategory = prvalue
-# 2342| getStmt(1): [WhileStmt] while (...) ...
-# 2342| getCondition(): [VariableAccess] b
-# 2342| Type = [BoolType] bool
-# 2342| ValueCategory = prvalue(load)
-# 2342| getStmt(): [BlockStmt] { ... }
-# 2343| getStmt(0): [ExprStmt] ExprStmt
-# 2343| getExpr(): [AssignExpr] ... = ...
-# 2343| Type = [BoolType] bool
-# 2343| ValueCategory = lvalue
-# 2343| getLValue(): [VariableAccess] b
-# 2343| Type = [BoolType] bool
-# 2343| ValueCategory = lvalue
-# 2343| getRValue(): [Literal] 0
-# 2343| Type = [BoolType] bool
-# 2343| Value = [Literal] 0
-# 2343| ValueCategory = prvalue
-# 2345| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2345| Type = [VoidType] void
-# 2345| ValueCategory = prvalue
-# 2345| getQualifier(): [VariableAccess] s
-# 2345| Type = [Struct] String
-# 2345| ValueCategory = lvalue
-# 2347| getStmt(1): [BlockStmt] { ... }
-# 2348| getStmt(0): [WhileStmt] while (...) ...
-# 2348| getCondition(): [ConditionDeclExpr] (condition decl)
-# 2348| Type = [BoolType] bool
-# 2348| ValueCategory = prvalue
-# 2348| getChild(0): [FunctionCall] call to operator bool
-# 2348| Type = [BoolType] bool
-# 2348| ValueCategory = prvalue
-# 2348| getQualifier(): [VariableAccess] B
-# 2348| Type = [Class] Bool
-# 2348| ValueCategory = prvalue(load)
-# 2348| getInitializingExpr(): [ConstructorCall] call to Bool
-# 2348| Type = [VoidType] void
-# 2348| ValueCategory = prvalue
-# 2348| getArgument(0): [VariableAccess] b
-# 2348| Type = [BoolType] bool
-# 2348| ValueCategory = prvalue(load)
-# 2348| getStmt(): [BlockStmt] { ... }
-# 2349| getStmt(0): [ExprStmt] ExprStmt
-# 2349| getExpr(): [AssignExpr] ... = ...
+# 2336| getVariable().getInitializer(): [Initializer] initializer for s2
+# 2336| getExpr(): [ConstructorCall] call to String
+# 2336| Type = [VoidType] void
+# 2336| ValueCategory = prvalue
+# 2337| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2337| Type = [VoidType] void
+# 2337| ValueCategory = prvalue
+# 2337| getQualifier(): [VariableAccess] s2
+# 2337| Type = [Struct] String
+# 2337| ValueCategory = lvalue
+# 2337| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool
+# 2337| Type = [VoidType] void
+# 2337| ValueCategory = prvalue
+# 2337| getQualifier(): [VariableAccess] B
+# 2337| Type = [Class] Bool
+# 2337| ValueCategory = lvalue
+# 2338| getStmt(1): [ReturnStmt] return ...
+# 2340| [TopLevelFunction] void WhileLoopDestructors(bool)
+# 2340| :
+# 2340| getParameter(0): [Parameter] b
+# 2340| Type = [BoolType] bool
+# 2340| getEntryPoint(): [BlockStmt] { ... }
+# 2341| getStmt(0): [BlockStmt] { ... }
+# 2342| getStmt(0): [DeclStmt] declaration
+# 2342| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
+# 2342| Type = [Struct] String
+# 2342| getVariable().getInitializer(): [Initializer] initializer for s
+# 2342| getExpr(): [ConstructorCall] call to String
+# 2342| Type = [VoidType] void
+# 2342| ValueCategory = prvalue
+# 2343| getStmt(1): [WhileStmt] while (...) ...
+# 2343| getCondition(): [VariableAccess] b
+# 2343| Type = [BoolType] bool
+# 2343| ValueCategory = prvalue(load)
+# 2343| getStmt(): [BlockStmt] { ... }
+# 2344| getStmt(0): [ExprStmt] ExprStmt
+# 2344| getExpr(): [AssignExpr] ... = ...
+# 2344| Type = [BoolType] bool
+# 2344| ValueCategory = lvalue
+# 2344| getLValue(): [VariableAccess] b
+# 2344| Type = [BoolType] bool
+# 2344| ValueCategory = lvalue
+# 2344| getRValue(): [Literal] 0
+# 2344| Type = [BoolType] bool
+# 2344| Value = [Literal] 0
+# 2344| ValueCategory = prvalue
+# 2346| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2346| Type = [VoidType] void
+# 2346| ValueCategory = prvalue
+# 2346| getQualifier(): [VariableAccess] s
+# 2346| Type = [Struct] String
+# 2346| ValueCategory = lvalue
+# 2348| getStmt(1): [BlockStmt] { ... }
+# 2349| getStmt(0): [WhileStmt] while (...) ...
+# 2349| getCondition(): [ConditionDeclExpr] (condition decl)
+# 2349| Type = [BoolType] bool
+# 2349| ValueCategory = prvalue
+# 2349| getChild(0): [FunctionCall] call to operator bool
+# 2349| Type = [BoolType] bool
+# 2349| ValueCategory = prvalue
+# 2349| getQualifier(): [VariableAccess] B
+# 2349| Type = [Class] Bool
+# 2349| ValueCategory = prvalue(load)
+# 2349| getInitializingExpr(): [ConstructorCall] call to Bool
+# 2349| Type = [VoidType] void
+# 2349| ValueCategory = prvalue
+# 2349| getArgument(0): [VariableAccess] b
# 2349| Type = [BoolType] bool
-# 2349| ValueCategory = lvalue
-# 2349| getLValue(): [VariableAccess] b
-# 2349| Type = [BoolType] bool
-# 2349| ValueCategory = lvalue
-# 2349| getRValue(): [Literal] 0
-# 2349| Type = [BoolType] bool
-# 2349| Value = [Literal] 0
-# 2349| ValueCategory = prvalue
-# 2350| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool
-# 2350| Type = [VoidType] void
-# 2350| ValueCategory = prvalue
-# 2350| getQualifier(): [VariableAccess] B
-# 2350| Type = [Class] Bool
+# 2349| ValueCategory = prvalue(load)
+# 2349| getStmt(): [BlockStmt] { ... }
+# 2350| getStmt(0): [ExprStmt] ExprStmt
+# 2350| getExpr(): [AssignExpr] ... = ...
+# 2350| Type = [BoolType] bool
# 2350| ValueCategory = lvalue
-# 2350| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool
-# 2350| Type = [VoidType] void
-# 2350| ValueCategory = prvalue
-# 2350| getQualifier(): [VariableAccess] B
-# 2350| Type = [Class] Bool
-# 2350| ValueCategory = lvalue
-# 2352| getStmt(2): [ReturnStmt] return ...
-# 2354| [TopLevelFunction] void VoidFunc()
-# 2354| :
-# 2354| getEntryPoint(): [BlockStmt] { ... }
-# 2354| getStmt(0): [ReturnStmt] return ...
-# 2356| [TopLevelFunction] void IfReturnDestructors(bool)
-# 2356| :
-# 2356| getParameter(0): [Parameter] b
-# 2356| Type = [BoolType] bool
-# 2356| getEntryPoint(): [BlockStmt] { ... }
-# 2357| getStmt(0): [DeclStmt] declaration
-# 2357| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
-# 2357| Type = [Struct] String
-# 2357| getVariable().getInitializer(): [Initializer] initializer for s
-# 2357| getExpr(): [ConstructorCall] call to String
-# 2357| Type = [VoidType] void
-# 2357| ValueCategory = prvalue
-# 2358| getStmt(1): [IfStmt] if (...) ...
-# 2358| getCondition(): [VariableAccess] b
-# 2358| Type = [BoolType] bool
-# 2358| ValueCategory = prvalue(load)
-# 2358| getThen(): [BlockStmt] { ... }
-# 2359| getStmt(0): [ReturnStmt] return ...
-# 2365| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2365| Type = [VoidType] void
-# 2365| ValueCategory = prvalue
-# 2365| getQualifier(): [VariableAccess] s
-# 2365| Type = [Struct] String
-# 2365| ValueCategory = lvalue
-# 2361| getStmt(2): [IfStmt] if (...) ...
-# 2361| getCondition(): [VariableAccess] b
-# 2361| Type = [BoolType] bool
-# 2361| ValueCategory = prvalue(load)
-# 2361| getThen(): [BlockStmt] { ... }
-# 2362| getStmt(0): [ReturnStmt] return ...
-# 2362| getExpr(): [FunctionCall] call to VoidFunc
-# 2362| Type = [VoidType] void
-# 2362| ValueCategory = prvalue
-# 2365| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2365| Type = [VoidType] void
-# 2365| ValueCategory = prvalue
-# 2365| getQualifier(): [VariableAccess] s
-# 2365| Type = [Struct] String
-# 2365| ValueCategory = lvalue
-# 2364| getStmt(3): [ExprStmt] ExprStmt
-# 2364| getExpr(): [VariableAccess] s
-# 2364| Type = [Struct] String
-# 2364| ValueCategory = lvalue
-# 2365| getStmt(4): [ReturnStmt] return ...
-# 2365| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2365| Type = [VoidType] void
-# 2365| ValueCategory = prvalue
-# 2365| getQualifier(): [VariableAccess] s
-# 2365| Type = [Struct] String
-# 2365| ValueCategory = lvalue
-# 2367| [TopLevelFunction] int IfReturnDestructors3(bool)
-# 2367| :
-# 2367| getParameter(0): [Parameter] b
-# 2367| Type = [BoolType] bool
-# 2367| getEntryPoint(): [BlockStmt] { ... }
-# 2368| getStmt(0): [DeclStmt] declaration
-# 2368| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
-# 2368| Type = [Struct] String
-# 2368| getVariable().getInitializer(): [Initializer] initializer for s
-# 2368| getExpr(): [ConstructorCall] call to String
-# 2368| Type = [VoidType] void
-# 2368| ValueCategory = prvalue
-# 2369| getStmt(1): [IfStmt] if (...) ...
-# 2369| getCondition(): [VariableAccess] b
-# 2369| Type = [BoolType] bool
-# 2369| ValueCategory = prvalue(load)
-# 2369| getThen(): [BlockStmt] { ... }
-# 2370| getStmt(0): [ReturnStmt] return ...
-# 2370| getExpr(): [Literal] 1
-# 2370| Type = [IntType] int
-# 2370| Value = [Literal] 1
-# 2370| ValueCategory = prvalue
-# 2373| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2373| Type = [VoidType] void
-# 2373| ValueCategory = prvalue
-# 2373| getQualifier(): [VariableAccess] s
-# 2373| Type = [Struct] String
-# 2373| ValueCategory = lvalue
-# 2372| getStmt(2): [ReturnStmt] return ...
-# 2372| getExpr(): [Literal] 0
-# 2372| Type = [IntType] int
-# 2372| Value = [Literal] 0
-# 2372| ValueCategory = prvalue
-# 2373| getImplicitDestructorCall(0): [DestructorCall] call to ~String
-# 2373| Type = [VoidType] void
+# 2350| getLValue(): [VariableAccess] b
+# 2350| Type = [BoolType] bool
+# 2350| ValueCategory = lvalue
+# 2350| getRValue(): [Literal] 0
+# 2350| Type = [BoolType] bool
+# 2350| Value = [Literal] 0
+# 2350| ValueCategory = prvalue
+# 2351| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool
+# 2351| Type = [VoidType] void
+# 2351| ValueCategory = prvalue
+# 2351| getQualifier(): [VariableAccess] B
+# 2351| Type = [Class] Bool
+# 2351| ValueCategory = lvalue
+# 2351| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool
+# 2351| Type = [VoidType] void
+# 2351| ValueCategory = prvalue
+# 2351| getQualifier(): [VariableAccess] B
+# 2351| Type = [Class] Bool
+# 2351| ValueCategory = lvalue
+# 2353| getStmt(2): [ReturnStmt] return ...
+# 2355| [TopLevelFunction] void VoidFunc()
+# 2355| :
+# 2355| getEntryPoint(): [BlockStmt] { ... }
+# 2355| getStmt(0): [ReturnStmt] return ...
+# 2357| [TopLevelFunction] void IfReturnDestructors(bool)
+# 2357| :
+# 2357| getParameter(0): [Parameter] b
+# 2357| Type = [BoolType] bool
+# 2357| getEntryPoint(): [BlockStmt] { ... }
+# 2358| getStmt(0): [DeclStmt] declaration
+# 2358| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
+# 2358| Type = [Struct] String
+# 2358| getVariable().getInitializer(): [Initializer] initializer for s
+# 2358| getExpr(): [ConstructorCall] call to String
+# 2358| Type = [VoidType] void
+# 2358| ValueCategory = prvalue
+# 2359| getStmt(1): [IfStmt] if (...) ...
+# 2359| getCondition(): [VariableAccess] b
+# 2359| Type = [BoolType] bool
+# 2359| ValueCategory = prvalue(load)
+# 2359| getThen(): [BlockStmt] { ... }
+# 2360| getStmt(0): [ReturnStmt] return ...
+# 2366| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2366| Type = [VoidType] void
+# 2366| ValueCategory = prvalue
+# 2366| getQualifier(): [VariableAccess] s
+# 2366| Type = [Struct] String
+# 2366| ValueCategory = lvalue
+# 2362| getStmt(2): [IfStmt] if (...) ...
+# 2362| getCondition(): [VariableAccess] b
+# 2362| Type = [BoolType] bool
+# 2362| ValueCategory = prvalue(load)
+# 2362| getThen(): [BlockStmt] { ... }
+# 2363| getStmt(0): [ReturnStmt] return ...
+# 2363| getExpr(): [FunctionCall] call to VoidFunc
+# 2363| Type = [VoidType] void
+# 2363| ValueCategory = prvalue
+# 2366| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2366| Type = [VoidType] void
+# 2366| ValueCategory = prvalue
+# 2366| getQualifier(): [VariableAccess] s
+# 2366| Type = [Struct] String
+# 2366| ValueCategory = lvalue
+# 2365| getStmt(3): [ExprStmt] ExprStmt
+# 2365| getExpr(): [VariableAccess] s
+# 2365| Type = [Struct] String
+# 2365| ValueCategory = lvalue
+# 2366| getStmt(4): [ReturnStmt] return ...
+# 2366| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2366| Type = [VoidType] void
+# 2366| ValueCategory = prvalue
+# 2366| getQualifier(): [VariableAccess] s
+# 2366| Type = [Struct] String
+# 2366| ValueCategory = lvalue
+# 2368| [TopLevelFunction] int IfReturnDestructors3(bool)
+# 2368| :
+# 2368| getParameter(0): [Parameter] b
+# 2368| Type = [BoolType] bool
+# 2368| getEntryPoint(): [BlockStmt] { ... }
+# 2369| getStmt(0): [DeclStmt] declaration
+# 2369| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
+# 2369| Type = [Struct] String
+# 2369| getVariable().getInitializer(): [Initializer] initializer for s
+# 2369| getExpr(): [ConstructorCall] call to String
+# 2369| Type = [VoidType] void
+# 2369| ValueCategory = prvalue
+# 2370| getStmt(1): [IfStmt] if (...) ...
+# 2370| getCondition(): [VariableAccess] b
+# 2370| Type = [BoolType] bool
+# 2370| ValueCategory = prvalue(load)
+# 2370| getThen(): [BlockStmt] { ... }
+# 2371| getStmt(0): [ReturnStmt] return ...
+# 2371| getExpr(): [Literal] 1
+# 2371| Type = [IntType] int
+# 2371| Value = [Literal] 1
+# 2371| ValueCategory = prvalue
+# 2374| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2374| Type = [VoidType] void
+# 2374| ValueCategory = prvalue
+# 2374| getQualifier(): [VariableAccess] s
+# 2374| Type = [Struct] String
+# 2374| ValueCategory = lvalue
+# 2373| getStmt(2): [ReturnStmt] return ...
+# 2373| getExpr(): [Literal] 0
+# 2373| Type = [IntType] int
+# 2373| Value = [Literal] 0
# 2373| ValueCategory = prvalue
-# 2373| getQualifier(): [VariableAccess] s
-# 2373| Type = [Struct] String
-# 2373| ValueCategory = lvalue
-# 2375| [TopLevelFunction] void VoidReturnDestructors()
-# 2375| :
-# 2375| getEntryPoint(): [BlockStmt] { ... }
-# 2376| getStmt(0): [DeclStmt] declaration
-# 2376| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
-# 2376| Type = [Struct] String
-# 2376| getVariable().getInitializer(): [Initializer] initializer for s
-# 2376| getExpr(): [ConstructorCall] call to String
-# 2376| Type = [VoidType] void
-# 2376| ValueCategory = prvalue
-# 2377| getStmt(1): [ReturnStmt] return ...
-# 2377| getExpr(): [FunctionCall] call to VoidFunc
-# 2377| Type = [VoidType] void
-# 2377| ValueCategory = prvalue
-# 2378| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2374| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2374| Type = [VoidType] void
+# 2374| ValueCategory = prvalue
+# 2374| getQualifier(): [VariableAccess] s
+# 2374| Type = [Struct] String
+# 2374| ValueCategory = lvalue
+# 2376| [TopLevelFunction] void VoidReturnDestructors()
+# 2376| :
+# 2376| getEntryPoint(): [BlockStmt] { ... }
+# 2377| getStmt(0): [DeclStmt] declaration
+# 2377| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
+# 2377| Type = [Struct] String
+# 2377| getVariable().getInitializer(): [Initializer] initializer for s
+# 2377| getExpr(): [ConstructorCall] call to String
+# 2377| Type = [VoidType] void
+# 2377| ValueCategory = prvalue
+# 2378| getStmt(1): [ReturnStmt] return ...
+# 2378| getExpr(): [FunctionCall] call to VoidFunc
# 2378| Type = [VoidType] void
# 2378| ValueCategory = prvalue
-# 2378| getQualifier(): [VariableAccess] s
-# 2378| Type = [Struct] String
-# 2378| ValueCategory = lvalue
-# 2381| [CopyAssignmentOperator] return_routine_type::HasVoidToIntFunc& return_routine_type::HasVoidToIntFunc::operator=(return_routine_type::HasVoidToIntFunc const&)
-# 2381| :
+# 2379| getImplicitDestructorCall(0): [DestructorCall] call to ~String
+# 2379| Type = [VoidType] void
+# 2379| ValueCategory = prvalue
+# 2379| getQualifier(): [VariableAccess] s
+# 2379| Type = [Struct] String
+# 2379| ValueCategory = lvalue
+# 2382| [CopyAssignmentOperator] return_routine_type::HasVoidToIntFunc& return_routine_type::HasVoidToIntFunc::operator=(return_routine_type::HasVoidToIntFunc const&)
+# 2382| :
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const HasVoidToIntFunc &
-# 2381| [MoveAssignmentOperator] return_routine_type::HasVoidToIntFunc& return_routine_type::HasVoidToIntFunc::operator=(return_routine_type::HasVoidToIntFunc&&)
-# 2381| :
+# 2382| [MoveAssignmentOperator] return_routine_type::HasVoidToIntFunc& return_routine_type::HasVoidToIntFunc::operator=(return_routine_type::HasVoidToIntFunc&&)
+# 2382| :
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] HasVoidToIntFunc &&
-# 2383| [MemberFunction] void return_routine_type::HasVoidToIntFunc::VoidToInt(int)
-# 2383| :
-# 2383| getParameter(0): [Parameter] (unnamed parameter 0)
-# 2383| Type = [IntType] int
-# 2388| [TopLevelFunction] return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc()
-# 2388| :
-# 2389| getEntryPoint(): [BlockStmt] { ... }
-# 2390| getStmt(0): [ReturnStmt] return ...
-# 2390| getExpr(): [FunctionAccess] VoidToInt
-# 2390| Type = [RoutineType] ..()(..)
-# 2390| ValueCategory = prvalue
-# 2395| [TopLevelFunction] int small_operation_should_not_be_constant_folded()
-# 2395| :
-# 2395| getEntryPoint(): [BlockStmt] { ... }
-# 2396| getStmt(0): [ReturnStmt] return ...
-# 2396| getExpr(): [BitwiseXorExpr] ... ^ ...
-# 2396| Type = [IntType] int
-# 2396| Value = [BitwiseXorExpr] 3
-# 2396| ValueCategory = prvalue
-# 2396| getLeftOperand(): [Literal] 1
-# 2396| Type = [IntType] int
-# 2396| Value = [Literal] 1
-# 2396| ValueCategory = prvalue
-# 2396| getRightOperand(): [Literal] 2
-# 2396| Type = [IntType] int
-# 2396| Value = [Literal] 2
-# 2396| ValueCategory = prvalue
-# 2406| [TopLevelFunction] int large_operation_should_be_constant_folded()
-# 2406| :
-# 2406| getEntryPoint(): [BlockStmt] { ... }
-# 2407| getStmt(0): [ReturnStmt] return ...
-# 2407| getExpr(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [BitwiseXorExpr] ... ^ ...
-# 2407| Type = [IntType] int
-# 2407| Value = [BitwiseXorExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand(): [Literal] 1
-# 2407| Type = [IntType] int
-# 2407| Value = [Literal] 1
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2407| getExpr().getFullyConverted(): [ParenthesisExpr] (...)
-# 2407| Type = [IntType] int
-# 2407| Value = [ParenthesisExpr] 0
-# 2407| ValueCategory = prvalue
-# 2410| [TopLevelFunction] void initialization_with_temp_destructor()
-# 2410| :
-# 2410| getEntryPoint(): [BlockStmt] { ... }
-# 2411| getStmt(0): [IfStmt] if (...) ...
-# 2411| getCondition(): [ConditionDeclExpr] (condition decl)
-# 2411| Type = [BoolType] bool
-# 2411| ValueCategory = prvalue
-# 2411| getVariableAccess(): [VariableAccess] x
-# 2411| Type = [PlainCharType] char
-# 2411| ValueCategory = prvalue(load)
-# 2411| getInitializingExpr(): [FunctionCall] call to get_x
-# 2411| Type = [PlainCharType] char
-# 2411| ValueCategory = prvalue
-# 2411| getQualifier(): [ConstructorCall] call to ClassWithDestructor
-# 2411| Type = [VoidType] void
-# 2411| ValueCategory = prvalue
-# 2411| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2411| Type = [VoidType] void
-# 2411| ValueCategory = prvalue
-# 2411| getQualifier(): [ReuseExpr] reuse of temporary object
-# 2411| Type = [Class] ClassWithDestructor
-# 2411| ValueCategory = xvalue
-# 2411| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
-# 2411| Type = [Class] ClassWithDestructor
-# 2411| ValueCategory = prvalue(load)
-# 2411| getVariableAccess().getFullyConverted(): [CStyleCast] (bool)...
-# 2411| Conversion = [BoolConversion] conversion to bool
-# 2411| Type = [BoolType] bool
-# 2411| ValueCategory = prvalue
-# 2412| getThen(): [ExprStmt] ExprStmt
-# 2412| getExpr(): [PostfixIncrExpr] ... ++
+# 2384| [MemberFunction] void return_routine_type::HasVoidToIntFunc::VoidToInt(int)
+# 2384| :
+# 2384| getParameter(0): [Parameter] (unnamed parameter 0)
+# 2384| Type = [IntType] int
+# 2389| [TopLevelFunction] return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc()
+# 2389| :
+# 2390| getEntryPoint(): [BlockStmt] { ... }
+# 2391| getStmt(0): [ReturnStmt] return ...
+# 2391| getExpr(): [FunctionAccess] VoidToInt
+# 2391| Type = [RoutineType] ..()(..)
+# 2391| ValueCategory = prvalue
+# 2396| [TopLevelFunction] int small_operation_should_not_be_constant_folded()
+# 2396| :
+# 2396| getEntryPoint(): [BlockStmt] { ... }
+# 2397| getStmt(0): [ReturnStmt] return ...
+# 2397| getExpr(): [BitwiseXorExpr] ... ^ ...
+# 2397| Type = [IntType] int
+# 2397| Value = [BitwiseXorExpr] 3
+# 2397| ValueCategory = prvalue
+# 2397| getLeftOperand(): [Literal] 1
+# 2397| Type = [IntType] int
+# 2397| Value = [Literal] 1
+# 2397| ValueCategory = prvalue
+# 2397| getRightOperand(): [Literal] 2
+# 2397| Type = [IntType] int
+# 2397| Value = [Literal] 2
+# 2397| ValueCategory = prvalue
+# 2407| [TopLevelFunction] int large_operation_should_be_constant_folded()
+# 2407| :
+# 2407| getEntryPoint(): [BlockStmt] { ... }
+# 2408| getStmt(0): [ReturnStmt] return ...
+# 2408| getExpr(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [BitwiseXorExpr] ... ^ ...
+# 2408| Type = [IntType] int
+# 2408| Value = [BitwiseXorExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand(): [Literal] 1
+# 2408| Type = [IntType] int
+# 2408| Value = [Literal] 1
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getLeftOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2408| getExpr().getFullyConverted(): [ParenthesisExpr] (...)
+# 2408| Type = [IntType] int
+# 2408| Value = [ParenthesisExpr] 0
+# 2408| ValueCategory = prvalue
+# 2411| [TopLevelFunction] void initialization_with_temp_destructor()
+# 2411| :
+# 2411| getEntryPoint(): [BlockStmt] { ... }
+# 2412| getStmt(0): [IfStmt] if (...) ...
+# 2412| getCondition(): [ConditionDeclExpr] (condition decl)
+# 2412| Type = [BoolType] bool
+# 2412| ValueCategory = prvalue
+# 2412| getVariableAccess(): [VariableAccess] x
+# 2412| Type = [PlainCharType] char
+# 2412| ValueCategory = prvalue(load)
+# 2412| getInitializingExpr(): [FunctionCall] call to get_x
# 2412| Type = [PlainCharType] char
# 2412| ValueCategory = prvalue
-# 2412| getOperand(): [VariableAccess] x
-# 2412| Type = [PlainCharType] char
-# 2412| ValueCategory = lvalue
-# 2414| getStmt(1): [IfStmt] if (...) ...
-# 2414| getInitialization(): [DeclStmt] declaration
-# 2414| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
-# 2414| Type = [PlainCharType] char
-# 2414| getVariable().getInitializer(): [Initializer] initializer for x
-# 2414| getExpr(): [FunctionCall] call to get_x
-# 2414| Type = [PlainCharType] char
-# 2414| ValueCategory = prvalue
-# 2414| getQualifier(): [ConstructorCall] call to ClassWithDestructor
-# 2414| Type = [VoidType] void
-# 2414| ValueCategory = prvalue
-# 2414| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2414| Type = [VoidType] void
-# 2414| ValueCategory = prvalue
-# 2414| getQualifier(): [ReuseExpr] reuse of temporary object
-# 2414| Type = [Class] ClassWithDestructor
-# 2414| ValueCategory = xvalue
-# 2414| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
-# 2414| Type = [Class] ClassWithDestructor
-# 2414| ValueCategory = prvalue(load)
-# 2414| getCondition(): [VariableAccess] x
-# 2414| Type = [PlainCharType] char
-# 2414| ValueCategory = prvalue(load)
-# 2415| getThen(): [ExprStmt] ExprStmt
-# 2415| getExpr(): [PostfixIncrExpr] ... ++
+# 2412| getQualifier(): [ConstructorCall] call to ClassWithDestructor
+# 2412| Type = [VoidType] void
+# 2412| ValueCategory = prvalue
+# 2412| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2412| Type = [VoidType] void
+# 2412| ValueCategory = prvalue
+# 2412| getQualifier(): [ReuseExpr] reuse of temporary object
+# 2412| Type = [Class] ClassWithDestructor
+# 2412| ValueCategory = xvalue
+# 2412| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
+# 2412| Type = [Class] ClassWithDestructor
+# 2412| ValueCategory = prvalue(load)
+# 2412| getVariableAccess().getFullyConverted(): [CStyleCast] (bool)...
+# 2412| Conversion = [BoolConversion] conversion to bool
+# 2412| Type = [BoolType] bool
+# 2412| ValueCategory = prvalue
+# 2413| getThen(): [ExprStmt] ExprStmt
+# 2413| getExpr(): [PostfixIncrExpr] ... ++
+# 2413| Type = [PlainCharType] char
+# 2413| ValueCategory = prvalue
+# 2413| getOperand(): [VariableAccess] x
+# 2413| Type = [PlainCharType] char
+# 2413| ValueCategory = lvalue
+# 2415| getStmt(1): [IfStmt] if (...) ...
+# 2415| getInitialization(): [DeclStmt] declaration
+# 2415| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
# 2415| Type = [PlainCharType] char
-# 2415| ValueCategory = prvalue
-# 2415| getOperand(): [VariableAccess] x
-# 2415| Type = [PlainCharType] char
-# 2415| ValueCategory = lvalue
-# 2414| getCondition().getFullyConverted(): [CStyleCast] (bool)...
-# 2414| Conversion = [BoolConversion] conversion to bool
-# 2414| Type = [BoolType] bool
-# 2414| ValueCategory = prvalue
-# 2417| getStmt(2): [ConstexprIfStmt] if constexpr (...) ...
-# 2417| getInitialization(): [DeclStmt] declaration
-# 2417| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
-# 2417| Type = [PlainCharType] char
-# 2417| getVariable().getInitializer(): [Initializer] initializer for x
-# 2417| getExpr(): [FunctionCall] call to get_x
-# 2417| Type = [PlainCharType] char
-# 2417| ValueCategory = prvalue
-# 2417| getQualifier(): [ConstructorCall] call to ClassWithDestructor
-# 2417| Type = [VoidType] void
-# 2417| ValueCategory = prvalue
-# 2417| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2417| Type = [VoidType] void
-# 2417| ValueCategory = prvalue
-# 2417| getQualifier(): [ReuseExpr] reuse of temporary object
-# 2417| Type = [Class] ClassWithDestructor
-# 2417| ValueCategory = xvalue
-# 2417| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
-# 2417| Type = [Class] ClassWithDestructor
-# 2417| ValueCategory = prvalue(load)
-# 2417| getCondition(): [VariableAccess] initialization_with_destructor_bool
-# 2417| Type = [BoolType] bool
-# 2417| Value = [VariableAccess] 1
-# 2417| ValueCategory = prvalue(load)
-# 2418| getThen(): [ExprStmt] ExprStmt
-# 2418| getExpr(): [PostfixIncrExpr] ... ++
+# 2415| getVariable().getInitializer(): [Initializer] initializer for x
+# 2415| getExpr(): [FunctionCall] call to get_x
+# 2415| Type = [PlainCharType] char
+# 2415| ValueCategory = prvalue
+# 2415| getQualifier(): [ConstructorCall] call to ClassWithDestructor
+# 2415| Type = [VoidType] void
+# 2415| ValueCategory = prvalue
+# 2415| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2415| Type = [VoidType] void
+# 2415| ValueCategory = prvalue
+# 2415| getQualifier(): [ReuseExpr] reuse of temporary object
+# 2415| Type = [Class] ClassWithDestructor
+# 2415| ValueCategory = xvalue
+# 2415| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
+# 2415| Type = [Class] ClassWithDestructor
+# 2415| ValueCategory = prvalue(load)
+# 2415| getCondition(): [VariableAccess] x
+# 2415| Type = [PlainCharType] char
+# 2415| ValueCategory = prvalue(load)
+# 2416| getThen(): [ExprStmt] ExprStmt
+# 2416| getExpr(): [PostfixIncrExpr] ... ++
+# 2416| Type = [PlainCharType] char
+# 2416| ValueCategory = prvalue
+# 2416| getOperand(): [VariableAccess] x
+# 2416| Type = [PlainCharType] char
+# 2416| ValueCategory = lvalue
+# 2415| getCondition().getFullyConverted(): [CStyleCast] (bool)...
+# 2415| Conversion = [BoolConversion] conversion to bool
+# 2415| Type = [BoolType] bool
+# 2415| ValueCategory = prvalue
+# 2418| getStmt(2): [ConstexprIfStmt] if constexpr (...) ...
+# 2418| getInitialization(): [DeclStmt] declaration
+# 2418| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
# 2418| Type = [PlainCharType] char
-# 2418| ValueCategory = prvalue
-# 2418| getOperand(): [VariableAccess] x
-# 2418| Type = [PlainCharType] char
-# 2418| ValueCategory = lvalue
-# 2420| getStmt(3): [SwitchStmt] switch (...) ...
-# 2420| getExpr(): [ConditionDeclExpr] (condition decl)
-# 2420| Type = [IntType] int
-# 2420| ValueCategory = prvalue
-# 2420| getVariableAccess(): [VariableAccess] x
-# 2420| Type = [PlainCharType] char
-# 2420| ValueCategory = prvalue(load)
-# 2420| getInitializingExpr(): [FunctionCall] call to get_x
-# 2420| Type = [PlainCharType] char
-# 2420| ValueCategory = prvalue
-# 2420| getQualifier(): [ConstructorCall] call to ClassWithDestructor
-# 2420| Type = [VoidType] void
-# 2420| ValueCategory = prvalue
-# 2420| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2420| Type = [VoidType] void
-# 2420| ValueCategory = prvalue
-# 2420| getQualifier(): [ReuseExpr] reuse of temporary object
-# 2420| Type = [Class] ClassWithDestructor
-# 2420| ValueCategory = xvalue
-# 2420| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
-# 2420| Type = [Class] ClassWithDestructor
-# 2420| ValueCategory = prvalue(load)
-# 2420| getVariableAccess().getFullyConverted(): [CStyleCast] (int)...
-# 2420| Conversion = [IntegralConversion] integral conversion
-# 2420| Type = [IntType] int
-# 2420| ValueCategory = prvalue
-# 2420| getStmt(): [BlockStmt] { ... }
-# 2421| getStmt(0): [SwitchCase] case ...:
-# 2421| getExpr(): [CharLiteral] 97
-# 2421| Type = [PlainCharType] char
-# 2421| Value = [CharLiteral] 97
+# 2418| getVariable().getInitializer(): [Initializer] initializer for x
+# 2418| getExpr(): [FunctionCall] call to get_x
+# 2418| Type = [PlainCharType] char
+# 2418| ValueCategory = prvalue
+# 2418| getQualifier(): [ConstructorCall] call to ClassWithDestructor
+# 2418| Type = [VoidType] void
+# 2418| ValueCategory = prvalue
+# 2418| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2418| Type = [VoidType] void
+# 2418| ValueCategory = prvalue
+# 2418| getQualifier(): [ReuseExpr] reuse of temporary object
+# 2418| Type = [Class] ClassWithDestructor
+# 2418| ValueCategory = xvalue
+# 2418| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
+# 2418| Type = [Class] ClassWithDestructor
+# 2418| ValueCategory = prvalue(load)
+# 2418| getCondition(): [VariableAccess] initialization_with_destructor_bool
+# 2418| Type = [BoolType] bool
+# 2418| Value = [VariableAccess] 1
+# 2418| ValueCategory = prvalue(load)
+# 2419| getThen(): [ExprStmt] ExprStmt
+# 2419| getExpr(): [PostfixIncrExpr] ... ++
+# 2419| Type = [PlainCharType] char
+# 2419| ValueCategory = prvalue
+# 2419| getOperand(): [VariableAccess] x
+# 2419| Type = [PlainCharType] char
+# 2419| ValueCategory = lvalue
+# 2421| getStmt(3): [SwitchStmt] switch (...) ...
+# 2421| getExpr(): [ConditionDeclExpr] (condition decl)
+# 2421| Type = [IntType] int
+# 2421| ValueCategory = prvalue
+# 2421| getVariableAccess(): [VariableAccess] x
+# 2421| Type = [PlainCharType] char
+# 2421| ValueCategory = prvalue(load)
+# 2421| getInitializingExpr(): [FunctionCall] call to get_x
+# 2421| Type = [PlainCharType] char
+# 2421| ValueCategory = prvalue
+# 2421| getQualifier(): [ConstructorCall] call to ClassWithDestructor
+# 2421| Type = [VoidType] void
# 2421| ValueCategory = prvalue
-# 2421| getExpr().getFullyConverted(): [CStyleCast] (int)...
-# 2421| Conversion = [IntegralConversion] integral conversion
-# 2421| Type = [IntType] int
-# 2421| Value = [CStyleCast] 97
+# 2421| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2421| Type = [VoidType] void
# 2421| ValueCategory = prvalue
-# 2422| getStmt(1): [ExprStmt] ExprStmt
-# 2422| getExpr(): [PostfixIncrExpr] ... ++
+# 2421| getQualifier(): [ReuseExpr] reuse of temporary object
+# 2421| Type = [Class] ClassWithDestructor
+# 2421| ValueCategory = xvalue
+# 2421| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
+# 2421| Type = [Class] ClassWithDestructor
+# 2421| ValueCategory = prvalue(load)
+# 2421| getVariableAccess().getFullyConverted(): [CStyleCast] (int)...
+# 2421| Conversion = [IntegralConversion] integral conversion
+# 2421| Type = [IntType] int
+# 2421| ValueCategory = prvalue
+# 2421| getStmt(): [BlockStmt] { ... }
+# 2422| getStmt(0): [SwitchCase] case ...:
+# 2422| getExpr(): [CharLiteral] 97
# 2422| Type = [PlainCharType] char
+# 2422| Value = [CharLiteral] 97
# 2422| ValueCategory = prvalue
-# 2422| getOperand(): [VariableAccess] x
-# 2422| Type = [PlainCharType] char
-# 2422| ValueCategory = lvalue
-# 2425| getStmt(4): [SwitchStmt] switch (...) ...
-# 2425| getInitialization(): [DeclStmt] declaration
-# 2425| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
-# 2425| Type = [PlainCharType] char
-# 2425| getVariable().getInitializer(): [Initializer] initializer for x
-# 2425| getExpr(): [FunctionCall] call to get_x
-# 2425| Type = [PlainCharType] char
-# 2425| ValueCategory = prvalue
-# 2425| getQualifier(): [ConstructorCall] call to ClassWithDestructor
-# 2425| Type = [VoidType] void
-# 2425| ValueCategory = prvalue
-# 2425| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2425| Type = [VoidType] void
-# 2425| ValueCategory = prvalue
-# 2425| getQualifier(): [ReuseExpr] reuse of temporary object
-# 2425| Type = [Class] ClassWithDestructor
-# 2425| ValueCategory = xvalue
-# 2425| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
-# 2425| Type = [Class] ClassWithDestructor
-# 2425| ValueCategory = prvalue(load)
-# 2425| getExpr(): [VariableAccess] x
-# 2425| Type = [PlainCharType] char
-# 2425| ValueCategory = prvalue(load)
-# 2425| getStmt(): [BlockStmt] { ... }
-# 2426| getStmt(0): [SwitchCase] case ...:
-# 2426| getExpr(): [CharLiteral] 97
-# 2426| Type = [PlainCharType] char
-# 2426| Value = [CharLiteral] 97
-# 2426| ValueCategory = prvalue
-# 2426| getExpr().getFullyConverted(): [CStyleCast] (int)...
-# 2426| Conversion = [IntegralConversion] integral conversion
-# 2426| Type = [IntType] int
-# 2426| Value = [CStyleCast] 97
-# 2426| ValueCategory = prvalue
-# 2427| getStmt(1): [ExprStmt] ExprStmt
-# 2427| getExpr(): [PostfixIncrExpr] ... ++
+# 2422| getExpr().getFullyConverted(): [CStyleCast] (int)...
+# 2422| Conversion = [IntegralConversion] integral conversion
+# 2422| Type = [IntType] int
+# 2422| Value = [CStyleCast] 97
+# 2422| ValueCategory = prvalue
+# 2423| getStmt(1): [ExprStmt] ExprStmt
+# 2423| getExpr(): [PostfixIncrExpr] ... ++
+# 2423| Type = [PlainCharType] char
+# 2423| ValueCategory = prvalue
+# 2423| getOperand(): [VariableAccess] x
+# 2423| Type = [PlainCharType] char
+# 2423| ValueCategory = lvalue
+# 2426| getStmt(4): [SwitchStmt] switch (...) ...
+# 2426| getInitialization(): [DeclStmt] declaration
+# 2426| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
+# 2426| Type = [PlainCharType] char
+# 2426| getVariable().getInitializer(): [Initializer] initializer for x
+# 2426| getExpr(): [FunctionCall] call to get_x
+# 2426| Type = [PlainCharType] char
+# 2426| ValueCategory = prvalue
+# 2426| getQualifier(): [ConstructorCall] call to ClassWithDestructor
+# 2426| Type = [VoidType] void
+# 2426| ValueCategory = prvalue
+# 2426| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2426| Type = [VoidType] void
+# 2426| ValueCategory = prvalue
+# 2426| getQualifier(): [ReuseExpr] reuse of temporary object
+# 2426| Type = [Class] ClassWithDestructor
+# 2426| ValueCategory = xvalue
+# 2426| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
+# 2426| Type = [Class] ClassWithDestructor
+# 2426| ValueCategory = prvalue(load)
+# 2426| getExpr(): [VariableAccess] x
+# 2426| Type = [PlainCharType] char
+# 2426| ValueCategory = prvalue(load)
+# 2426| getStmt(): [BlockStmt] { ... }
+# 2427| getStmt(0): [SwitchCase] case ...:
+# 2427| getExpr(): [CharLiteral] 97
# 2427| Type = [PlainCharType] char
+# 2427| Value = [CharLiteral] 97
# 2427| ValueCategory = prvalue
-# 2427| getOperand(): [VariableAccess] x
-# 2427| Type = [PlainCharType] char
-# 2427| ValueCategory = lvalue
-# 2425| getExpr().getFullyConverted(): [CStyleCast] (int)...
-# 2425| Conversion = [IntegralConversion] integral conversion
-# 2425| Type = [IntType] int
-# 2425| ValueCategory = prvalue
-# 2430| getStmt(5): [RangeBasedForStmt] for(...:...) ...
-# 2430| getInitialization(): [DeclStmt] declaration
-# 2430| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
-# 2430| Type = [PlainCharType] char
-# 2430| getVariable().getInitializer(): [Initializer] initializer for x
-# 2430| getExpr(): [FunctionCall] call to get_x
-# 2430| Type = [PlainCharType] char
-# 2430| ValueCategory = prvalue
-# 2430| getQualifier(): [ConstructorCall] call to ClassWithDestructor
-# 2430| Type = [VoidType] void
-# 2430| ValueCategory = prvalue
-# 2430| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
-# 2430| Type = [VoidType] void
-# 2430| ValueCategory = prvalue
-# 2430| getQualifier(): [ReuseExpr] reuse of temporary object
-# 2430| Type = [Class] ClassWithDestructor
-# 2430| ValueCategory = xvalue
-# 2430| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
-# 2430| Type = [Class] ClassWithDestructor
-# 2430| ValueCategory = prvalue(load)
-# 2430| getChild(1): [DeclStmt] declaration
-# 2430| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range)
-# 2430| Type = [RValueReferenceType] vector &&
+# 2427| getExpr().getFullyConverted(): [CStyleCast] (int)...
+# 2427| Conversion = [IntegralConversion] integral conversion
+# 2427| Type = [IntType] int
+# 2427| Value = [CStyleCast] 97
+# 2427| ValueCategory = prvalue
+# 2428| getStmt(1): [ExprStmt] ExprStmt
+# 2428| getExpr(): [PostfixIncrExpr] ... ++
+# 2428| Type = [PlainCharType] char
+# 2428| ValueCategory = prvalue
+# 2428| getOperand(): [VariableAccess] x
+# 2428| Type = [PlainCharType] char
+# 2428| ValueCategory = lvalue
+# 2426| getExpr().getFullyConverted(): [CStyleCast] (int)...
+# 2426| Conversion = [IntegralConversion] integral conversion
+# 2426| Type = [IntType] int
+# 2426| ValueCategory = prvalue
+# 2431| getStmt(5): [RangeBasedForStmt] for(...:...) ...
+# 2431| getInitialization(): [DeclStmt] declaration
+# 2431| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
+# 2431| Type = [PlainCharType] char
+# 2431| getVariable().getInitializer(): [Initializer] initializer for x
+# 2431| getExpr(): [FunctionCall] call to get_x
+# 2431| Type = [PlainCharType] char
+# 2431| ValueCategory = prvalue
+# 2431| getQualifier(): [ConstructorCall] call to ClassWithDestructor
+# 2431| Type = [VoidType] void
+# 2431| ValueCategory = prvalue
+# 2431| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
+# 2431| Type = [VoidType] void
+# 2431| ValueCategory = prvalue
+# 2431| getQualifier(): [ReuseExpr] reuse of temporary object
+# 2431| Type = [Class] ClassWithDestructor
+# 2431| ValueCategory = xvalue
+# 2431| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object
+# 2431| Type = [Class] ClassWithDestructor
+# 2431| ValueCategory = prvalue(load)
+# 2431| getChild(1): [DeclStmt] declaration
+# 2431| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range)
+# 2431| Type = [RValueReferenceType] vector &&
#-----| getVariable().getInitializer(): [Initializer] initializer for (__range)
-# 2430| getExpr(): [ConstructorCall] call to vector
-# 2430| Type = [VoidType] void
-# 2430| ValueCategory = prvalue
-# 2430| getArgument(0): [VariableAccess] x
-# 2430| Type = [PlainCharType] char
-# 2430| ValueCategory = prvalue(load)
-# 2430| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
-# 2430| Type = [LValueReferenceType] vector &
-# 2430| ValueCategory = prvalue
-# 2430| getExpr(): [TemporaryObjectExpr] temporary object
-# 2430| Type = [ClassTemplateInstantiation,Struct] vector
-# 2430| ValueCategory = xvalue
-# 2430| getBeginEndDeclaration(): [DeclStmt] declaration
-# 2430| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin)
-# 2430| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2431| getExpr(): [ConstructorCall] call to vector
+# 2431| Type = [VoidType] void
+# 2431| ValueCategory = prvalue
+# 2431| getArgument(0): [VariableAccess] x
+# 2431| Type = [PlainCharType] char
+# 2431| ValueCategory = prvalue(load)
+# 2431| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
+# 2431| Type = [LValueReferenceType] vector &
+# 2431| ValueCategory = prvalue
+# 2431| getExpr(): [TemporaryObjectExpr] temporary object
+# 2431| Type = [ClassTemplateInstantiation,Struct] vector
+# 2431| ValueCategory = xvalue
+# 2431| getBeginEndDeclaration(): [DeclStmt] declaration
+# 2431| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin)
+# 2431| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin)
-# 2430| getExpr(): [FunctionCall] call to begin
-# 2430| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
-# 2430| ValueCategory = prvalue
-# 2430| getQualifier(): [VariableAccess] (__range)
-# 2430| Type = [RValueReferenceType] vector &&
-# 2430| ValueCategory = prvalue(load)
+# 2431| getExpr(): [FunctionCall] call to begin
+# 2431| Type = [NestedTypedefType,UsingAliasTypedefType] iterator
+# 2431| ValueCategory = prvalue
+# 2431| getQualifier(): [VariableAccess] (__range)
+# 2431| Type = [RValueReferenceType] vector &&
+# 2431| ValueCategory = prvalue(load)
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const vector