diff --git a/test/language/computed-property-names/basics/number.js b/test/language/computed-property-names/basics/number.js
new file mode 100644
index 0000000000000000000000000000000000000000..e056116959d6ded13b28e6eab067fd677e572952
--- /dev/null
+++ b/test/language/computed-property-names/basics/number.js
@@ -0,0 +1,27 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property names can be a number
+includes: [compareArray.js]
+---*/
+
+function ID(x) {
+  return x;
+}
+
+var object = {
+  a: 'A',
+  [1]: 'B',
+  c: 'C',
+  [ID(2)]: 'D',
+};
+assert.sameValue(object.a, 'A', "The value of `object.a` is `'A'`. Defined in `object` as `a: 'A'`");
+assert.sameValue(object[1], 'B', "The value of `object[1]` is `'B'`. Defined in `object` as `[1]: 'B'`");
+assert.sameValue(object.c, 'C', "The value of `object.c` is `'C'`. Defined in `object` as `c: 'C'`");
+assert.sameValue(object[2], 'D', "The value of `object[2]` is `'D'`. Defined in `object` as `[ID(2)]: 'D'`");
+assert(
+  compareArray(Object.keys(object), ['1', '2', 'a', 'c']),
+  "`compareArray(Object.keys(object), ['1', '2', 'a', 'c'])` returns `true`"
+);
diff --git a/test/language/computed-property-names/basics/string.js b/test/language/computed-property-names/basics/string.js
new file mode 100644
index 0000000000000000000000000000000000000000..27dce0e1d40641c2fd1a53b0852375074273df91
--- /dev/null
+++ b/test/language/computed-property-names/basics/string.js
@@ -0,0 +1,26 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property names can be a string
+includes: [compareArray.js]
+---*/
+function ID(x) {
+  return x;
+}
+
+var object = {
+  a: 'A',
+  ['b']: 'B',
+  c: 'C',
+  [ID('d')]: 'D',
+};
+assert.sameValue(object.a, 'A', "The value of `object.a` is `'A'`. Defined in `object` as `a: 'A'`");
+assert.sameValue(object.b, 'B', "The value of `object.b` is `'B'`. Defined in `object` as `['b']: 'B'`");
+assert.sameValue(object.c, 'C', "The value of `object.c` is `'C'`. Defined in `object` as `c: 'C'`");
+assert.sameValue(object.d, 'D', "The value of `object.d` is `'D'`. Defined in `object` as `[ID('d')]: 'D'`");
+assert(
+  compareArray(Object.keys(object), ['a', 'b', 'c', 'd']),
+  "`compareArray(Object.keys(object), ['a', 'b', 'c', 'd'])` returns `true`"
+);
diff --git a/test/language/computed-property-names/basics/symbol.js b/test/language/computed-property-names/basics/symbol.js
new file mode 100644
index 0000000000000000000000000000000000000000..32dddac730dcb69090b671bb368f102826db6434
--- /dev/null
+++ b/test/language/computed-property-names/basics/symbol.js
@@ -0,0 +1,50 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property names can be a symbol
+includes: [compareArray.js]
+---*/
+
+function ID(x) {
+  return x;
+}
+
+var sym1 = Symbol();
+var sym2 = Symbol();
+var object = {
+  a: 'A',
+  [sym1]: 'B',
+  c: 'C',
+  [ID(sym2)]: 'D',
+};
+assert.sameValue(object.a, 'A', "The value of `object.a` is `'A'`. Defined in `object` as `a: 'A'`");
+assert.sameValue(object[sym1], 'B', "The value of `object[sym1]` is `'B'`. Defined in `object` as `[sym1]: 'B'`");
+assert.sameValue(object.c, 'C', "The value of `object.c` is `'C'`. Defined in `object` as `c: 'C'`");
+assert.sameValue(object[sym2], 'D', "The value of `object[sym2]` is `'D'`. Defined in `object` as `[ID(sym2)]: 'D'`");
+assert(
+  compareArray(Object.keys(object), ['a', 'c']),
+  "`compareArray(Object.keys(object), ['a', 'c'])` returns `true`"
+);
+
+// compareArray expects arguments to be sorted,
+// which will cause an array containing symbols to
+// throw an exception when toString() is called.
+//
+// Since there is no guarantee of order:
+//
+//    - Assert only that the symbol is present
+//    - Assert that the length is correct
+//
+var symbols = Object.getOwnPropertySymbols(object);
+
+assert(
+  symbols.indexOf(sym1) !== -1,
+  "The result of `symbols.indexOf(sym1) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(object);`"
+);
+assert(
+  symbols.indexOf(sym2) !== -1,
+  "The result of `symbols.indexOf(sym2) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(object);`"
+);
+assert.sameValue(symbols.length, 2, "The value of `symbols.length` is `2`, after executing `var symbols = Object.getOwnPropertySymbols(object);`");
diff --git a/test/language/computed-property-names/class/accessor/getter-duplicates.js b/test/language/computed-property-names/class/accessor/getter-duplicates.js
new file mode 100644
index 0000000000000000000000000000000000000000..0637509834fa68fb2345a2d80a1f525e1af415e7
--- /dev/null
+++ b/test/language/computed-property-names/class/accessor/getter-duplicates.js
@@ -0,0 +1,47 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In a class, duplicate computed property getter names produce only a single property of
+    that name, whose value is the value of the last property of that name.
+---*/
+class C {
+  get ['a']() {
+    return 'A';
+  }
+}
+assert.sameValue(new C().a, 'A', "The value of `new C().a` is `'A'`");
+
+class C2 {
+  get b() {
+    $ERROR("The first `b` getter definition in `C2` is unreachable");
+  }
+  get ['b']() {
+    return 'B';
+  }
+}
+assert.sameValue(new C2().b, 'B', "The value of `new C2().b` is `'B'`");
+
+class C3 {
+  get c() {
+    $ERROR("The first `c` getter definition in `C3` is unreachable");
+  }
+  get ['c']() {
+    $ERROR("The second `c` getter definition in `C3` is unreachable");
+  }
+  get ['c']() {
+    return 'C';
+  }
+}
+assert.sameValue(new C3().c, 'C', "The value of `new C3().c` is `'C'`");
+
+class C4 {
+  get ['d']() {
+    $ERROR("The first `d` getter definition in `C4` is unreachable");
+  }
+  get d() {
+    return 'D';
+  }
+}
+assert.sameValue(new C4().d, 'D', "The value of `new C4().d` is `'D'`");
diff --git a/test/language/computed-property-names/class/accessor/getter.js b/test/language/computed-property-names/class/accessor/getter.js
new file mode 100644
index 0000000000000000000000000000000000000000..e44a928b93c9b36d30b3a781b89e5c04bc663df4
--- /dev/null
+++ b/test/language/computed-property-names/class/accessor/getter.js
@@ -0,0 +1,13 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    Computed property names for getters
+---*/
+class C {
+  get ['a']() {
+    return 'A';
+  }
+}
+assert.sameValue(new C().a, 'A', "The value of `new C().a` is `'A'`");
diff --git a/test/language/computed-property-names/class/accessor/setter-duplicates.js b/test/language/computed-property-names/class/accessor/setter-duplicates.js
new file mode 100644
index 0000000000000000000000000000000000000000..422753262fb1d9cb934ba9ee173d45991ee1068a
--- /dev/null
+++ b/test/language/computed-property-names/class/accessor/setter-duplicates.js
@@ -0,0 +1,55 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In a class, duplicate computed property setter names produce only a single property of
+    that name, whose value is the value of the last property of that name.
+---*/
+var calls = 0;
+class C {
+  set ['a'](_) {
+    calls++;
+  }
+}
+new C().a = 'A';
+assert.sameValue(calls, 1, "The value of `calls` is `1`, after executing `new C().a = 'A';`");
+
+calls = 0;
+class C2 {
+  set b(_) {
+    $ERROR("The first `b` setter definition in `C2` is unreachable");
+  }
+  set ['b'](_) {
+    calls++;
+  }
+}
+new C2().b = 'B';
+assert.sameValue(calls, 1, "The value of `calls` is `1`, after executing `new C2().b = 'B';`");
+
+calls = 0;
+class C3 {
+  set c(_) {
+    $ERROR("The first `c` setter definition in `C3` is unreachable");
+  }
+  set ['c'](_) {
+    $ERROR("The second `c` setter definition in `C3` is unreachable");
+  }
+  set ['c'](_) {
+    calls++
+  }
+}
+new C3().c = 'C';
+assert.sameValue(calls, 1, "The value of `calls` is `1`, after executing `new C3().c = 'C';`");
+
+calls = 0;
+class C4 {
+  set ['d'](_) {
+    $ERROR("The first `d` setter definition in `C4` is unreachable");
+  }
+  set d(_) {
+    calls++
+  }
+}
+new C4().d = 'D';
+assert.sameValue(calls, 1, "The value of `calls` is `1`, after executing `new C4().d = 'D';`");
diff --git a/test/language/computed-property-names/class/accessor/setter.js b/test/language/computed-property-names/class/accessor/setter.js
new file mode 100644
index 0000000000000000000000000000000000000000..3df1b208c28959dc2b80572e51715b7a6cc84f93
--- /dev/null
+++ b/test/language/computed-property-names/class/accessor/setter.js
@@ -0,0 +1,15 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    Computed property names for setters
+---*/
+var calls = 0;
+class C {
+  set ['a'](_) {
+    calls++;
+  }
+}
+new C().a = 'A';
+assert.sameValue(calls, 1, "The value of `calls` is `1`, after executing `new C().a = 'A';`");
diff --git a/test/language/computed-property-names/class/method/constructor-cannot-be-generator.js b/test/language/computed-property-names/class/method/constructor-cannot-be-generator.js
new file mode 100644
index 0000000000000000000000000000000000000000..83a8f4ed04f1b57ca05a88ba97aaa8936c762082
--- /dev/null
+++ b/test/language/computed-property-names/class/method/constructor-cannot-be-generator.js
@@ -0,0 +1,12 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.5.3
+description: >
+    computed property generator method names cannot be "constructor"
+negative: SyntaxError
+---*/
+class C4 {
+  *['constructor']() {
+  }
+}
diff --git a/test/language/computed-property-names/class/method/constructor-cannot-be-getter.js b/test/language/computed-property-names/class/method/constructor-cannot-be-getter.js
new file mode 100644
index 0000000000000000000000000000000000000000..895b0e79ead89e73d98ad7f93c30556a1b386814
--- /dev/null
+++ b/test/language/computed-property-names/class/method/constructor-cannot-be-getter.js
@@ -0,0 +1,11 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.5.3
+description: >
+    computed property getter names cannot be "constructor"
+negative: SyntaxError
+---*/
+class C4 {
+  get ['constructor']() {}
+}
diff --git a/test/language/computed-property-names/class/method/constructor-cannot-be-setter.js b/test/language/computed-property-names/class/method/constructor-cannot-be-setter.js
new file mode 100644
index 0000000000000000000000000000000000000000..dd99625d6e992a447952645d70b164467c05c12b
--- /dev/null
+++ b/test/language/computed-property-names/class/method/constructor-cannot-be-setter.js
@@ -0,0 +1,11 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.5.3
+description: >
+    computed property setter names cannot be "constructor"
+negative: SyntaxError
+---*/
+class C4 {
+  set ['constructor'](_) {}
+}
diff --git a/test/language/computed-property-names/class/method/constructor-no-duplicate-1.js b/test/language/computed-property-names/class/method/constructor-no-duplicate-1.js
new file mode 100644
index 0000000000000000000000000000000000000000..e762bfbb0546d96745303b80fad353df9a456463
--- /dev/null
+++ b/test/language/computed-property-names/class/method/constructor-no-duplicate-1.js
@@ -0,0 +1,12 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property names can be "constructor", but duplicates are not allowed, 1
+negative: SyntaxError
+---*/
+class C {
+  constructor() {}
+  ['constructor']() {}
+}
diff --git a/test/language/computed-property-names/class/method/constructor-no-duplicate-2.js b/test/language/computed-property-names/class/method/constructor-no-duplicate-2.js
new file mode 100644
index 0000000000000000000000000000000000000000..79594ac15ed1e3eed6d22a2028bc877b5796a275
--- /dev/null
+++ b/test/language/computed-property-names/class/method/constructor-no-duplicate-2.js
@@ -0,0 +1,12 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property names can be "constructor", but duplicates are not allowed, 2
+negative: SyntaxError
+---*/
+class C {
+  ['constructor']() {}
+  constructor() {}
+}
diff --git a/test/language/computed-property-names/class/method/constructor-no-duplicate-3.js b/test/language/computed-property-names/class/method/constructor-no-duplicate-3.js
new file mode 100644
index 0000000000000000000000000000000000000000..3e0297e89e92b787d06b6428de30934a5968af0e
--- /dev/null
+++ b/test/language/computed-property-names/class/method/constructor-no-duplicate-3.js
@@ -0,0 +1,12 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property names can be "constructor", but duplicates are not allowed, 2
+negative: SyntaxError
+---*/
+class C {
+  ['constructor']() {}
+  ['constructor']() {}
+}
diff --git a/test/language/computed-property-names/class/method/constructor.js b/test/language/computed-property-names/class/method/constructor.js
new file mode 100644
index 0000000000000000000000000000000000000000..568f16a30fdf13d2117ab104ebee6868b16cd10b
--- /dev/null
+++ b/test/language/computed-property-names/class/method/constructor.js
@@ -0,0 +1,17 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property names can be "constructor"
+---*/
+class C {
+  ['constructor']() {
+    return 1;
+  }
+}
+assert(
+  C !== C.prototype.constructor,
+  "The result of `C !== C.prototype.constructor` is `true`"
+);
+assert.sameValue(new C().constructor(), 1, "`new C().constructor()` returns `1`");
diff --git a/test/language/computed-property-names/class/method/generator.js b/test/language/computed-property-names/class/method/generator.js
new file mode 100644
index 0000000000000000000000000000000000000000..853e2f2a05d70f137074c35e987424ef5fcf01a3
--- /dev/null
+++ b/test/language/computed-property-names/class/method/generator.js
@@ -0,0 +1,23 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property names can be used as the name of a generator method in a class
+includes: [compareArray.js]
+---*/
+class C {
+  *['a']() {
+    yield 1;
+    yield 2;
+  }
+}
+assert.sameValue(
+  Object.keys(C.prototype).length,
+  0,
+  "The value of `Object.keys(C.prototype).length` is `0`"
+);
+assert(
+  compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a']),
+  "`compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a'])` returns `true`"
+);
diff --git a/test/language/computed-property-names/class/method/number.js b/test/language/computed-property-names/class/method/number.js
new file mode 100644
index 0000000000000000000000000000000000000000..703033ef81eefa6c1068889539a72efbe65e114f
--- /dev/null
+++ b/test/language/computed-property-names/class/method/number.js
@@ -0,0 +1,31 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property class method names can be a number
+includes: [compareArray.js]
+---*/
+
+function ID(x) {
+  return x;
+}
+
+class C {
+  a() { return 'A'; }
+  [1]() { return 'B'; }
+  c() { return 'C'; }
+  [ID(2)]() { return 'D'; }
+}
+assert.sameValue(new C().a(), 'A', "`new C().a()` returns `'A'`, from `a() { return 'A'; }`");
+assert.sameValue(new C()[1](), 'B', "`new C()[1]()` returns `'B'`, from `[1]() { return 'B'; }`");
+assert.sameValue(new C().c(), 'C', "`new C().c()` returns `'C'`, from `c() { return 'C'; }`");
+assert.sameValue(new C()[2](), 'D', "`new C()[2]()` returns `'D'`, from `[ID(2)]() { return 'D'; }`");
+assert(
+  compareArray(Object.keys(C.prototype), []),
+  "`compareArray(Object.keys(C.prototype), [])` returns `true`"
+);
+assert(
+  compareArray(Object.getOwnPropertyNames(C.prototype), ['1', '2', 'constructor', 'a', 'c']),
+  "`compareArray(Object.getOwnPropertyNames(C.prototype), ['1', '2', 'constructor', 'a', 'c'])` returns `true`"
+);
diff --git a/test/language/computed-property-names/class/method/string.js b/test/language/computed-property-names/class/method/string.js
new file mode 100644
index 0000000000000000000000000000000000000000..f59d1f98725b377a18df4bfe7d0dd6eb80722f14
--- /dev/null
+++ b/test/language/computed-property-names/class/method/string.js
@@ -0,0 +1,31 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property class method names can be a string
+includes: [compareArray.js]
+---*/
+
+function ID(x) {
+  return x;
+}
+
+class C {
+  a() { return 'A'}
+  ['b']() { return 'B'; }
+  c() { return 'C'; }
+  [ID('d')]() { return 'D'; }
+}
+assert.sameValue(new C().a(), 'A', "`new C().a()` returns `'A'`. Defined as `a() { return 'A'}`");
+assert.sameValue(new C().b(), 'B', "`new C().b()` returns `'B'`. Defined as `['b']() { return 'B'; }`");
+assert.sameValue(new C().c(), 'C', "`new C().c()` returns `'C'`. Defined as `c() { return 'C'; }`");
+assert.sameValue(new C().d(), 'D', "`new C().d()` returns `'D'`. Defined as `[ID('d')]() { return 'D'; }`");
+assert(
+  compareArray(Object.keys(C.prototype), []),
+  "`compareArray(Object.keys(C.prototype), [])` returns `true`"
+);
+assert(
+  compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a', 'b', 'c', 'd']),
+  "`compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a', 'b', 'c', 'd'])` returns `true`"
+);
diff --git a/test/language/computed-property-names/class/method/symbol.js b/test/language/computed-property-names/class/method/symbol.js
new file mode 100644
index 0000000000000000000000000000000000000000..188e96bad5969f7f304b1be4035a273838da2dff
--- /dev/null
+++ b/test/language/computed-property-names/class/method/symbol.js
@@ -0,0 +1,54 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property class method names can be a symbol
+includes: [compareArray.js]
+---*/
+
+function ID(x) {
+  return x;
+}
+
+var sym1 = Symbol();
+var sym2 = Symbol();
+class C {
+  a() { return 'A'; }
+  [sym1]() { return 'B'; }
+  c() { return 'C'; }
+  [ID(sym2)]() { return 'D'; }
+}
+assert.sameValue(new C().a(), 'A', "`new C().a()` returns `'A'`. Defined as `a() { return 'A'; }`");
+assert.sameValue(new C()[sym1](), 'B', "`new C()[sym1]()` returns `'B'`. Defined as `[sym1]() { return 'B'; }`");
+assert.sameValue(new C().c(), 'C', "`new C().c()` returns `'C'`. Defined as `c() { return 'C'; }`");
+assert.sameValue(new C()[sym2](), 'D', "`new C()[sym2]()` returns `'D'`. Defined as `[ID(sym2)]() { return 'D'; }`");
+assert(
+  compareArray(Object.keys(C.prototype), []),
+  "`compareArray(Object.keys(C.prototype), [])` returns `true`"
+);
+assert(
+  compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a', 'c']),
+  "`compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a', 'c'])` returns `true`"
+);
+
+// compareArray expects arguments to be sorted,
+// which will cause an array containing symbols to
+// throw an exception when toString() is called.
+//
+// Since there is no guarantee of order:
+//
+//    - Assert only that the symbol is present
+//    - Assert that the length is correct
+//
+var symbols = Object.getOwnPropertySymbols(C.prototype);
+
+assert(
+  symbols.indexOf(sym1) !== -1,
+  "The result of `symbols.indexOf(sym1) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(C.prototype);`"
+);
+assert(
+  symbols.indexOf(sym2) !== -1,
+  "The result of `symbols.indexOf(sym2) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(C.prototype);`"
+);
+assert.sameValue(symbols.length, 2, "The value of `symbols.length` is `2`, after executing `var symbols = Object.getOwnPropertySymbols(C.prototype);`");
diff --git a/test/language/computed-property-names/class/static/generator-constructor.js b/test/language/computed-property-names/class/static/generator-constructor.js
new file mode 100644
index 0000000000000000000000000000000000000000..0d24e6ffb701472b27dc4c64f4292b83a74a1c0f
--- /dev/null
+++ b/test/language/computed-property-names/class/static/generator-constructor.js
@@ -0,0 +1,12 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In a class, computed property names for static
+    generators cannot be "constructor"
+negative: SyntaxError
+---*/
+class C {
+  static *['constructor']() {}
+}
diff --git a/test/language/computed-property-names/class/static/generator-prototype.js b/test/language/computed-property-names/class/static/generator-prototype.js
new file mode 100644
index 0000000000000000000000000000000000000000..16c558217b979db7e4c3f9b2f7bca28afb3a6370
--- /dev/null
+++ b/test/language/computed-property-names/class/static/generator-prototype.js
@@ -0,0 +1,12 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In a class, computed property names for static
+    generators cannot be "prototype"
+negative: SyntaxError
+---*/
+class C {
+  static *['prototype']() {}
+}
diff --git a/test/language/computed-property-names/class/static/getter-constructor.js b/test/language/computed-property-names/class/static/getter-constructor.js
new file mode 100644
index 0000000000000000000000000000000000000000..3b576dd53a3b7df231d7fa26d2bbb8be64d79000
--- /dev/null
+++ b/test/language/computed-property-names/class/static/getter-constructor.js
@@ -0,0 +1,12 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In a class, computed property names for static
+    getters cannot be "constructor"
+negative: SyntaxError
+---*/
+class C {
+  static get ['constructor']() {}
+}
diff --git a/test/language/computed-property-names/class/static/getter-prototype.js b/test/language/computed-property-names/class/static/getter-prototype.js
new file mode 100644
index 0000000000000000000000000000000000000000..f445ee0f3dd0102d8275f885da346f0ea87d361f
--- /dev/null
+++ b/test/language/computed-property-names/class/static/getter-prototype.js
@@ -0,0 +1,12 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In a class, computed property names for static
+    getters cannot be "prototype"
+negative: SyntaxError
+---*/
+class C {
+  static get ['prototype']() {}
+}
diff --git a/test/language/computed-property-names/class/static/method-constructor.js b/test/language/computed-property-names/class/static/method-constructor.js
new file mode 100644
index 0000000000000000000000000000000000000000..a47c8038353112b52ab91a0a443a9b7d666ed79c
--- /dev/null
+++ b/test/language/computed-property-names/class/static/method-constructor.js
@@ -0,0 +1,12 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In a class, computed property names for static
+    methods cannot be "constructor"
+negative: SyntaxError
+---*/
+class C {
+  static ['constructor']() {}
+}
diff --git a/test/language/computed-property-names/class/static/method-number.js b/test/language/computed-property-names/class/static/method-number.js
new file mode 100644
index 0000000000000000000000000000000000000000..4574a2d7c29b3e0984203536d2578e4b88edd515
--- /dev/null
+++ b/test/language/computed-property-names/class/static/method-number.js
@@ -0,0 +1,26 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In a class, static computed property method names can be a number
+includes: [compareArray.js]
+---*/
+class C {
+  static a() { return 'A'; }
+  static [1]() { return 'B'; }
+  static c() { return 'C'; }
+  static [2]() { return 'D'; }
+}
+assert.sameValue(C.a(), 'A', "`C.a()` returns `'A'`. Defined as `static a() { return 'A'; }`");
+assert.sameValue(C[1](), 'B', "`C[1]()` returns `'B'`. Defined as `static [1]() { return 'B'; }`");
+assert.sameValue(C.c(), 'C', "`C.c()` returns `'C'`. Defined as `static c() { return 'C'; }`");
+assert.sameValue(C[2](), 'D', "`C[2]()` returns `'D'`. Defined as `static [2]() { return 'D'; }`");
+assert(
+  compareArray(Object.keys(C), []),
+  "`compareArray(Object.keys(C), [])` returns `true`"
+);
+assert(
+  compareArray(Object.getOwnPropertyNames(C), ['1', '2', 'length', 'name', 'prototype', 'a', 'c']),
+  "`compareArray(Object.getOwnPropertyNames(C), ['1', '2', 'length', 'name', 'prototype', 'a', 'c'])` returns `true`"
+);
diff --git a/test/language/computed-property-names/class/static/method-prototype.js b/test/language/computed-property-names/class/static/method-prototype.js
new file mode 100644
index 0000000000000000000000000000000000000000..df2f59af1285972ddce90cde49085460440255b7
--- /dev/null
+++ b/test/language/computed-property-names/class/static/method-prototype.js
@@ -0,0 +1,12 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In a class, computed property names for static
+    methods cannot be "prototype"
+negative: SyntaxError
+---*/
+class C {
+  static ['prototype']() {}
+}
diff --git a/test/language/computed-property-names/class/static/method-string.js b/test/language/computed-property-names/class/static/method-string.js
new file mode 100644
index 0000000000000000000000000000000000000000..6f62b5ac816f4f9cc82c572e96cd5513b472781e
--- /dev/null
+++ b/test/language/computed-property-names/class/static/method-string.js
@@ -0,0 +1,26 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In a class, static computed property method names can be a string
+includes: [compareArray.js]
+---*/
+class C {
+  static a() { return 'A'}
+  static ['b']() { return 'B'; }
+  static c() { return 'C'; }
+  static ['d']() { return 'D'; }
+}
+assert.sameValue(C.a(), 'A', "`C.a()` returns `'A'`. Defined as `static a() { return 'A'}`");
+assert.sameValue(C.b(), 'B', "`C.b()` returns `'B'`. Defined as `static ['b']() { return 'B'; }`");
+assert.sameValue(C.c(), 'C', "`C.c()` returns `'C'`. Defined as `static c() { return 'C'; }`");
+assert.sameValue(C.d(), 'D', "`C.d()` returns `'D'`. Defined as `static ['d']() { return 'D'; }`");
+assert(
+  compareArray(Object.keys(C), []),
+  "`compareArray(Object.keys(C), [])` returns `true`"
+);
+assert(
+  compareArray(Object.getOwnPropertyNames(C), ['length', 'name', 'prototype', 'a', 'b', 'c', 'd']),
+  "`compareArray(Object.getOwnPropertyNames(C), ['length', 'name', 'prototype', 'a', 'b', 'c', 'd'])` returns `true`"
+);
diff --git a/test/language/computed-property-names/class/static/method-symbol.js b/test/language/computed-property-names/class/static/method-symbol.js
new file mode 100644
index 0000000000000000000000000000000000000000..7a29efb9dd7f9ce75a2b370cfa96675c7b652ec1
--- /dev/null
+++ b/test/language/computed-property-names/class/static/method-symbol.js
@@ -0,0 +1,54 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In a class, static computed property method names can be a symbol
+includes: [compareArray.js]
+---*/
+var sym1 = Symbol();
+var sym2 = Symbol();
+class C {
+  static a() { return 'A'; }
+  static [sym1]() { return 'B'; }
+  static c() { return 'C'; }
+  static [sym2]() { return 'D'; }
+}
+assert.sameValue(C.a(), 'A', "`C.a()` returns `'A'`. Defined as `static a() { return 'A'; }`");
+assert.sameValue(C[sym1](), 'B', "`C[sym1]()` returns `'B'`. Defined as `static [sym1]() { return 'B'; }`");
+assert.sameValue(C.c(), 'C', "`C.c()` returns `'C'`. Defined as `static c() { return 'C'; }`");
+assert.sameValue(C[sym2](), 'D', "`C[sym2]()` returns `'D'`. Defined as `static [sym2]() { return 'D'; }`");
+assert(
+  compareArray(Object.keys(C), []),
+  "`compareArray(Object.keys(C), [])` returns `true`"
+);
+assert(
+  compareArray(Object.getOwnPropertyNames(C), ['length', 'name', 'prototype', 'a', 'c']),
+  "`compareArray(Object.getOwnPropertyNames(C), ['length', 'name', 'prototype', 'a', 'c'])` returns `true`"
+);
+
+
+// compareArray expects arguments to be sorted,
+// which will cause an array containing symbols to
+// throw an exception when toString() is called.
+//
+// Since there is no guarantee of order:
+//
+//    - Assert only that the symbol is present
+//    - Assert that the length is correct
+//
+var symbols = Object.getOwnPropertySymbols(C);
+
+assert(
+  symbols.indexOf(sym1) !== -1,
+  "The result of `symbols.indexOf(sym1) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(C);`"
+);
+assert(
+  symbols.indexOf(sym2) !== -1,
+  "The result of `symbols.indexOf(sym2) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(C);`"
+);
+assert.sameValue(
+  symbols.length,
+  2,
+  "The value of `symbols.length` is `2`, after executing `var symbols = Object.getOwnPropertySymbols(C);`"
+);
diff --git a/test/language/computed-property-names/class/static/setter-constructor.js b/test/language/computed-property-names/class/static/setter-constructor.js
new file mode 100644
index 0000000000000000000000000000000000000000..4ee7466c7dbf99169f7e6921723ecfe04fc73d24
--- /dev/null
+++ b/test/language/computed-property-names/class/static/setter-constructor.js
@@ -0,0 +1,12 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In a class, computed property names for static
+    setters cannot be "constructor"
+negative: SyntaxError
+---*/
+class C {
+  static set ['constructor'](x) {}
+}
diff --git a/test/language/computed-property-names/class/static/setter-prototype.js b/test/language/computed-property-names/class/static/setter-prototype.js
new file mode 100644
index 0000000000000000000000000000000000000000..56505eab057b29cbaa225551d230bfbbe97dc4c4
--- /dev/null
+++ b/test/language/computed-property-names/class/static/setter-prototype.js
@@ -0,0 +1,12 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In a class, computed property names for static
+    setters cannot be "prototype"
+negative: SyntaxError
+---*/
+class C {
+  static set ['prototype'](x) {}
+}
diff --git a/test/language/computed-property-names/object/accessor/getter-duplicates.js b/test/language/computed-property-names/object/accessor/getter-duplicates.js
new file mode 100644
index 0000000000000000000000000000000000000000..5c8e908cd43187d8d3fdb0ee03afef1b08b9ee31
--- /dev/null
+++ b/test/language/computed-property-names/object/accessor/getter-duplicates.js
@@ -0,0 +1,47 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In an object, duplicate computed property getter names produce only a single property of
+    that name, whose value is the value of the last property of that name.
+---*/
+var A = {
+  get ['a']() {
+    return 'A';
+  }
+};
+assert.sameValue(A.a, 'A', "The value of `A.a` is `'A'`");
+
+var B = {
+  get b() {
+    $ERROR("The `b` getter definition in `B` is unreachable");
+  },
+  get ['b']() {
+    return 'B';
+  }
+};
+assert.sameValue(B.b, 'B', "The value of `B.b` is `'B'`");
+
+var C = {
+  get c() {
+    $ERROR("The `c` getter definition in `C` is unreachable");
+  },
+  get ['c']() {
+    $ERROR("The `['c']` getter definition in `C` is unreachable");
+  },
+  get ['c']() {
+    return 'C';
+  }
+};
+assert.sameValue(C.c, 'C', "The value of `C.c` is `'C'`");
+
+var D = {
+  get ['d']() {
+    $ERROR("The `['d']` getter definition in `D` is unreachable");
+  },
+  get d() {
+    return 'D';
+  }
+};
+assert.sameValue(D.d, 'D', "The value of `D.d` is `'D'`");
diff --git a/test/language/computed-property-names/object/accessor/getter-super.js b/test/language/computed-property-names/object/accessor/getter-super.js
new file mode 100644
index 0000000000000000000000000000000000000000..7c6ddc16166e79f407fd8cc306786ba62ec68167
--- /dev/null
+++ b/test/language/computed-property-names/object/accessor/getter-super.js
@@ -0,0 +1,46 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property getters can call super methods
+---*/
+
+function ID(x) {
+  return x;
+}
+
+var proto = {
+  m() {
+    return ' proto m';
+  }
+};
+var object = {
+  get ['a']() { return 'a' + super.m(); },
+  get [ID('b')]() { return 'b' + super.m(); },
+  get [0]() { return '0' + super.m(); },
+  get [ID(1)]() { return '1' + super.m(); },
+};
+
+Object.setPrototypeOf(object, proto);
+
+assert.sameValue(
+  object.a,
+  'a proto m',
+  "The value of `object.a` is `'a proto m'`. Defined as `get ['a']() { return 'a' + super.m(); }`"
+);
+assert.sameValue(
+  object.b,
+  'b proto m',
+  "The value of `object.b` is `'b proto m'`. Defined as `get [ID('b')]() { return 'b' + super.m(); }`"
+);
+assert.sameValue(
+  object[0],
+  '0 proto m',
+  "The value of `object[0]` is `'0 proto m'`. Defined as `get [0]() { return '0' + super.m(); }`"
+);
+assert.sameValue(
+  object[1],
+  '1 proto m',
+  "The value of `object[1]` is `'1 proto m'`. Defined as `get [ID(1)]() { return '1' + super.m(); }`"
+);
diff --git a/test/language/computed-property-names/object/accessor/getter.js b/test/language/computed-property-names/object/accessor/getter.js
new file mode 100644
index 0000000000000000000000000000000000000000..6245651f714d557f8d63a253b5dce52065c179bc
--- /dev/null
+++ b/test/language/computed-property-names/object/accessor/getter.js
@@ -0,0 +1,13 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    Computed property names for getters
+---*/
+var A = {
+  get ["a"]() {
+    return "A";
+  }
+};
+assert.sameValue(A.a, "A", "The value of `A.a` is `'A'`");
diff --git a/test/language/computed-property-names/object/accessor/setter-duplicates.js b/test/language/computed-property-names/object/accessor/setter-duplicates.js
new file mode 100644
index 0000000000000000000000000000000000000000..f423c31bad50dd9a9f1246b158ddcabb9a7ba179
--- /dev/null
+++ b/test/language/computed-property-names/object/accessor/setter-duplicates.js
@@ -0,0 +1,55 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In an object, duplicate computed property getter names produce only a single property of
+    that name, whose value is the value of the last property of that name.
+---*/
+var calls = 0;
+var A = {
+  set ['a'](_) {
+    calls++;
+  }
+};
+A.a = 'A';
+assert.sameValue(calls, 1, "The value of `calls` is `1`");
+
+calls = 0;
+var B = {
+  set b(_) {
+    $ERROR("The `b` setter definition in `B` is unreachable");
+  },
+  set ['b'](_) {
+    calls++;
+  }
+};
+B.b = 'B';
+assert.sameValue(calls, 1, "The value of `calls` is `1`");
+
+calls = 0;
+var C = {
+  set c(_) {
+    $ERROR("The `c` setter definition in `C` is unreachable");
+  },
+  set ['c'](_) {
+    $ERROR("The first `['c']` setter definition in `C` is unreachable");
+  },
+  set ['c'](_) {
+    calls++
+  }
+};
+C.c = 'C';
+assert.sameValue(calls, 1, "The value of `calls` is `1`");
+
+calls = 0;
+var D = {
+  set ['d'](_) {
+    $ERROR("The `['d']` setter definition in `D` is unreachable");
+  },
+  set d(_) {
+    calls++
+  }
+};
+D.d = 'D';
+assert.sameValue(calls, 1, "The value of `calls` is `1`");
diff --git a/test/language/computed-property-names/object/accessor/setter-super.js b/test/language/computed-property-names/object/accessor/setter-super.js
new file mode 100644
index 0000000000000000000000000000000000000000..e98a439b58a675f3975700c6083ab2f730af1f6b
--- /dev/null
+++ b/test/language/computed-property-names/object/accessor/setter-super.js
@@ -0,0 +1,35 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property setters can call super methods
+---*/
+
+function ID(x) {
+  return x;
+}
+
+var value;
+var proto = {
+  m(name, v) {
+    value = name + ' ' + v;
+  }
+};
+var object = {
+  set ['a'](v) { super.m('a', v); },
+  set [ID('b')](v) { super.m('b', v); },
+  set [0](v) { super.m('0', v); },
+  set [ID(1)](v) { super.m('1', v); },
+};
+
+Object.setPrototypeOf(object, proto);
+
+object.a = 2;
+assert.sameValue(value, 'a 2', "The value of `value` is `'a 2'`, after executing `object.a = 2;`");
+object.b = 3;
+assert.sameValue(value, 'b 3', "The value of `value` is `'b 3'`, after executing `object.b = 3;`");
+object[0] = 4;
+assert.sameValue(value, '0 4', "The value of `value` is `'0 4'`, after executing `object[0] = 4;`");
+object[1] = 5;
+assert.sameValue(value, '1 5', "The value of `value` is `'1 5'`, after executing `object[1] = 5;`");
diff --git a/test/language/computed-property-names/object/accessor/setter.js b/test/language/computed-property-names/object/accessor/setter.js
new file mode 100644
index 0000000000000000000000000000000000000000..efd67a9cb25558d413e799dc1866941aa7baf80c
--- /dev/null
+++ b/test/language/computed-property-names/object/accessor/setter.js
@@ -0,0 +1,16 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    In an object, duplicate computed property getter names produce only a single property of
+    that name, whose value is the value of the last property of that name.
+---*/
+var calls = 0;
+var A = {
+  set ['a'](_) {
+    calls++;
+  }
+};
+A.a = 'A';
+assert.sameValue(calls, 1, "The value of `calls` is `1`, after executing `A.a = 'A';`");
diff --git a/test/language/computed-property-names/object/method/generator.js b/test/language/computed-property-names/object/method/generator.js
new file mode 100644
index 0000000000000000000000000000000000000000..2ad5c9f318bd73b1054c3779a59ba981299f01c7
--- /dev/null
+++ b/test/language/computed-property-names/object/method/generator.js
@@ -0,0 +1,18 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property names can be used as the name of a generator method in an object
+includes: [compareArray.js]
+---*/
+var object = {
+  *['a']() {
+    yield 1;
+    yield 2;
+  }
+};
+assert(
+  compareArray(Object.keys(object), ['a']),
+  "`compareArray(Object.keys(object), ['a'])` returns `true`"
+);
diff --git a/test/language/computed-property-names/object/method/number.js b/test/language/computed-property-names/object/method/number.js
new file mode 100644
index 0000000000000000000000000000000000000000..13026a1575a6191dd6007f5316e1137bb413305e
--- /dev/null
+++ b/test/language/computed-property-names/object/method/number.js
@@ -0,0 +1,27 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property method names can be a number
+includes: [compareArray.js]
+---*/
+
+function ID(x) {
+  return x;
+}
+
+var object = {
+  a() { return 'A'; },
+  [1]() { return 'B'; },
+  c() { return 'C'; },
+  [ID(2)]() { return 'D'; },
+};
+assert.sameValue(object.a(), 'A', "`object.a()` returns `'A'`. Defined as `a() { return 'A'; }`");
+assert.sameValue(object[1](), 'B', "`object[1]()` returns `'B'`. Defined as `[1]() { return 'B'; }`");
+assert.sameValue(object.c(), 'C', "`object.c()` returns `'C'`. Defined as `c() { return 'C'; }`");
+assert.sameValue(object[2](), 'D', "`object[2]()` returns `'D'`. Defined as `[ID(2)]() { return 'D'; }`");
+assert(
+  compareArray(Object.keys(object), ['1', '2', 'a', 'c']),
+  "`compareArray(Object.keys(object), ['1', '2', 'a', 'c'])` returns `true`"
+);
diff --git a/test/language/computed-property-names/object/method/string.js b/test/language/computed-property-names/object/method/string.js
new file mode 100644
index 0000000000000000000000000000000000000000..ace48da078626e3f39f68fd3a8a5f4084afd2039
--- /dev/null
+++ b/test/language/computed-property-names/object/method/string.js
@@ -0,0 +1,27 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property method names can be a string
+includes: [compareArray.js]
+---*/
+
+function ID(x) {
+  return x;
+}
+
+var object = {
+  a() { return 'A'},
+  ['b']() { return 'B'; },
+  c() { return 'C'; },
+  [ID('d')]() { return 'D'; },
+};
+assert.sameValue(object.a(), 'A', "`object.a()` returns `'A'`. Defined as `a() { return 'A'}`");
+assert.sameValue(object.b(), 'B', "`object.b()` returns `'B'`. Defined as `['b']() { return 'B'; }`");
+assert.sameValue(object.c(), 'C', "`object.c()` returns `'C'`. Defined as `c() { return 'C'; }`");
+assert.sameValue(object.d(), 'D', "`object.d()` returns `'D'`. Defined as `[ID('d')]() { return 'D'; }`");
+assert(
+  compareArray(Object.keys(object), ['a', 'b', 'c', 'd']),
+  "`compareArray(Object.keys(object), ['a', 'b', 'c', 'd'])` returns `true`"
+);
diff --git a/test/language/computed-property-names/object/method/super.js b/test/language/computed-property-names/object/method/super.js
new file mode 100644
index 0000000000000000000000000000000000000000..21e10b80d4bf834918997b75e3910001c96f390e
--- /dev/null
+++ b/test/language/computed-property-names/object/method/super.js
@@ -0,0 +1,30 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property methods can call super methods
+---*/
+
+function ID(x) {
+  return x;
+}
+
+var proto = {
+  m() {
+    return ' proto m';
+  }
+};
+var object = {
+  ['a']() { return 'a' + super.m(); },
+  [ID('b')]() { return 'b' + super.m(); },
+  [0]() { return '0' + super.m(); },
+  [ID(1)]() { return '1' + super.m(); },
+};
+
+Object.setPrototypeOf(object, proto);
+
+assert.sameValue(object.a(), 'a proto m', "`object.a()` returns `'a proto m'`, after executing `Object.setPrototypeOf(object, proto);`");
+assert.sameValue(object.b(), 'b proto m', "`object.b()` returns `'b proto m'`, after executing `Object.setPrototypeOf(object, proto);`");
+assert.sameValue(object[0](), '0 proto m', "`object[0]()` returns `'0 proto m'`, after executing `Object.setPrototypeOf(object, proto);`");
+assert.sameValue(object[1](), '1 proto m', "`object[1]()` returns `'1 proto m'`, after executing `Object.setPrototypeOf(object, proto);`");
diff --git a/test/language/computed-property-names/object/method/symbol.js b/test/language/computed-property-names/object/method/symbol.js
new file mode 100644
index 0000000000000000000000000000000000000000..64f1e71255b2b95521a3f80399cd89c939963b9b
--- /dev/null
+++ b/test/language/computed-property-names/object/method/symbol.js
@@ -0,0 +1,50 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property method names can be a symbol
+includes: [compareArray.js]
+---*/
+
+function ID(x) {
+  return x;
+}
+
+var sym1 = Symbol();
+var sym2 = Symbol();
+var object = {
+  a() { return 'A'; },
+  [sym1]() { return 'B'; },
+  c() { return 'C'; },
+  [ID(sym2)]() { return 'D'; },
+};
+assert.sameValue(object.a(), 'A', "`object.a()` returns `'A'`. Defined as `a() { return 'A'; }`");
+assert.sameValue(object[sym1](), 'B', "`object[sym1]()` returns `'B'`. Defined as `[sym1]() { return 'B'; }`");
+assert.sameValue(object.c(), 'C', "`object.c()` returns `'C'`. Defined as `c() { return 'C'; }`");
+assert.sameValue(object[sym2](), 'D', "`object[sym2]()` returns `'D'`. Defined as `[ID(sym2)]() { return 'D'; }`");
+assert(
+  compareArray(Object.keys(object), ['a', 'c']),
+  "`compareArray(Object.keys(object), ['a', 'c'])` returns `true`"
+);
+
+// compareArray expects arguments to be sorted,
+// which will cause an array containing symbols to
+// throw an exception when toString() is called.
+//
+// Since there is no guarantee of order:
+//
+//    - Assert only that the symbol is present
+//    - Assert that the length is correct
+//
+var symbols = Object.getOwnPropertySymbols(object);
+
+assert(
+  symbols.indexOf(sym1) !== -1,
+  "The result of `symbols.indexOf(sym1) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(object);`"
+);
+assert(
+  symbols.indexOf(sym2) !== -1,
+  "The result of `symbols.indexOf(sym2) !== -1` is `true`, after executing `var symbols = Object.getOwnPropertySymbols(object);`"
+);
+assert.sameValue(symbols.length, 2, "The value of `symbols.length` is `2`, after executing `var symbols = Object.getOwnPropertySymbols(object);`");
diff --git a/test/language/computed-property-names/object/property/number-duplicates.js b/test/language/computed-property-names/object/property/number-duplicates.js
new file mode 100644
index 0000000000000000000000000000000000000000..6913acc2262f6ee5d0ba1231c35349522f7561f0
--- /dev/null
+++ b/test/language/computed-property-names/object/property/number-duplicates.js
@@ -0,0 +1,50 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    computed property names can be numbers
+---*/
+var object = {
+  [1.2]: 'A',
+  [1e55]: 'B',
+  [0.000001]: 'C',
+  [-0]: 'D',
+  [Infinity]: 'E',
+  [-Infinity]: 'F',
+  [NaN]: 'G',
+};
+assert.sameValue(
+  object['1.2'],
+  'A',
+  "The value of `object['1.2']` is `'A'`. Defined as `[1.2]: 'A'`"
+);
+assert.sameValue(
+  object['1e+55'],
+  'B',
+  "The value of `object['1e+55']` is `'B'`. Defined as `[1e55]: 'B'`"
+);
+assert.sameValue(
+  object['0.000001'],
+  'C',
+  "The value of `object['0.000001']` is `'C'`. Defined as `[0.000001]: 'C'`"
+);
+assert.sameValue(
+  object[0],
+  'D',
+  "The value of `object[0]` is `'D'`. Defined as `[-0]: 'D'`"
+);
+assert.sameValue(object[Infinity],
+  'E',
+  "The value of `object[Infinity]` is `'E'`. Defined as `[Infinity]: 'E'`"
+);
+assert.sameValue(
+  object[-Infinity],
+  'F',
+  "The value of `object[-Infinity]` is `'F'`. Defined as `[-Infinity]: 'F'`"
+);
+assert.sameValue(
+  object[NaN],
+  'G',
+  "The value of `object[NaN]` is `'G'`. Defined as `[NaN]: 'G'`"
+);
diff --git a/test/language/computed-property-names/to-name-side-effects/class.js b/test/language/computed-property-names/to-name-side-effects/class.js
new file mode 100644
index 0000000000000000000000000000000000000000..7336967116803418b9a236c03e8d219e282e6bf3
--- /dev/null
+++ b/test/language/computed-property-names/to-name-side-effects/class.js
@@ -0,0 +1,40 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    to name, accessor side effects 3
+includes: [compareArray.js]
+---*/
+var counter = 0;
+var key1 = {
+  toString: function() {
+    assert.sameValue(counter++, 0, "The result of `counter++` is `0`");
+    return 'b';
+  }
+};
+var key2 = {
+  toString: function() {
+    assert.sameValue(counter++, 1, "The result of `counter++` is `1`");
+    return 'd';
+  }
+};
+class C {
+  a() { return 'A'; }
+  [key1]() { return 'B'; }
+  c() { return 'C'; }
+  [key2]() { return 'D'; }
+}
+assert.sameValue(counter, 2, "The value of `counter` is `2`");
+assert.sameValue(new C().a(), 'A', "`new C().a()` returns `'A'`. Defined as `a() { return 'A'; }`");
+assert.sameValue(new C().b(), 'B', "`new C().b()` returns `'B'`. Defined as `[key1]() { return 'B'; }`");
+assert.sameValue(new C().c(), 'C', "`new C().c()` returns `'C'`. Defined as `c() { return 'C'; }`");
+assert.sameValue(new C().d(), 'D', "`new C().d()` returns `'D'`. Defined as `[key2]() { return 'D'; }`");
+assert(
+  compareArray(Object.keys(C.prototype), []),
+  "`compareArray(Object.keys(C.prototype), [])` returns `true`"
+);
+assert(
+  compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a', 'b', 'c', 'd']),
+  "`compareArray(Object.getOwnPropertyNames(C.prototype), ['constructor', 'a', 'b', 'c', 'd'])` returns `true`"
+);
diff --git a/test/language/computed-property-names/to-name-side-effects/numbers-class.js b/test/language/computed-property-names/to-name-side-effects/numbers-class.js
new file mode 100644
index 0000000000000000000000000000000000000000..78035a330eccf99a1f50d3fae131f4c7fb394403
--- /dev/null
+++ b/test/language/computed-property-names/to-name-side-effects/numbers-class.js
@@ -0,0 +1,43 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    to name, accessor side effects numbers 2
+includes: [compareArray.js]
+---*/
+var counter = 0;
+var key1 = {
+  valueOf: function() {
+    assert.sameValue(counter++, 0, "The result of `counter++` is `0`");
+    return 1;
+  },
+  toString: null
+};
+var key2 = {
+  valueOf: function() {
+    assert.sameValue(counter++, 1, "The result of `counter++` is `1`");
+    return 2;
+  },
+  toString: null
+};
+
+class C {
+  a() { return 'A'; }
+  [key1]() { return 'B'; }
+  c() { return 'C'; }
+  [key2]() { return 'D'; }
+}
+assert.sameValue(counter, 2, "The value of `counter` is `2`");
+assert.sameValue(new C().a(), 'A', "`new C().a()` returns `'A'`. Defined as `a() { return 'A'; }`");
+assert.sameValue(new C()[1](), 'B', "`new C()[1]()` returns `'B'`. Defined as `[key1]() { return 'B'; }`");
+assert.sameValue(new C().c(), 'C', "`new C().c()` returns `'C'`. Defined as `c() { return 'C'; }`");
+assert.sameValue(new C()[2](), 'D', "`new C()[2]()` returns `'D'`. Defined as `[key2]() { return 'D'; }`");
+assert(
+  compareArray(Object.keys(C.prototype), []),
+  "`compareArray(Object.keys(C.prototype), [])` returns `true`"
+);
+assert(
+  compareArray(Object.getOwnPropertyNames(C.prototype), ['1', '2', 'constructor', 'a', 'c']),
+  "`compareArray(Object.getOwnPropertyNames(C.prototype), ['1', '2', 'constructor', 'a', 'c'])` returns `true`"
+);
diff --git a/test/language/computed-property-names/to-name-side-effects/numbers-object.js b/test/language/computed-property-names/to-name-side-effects/numbers-object.js
new file mode 100644
index 0000000000000000000000000000000000000000..8744974e4a6fcdd9531cf906e0c237e9bbba2da5
--- /dev/null
+++ b/test/language/computed-property-names/to-name-side-effects/numbers-object.js
@@ -0,0 +1,39 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    to name side effects numbers
+includes: [compareArray.js]
+---*/
+var counter = 0;
+var key1 = {
+  valueOf: function() {
+    assert.sameValue(counter++, 0, "The result of `counter++` is `0`");
+    return 1;
+  },
+  toString: null
+};
+var key2 = {
+  valueOf: function() {
+    assert.sameValue(counter++, 1, "The result of `counter++` is `1`");
+    return 2;
+  },
+  toString: null
+};
+
+var object = {
+  a: 'A',
+  [key1]: 'B',
+  c: 'C',
+  [key2]: 'D',
+};
+assert.sameValue(counter, 2, "The value of `counter` is `2`");
+assert.sameValue(object.a, 'A', "The value of `object.a` is `'A'`. Defined as `a: 'A'`");
+assert.sameValue(object[1], 'B', "The value of `object[1]` is `'B'`. Defined as `[key1]: 'B'`");
+assert.sameValue(object.c, 'C', "The value of `object.c` is `'C'`. Defined as `c: 'C'`");
+assert.sameValue(object[2], 'D', "The value of `object[2]` is `'D'`. Defined as `[key2]: 'D'`");
+assert(
+  compareArray(Object.keys(object), ['1', '2', 'a', 'c']),
+  "`compareArray(Object.keys(object), ['1', '2', 'a', 'c'])` returns `true`"
+);
diff --git a/test/language/computed-property-names/to-name-side-effects/object.js b/test/language/computed-property-names/to-name-side-effects/object.js
new file mode 100644
index 0000000000000000000000000000000000000000..66fae77ad1ed6be4bca80c52339e30439d757f0f
--- /dev/null
+++ b/test/language/computed-property-names/to-name-side-effects/object.js
@@ -0,0 +1,36 @@
+// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 12.2.5
+description: >
+    to name, accessor side effects object literal
+includes: [compareArray.js]
+---*/
+var counter = 0;
+var key1 = {
+  toString: function() {
+    assert.sameValue(counter++, 0, "The result of `counter++` is `0`");
+    return 'b';
+  }
+};
+var key2 = {
+  toString: function() {
+    assert.sameValue(counter++, 1, "The result of `counter++` is `1`");
+    return 'd';
+  }
+};
+var object = {
+  a() { return 'A'; },
+  [key1]() { return 'B'; },
+  c() { return 'C'; },
+  [key2]() { return 'D'; },
+};
+assert.sameValue(counter, 2, "The value of `counter` is `2`");
+assert.sameValue(object.a(), 'A', "`object.a()` returns `'A'`. Defined as `a() { return 'A'; }`");
+assert.sameValue(object.b(), 'B', "`object.b()` returns `'B'`. Defined as `[key1]() { return 'B'; }`");
+assert.sameValue(object.c(), 'C', "`object.c()` returns `'C'`. Defined as `c() { return 'C'; }`");
+assert.sameValue(object.d(), 'D', "`object.d()` returns `'D'`. Defined as `[key2]() { return 'D'; }`");
+assert(
+  compareArray(Object.keys(object), ['a', 'b', 'c', 'd']),
+  "`compareArray(Object.keys(object), ['a', 'b', 'c', 'd'])` returns `true`"
+);