<pre style='margin:0'>
ci42 pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/bf3dae828f1c5dd56621a162303332c0148f00a6">https://github.com/macports/macports-ports/commit/bf3dae828f1c5dd56621a162303332c0148f00a6</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit bf3dae828f1c5dd56621a162303332c0148f00a6
</span>Author: ci42 <ciserlohn@macports.org>
AuthorDate: Sat Sep 28 21:46:03 2019 +0200

<span style='display:block; white-space:pre;color:#404040;'>    nodejs12: update to version 12.11.0
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    - switch back to the macports provided openssl as we are now on version 1.1.x
</span><span style='display:block; white-space:pre;color:#404040;'>    - add file missing in the source tarball (https://github.com/nodejs/node/commit/f21818ec32b2e6a6acc010861742b451ce6fae1d)
</span>---
 devel/nodejs12/Portfile                            |   25 +-
 .../patch-deps-v8-test-torque-test-torque.tq.diff  | 1014 ++++++++++++++++++++
 2 files changed, 1029 insertions(+), 10 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/nodejs12/Portfile b/devel/nodejs12/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index ed3e5cc..7991bfb 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/nodejs12/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/nodejs12/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -10,7 +10,7 @@ configure.cxx_stdlib    libc++
</span> PortGroup               cxx11 1.1
 
 name                    nodejs12
<span style='display:block; white-space:pre;background:#ffe0e0;'>-version                 12.10.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+version                 12.11.0
</span> 
 categories              devel net
 platforms               darwin
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -30,16 +30,16 @@ homepage                https://nodejs.org/
</span> master_sites            ${homepage}dist/v${version}
 use_xz                  yes
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-checksums               rmd160  a57507cb7bf4e7ba86bbdd8f7536069a1e22f914 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  2515b87c60921f22514a58830e86e54831daa2453d0e82f2ed7ab02134ee30cd \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    22726116
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums               rmd160  142ebe5fba4c3a655b3e6f1acc62524b19918f61 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  8306491e9b7bb95f8ee34dcd8daa4c071b94d523e63c0f2b8c605f2ca43dcf91 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    22817256
</span> 
 distname                node-v${version}
 
 depends_build           port:pkgconfig
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-depends_lib             port:python27
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#                        path:lib/libssl.dylib:openssl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+depends_lib             port:python27 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        path:lib/libssl.dylib:openssl
</span> 
 proc rec_glob {basedir pattern} {
     set files [glob -directory $basedir -nocomplain -type f $pattern]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -51,7 +51,12 @@ proc rec_glob {basedir pattern} {
</span> 
 configure.python ${prefix}/bin/python2.7
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-patchfiles              patch-common.gypi.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles              patch-common.gypi.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        patch-deps-v8-test-torque-test-torque.tq.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+pre-patch {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    file mkdir ${worksrcpath}/deps/v8/test/torque
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span> 
 post-patch {
     foreach f [concat ${worksrcpath}/configure \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -73,9 +78,9 @@ if { ${os.platform} eq "darwin" && ${os.major} < 11 } {
</span> 
 configure.args-append   --without-npm
 configure.args-append   --with-intl=small-icu
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#configure.args-append   --shared-openssl
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#configure.args-append   --shared-openssl-includes=${prefix}/include/openssl
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#configure.args-append   --shared-openssl-libpath=${prefix}/lib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+configure.args-append   --shared-openssl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+configure.args-append   --shared-openssl-includes=${prefix}/include/openssl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+configure.args-append   --shared-openssl-libpath=${prefix}/lib
</span> 
 # V8 only supports ARM and IA-32 processors
 supported_archs         i386 x86_64
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/nodejs12/files/patch-deps-v8-test-torque-test-torque.tq.diff b/devel/nodejs12/files/patch-deps-v8-test-torque-test-torque.tq.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..07cf567
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/nodejs12/files/patch-deps-v8-test-torque-test-torque.tq.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,1014 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff -urN a/deps/v8/test/torque/test-torque.tq b/deps/v8/test/torque/test-torque.tq
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ deps/v8/test/torque/test-torque.tq
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,1010 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Copyright 2018 the V8 project authors. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Use of this source code is governed by a BSD-style license that can be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// found in the LICENSE file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace test {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro ElementsKindTestHelper1(kind: constexpr ElementsKind): bool {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if constexpr ((kind == UINT8_ELEMENTS) || (kind == UINT16_ELEMENTS)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro ElementsKindTestHelper2(kind: constexpr ElementsKind): constexpr bool {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return ((kind == UINT8_ELEMENTS) || (kind == UINT16_ELEMENTS));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro LabelTestHelper1(): never
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      labels Label1 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    goto Label1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro LabelTestHelper2(): never
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      labels Label2(Smi) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    goto Label2(42);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro LabelTestHelper3(): never
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      labels Label3(Oddball, Smi) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    goto Label3(Null, 7);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestConstexpr1() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(FromConstexpr<bool>(IsFastElementsKind(PACKED_SMI_ELEMENTS)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestConstexprIf() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(ElementsKindTestHelper1(UINT8_ELEMENTS));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(ElementsKindTestHelper1(UINT16_ELEMENTS));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!ElementsKindTestHelper1(UINT32_ELEMENTS));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestConstexprReturn() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(FromConstexpr<bool>(ElementsKindTestHelper2(UINT8_ELEMENTS)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(FromConstexpr<bool>(ElementsKindTestHelper2(UINT16_ELEMENTS)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!FromConstexpr<bool>(ElementsKindTestHelper2(UINT32_ELEMENTS)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(FromConstexpr<bool>(!ElementsKindTestHelper2(UINT32_ELEMENTS)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestGotoLabel(): Boolean {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      LabelTestHelper1() otherwise Label1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    label Label1 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return True;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestGotoLabelWithOneParameter(): Boolean {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      LabelTestHelper2() otherwise Label2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    label Label2(smi: Smi) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check(smi == 42);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return True;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestGotoLabelWithTwoParameters(): Boolean {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      LabelTestHelper3() otherwise Label3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    label Label3(o: Oddball, smi: Smi) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check(o == Null);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check(smi == 7);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return True;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  builtin GenericBuiltinTest<T: type>(_c: Context, _param: T): Object {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return Null;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  GenericBuiltinTest<Object>(_c: Context, param: Object): Object {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return param;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestBuiltinSpecialization(c: Context) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(GenericBuiltinTest<Smi>(c, 0) == Null);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(GenericBuiltinTest<Smi>(c, 1) == Null);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(GenericBuiltinTest<Object>(c, Undefined) == Undefined);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(GenericBuiltinTest<Object>(c, Undefined) == Undefined);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro LabelTestHelper4(flag: constexpr bool): never
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      labels Label4, Label5 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if constexpr (flag) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      goto Label4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      goto Label5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro CallLabelTestHelper4(flag: constexpr bool): bool {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      LabelTestHelper4(flag) otherwise Label4, Label5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    label Label4 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    label Label5 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestPartiallyUnusedLabel(): Boolean {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const r1: bool = CallLabelTestHelper4(true);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const r2: bool = CallLabelTestHelper4(false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (r1 && !r2) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return True;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return False;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro GenericMacroTest<T: type>(_param: T): Object {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return Undefined;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  GenericMacroTest<Object>(param2: Object): Object {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return param2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro GenericMacroTestWithLabels<T: type>(_param: T): Object
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  labels _X {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return Undefined;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  GenericMacroTestWithLabels<Object>(param2: Object): Object
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      labels Y {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return Cast<Smi>(param2) otherwise Y;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestMacroSpecialization() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      const _smi0: Smi = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check(GenericMacroTest<Smi>(0) == Undefined);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check(GenericMacroTest<Smi>(1) == Undefined);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check(GenericMacroTest<Object>(Null) == Null);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check(GenericMacroTest<Object>(False) == False);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check(GenericMacroTest<Object>(True) == True);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check((GenericMacroTestWithLabels<Smi>(0) otherwise Fail) == Undefined);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check((GenericMacroTestWithLabels<Smi>(0) otherwise Fail) == Undefined);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        GenericMacroTestWithLabels<Object>(False) otherwise Expected;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      label Expected {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    label Fail {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      unreachable;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  builtin TestHelperPlus1(_context: Context, x: Smi): Smi {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return x + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  builtin TestHelperPlus2(_context: Context, x: Smi): Smi {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return x + 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestFunctionPointers(implicit context: Context)(): Boolean {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let fptr: builtin(Context, Smi) => Smi = TestHelperPlus1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(fptr(context, 42) == 43);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    fptr = TestHelperPlus2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(fptr(context, 42) == 44);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return True;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestVariableRedeclaration(implicit context: Context)(): Boolean {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let _var1: int31 = FromConstexpr<bool>(42 == 0) ? 0 : 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let _var2: int31 = FromConstexpr<bool>(42 == 0) ? 1 : 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return True;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestTernaryOperator(x: Smi): Smi {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const b: bool = x < 0 ? true : false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return b ? x - 10 : x + 100;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestFunctionPointerToGeneric(c: Context) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const fptr1: builtin(Context, Smi) => Object = GenericBuiltinTest<Smi>;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const fptr2: builtin(Context, Object) => Object =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        GenericBuiltinTest<Object>;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(fptr1(c, 0) == Null);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(fptr1(c, 1) == Null);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(fptr2(c, Undefined) == Undefined);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(fptr2(c, Undefined) == Undefined);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  type ObjectToObject = builtin(Context, Object) => Object;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestTypeAlias(x: ObjectToObject): BuiltinPtr {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestUnsafeCast(implicit context: Context)(n: Number): Boolean {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (TaggedIsSmi(n)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      const m: Smi = UnsafeCast<Smi>(n);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check(TestHelperPlus1(context, m) == 11);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return True;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return False;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestHexLiteral() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(Convert<intptr>(0xffff) + 1 == 0x10000);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(Convert<intptr>(-0xffff) == -65535);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestLargeIntegerLiterals(implicit c: Context)() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let _x: int32 = 0x40000000;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let _y: int32 = 0x7fffffff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestMultilineAssert() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const someVeryLongVariableNameThatWillCauseLineBreaks: Smi = 5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        someVeryLongVariableNameThatWillCauseLineBreaks > 0 &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        someVeryLongVariableNameThatWillCauseLineBreaks < 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestNewlineInString() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Print('Hello, World!\n');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  const kConstexprConst: constexpr int31 = 5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  const kIntptrConst: intptr = 4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  const kSmiConst: Smi = 3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestModuleConstBindings() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(kConstexprConst == Int32Constant(5));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(kIntptrConst == 4);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(kSmiConst == 3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestLocalConstBindings() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const x: constexpr int31 = 3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const xSmi: Smi = x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      const x: Smi = x + FromConstexpr<Smi>(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check(x == xSmi + 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      const xSmi: Smi = x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check(x == xSmi);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check(x == 4);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(xSmi == 3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(x == xSmi);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  struct TestStructA {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    indexes: FixedArray;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    i: Smi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    k: Number;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  struct TestStructB {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    x: TestStructA;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    y: Smi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestStruct1(i: TestStructA): Smi {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return i.i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestStruct2(implicit context: Context)(): TestStructA {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return TestStructA{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      indexes: UnsafeCast<FixedArray>(kEmptyFixedArray),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      i: 27,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      k: 31
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestStruct3(implicit context: Context)(): TestStructA {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let a: TestStructA =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TestStructA{indexes: UnsafeCast<FixedArray>(kEmptyFixedArray), i: 13, k: 5};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let _b: TestStructA = a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const c: TestStructA = TestStruct2();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    a.i = TestStruct1(c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    a.k = a.i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let d: TestStructB;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    d.x = a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    d = TestStructB{x: a, y: 7};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let _e: TestStructA = d.x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let f: Smi = TestStructA{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      indexes: UnsafeCast<FixedArray>(kEmptyFixedArray),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      i: 27,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      k: 31
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }.i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    f = TestStruct2().i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  struct TestStructC {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    x: TestStructA;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    y: TestStructA;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestStruct4(implicit context: Context)(): TestStructC {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return TestStructC{x: TestStruct2(), y: TestStruct2()};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestStructInLabel(implicit context: Context)(): never labels
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Foo(TestStructA) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    goto Foo(TestStruct2());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export  // Silence unused warning.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro CallTestStructInLabel(implicit context: Context)() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      TestStructInLabel() otherwise Foo;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    label Foo(_s: TestStructA) {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // This macro tests different versions of the for-loop where some parts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // are (not) present.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestForLoop() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let sum: Smi = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (let i: Smi = 0; i < 5; ++i) sum += i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(sum == 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sum = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let j: Smi = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (; j < 5; ++j) sum += j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(sum == 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sum = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (; j < 5;) sum += j++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(sum == 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // Check that break works. No test expression.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sum = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (let i: Smi = 0;; ++i) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (i == 5) break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      sum += i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(sum == 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sum = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (;;) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (j == 5) break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      sum += j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      j++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(sum == 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // The following tests are the same as above, but use continue to skip
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // index 3.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sum = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (let i: Smi = 0; i < 5; ++i) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (i == 3) continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      sum += i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(sum == 7);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sum = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (; j < 5; ++j) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (j == 3) continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      sum += j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(sum == 7);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sum = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (; j < 5;) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (j == 3) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        j++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      sum += j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      j++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(sum == 7);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sum = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (let i: Smi = 0;; ++i) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (i == 3) continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (i == 5) break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      sum += i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(sum == 7);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sum = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (;;) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (j == 3) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        j++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (j == 5) break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      sum += j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      j++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(sum == 7);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      for (;;) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (++j == 10) goto Exit;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    label Exit {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      check(j == 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // Test if we can handle uninitialized values on the stack.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let _i: Smi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (let j: Smi = 0; j < 10; ++j) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestSubtyping(x: Smi) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const _foo: Object = x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro IncrementIfSmi<A: type>(x: A): A {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    typeswitch (x) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (x: Smi): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return x + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (o: A): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return o;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  type NumberOrFixedArray = Number | FixedArray;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TypeswitchExample(implicit context: Context)(x: NumberOrFixedArray):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      int32 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let result: int32 = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    typeswitch (IncrementIfSmi(x)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (_x: FixedArray): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        result = result + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (Number): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        result = result + 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    result = result * 10;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    typeswitch (IncrementIfSmi(x)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (x: Smi): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        result = result + Convert<int32>(x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (a: FixedArray): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        result = result + Convert<int32>(a.length);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (_x: HeapNumber): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        result = result + 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestTypeswitch(implicit context: Context)() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TypeswitchExample(FromConstexpr<Smi>(5)) == 26);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const a: FixedArray = AllocateZeroedFixedArray(3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TypeswitchExample(a) == 13);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TypeswitchExample(FromConstexpr<Number>(0.5)) == 27);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestTypeswitchAsanLsanFailure(implicit context: Context)(obj: Object) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    typeswitch (obj) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (_o: Smi): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (_o: JSTypedArray): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (_o: JSReceiver): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (_o: HeapObject): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro ExampleGenericOverload<A: type>(o: Object): A {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return o;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro ExampleGenericOverload<A: type>(o: Smi): A {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return o + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestGenericOverload(implicit context: Context)() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const xSmi: Smi = 5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const xObject: Object = xSmi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(ExampleGenericOverload<Smi>(xSmi) == 6);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(UnsafeCast<Smi>(ExampleGenericOverload<Object>(xObject)) == 5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestEquality(implicit context: Context)() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const notEqual: bool =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        AllocateHeapNumberWithValue(0.5) != AllocateHeapNumberWithValue(0.5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!notEqual);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const equal: bool =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        AllocateHeapNumberWithValue(0.5) == AllocateHeapNumberWithValue(0.5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(equal);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro BoolToBranch(x: bool): never
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      labels Taken, NotTaken {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (x) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      goto Taken;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      goto NotTaken;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestOrAnd1(x: bool, y: bool, z: bool): bool {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return BoolToBranch(x) || y && z ? true : false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestOrAnd2(x: bool, y: bool, z: bool): bool {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return x || BoolToBranch(y) && z ? true : false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestOrAnd3(x: bool, y: bool, z: bool): bool {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return x || y && BoolToBranch(z) ? true : false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestAndOr1(x: bool, y: bool, z: bool): bool {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return BoolToBranch(x) && y || z ? true : false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestAndOr2(x: bool, y: bool, z: bool): bool {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return x && BoolToBranch(y) || z ? true : false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestAndOr3(x: bool, y: bool, z: bool): bool {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return x && y || BoolToBranch(z) ? true : false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestLogicalOperators() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr1(true, true, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr2(true, true, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr3(true, true, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr1(true, true, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr2(true, true, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr3(true, true, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr1(true, false, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr2(true, false, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr3(true, false, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestAndOr1(true, false, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestAndOr2(true, false, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestAndOr3(true, false, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr1(false, true, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr2(false, true, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr3(false, true, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestAndOr1(false, true, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestAndOr2(false, true, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestAndOr3(false, true, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr1(false, false, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr2(false, false, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestAndOr3(false, false, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestAndOr1(false, false, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestAndOr2(false, false, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestAndOr3(false, false, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd1(true, true, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd2(true, true, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd3(true, true, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd1(true, true, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd2(true, true, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd3(true, true, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd1(true, false, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd2(true, false, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd3(true, false, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd1(true, false, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd2(true, false, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd3(true, false, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd1(false, true, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd2(false, true, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(TestOrAnd3(false, true, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestOrAnd1(false, true, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestOrAnd2(false, true, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestOrAnd3(false, true, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestOrAnd1(false, false, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestOrAnd2(false, false, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestOrAnd3(false, false, true));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestOrAnd1(false, false, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestOrAnd2(false, false, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!TestOrAnd3(false, false, false));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestCall(i: Smi): Smi labels A {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (i < 5) return i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    goto A;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestOtherwiseWithCode1() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let v: Smi = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let s: Smi = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      TestCall(10) otherwise goto B(++s);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    label B(v1: Smi) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      v = v1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    assert(v == 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestOtherwiseWithCode2() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let s: Smi = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (let i: Smi = 0; i < 10; ++i) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      TestCall(i) otherwise break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      ++s;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    assert(s == 5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestOtherwiseWithCode3() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let s: Smi = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (let i: Smi = 0; i < 10; ++i) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      s += TestCall(i) otherwise break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    assert(s == 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestForwardLabel() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      goto A;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    label A {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      goto B(5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    label B(b: Smi) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      assert(b == 5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestQualifiedAccess(implicit context: Context)() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const s: Smi = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(!array::IsJSArray(s));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestCatch1(implicit context: Context)(): Smi {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let r: Smi = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      ThrowTypeError(kInvalidArrayLength);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } catch (_e) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      r = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestCatch2Wrapper(implicit context: Context)(): never {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ThrowTypeError(kInvalidArrayLength);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestCatch2(implicit context: Context)(): Smi {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let r: Smi = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      TestCatch2Wrapper();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } catch (_e) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      r = 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestCatch3WrapperWithLabel(implicit context: Context)():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      never labels _Abort {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ThrowTypeError(kInvalidArrayLength);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestCatch3(implicit context: Context)(): Smi {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let r: Smi = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      TestCatch3WrapperWithLabel() otherwise Abort;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    label Abort {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    catch (_e) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      r = 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // This test doesn't actually test the functionality of iterators,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // it's only purpose is to make sure tha the CSA macros in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // IteratorBuiltinsAssembler match the signatures provided in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // iterator.tq.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestIterator(implicit context: Context)(o: JSReceiver, map: Map) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      const t1: Object = iterator::GetIteratorMethod(o);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      const t2: iterator::IteratorRecord = iterator::GetIterator(o);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      const _t3: Object = iterator::IteratorStep(t2) otherwise Fail;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      const _t4: Object = iterator::IteratorStep(t2, map) otherwise Fail;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      const t5: Object = iterator::IteratorValue(o);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      const _t6: Object = iterator::IteratorValue(o, map);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      const _t7: JSArray = iterator::IterableToList(t1, t1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      iterator::IteratorCloseOnException(t2, t5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    label Fail {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestFrame1(implicit context: Context)() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const f: Frame = LoadFramePointer();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const frameType: FrameType =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        Cast<FrameType>(f.context_or_frame_type) otherwise unreachable;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    assert(frameType == STUB_FRAME);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    assert(f.caller == LoadParentFramePointer());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    typeswitch (f) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (_f: StandardFrame): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        unreachable;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (_f: ArgumentsAdaptorFrame): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        unreachable;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (_f: StubFrame): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestNew(implicit context: Context)() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const f: JSArray = NewJSArray();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(f.IsEmpty());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    f.length = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  struct TestInner {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    SetX(newValue: int32) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      this.x = newValue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    GetX(): int32 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return this.x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    x: int32;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    y: int32;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  struct TestOuter {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    a: int32;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    b: TestInner;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    c: int32;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestStructConstructor(implicit context: Context)() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // Test default constructor
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let a: TestOuter = TestOuter{a: 5, b: TestInner{x: 6, y: 7}, c: 8};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(a.a == 5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(a.b.x == 6);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(a.b.y == 7);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(a.c == 8);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    a.b.x = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(a.b.x == 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    a.b.SetX(2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(a.b.x == 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(a.b.GetX() == 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  class InternalClass extends Struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Flip() labels NotASmi {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      const tmp = Cast<Smi>(this.b) otherwise NotASmi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      this.b = this.a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      this.a = tmp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    a: Smi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    b: Number;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro NewInternalClass(x: Smi): InternalClass {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return new InternalClass{a: x, b: x + 1};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestInternalClass(implicit context: Context)() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const o = NewInternalClass(5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    o.Flip() otherwise unreachable;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(o.a == 6);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(o.b == 5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  struct StructWithConst {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TestMethod1(): int32 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return this.b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TestMethod2(): Object {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return this.a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    a: Object;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const b: int32;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestConstInStructs() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const x = StructWithConst{a: Null, b: 1};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let y = StructWithConst{a: Null, b: 1};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    y.a = Undefined;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const _copy = x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(x.TestMethod1() == 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(x.TestMethod2() == Null);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  struct TestIterator {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Next(): Object labels NoMore {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (this.count-- == 0) goto NoMore;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return TheHole;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    count: Smi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestNewFixedArrayFromSpread(implicit context: Context)(): Object {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let i = TestIterator{count: 5};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return new FixedArray{map: kFixedArrayMap, length: 5, objects: ...i};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  class SmiPair extends Struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    GetA():&Smi {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return & this.a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    a: Smi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    b: Smi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro Swap<T: type>(a:&T, b:&T) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const tmp = * a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    * a = * b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    * b = tmp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestReferences() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const array = new SmiPair{a: 7, b: 2};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const ref:&Smi = & array.a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    * ref = 3 + * ref;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    -- * ref;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Swap(& array.b, array.GetA());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(array.a == 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(array.b == 9);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestStaticAssert() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    StaticAssert(1 + 2 == 3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  class SmiBox extends Struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    value: Smi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unrelated: Smi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  builtin NewSmiBox(implicit context: Context)(value: Smi): SmiBox {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return new SmiBox{value, unrelated: 0};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestLoadEliminationFixed(implicit context: Context)() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const box = NewSmiBox(123);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const v1 = box.value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    box.unrelated = 999;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const v2 = (box.unrelated == 0) ? box.value : box.value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    StaticAssert(WordEqual(v1, v2));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    box.value = 11;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const v3 = box.value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const eleven: Smi = 11;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    StaticAssert(WordEqual(v3, eleven));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestLoadEliminationVariable(implicit context: Context)() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const a = UnsafeCast<FixedArray>(kEmptyFixedArray);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const box = NewSmiBox(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const v1 = a.objects[box.value];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const u1 = a.objects[box.value + 2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const v2 = a.objects[box.value];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const u2 = a.objects[box.value + 2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    StaticAssert(WordEqual(v1, v2));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    StaticAssert(WordEqual(u1, u2));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestRedundantArrayElementCheck(implicit context: Context)(): Smi {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const a = kEmptyFixedArray;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (let i: Smi = 0; i < a.length; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (a.objects[i] == TheHole) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (a.objects[i] == TheHole) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          StaticAssert(false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestRedundantSmiCheck(implicit context: Context)(): Smi {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const a = kEmptyFixedArray;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const x = a.objects[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    typeswitch (x) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (Smi): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        Cast<Smi>(x) otherwise VerifiedUnreachable();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case (Object): {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  struct SBox<T: type> {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    value: T;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestGenericStruct1(): intptr {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const i: intptr = 123;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let box = SBox<intptr>{value: i};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    let boxbox = SBox<SBox<intptr>>{value: box};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(box.value == 123);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    boxbox.value.value *= 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(boxbox.value.value == 246);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return boxbox.value.value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  struct TestTuple<T1: type, T2: type> {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const fst: T1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const snd: T2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro Swap<T1: type, T2: type>(tuple: TestTuple<T1, T2>):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      TestTuple<T2, T1> {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return TestTuple<T2, T1>{fst: tuple.snd, snd: tuple.fst};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  @export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  macro TestGenericStruct2(): TestTuple<Smi, intptr> {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const intptrAndSmi = TestTuple<intptr, Smi>{fst: 1, snd: 2};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const smiAndIntptr = Swap<intptr, Smi>(intptrAndSmi);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(intptrAndSmi.fst == smiAndIntptr.snd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    check(intptrAndSmi.snd == smiAndIntptr.fst);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return smiAndIntptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span></pre><pre style='margin:0'>

</pre>