diff --git a/src/dstr-assignment-for-await/array-elem-iter-rtrn-close-null.case b/src/dstr-assignment-for-await/array-elem-iter-rtrn-close-null.case
index 93d4c0402a89947b1b6cff835e7e590bf2c88172..10d18a136f9a29ff72f91d544995db49eccbc126 100644
--- a/src/dstr-assignment-for-await/array-elem-iter-rtrn-close-null.case
+++ b/src/dstr-assignment-for-await/array-elem-iter-rtrn-close-null.case
@@ -4,12 +4,6 @@
 desc: >
     IteratorClose throws a TypeError when `return` returns a non-Object value
 info: |
-    AssignmentElement : DestructuringAssignmentTarget Initializer
-    1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an ArrayLiteral, then
-      a. Let lref be the result of evaluating DestructuringAssignmentTarget.
-      b. ReturnIfAbrupt(lref).
-    [...]
-
     ArrayAssignmentPattern : [ AssignmentElementList ]
 
     [...]
@@ -32,8 +26,15 @@ esid: sec-runtime-semantics-destructuringassignmentevaluation
 
 //- setup
 let unreachable = 0;
+let nextCount = 0;
+let returnCount = 0;
 let iterator = {
+  next() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return() {
+    returnCount += 1;
     return null;
   }
 };
@@ -43,17 +44,21 @@ let iterable = {
   }
 };
 //- elems
-[ {}[yield] ]
+[ {} = yield ]
 //- vals
 iterable
 //- body
 unreachable += 1;
 //- teardown
 iter.next().then(result => {
+  assert.sameValue(nextCount, 1);
+  assert.sameValue(returnCount, 0);
   assert.sameValue(result.value, undefined);
   assert.sameValue(result.done, false);
 
   iter.return().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => {
+    assert.sameValue(nextCount, 1);
+    assert.sameValue(returnCount, 1);
     assert.sameValue(unreachable, 0);
     assert.sameValue(constructor, TypeError);
   }).then($DONE, $DONE);
diff --git a/src/dstr-assignment/array-elem-iter-rtrn-close-null.case b/src/dstr-assignment/array-elem-iter-rtrn-close-null.case
index 817ca7b6bb0837fa05240cc2423eb1c460bd037d..c524b37069ed6950a0d1ee405cf528a42c8fe64c 100644
--- a/src/dstr-assignment/array-elem-iter-rtrn-close-null.case
+++ b/src/dstr-assignment/array-elem-iter-rtrn-close-null.case
@@ -26,19 +26,26 @@ esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
 //- setup
-var iterable = {};
+var nextCount = 0;
+var returnCount = 0;
+var unreachable = 0;
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
+    returnCount += 1;
     return null;
   }
 };
-var iter;
+var iterable = {};
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
 function* g() {
 //- elems
-[ {}[yield] ]
+[ {} = yield ]
 //- vals
 iterable
 //- body
@@ -46,9 +53,14 @@ iterable
 //- teardown
 }
 
-iter = g();
+var iter = g();
 iter.next();
 
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
 assert.throws(TypeError, function() {
   iter.return();
 });
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 1);
+assert.sameValue(unreachable, 0, 'Unreachable statement was not executed');
diff --git a/src/dstr-assignment/array-elem-iter-rtrn-close.case b/src/dstr-assignment/array-elem-iter-rtrn-close.case
index 7f1c482fe5448c7b39d2e3e556aa84b8bd2b990c..1726266e257d5ab048a153cfc89565bdbf2133c2 100644
--- a/src/dstr-assignment/array-elem-iter-rtrn-close.case
+++ b/src/dstr-assignment/array-elem-iter-rtrn-close.case
@@ -25,12 +25,16 @@ esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
 //- setup
+var nextCount = 0;
 var returnCount = 0;
 var unreachable = 0;
 var thisValue = null;
 var args = null;
-var iterable = {};
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
     returnCount += 1;
     thisValue = this;
@@ -38,24 +42,29 @@ var iterator = {
     return {};
   }
 };
-var iter, result;
+var iterable = {};
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
 
 function* g() {
 //- elems
-[ {}[yield] ]
+[ {} = yield ]
 //- vals
 iterable
 //- body
 unreachable += 1;
 //- teardown
 }
-iter = g();
+var iter = g();
 iter.next();
-result = iter.return(777);
 
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
+
+var result = iter.return(777);
+
+assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
 assert.sameValue(unreachable, 0, 'Unreachable statement was not executed');
 assert.sameValue(result.value, 777);
diff --git a/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-err.case b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-err.case
index 628e827e4b7c9f4d58c0042bd7bf627f21aaf179..1c47fafd51f1e32b24b84b58b51dc228ccbc4983 100644
--- a/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-err.case
+++ b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-err.case
@@ -30,24 +30,28 @@ esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
 //- setup
+var nextCount = 0;
 var returnCount = 0;
 var unreachable = 0;
-var iterable = {};
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
     returnCount += 1;
 
     throw new Test262Error();
   }
 };
-var iter;
+var iterable = {};
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
 
 function* g() {
 //- elems
-[ {}[yield] , ]
+[ {} = yield , ]
 //- vals
 iterable
 //- body
@@ -55,11 +59,14 @@ unreachable += 1;
 //- teardown
 }
 
-iter = g();
+var iter = g();
 iter.next();
+
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
 assert.throws(Test262Error, function() {
   iter.return();
 });
-
+assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
 assert.sameValue(unreachable, 0, 'Unreachable statement was not executed');
diff --git a/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-null.case b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-null.case
index 8a807a3156762e89eda1446e0f8790b062bbd572..73ac1935208f9c396d994b50fe60f8606793c269 100644
--- a/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-null.case
+++ b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-null.case
@@ -32,28 +32,38 @@ esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
 //- setup
-var iterable = {};
+var nextCount = 0;
+var returnCount = 0;
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
+    returnCount += 1;
     return null;
   }
 };
-var iter;
+var iterable = {};
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
 
 function* g() {
 //- elems
-  [ {}[yield] , ]
+  [ {} = yield , ]
 //- vals
 iterable
 //- teardown
 }
 
-iter = g();
+var iter = g();
 iter.next();
 
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
 assert.throws(TypeError, function() {
   iter.return();
 });
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 1);
diff --git a/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close.case b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close.case
index c7c10a93cb1962e7a61790b95f33b0162acb12b4..5e1ab2f448b1443b90b2025e793d1f146658d940 100644
--- a/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close.case
+++ b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close.case
@@ -31,12 +31,17 @@ esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
 //- setup
+var nextCount = 0;
 var returnCount = 0;
 var unreachable = 0;
 var thisValue = null;
 var args = null;
 var iterable = {};
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
     returnCount += 1;
     thisValue = this;
@@ -52,7 +57,7 @@ iterable[Symbol.iterator] = function() {
 
 function* g() {
 //- elems
-[ {}[yield] , ]
+[ {} = yield , ]
 //- vals
 iterable
 //- body
@@ -62,8 +67,13 @@ iterable
 
 iter = g();
 iter.next();
+
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
+
 result = iter.return(888);
 
+assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
 assert.sameValue(unreachable, 0, 'Unreachable statement was not executed');
 assert.sameValue(result.value, 888);
diff --git a/test/language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js b/test/language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js
new file mode 100644
index 0000000000000000000000000000000000000000..f5ada21f4230d646cf726dd2b51db237db56d981
--- /dev/null
+++ b/test/language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js
@@ -0,0 +1,80 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-runtime-semantics-iteratordestructuringassignmentevaluation
+description: >
+    Ensure correct evaluation order when destructuring target is property reference.
+info: |
+    12.15.5.3 Runtime Semantics: IteratorDestructuringAssignmentEvaluation
+
+    AssignmentElement : DestructuringAssignmentTarget Initializer
+
+    1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an ArrayLiteral, then
+        a. Let lref be the result of evaluating DestructuringAssignmentTarget.
+        b. ReturnIfAbrupt(lref).
+    2. If iteratorRecord.[[Done]] is false, then
+        a. Let next be IteratorStep(iteratorRecord.[[Iterator]]).
+        ...
+    3. If iteratorRecord.[[Done]] is true, let value be undefined.
+    ...
+    5. Else, let v be value.
+    ...
+    8. Return ? PutValue(lref, v).
+features: [Symbol.iterator]
+includes: [compareArray.js]
+---*/
+
+
+var log = [];
+
+function source() {
+    log.push("source");
+    var iterator = {
+        next: function() {
+            log.push("iterator-step");
+            return {
+                get done() {
+                    log.push("iterator-done");
+                    return true;
+                },
+                get value() {
+                    // Note: This getter shouldn't be called.
+                    log.push("iterator-value");
+                }
+            };
+        }
+    };
+    var source = {};
+    source[Symbol.iterator] = function() {
+        log.push("iterator");
+        return iterator;
+    };
+    return source;
+}
+function target() {
+    log.push("target");
+    return target = {
+        set q(v) {
+            log.push("set");
+        }
+    };
+}
+function targetKey() {
+    log.push("target-key");
+    return {
+        toString: function() {
+            log.push("target-key-tostring");
+            return "q";
+        }
+    };
+}
+
+([target()[targetKey()]] = source());
+
+assert.compareArray(log, [
+    "source", "iterator",
+    "target", "target-key", "target-key-tostring",
+    "iterator-step", "iterator-done",
+    "set",
+]);
diff --git a/test/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js b/test/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js
new file mode 100644
index 0000000000000000000000000000000000000000..81d8a6a728f109d634586d7e03af18051afb8a32
--- /dev/null
+++ b/test/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js
@@ -0,0 +1,75 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-runtime-semantics-keyeddestructuringassignmentevaluation
+description: >
+    Ensure correct evaluation order when destructuring target is property reference.
+info: |
+    12.15.5.2 Runtime Semantics: DestructuringAssignmentEvaluation
+
+    AssignmentProperty : PropertyName : AssignmentElement
+
+    1. Let name be the result of evaluating PropertyName.
+    2. ReturnIfAbrupt(name).
+    3. Return the result of performing KeyedDestructuringAssignmentEvaluation of
+       AssignmentElement with value and name as the arguments. 
+
+    12.15.5.4 Runtime Semantics: KeyedDestructuringAssignmentEvaluation
+
+    1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an ArrayLiteral, then
+        a. Let lref be the result of evaluating DestructuringAssignmentTarget.
+        b. ReturnIfAbrupt(lref).
+    2. Let v be ? GetV(value, propertyName).
+    ...
+    4. Else, let rhsValue be v.
+    ...
+    7. Return ? PutValue(lref, rhsValue).
+includes: [compareArray.js]
+---*/
+
+
+var log = [];
+
+function source() {
+    log.push("source");
+    return {
+        get p() {
+            log.push("get");
+        }
+    };
+}
+function target() {
+    log.push("target");
+    return {
+        set q(v) {
+            log.push("set");
+        }
+    };
+}
+function sourceKey() {
+    log.push("source-key");
+    return {
+        toString: function() {
+            log.push("source-key-tostring");
+            return "p";
+        }
+    };
+}
+function targetKey() {
+    log.push("target-key");
+    return {
+        toString: function() {
+            log.push("target-key-tostring");
+            return "q";
+        }
+    };
+}
+
+({[sourceKey()]: target()[targetKey()]} = source());
+
+assert.compareArray(log, [
+    "source", "source-key", "source-key-tostring",
+    "target", "target-key", "target-key-tostring",
+    "get", "set",
+]);
diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-null.js b/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-null.js
index 012dc89929c4c158142cbe0d5389a57145e0f5c6..e01b3990f827c68a289ca898ec50c7274e5ff3a5 100644
--- a/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-null.js
+++ b/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-null.js
@@ -33,13 +33,20 @@ info: |
        exception.
 
 ---*/
-var iterable = {};
+var nextCount = 0;
+var returnCount = 0;
+var unreachable = 0;
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
+    returnCount += 1;
     return null;
   }
 };
-var iter;
+var iterable = {};
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
@@ -48,7 +55,7 @@ function* g() {
 var result;
 var vals = iterable;
 
-result = [ {}[yield] ] = vals;
+result = [ {} = yield ] = vals;
 
 unreachable += 1;
 
@@ -56,9 +63,14 @@ assert.sameValue(result, vals);
 
 }
 
-iter = g();
+var iter = g();
 iter.next();
 
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
 assert.throws(TypeError, function() {
   iter.return();
 });
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 1);
+assert.sameValue(unreachable, 0, 'Unreachable statement was not executed');
diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close.js b/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close.js
index 628357252a4d1f325cf6b90154e57cc5ed7e582c..79f5d13cec703f82abe934864c1cd80eee455e62 100644
--- a/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close.js
+++ b/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close.js
@@ -31,12 +31,16 @@ info: |
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 
 ---*/
+var nextCount = 0;
 var returnCount = 0;
 var unreachable = 0;
 var thisValue = null;
 var args = null;
-var iterable = {};
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
     returnCount += 1;
     thisValue = this;
@@ -44,7 +48,7 @@ var iterator = {
     return {};
   }
 };
-var iter, result;
+var iterable = {};
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
@@ -54,17 +58,22 @@ function* g() {
 var result;
 var vals = iterable;
 
-result = [ {}[yield] ] = vals;
+result = [ {} = yield ] = vals;
 
 unreachable += 1;
 
 assert.sameValue(result, vals);
 
 }
-iter = g();
+var iter = g();
 iter.next();
-result = iter.return(777);
 
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
+
+var result = iter.return(777);
+
+assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
 assert.sameValue(unreachable, 0, 'Unreachable statement was not executed');
 assert.sameValue(result.value, 777);
diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-err.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-err.js
index af2468b11f899fbfb03d460dab43ad28ae556abc..eb1d05505ad44d80f90874a18e3949a382da778a 100644
--- a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-err.js
+++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-err.js
@@ -36,17 +36,21 @@ info: |
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 
 ---*/
+var nextCount = 0;
 var returnCount = 0;
 var unreachable = 0;
-var iterable = {};
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
     returnCount += 1;
 
     throw new Test262Error();
   }
 };
-var iter;
+var iterable = {};
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
@@ -56,7 +60,7 @@ function* g() {
 var result;
 var vals = iterable;
 
-result = [ {}[yield] , ] = vals;
+result = [ {} = yield , ] = vals;
 
 unreachable += 1;
 
@@ -64,11 +68,14 @@ assert.sameValue(result, vals);
 
 }
 
-iter = g();
+var iter = g();
 iter.next();
+
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
 assert.throws(Test262Error, function() {
   iter.return();
 });
-
+assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
 assert.sameValue(unreachable, 0, 'Unreachable statement was not executed');
diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-null.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-null.js
index f622e7d89898a330eada034a05fd86abda0de0cb..757f8a5aa5e97110894588a933b9885ec8340cfe 100644
--- a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-null.js
+++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-null.js
@@ -39,13 +39,19 @@ info: |
        exception.
 
 ---*/
-var iterable = {};
+var nextCount = 0;
+var returnCount = 0;
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
+    returnCount += 1;
     return null;
   }
 };
-var iter;
+var iterable = {};
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
@@ -55,7 +61,7 @@ function* g() {
 var result;
 var vals = iterable;
 
-result = [ {}[yield] , ] = vals;
+result = [ {} = yield , ] = vals;
 
 
 
@@ -63,9 +69,13 @@ assert.sameValue(result, vals);
 
 }
 
-iter = g();
+var iter = g();
 iter.next();
 
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
 assert.throws(TypeError, function() {
   iter.return();
 });
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 1);
diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close.js
index 23110527ea91f77e15d1746651bc76fba27c9c4e..9a6ebed9ab8cc59b3133a99441586c353c020d22 100644
--- a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close.js
+++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close.js
@@ -37,12 +37,17 @@ info: |
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 
 ---*/
+var nextCount = 0;
 var returnCount = 0;
 var unreachable = 0;
 var thisValue = null;
 var args = null;
 var iterable = {};
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
     returnCount += 1;
     thisValue = this;
@@ -61,7 +66,7 @@ function* g() {
 var result;
 var vals = iterable;
 
-result = [ {}[yield] , ] = vals;
+result = [ {} = yield , ] = vals;
 
 unreachable += 1;
 
@@ -71,8 +76,13 @@ assert.sameValue(result, vals);
 
 iter = g();
 iter.next();
+
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
+
 result = iter.return(888);
 
+assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
 assert.sameValue(unreachable, 0, 'Unreachable statement was not executed');
 assert.sameValue(result.value, 888);
diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-rtrn-close-null.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-rtrn-close-null.js
index ddd3f1fb0021d47444f39cb32f5ddc43bb9e2a24..7fb85ba02535bcee96980a5deed9b0e7a83ff866 100644
--- a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-rtrn-close-null.js
+++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-rtrn-close-null.js
@@ -24,12 +24,6 @@ info: |
           lhs using AssignmentPattern as the goal symbol.
     [...]
 
-    AssignmentElement : DestructuringAssignmentTarget Initializer
-    1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an ArrayLiteral, then
-      a. Let lref be the result of evaluating DestructuringAssignmentTarget.
-      b. ReturnIfAbrupt(lref).
-    [...]
-
     ArrayAssignmentPattern : [ AssignmentElementList ]
 
     [...]
@@ -46,8 +40,15 @@ info: |
 
 ---*/
 let unreachable = 0;
+let nextCount = 0;
+let returnCount = 0;
 let iterator = {
+  next() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return() {
+    returnCount += 1;
     return null;
   }
 };
@@ -59,7 +60,7 @@ let iterable = {
 
 let iterCount = 0;
 async function * fn() {
-  for await ([ {}[yield] ] of [iterable]) {
+  for await ([ {} = yield ] of [iterable]) {
     unreachable += 1;
     iterCount += 1;
   }
@@ -68,10 +69,14 @@ async function * fn() {
 let iter = fn();
 
 iter.next().then(result => {
+  assert.sameValue(nextCount, 1);
+  assert.sameValue(returnCount, 0);
   assert.sameValue(result.value, undefined);
   assert.sameValue(result.done, false);
 
   iter.return().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => {
+    assert.sameValue(nextCount, 1);
+    assert.sameValue(returnCount, 1);
     assert.sameValue(unreachable, 0);
     assert.sameValue(constructor, TypeError);
   }).then($DONE, $DONE);
diff --git a/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-null.js b/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-null.js
index ba47174659686b574e623b5c5d42e30f2599ad21..972c6c2cba711b2f9858dff414df6128bfcf61df 100644
--- a/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-null.js
+++ b/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-null.js
@@ -42,13 +42,20 @@ info: |
        exception.
 
 ---*/
-var iterable = {};
+var nextCount = 0;
+var returnCount = 0;
+var unreachable = 0;
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
+    returnCount += 1;
     return null;
   }
 };
-var iter;
+var iterable = {};
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
@@ -56,7 +63,7 @@ function* g() {
 
 var counter = 0;
 
-for ([ {}[yield] ] of [iterable]) {
+for ([ {} = yield ] of [iterable]) {
   unreachable += 1;
   counter += 1;
 }
@@ -65,9 +72,14 @@ assert.sameValue(counter, 1);
 
 }
 
-iter = g();
+var iter = g();
 iter.next();
 
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
 assert.throws(TypeError, function() {
   iter.return();
 });
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 1);
+assert.sameValue(unreachable, 0, 'Unreachable statement was not executed');
diff --git a/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close.js b/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close.js
index 84175bc503a23e7e893de221b08c943f6069a30f..e1f43ddf85eee31e748434bbde39960689b72d03 100644
--- a/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close.js
+++ b/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close.js
@@ -40,12 +40,16 @@ info: |
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 
 ---*/
+var nextCount = 0;
 var returnCount = 0;
 var unreachable = 0;
 var thisValue = null;
 var args = null;
-var iterable = {};
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
     returnCount += 1;
     thisValue = this;
@@ -53,7 +57,7 @@ var iterator = {
     return {};
   }
 };
-var iter, result;
+var iterable = {};
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
@@ -62,7 +66,7 @@ function* g() {
 
 var counter = 0;
 
-for ([ {}[yield] ] of [iterable]) {
+for ([ {} = yield ] of [iterable]) {
   unreachable += 1;
   counter += 1;
 }
@@ -70,10 +74,15 @@ for ([ {}[yield] ] of [iterable]) {
 assert.sameValue(counter, 1);
 
 }
-iter = g();
+var iter = g();
 iter.next();
-result = iter.return(777);
 
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
+
+var result = iter.return(777);
+
+assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
 assert.sameValue(unreachable, 0, 'Unreachable statement was not executed');
 assert.sameValue(result.value, 777);
diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js
index c5137f4e28166b51a91dbde2625ada8be3265543..30fb04f8bd478696603a3fd5f60dbe94279bb540 100644
--- a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js
+++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js
@@ -45,17 +45,21 @@ info: |
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 
 ---*/
+var nextCount = 0;
 var returnCount = 0;
 var unreachable = 0;
-var iterable = {};
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
     returnCount += 1;
 
     throw new Test262Error();
   }
 };
-var iter;
+var iterable = {};
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
@@ -64,7 +68,7 @@ function* g() {
 
 var counter = 0;
 
-for ([ {}[yield] , ] of [iterable]) {
+for ([ {} = yield , ] of [iterable]) {
   unreachable += 1;
   counter += 1;
 }
@@ -73,11 +77,14 @@ assert.sameValue(counter, 1);
 
 }
 
-iter = g();
+var iter = g();
 iter.next();
+
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
 assert.throws(Test262Error, function() {
   iter.return();
 });
-
+assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
 assert.sameValue(unreachable, 0, 'Unreachable statement was not executed');
diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js
index 0ee69ab93f0b9f1d5ffe4357881906b2bd0c4d33..ca4219139dee70f075e335c1d24aa271c79cf549 100644
--- a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js
+++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js
@@ -48,13 +48,19 @@ info: |
        exception.
 
 ---*/
-var iterable = {};
+var nextCount = 0;
+var returnCount = 0;
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
+    returnCount += 1;
     return null;
   }
 };
-var iter;
+var iterable = {};
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
@@ -63,7 +69,7 @@ function* g() {
 
 var counter = 0;
 
-for ([ {}[yield] , ] of [iterable]) {
+for ([ {} = yield , ] of [iterable]) {
   
   counter += 1;
 }
@@ -72,9 +78,13 @@ assert.sameValue(counter, 1);
 
 }
 
-iter = g();
+var iter = g();
 iter.next();
 
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
 assert.throws(TypeError, function() {
   iter.return();
 });
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 1);
diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close.js
index eb1c4c749bbc1050542b3273f0e50236e46c9c13..94ddc7db31a78ac193167859f4b242064077e11f 100644
--- a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close.js
+++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close.js
@@ -46,12 +46,17 @@ info: |
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 
 ---*/
+var nextCount = 0;
 var returnCount = 0;
 var unreachable = 0;
 var thisValue = null;
 var args = null;
 var iterable = {};
 var iterator = {
+  next: function() {
+    nextCount += 1;
+    return {done: false, value: undefined};
+  },
   return: function() {
     returnCount += 1;
     thisValue = this;
@@ -69,7 +74,7 @@ function* g() {
 
 var counter = 0;
 
-for ([ {}[yield] , ] of [iterable]) {
+for ([ {} = yield , ] of [iterable]) {
   unreachable += 1;
   counter += 1;
 }
@@ -80,8 +85,13 @@ assert.sameValue(counter, 1);
 
 iter = g();
 iter.next();
+
+assert.sameValue(nextCount, 1);
+assert.sameValue(returnCount, 0);
+
 result = iter.return(888);
 
+assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
 assert.sameValue(unreachable, 0, 'Unreachable statement was not executed');
 assert.sameValue(result.value, 888);