diff --git a/test/language/expressions/async-arrow-function/try-reject-finally-reject.js b/test/language/expressions/async-arrow-function/try-reject-finally-reject.js
new file mode 100644
index 0000000000000000000000000000000000000000..6c9531e66ce19b09c7193c42ec8277698c417019
--- /dev/null
+++ b/test/language/expressions/async-arrow-function/try-reject-finally-reject.js
@@ -0,0 +1,27 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async() => {
+  try {
+    await new Promise(function(resolve, reject) {
+      reject("early-reject");
+    });
+  } finally {
+    await new Promise(function(resolve, reject) {
+      reject("override");
+    });
+  }
+};
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Awaited rejection in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-arrow-function/try-reject-finally-return.js b/test/language/expressions/async-arrow-function/try-reject-finally-return.js
new file mode 100644
index 0000000000000000000000000000000000000000..71e4e1410fb32d2038fb0a456b391bfee2127222
--- /dev/null
+++ b/test/language/expressions/async-arrow-function/try-reject-finally-return.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async() => {
+  try {
+    await new Promise(function(resolve, reject) {
+      reject("early-reject");
+    });
+  } finally {
+    return "override";
+  }
+};
+
+f().then(function(value) {
+  assert.sameValue(value, "override", "Return in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-arrow-function/try-reject-finally-throw.js b/test/language/expressions/async-arrow-function/try-reject-finally-throw.js
new file mode 100644
index 0000000000000000000000000000000000000000..a058272f2cf839d6a84fe113a2aed5d579f0b74d
--- /dev/null
+++ b/test/language/expressions/async-arrow-function/try-reject-finally-throw.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async() => {
+  try {
+    await new Promise(function(resolve, reject) {
+      reject("early-reject");
+    });
+  } finally {
+    throw "override";
+  }
+};
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Exception thrown in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-arrow-function/try-return-finally-reject.js b/test/language/expressions/async-arrow-function/try-return-finally-reject.js
new file mode 100644
index 0000000000000000000000000000000000000000..115e23100128263627783a375a441116f7c97199
--- /dev/null
+++ b/test/language/expressions/async-arrow-function/try-return-finally-reject.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer resolving an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async() => {
+  try {
+    return "early-return";
+  } finally {
+    await new Promise(function(resolve, reject) {
+      reject("override");
+    });
+  }
+};
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Awaited rejection in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-arrow-function/try-return-finally-return.js b/test/language/expressions/async-arrow-function/try-return-finally-return.js
new file mode 100644
index 0000000000000000000000000000000000000000..4b0798f9b727cd77ab3c5614de112027a3e437c7
--- /dev/null
+++ b/test/language/expressions/async-arrow-function/try-return-finally-return.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer resolving an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async() => {
+  try {
+    return "early-return";
+  } finally {
+    return await new Promise(function(resolve, reject) {
+      resolve("override");
+    });
+  }
+};
+
+f().then(function(value) {
+  assert.sameValue(value, "override", "Return in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-arrow-function/try-return-finally-throw.js b/test/language/expressions/async-arrow-function/try-return-finally-throw.js
new file mode 100644
index 0000000000000000000000000000000000000000..ab6d6a8c44f104808df07c63fa71953013d9fc78
--- /dev/null
+++ b/test/language/expressions/async-arrow-function/try-return-finally-throw.js
@@ -0,0 +1,23 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer resolving an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async() => {
+  try {
+    return "early-return";
+  } finally {
+    throw "override";
+  }
+};
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Exception thrown in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-arrow-function/try-throw-finally-reject.js b/test/language/expressions/async-arrow-function/try-throw-finally-reject.js
new file mode 100644
index 0000000000000000000000000000000000000000..7c5e2f32abbe41cd7b914a4f0fa202ba787c14de
--- /dev/null
+++ b/test/language/expressions/async-arrow-function/try-throw-finally-reject.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async() => {
+  try {
+    throw "early-throw";
+  } finally {
+    await new Promise(function(resolve, reject) {
+      reject("override");
+    });
+  }
+};
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Awaited rejection in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-arrow-function/try-throw-finally-return.js b/test/language/expressions/async-arrow-function/try-throw-finally-return.js
new file mode 100644
index 0000000000000000000000000000000000000000..a34cb3d1944fcefc7fe65db911c6329de37ced1b
--- /dev/null
+++ b/test/language/expressions/async-arrow-function/try-throw-finally-return.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async() => {
+  try {
+    throw "early-throw";
+  } finally {
+    return await new Promise(function(resolve, reject) {
+      resolve("override");
+    });
+  }
+};
+
+f().then(function(value) {
+  assert.sameValue(value, "override", "Return in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-arrow-function/try-throw-finally-throw.js b/test/language/expressions/async-arrow-function/try-throw-finally-throw.js
new file mode 100644
index 0000000000000000000000000000000000000000..59b8bfd73beb1ce74460a7867784528c64e46f57
--- /dev/null
+++ b/test/language/expressions/async-arrow-function/try-throw-finally-throw.js
@@ -0,0 +1,23 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async() => {
+  try {
+    throw "early-throw";
+  } finally {
+    throw "override";
+  }
+};
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Exception thrown in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-function/try-reject-finally-reject.js b/test/language/expressions/async-function/try-reject-finally-reject.js
new file mode 100644
index 0000000000000000000000000000000000000000..7e15c23b789557d4fcf89d832ee1db972b4d36f8
--- /dev/null
+++ b/test/language/expressions/async-function/try-reject-finally-reject.js
@@ -0,0 +1,27 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async function() {
+  try {
+    await new Promise(function(resolve, reject) {
+      reject("early-reject");
+    });
+  } finally {
+    await new Promise(function(resolve, reject) {
+      reject("override");
+    });
+  }
+};
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Awaited rejection in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-function/try-reject-finally-return.js b/test/language/expressions/async-function/try-reject-finally-return.js
new file mode 100644
index 0000000000000000000000000000000000000000..21f96918ae3497b9a769bf582b6fd8b503522b4b
--- /dev/null
+++ b/test/language/expressions/async-function/try-reject-finally-return.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async function() {
+  try {
+    await new Promise(function(resolve, reject) {
+      reject("early-reject");
+    });
+  } finally {
+    return "override";
+  }
+};
+
+f().then(function(value) {
+  assert.sameValue(value, "override", "Return in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-function/try-reject-finally-throw.js b/test/language/expressions/async-function/try-reject-finally-throw.js
new file mode 100644
index 0000000000000000000000000000000000000000..d5ed694908266ecbcd750ae2ddb045bf4d461c87
--- /dev/null
+++ b/test/language/expressions/async-function/try-reject-finally-throw.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async function() {
+  try {
+    await new Promise(function(resolve, reject) {
+      reject("early-reject");
+    });
+  } finally {
+    throw "override";
+  }
+};
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Exception thrown in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-function/try-return-finally-reject.js b/test/language/expressions/async-function/try-return-finally-reject.js
new file mode 100644
index 0000000000000000000000000000000000000000..e7a1df90fa58220ba6b0328f6e71ee6e4ae82d43
--- /dev/null
+++ b/test/language/expressions/async-function/try-return-finally-reject.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer resolving an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async function() {
+  try {
+    return "early-return";
+  } finally {
+    await new Promise(function(resolve, reject) {
+      reject("override");
+    });
+  }
+};
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Awaited rejection in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-function/try-return-finally-return.js b/test/language/expressions/async-function/try-return-finally-return.js
new file mode 100644
index 0000000000000000000000000000000000000000..3727e4b94b5b824e8268f1ab05e919821ca9a5b0
--- /dev/null
+++ b/test/language/expressions/async-function/try-return-finally-return.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer resolving an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async function() {
+  try {
+    return "early-return";
+  } finally {
+    return await new Promise(function(resolve, reject) {
+      resolve("override");
+    });
+  }
+};
+
+f().then(function(value) {
+  assert.sameValue(value, "override", "Return in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-function/try-return-finally-throw.js b/test/language/expressions/async-function/try-return-finally-throw.js
new file mode 100644
index 0000000000000000000000000000000000000000..e41fc34358ed753c869a7344c58946e0fb05622b
--- /dev/null
+++ b/test/language/expressions/async-function/try-return-finally-throw.js
@@ -0,0 +1,23 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer resolving an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async function() {
+  try {
+    return "early-return";
+  } finally {
+    throw "override";
+  }
+};
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Exception thrown in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-function/try-throw-finally-reject.js b/test/language/expressions/async-function/try-throw-finally-reject.js
new file mode 100644
index 0000000000000000000000000000000000000000..3ff3c5eb72c7a598a5f7a3a41038dea8edd5e055
--- /dev/null
+++ b/test/language/expressions/async-function/try-throw-finally-reject.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async function() {
+  try {
+    throw "early-throw";
+  } finally {
+    await new Promise(function(resolve, reject) {
+      reject("override");
+    });
+  }
+};
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Awaited rejection in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-function/try-throw-finally-return.js b/test/language/expressions/async-function/try-throw-finally-return.js
new file mode 100644
index 0000000000000000000000000000000000000000..dc28e980a656678e124e7dcba8c21771dcc3cdb5
--- /dev/null
+++ b/test/language/expressions/async-function/try-throw-finally-return.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async function() {
+  try {
+    throw "early-throw";
+  } finally {
+    return await new Promise(function(resolve, reject) {
+      resolve("override");
+    });
+  }
+};
+
+f().then(function(value) {
+  assert.sameValue(value, "override", "Return in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/expressions/async-function/try-throw-finally-throw.js b/test/language/expressions/async-function/try-throw-finally-throw.js
new file mode 100644
index 0000000000000000000000000000000000000000..5ffcc04827050d27d03df0ec7d1681bf13b19d41
--- /dev/null
+++ b/test/language/expressions/async-function/try-throw-finally-throw.js
@@ -0,0 +1,23 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+var f = async function() {
+  try {
+    throw "early-throw";
+  } finally {
+    throw "override";
+  }
+};
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Exception thrown in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/statements/async-function/try-reject-finally-reject.js b/test/language/statements/async-function/try-reject-finally-reject.js
new file mode 100644
index 0000000000000000000000000000000000000000..f8c4f79c481bb42bb1c02ca26572af246964e75b
--- /dev/null
+++ b/test/language/statements/async-function/try-reject-finally-reject.js
@@ -0,0 +1,27 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+async function f() {
+  try {
+    await new Promise(function(resolve, reject) {
+      reject("early-reject");
+    });
+  } finally {
+    await new Promise(function(resolve, reject) {
+      reject("override");
+    });
+  }
+}
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Awaited rejection in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/statements/async-function/try-reject-finally-return.js b/test/language/statements/async-function/try-reject-finally-return.js
new file mode 100644
index 0000000000000000000000000000000000000000..bf522673bfb5830b2cabb9728c91913a2bb90296
--- /dev/null
+++ b/test/language/statements/async-function/try-reject-finally-return.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+async function f() {
+  try {
+    await new Promise(function(resolve, reject) {
+      reject("early-reject");
+    });
+  } finally {
+    return "override";
+  }
+}
+
+f().then(function(value) {
+  assert.sameValue(value, "override", "Return in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/statements/async-function/try-reject-finally-throw.js b/test/language/statements/async-function/try-reject-finally-throw.js
new file mode 100644
index 0000000000000000000000000000000000000000..4211cf29d7a1ed86309c2f04421ed894fe667016
--- /dev/null
+++ b/test/language/statements/async-function/try-reject-finally-throw.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+async function f() {
+  try {
+    await new Promise(function(resolve, reject) {
+      reject("early-reject");
+    });
+  } finally {
+    throw "override";
+  }
+}
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Exception thrown in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/statements/async-function/try-return-finally-reject.js b/test/language/statements/async-function/try-return-finally-reject.js
new file mode 100644
index 0000000000000000000000000000000000000000..b477407a515f266fd85a1ba5112598dc572592d3
--- /dev/null
+++ b/test/language/statements/async-function/try-return-finally-reject.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer resolving an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+async function f() {
+  try {
+    return "early-return";
+  } finally {
+    await new Promise(function(resolve, reject) {
+      reject("override");
+    });
+  }
+}
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Awaited rejection in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/statements/async-function/try-return-finally-return.js b/test/language/statements/async-function/try-return-finally-return.js
new file mode 100644
index 0000000000000000000000000000000000000000..60c0e73cd661009ab24d012a1e273398c8702559
--- /dev/null
+++ b/test/language/statements/async-function/try-return-finally-return.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer resolving an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+async function f() {
+  try {
+    return "early-return";
+  } finally {
+    return await new Promise(function(resolve, reject) {
+      resolve("override");
+    });
+  }
+}
+
+f().then(function(value) {
+  assert.sameValue(value, "override", "Return in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/statements/async-function/try-return-finally-throw.js b/test/language/statements/async-function/try-return-finally-throw.js
new file mode 100644
index 0000000000000000000000000000000000000000..8e03895cd3afdd2d84b67f2b92e1e741eb3744b8
--- /dev/null
+++ b/test/language/statements/async-function/try-return-finally-throw.js
@@ -0,0 +1,23 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer resolving an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+async function f() {
+  try {
+    return "early-return";
+  } finally {
+    throw "override";
+  }
+}
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Exception thrown in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/statements/async-function/try-throw-finally-reject.js b/test/language/statements/async-function/try-throw-finally-reject.js
new file mode 100644
index 0000000000000000000000000000000000000000..590b39292741248d7979cdb38717164ecca3897c
--- /dev/null
+++ b/test/language/statements/async-function/try-throw-finally-reject.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+async function f() {
+  try {
+    throw "early-throw";
+  } finally {
+    await new Promise(function(resolve, reject) {
+      reject("override");
+    });
+  }
+}
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Awaited rejection in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/statements/async-function/try-throw-finally-return.js b/test/language/statements/async-function/try-throw-finally-return.js
new file mode 100644
index 0000000000000000000000000000000000000000..73f4da6a88c8042c17b21073b0a738edc21d1f20
--- /dev/null
+++ b/test/language/statements/async-function/try-throw-finally-return.js
@@ -0,0 +1,25 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+async function f() {
+  try {
+    throw "early-throw";
+  } finally {
+    return await new Promise(function(resolve, reject) {
+      resolve("override");
+    });
+  }
+}
+
+f().then(function(value) {
+  assert.sameValue(value, "override", "Return in finally block");
+}).then($DONE, $DONE);
diff --git a/test/language/statements/async-function/try-throw-finally-throw.js b/test/language/statements/async-function/try-throw-finally-throw.js
new file mode 100644
index 0000000000000000000000000000000000000000..9d560a14fccecc19b3604f12e19147eb78034b0f
--- /dev/null
+++ b/test/language/statements/async-function/try-throw-finally-throw.js
@@ -0,0 +1,23 @@
+// Copyright 2017 Caitlin Potter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Caitlin Potter <caitp@igalia.com>
+esid: pending
+description: >
+  Implementations must defer rejecting an async function's Promise until after
+  all finally blocks have been evaluated.
+flags: [async]
+---*/
+
+async function f() {
+  try {
+    throw "early-throw";
+  } finally {
+    throw "override";
+  }
+}
+
+f().then($DONE, function(value) {
+  assert.sameValue(value, "override", "Exception thrown in finally block");
+}).then($DONE, $DONE);