diff --git a/test/runtime/samples/await-then-destruct-array-nested-rest/_config.js b/test/runtime/samples/await-then-destruct-array-nested-rest/_config.js
new file mode 100644
index 0000000000..9a287e35e2
--- /dev/null
+++ b/test/runtime/samples/await-then-destruct-array-nested-rest/_config.js
@@ -0,0 +1,69 @@
+export default {
+ props: {
+ thePromise: new Promise(_ => {})
+ },
+
+ html: `
+ loading...
+ `,
+
+ async test({ assert, component, target }) {
+ await (component.thePromise = Promise.resolve([1, 2, 3, 4, 5, 6, 7, 8]));
+
+ assert.htmlEqual(
+ target.innerHTML,
+ `
+
a: 1
+ b: 2
+ c: 5
+ remaining length: 3
+ `
+ );
+
+ await (component.thePromise = Promise.resolve([9, 10, 11, 12, 13, 14, 15]));
+
+ assert.htmlEqual(
+ target.innerHTML,
+ `
+ a: 9
+ b: 10
+ c: 13
+ remaining length: 2
+ `
+ );
+
+ try {
+ await (component.thePromise = Promise.reject([16, 17, 18, 19, 20, 21, 22]));
+ } catch (e) {
+ // do nothing
+ }
+
+ assert.htmlEqual(
+ target.innerHTML,
+ `
+ c: 16
+ d: 17
+ e: 18
+ f: 19
+ g: 22
+ `
+ );
+
+ try {
+ await (component.thePromise = Promise.reject([23, 24, 25, 26, 27, 28, 29, 30, 31]));
+ } catch (e) {
+ // do nothing
+ }
+
+ assert.htmlEqual(
+ target.innerHTML,
+ `
+ c: 23
+ d: 24
+ e: 25
+ f: 26
+ g: 29
+ `
+ );
+ }
+};
diff --git a/test/runtime/samples/await-then-destruct-array-nested-rest/main.svelte b/test/runtime/samples/await-then-destruct-array-nested-rest/main.svelte
new file mode 100644
index 0000000000..4bb8ad0077
--- /dev/null
+++ b/test/runtime/samples/await-then-destruct-array-nested-rest/main.svelte
@@ -0,0 +1,18 @@
+
+
+{#await thePromise}
+ loading...
+{:then [ a, b, ...[,, c, ...{ length } ]]}
+ a: {a}
+ b: {b}
+ c: {c}
+ remaining length: {length}
+{:catch [c, ...[d, e, f, ...[,,g]]]}
+ c: {c}
+ d: {d}
+ e: {e}
+ f: {f}
+ g: {g}
+{/await}
diff --git a/test/runtime/samples/const-tag-await-then-destructuring-nested-rest/_config.js b/test/runtime/samples/const-tag-await-then-destructuring-nested-rest/_config.js
new file mode 100644
index 0000000000..cb40e7c456
--- /dev/null
+++ b/test/runtime/samples/const-tag-await-then-destructuring-nested-rest/_config.js
@@ -0,0 +1,19 @@
+export default {
+ html: '12 120 70, 30+4=34
',
+ async test({ component, target, assert }) {
+ component.promise1 = Promise.resolve({width: 5, height: 6});
+ component.promise2 = Promise.reject({width: 6, height: 7});
+
+ await Promise.resolve();
+ assert.htmlEqual(target.innerHTML, `
+ 30 300 110, 50+6=56
+ 42 420 130, 60+7=67
+ `);
+
+ component.constant = 20;
+ assert.htmlEqual(target.innerHTML, `
+ 30 600 220, 100+6=106
+ 42 840 260, 120+7=127
+ `);
+ }
+};
diff --git a/test/runtime/samples/const-tag-await-then-destructuring-nested-rest/main.svelte b/test/runtime/samples/const-tag-await-then-destructuring-nested-rest/main.svelte
new file mode 100644
index 0000000000..7af5c989e4
--- /dev/null
+++ b/test/runtime/samples/const-tag-await-then-destructuring-nested-rest/main.svelte
@@ -0,0 +1,23 @@
+
+
+{#await promise1 then { width, height }}
+ {@const {area, volume} = calculate(width, height, constant)}
+ {@const perimeter = (width + height) * constant}
+ {@const [_width, ...[_height, ...[sum]]] = [width * constant, height, width * constant + height]}
+ {area} {volume} {perimeter}, {_width}+{_height}={sum}
+{/await}
+
+{#await promise2 catch { width, height }}
+ {@const {area, volume} = calculate(width, height, constant)}
+ {@const perimeter = (width + height) * constant}
+ {@const [_width, ...[_height, ...[sum]]] = [width * constant, height, width * constant + height]}
+ {area} {volume} {perimeter}, {_width}+{_height}={sum}
+{/await}
diff --git a/test/runtime/samples/const-tag-each-destructure-nested-rest/_config.js b/test/runtime/samples/const-tag-each-destructure-nested-rest/_config.js
new file mode 100644
index 0000000000..00f8b31540
--- /dev/null
+++ b/test/runtime/samples/const-tag-each-destructure-nested-rest/_config.js
@@ -0,0 +1,30 @@
+export default {
+ html: `
+ 12 120 70, 30+4=34
+ 35 350 120, 50+7=57
+ 48 480 140, 60+8=68
+ `,
+ async test({ component, target, assert }) {
+ component.constant = 20;
+
+ assert.htmlEqual(target.innerHTML, `
+ 12 240 140, 60+4=64
+ 35 700 240, 100+7=107
+ 48 960 280, 120+8=128
+ `);
+
+ component.boxes = [
+ {width: 3, height: 4},
+ {width: 4, height: 5},
+ {width: 5, height: 6},
+ {width: 6, height: 7}
+ ];
+
+ assert.htmlEqual(target.innerHTML, `
+ 12 240 140, 60+4=64
+ 20 400 180, 80+5=85
+ 30 600 220, 100+6=106
+ 42 840 260, 120+7=127
+ `);
+ }
+};
diff --git a/test/runtime/samples/const-tag-each-destructure-nested-rest/main.svelte b/test/runtime/samples/const-tag-each-destructure-nested-rest/main.svelte
new file mode 100644
index 0000000000..4361314b19
--- /dev/null
+++ b/test/runtime/samples/const-tag-each-destructure-nested-rest/main.svelte
@@ -0,0 +1,19 @@
+
+
+{#each boxes as { width, height }}
+ {@const {area, volume} = calculate(width, height, constant)}
+ {@const perimeter = (width + height) * constant}
+ {@const [_width, ...[_height, ...[sum]]] = [width * constant, height, width * constant + height]}
+ {area} {volume} {perimeter}, {_width}+{_height}={sum}
+{/each}
diff --git a/test/runtime/samples/each-block-destructured-array-nested-rest/_config.js b/test/runtime/samples/each-block-destructured-array-nested-rest/_config.js
new file mode 100644
index 0000000000..5922925956
--- /dev/null
+++ b/test/runtime/samples/each-block-destructured-array-nested-rest/_config.js
@@ -0,0 +1,24 @@
+export default {
+ props: {
+ array: [
+ [1, 2, 3, 4, 5],
+ [6, 7, 8],
+ [9, 10, 11, 12],
+ [13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
+ ]
+ },
+
+ html: `
+ First: 1, Second: 2, Third: 3, Elements remaining: 2
+ First: 6, Second: 7, Third: 8, Elements remaining: 0
+ First: 9, Second: 10, Third: 11, Elements remaining: 1
+ First: 13, Second: 14, Third: 15, Elements remaining: 7
+ `,
+
+ test({ assert, component, target }) {
+ component.array = [[23, 24, 25, 26, 27, 28, 29]];
+ assert.htmlEqual( target.innerHTML, `
+ First: 23, Second: 24, Third: 25, Elements remaining: 4
+ `);
+ }
+};
diff --git a/test/runtime/samples/each-block-destructured-array-nested-rest/main.svelte b/test/runtime/samples/each-block-destructured-array-nested-rest/main.svelte
new file mode 100644
index 0000000000..fc73462464
--- /dev/null
+++ b/test/runtime/samples/each-block-destructured-array-nested-rest/main.svelte
@@ -0,0 +1,9 @@
+
+
+{#each array as [first, second, ...[third, ...{ length }]]}
+
+ First: {first}, Second: {second}, Third: {third}, Elements remaining: {length}
+
+{/each}