Merge pull request #224 from bocoup/class-syntax

14.5 Class Definitions
This commit is contained in:
Brian Terlson 2015-05-02 11:33:13 -07:00
commit 9b5a1c1e79
91 changed files with 1014 additions and 20 deletions

View File

@ -1,18 +0,0 @@
// Copyright (C) 2014 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5
description: >
class subclassing null
---*/
var N = null;
class Foo extends N {
constructor(x, y) {
assert.sameValue(x, 1, "The value of `x` is `1`");
assert.sameValue(y, 2, "The value of `y` is `2`");
return {};
}
}
new Foo(1,2);

View File

@ -0,0 +1,35 @@
// Copyright (C) 2014 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.14
description: >
10. If constructor is empty, then,
a. If ClassHeritageopt is present, then
i. Let constructor be the result of parsing the String "constructor(... args){ super (...args);}" using the syntactic grammar with the goal symbol MethodDefinition.
---*/
var args;
class A {
constructor() {
args = arguments;
}
}
class B extends A {
/*
The missing constructor is created by the runtime:
constructor(...args) {
super(...args);
}
*/
}
new B(0, 1, 2);
assert.sameValue(args[0], 0);
assert.sameValue(args[1], 1);
assert.sameValue(args[2], 2);

View File

@ -0,0 +1,22 @@
// Copyright (C) 2014 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.14
description: >
Runtime Semantics: ClassDefinitionEvaluation
If superclass is null, then
Let protoParent be null.
Let constructorParent be the intrinsic object %FunctionPrototype%.
`extends null` requires return override in the constructor
---*/
class Foo extends null {
constructor() {
return {};
}
}
var f = new Foo();
assert.sameValue(Object.getPrototypeOf(f), Object.prototype);

View File

@ -0,0 +1,21 @@
// Copyright (C) 2014 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.14
description: >
Runtime Semantics: ClassDefinitionEvaluation
If superclass is null, then
Let protoParent be null.
Let constructorParent be the intrinsic object %FunctionPrototype%.
`extends null` requires return override in the constructor
---*/
class Foo extends null {
constructor() {}
}
assert.throws(ReferenceError, function() {
new Foo();
});

View File

@ -0,0 +1,19 @@
// Copyright (C) 2014 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.14_S6.e
description: >
Runtime Semantics: ClassDefinitionEvaluation
If superclass is null, then
Let protoParent be null.
Let constructorParent be the intrinsic object %FunctionPrototype%.
---*/
class Foo extends null {
constructor() {
return {};
}
}
assert.sameValue(Object.getPrototypeOf(Foo.prototype), null);
assert.sameValue(Object.getPrototypeOf(Foo.prototype.constructor), Function.prototype);

View File

@ -0,0 +1,19 @@
// Copyright (C) 2014 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.14_S6.g.i
description: >
Runtime Semantics: ClassDefinitionEvaluation
If superclass has a [[FunctionKind]] internal slot whose value is "generator", throw a TypeError exception.
---*/
function * G() {}
assert.throws(TypeError, function() {
class A extends G {
constructor() {
super();
}
}
});

View File

@ -12,9 +12,9 @@ class Base {
}
}
class Derived extends Base {}
var object = new Derived;
var object = new Derived();
assert.sameValue(calls, 1, "The value of `calls` is `1`");
calls = 0;
assert.throws(TypeError, function() { Derived(); });
assert.sameValue(calls, 0, "The value of `calls` is `0`");
assert.sameValue(calls, 0, "The value of `calls` is `0`");

View File

@ -0,0 +1,30 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 9.2.2
description: >
[[Construct]] ( argumentsList, newTarget)
...
13. If result.[[type]] is return, then
...
c. If result.[[value]] is not undefined, throw a TypeError exception.
...
`return true;`
---*/
class Base {
constructor() {}
}
class Derived extends Base {
constructor() {
super();
return true;
}
}
assert.throws(TypeError, function() {
new Derived();
});

View File

@ -0,0 +1,40 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 9.2.2
description: >
[[Construct]] ( argumentsList, newTarget)
...
13. If result.[[type]] is return, then
...
c. If result.[[value]] is not undefined, ...
14. Else, ReturnIfAbrupt(result).
15. Return envRec.GetThisBinding().
`return (empty);` Should be the same as `return undefined;`
---*/
var calls = 0;
class Base {
constructor() {
this.prop = 1;
calls++;
}
}
class Derived extends Base {
constructor() {
super();
return;
}
}
var object = new Derived();
// super is called
assert.sameValue(calls, 1, "The value of `calls` is `1`, because `super()`");
// undefined was returned
assert.sameValue(object.prop, 1);
assert.sameValue(object instanceof Derived, true);
assert.sameValue(object instanceof Base, true);

View File

@ -0,0 +1,30 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 9.2.2
description: >
[[Construct]] ( argumentsList, newTarget)
...
13. If result.[[type]] is return, then
...
c. If result.[[value]] is not undefined, throw a TypeError exception.
...
`return null;`
---*/
class Base {
constructor() {}
}
class Derived extends Base {
constructor() {
super();
return null;
}
}
assert.throws(TypeError, function() {
new Derived();
});

View File

@ -0,0 +1,30 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 9.2.2
description: >
[[Construct]] ( argumentsList, newTarget)
...
13. If result.[[type]] is return, then
...
c. If result.[[value]] is not undefined, throw a TypeError exception.
...
`return 0;`
---*/
class Base {
constructor() {}
}
class Derived extends Base {
constructor() {
super();
return 0;
}
}
assert.throws(TypeError, function() {
new Derived();
});

View File

@ -0,0 +1,40 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 9.2.2
description: >
[[Construct]] ( argumentsList, newTarget)
...
13. If result.[[type]] is return, then
a. If Type(result.[[value]]) is Object, return NormalCompletion(result.[[value]]).
...
...
`return {};`
---*/
var calls = 0;
class Base {
constructor() {
this.prop = 1;
calls++;
}
}
class Derived extends Base {
constructor() {
super();
return {};
}
}
var object = new Derived();
// super is called
assert.sameValue(calls, 1, "The value of `calls` is `1`, because `super()`");
// But the this object was discarded.
assert.sameValue(typeof object.prop, "undefined");
assert.sameValue(object instanceof Derived, false);
assert.sameValue(object instanceof Base, false);

View File

@ -0,0 +1,30 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 9.2.2
description: >
[[Construct]] ( argumentsList, newTarget)
...
13. If result.[[type]] is return, then
...
c. If result.[[value]] is not undefined, throw a TypeError exception.
...
`return "";`
---*/
class Base {
constructor() {}
}
class Derived extends Base {
constructor() {
super();
return "";
}
}
assert.throws(TypeError, function() {
new Derived();
});

View File

@ -0,0 +1,30 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 9.2.2
description: >
[[Construct]] ( argumentsList, newTarget)
...
13. If result.[[type]] is return, then
...
c. If result.[[value]] is not undefined, throw a TypeError exception.
...
`return Symbol();`
---*/
class Base {
constructor() {}
}
class Derived extends Base {
constructor() {
super();
return Symbol();
}
}
assert.throws(TypeError, function() {
new Derived();
});

View File

@ -0,0 +1,41 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 9.2.2
description: >
[[Construct]] ( argumentsList, newTarget)
...
13. If result.[[type]] is return, then
...
b. If kind is "base", return NormalCompletion(thisArgument).
...
...
`return this;`
---*/
var calls = 0;
class Base {
constructor() {
this.prop = 1;
calls++;
}
}
class Derived extends Base {
constructor() {
super();
return this;
}
}
var object = new Derived();
// super is called
assert.sameValue(calls, 1, "The value of `calls` is `1`, because `super()`");
// The this object was returned.
assert.sameValue(object.prop, 1);
assert.sameValue(object instanceof Derived, true);
assert.sameValue(object instanceof Base, true);

View File

@ -0,0 +1,41 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 9.2.2
description: >
[[Construct]] ( argumentsList, newTarget)
...
13. If result.[[type]] is return, then
...
c. If result.[[value]] is not undefined, ...
14. Else, ReturnIfAbrupt(result).
15. Return envRec.GetThisBinding().
`return undefined;`
---*/
var calls = 0;
class Base {
constructor() {
this.prop = 1;
calls++;
}
}
class Derived extends Base {
constructor() {
super();
return undefined;
}
}
var object = new Derived();
// super is called
assert.sameValue(calls, 1, "The value of `calls` is `1`, because `super()`");
// undefined was returned
assert.sameValue(object.prop, 1);
assert.sameValue(object instanceof Derived, true);
assert.sameValue(object instanceof Base, true);

View File

@ -0,0 +1,23 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
The opposite of:
ClassTail : ClassHeritageopt { ClassBody }
It is a Syntax Error if ClassHeritage is not present and the following algorithm evaluates to true:
1. Let constructor be ConstructorMethod of ClassBody.
2. If constructor is empty, return false.
3. Return HasDirectSuper of constructor.
---*/
class A {}
class B extends A {
constructor() {
super();
}
}
assert.sameValue(typeof B, "function");

View File

@ -0,0 +1,23 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
No restrictions on SuperProperty
---*/
class A {
constructor() {
super.toString();
}
dontDoThis() {
super.makeBugs = 1;
}
}
assert.sameValue(typeof A, "function");
var a = new A();
a.dontDoThis();
assert.sameValue(a.makeBugs, 1);

View File

@ -0,0 +1,35 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5
description: >
ClassDeclaration:
class BindingIdentifier ClassTail
ClassTail:
... { ClassBodyopt }
ClassBody[Yield] :
ClassElementList[?Yield]
ClassElementList[Yield] :
ClassElement[?Yield]
ClassElementList[?Yield] ClassElement[?Yield]
ClassElement[Yield] :
MethodDefinition[?Yield]
static MethodDefinition[?Yield]
;
---*/
class A {
method() {}
static method() {}
;
}
assert.sameValue(typeof A, "function");
assert.sameValue(typeof A.prototype.method, "function");
assert.sameValue(typeof A.method, "function");

View File

@ -0,0 +1,30 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5
description: >
ClassDeclaration:
class BindingIdentifier ClassTail
ClassTail:
... { ClassBodyopt }
ClassBody[Yield] :
ClassElementList[?Yield]
ClassElementList[Yield] :
ClassElement[?Yield]
ClassElementList[?Yield] ClassElement[?Yield]
ClassElement[Yield] :
MethodDefinition[?Yield]
...
---*/
class A {
[1]() {}
}
assert.sameValue(typeof A, "function");
assert.sameValue(typeof A.prototype[1], "function");

View File

@ -0,0 +1,30 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5
description: >
ClassDeclaration:
class BindingIdentifier ClassTail
ClassTail:
... { ClassBodyopt }
ClassBody[Yield] :
ClassElementList[?Yield]
ClassElementList[Yield] :
ClassElement[?Yield]
ClassElementList[?Yield] ClassElement[?Yield]
ClassElement[Yield] :
MethodDefinition[?Yield]
...
---*/
class A {
*[1]() {}
}
assert.sameValue(typeof A, "function");
assert.sameValue(typeof A.prototype[1], "function");

View File

@ -0,0 +1,54 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5
description: >
ClassHeritage[Yield] :
extends LeftHandSideExpression[?Yield]
LeftHandSideExpression :
NewExpression
...
NewExpression :
MemberExpression
...
MemberExpression :
PrimaryExpression
...
PrimaryExpression :
IdentifierReference
...
ClassDeclaration:
class BindingIdentifier ClassTail
ClassTail:
... { ClassBodyopt }
ClassBody[Yield] :
ClassElementList[?Yield]
ClassElementList[Yield] :
ClassElement[?Yield]
ClassElementList[?Yield] ClassElement[?Yield]
ClassElement[Yield] :
MethodDefinition[?Yield]
static MethodDefinition[?Yield]
;
---*/
class A {}
class B extends A {
method() {}
static method() {}
;
}
assert.sameValue(typeof B, "function");
assert.sameValue(typeof B.prototype.method, "function");
assert.sameValue(typeof B.method, "function");

View File

@ -0,0 +1,39 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5
description: >
ClassExpression[Yield,GeneratorParameter] :
class BindingIdentifier[?Yield]opt ClassTail[?Yield,?GeneratorParameter]
ClassDeclaration:
class BindingIdentifier ClassTail
ClassTail:
... { ClassBodyopt }
ClassBody[Yield] :
ClassElementList[?Yield]
ClassElementList[Yield] :
ClassElement[?Yield]
ClassElementList[?Yield] ClassElement[?Yield]
ClassElement[Yield] :
MethodDefinition[?Yield]
static MethodDefinition[?Yield]
;
---*/
var A = class B {
method() {}
static method() {}
;
}
assert.sameValue(typeof A, "function");
assert.sameValue(typeof A.prototype.method, "function");
assert.sameValue(typeof A.method, "function");
assert.sameValue(typeof B, "undefined");

View File

@ -0,0 +1,16 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5
description: >
ClassExpression[Yield,GeneratorParameter] :
class BindingIdentifier[?Yield]opt ClassTail[?Yield,?GeneratorParameter]
ClassTail[Yield,GeneratorParameter] :
[~GeneratorParameter] ClassHeritage[?Yield]opt { ClassBody[?Yield]opt }
[+GeneratorParameter] ClassHeritageopt { ClassBodyopt }
---*/
class A {}
var B = class extends A {}
assert.sameValue(typeof B, "function");

View File

@ -0,0 +1,10 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5
description: >
ClassExpression
---*/
var A = class {}
assert.sameValue(typeof A, "function");

View File

@ -0,0 +1,17 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
The opposite of:
ClassBody : ClassElementList
It is a Syntax Error if PrototypePropertyNameList of ClassElementList contains more than one occurrence of "constructor".
---*/
class A {
constructor() {}
}
assert.sameValue(typeof A, "function");

View File

@ -0,0 +1,16 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassTail : ClassHeritageopt { ClassBody }
It is a Syntax Error if ClassHeritage is not present and the following algorithm evaluates to true:
1. Let constructor be ConstructorMethod of ClassBody.
2. If constructor is empty, return false.
3. Return HasDirectSuper of constructor.
---*/
class A {
constructor() {}
}

View File

@ -0,0 +1,16 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassBody : ClassElementList
It is a Syntax Error if PrototypePropertyNameList of ClassElementList contains more than one occurrence of "constructor".
negative: SyntaxError
---*/
class A {
constructor() {}
constructor() {}
}

View File

@ -0,0 +1,20 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassTail : ClassHeritageopt { ClassBody }
It is a Syntax Error if ClassHeritage is not present and the following algorithm evaluates to true:
1. Let constructor be ConstructorMethod of ClassBody.
2. If constructor is empty, return false.
3. Return HasDirectSuper of constructor.
negative: SyntaxError
---*/
class A {
constructor() {
super();
}
}

View File

@ -0,0 +1,17 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassElement : MethodDefinition
It is a Syntax Error if PropName of MethodDefinition is not "constructor" and HasDirectSuper of MethodDefinition is true.
negative: SyntaxError
---*/
class A {
method() {
super();
}
}

View File

@ -0,0 +1,19 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassElement : MethodDefinition
It is a Syntax Error if PropName of MethodDefinition is not "constructor" and HasDirectSuper of MethodDefinition is true.
(GeneratorMethod)
negative: SyntaxError
---*/
class A {
* method() {
super();
}
}

View File

@ -0,0 +1,17 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassElement : MethodDefinition
It is a Syntax Error if PropName of MethodDefinition is "constructor" and SpecialMethod of MethodDefinition is true.
(GeneratorMethod)
negative: SyntaxError
---*/
class A {
* constructor() {}
}

View File

@ -0,0 +1,19 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassElement : MethodDefinition
It is a Syntax Error if PropName of MethodDefinition is not "constructor" and HasDirectSuper of MethodDefinition is true.
(get)
negative: SyntaxError
---*/
class A {
get method() {
super();
}
}

View File

@ -0,0 +1,17 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassElement : MethodDefinition
It is a Syntax Error if PropName of MethodDefinition is "constructor" and SpecialMethod of MethodDefinition is true.
(get)
negative: SyntaxError
---*/
class A {
get constructor() {}
}

View File

@ -0,0 +1,19 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassElement : MethodDefinition
It is a Syntax Error if PropName of MethodDefinition is not "constructor" and HasDirectSuper of MethodDefinition is true.
(set)
negative: SyntaxError
---*/
class A {
set method(_) {
super();
}
}

View File

@ -0,0 +1,17 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassElement : MethodDefinition
It is a Syntax Error if PropName of MethodDefinition is "constructor" and SpecialMethod of MethodDefinition is true.
(set)
negative: SyntaxError
---*/
class A {
set constructor(_) {}
}

View File

@ -0,0 +1,17 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassElement : static MethodDefinition
It is a Syntax Error if HasDirectSuper of MethodDefinition is true.
negative: SyntaxError
---*/
class A {
static method() {
super();
}
}

View File

@ -0,0 +1,19 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassElement : static MethodDefinition
It is a Syntax Error if HasDirectSuper of MethodDefinition is true.
(get)
negative: SyntaxError
---*/
class A {
static get method() {
super();
}
}

View File

@ -0,0 +1,17 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassElement : static MethodDefinition
It is a Syntax Error if PropName of MethodDefinition is "prototype".
(get)
negative: SyntaxError
---*/
class A {
static get prototype() {}
}

View File

@ -0,0 +1,15 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassElement : static MethodDefinition
It is a Syntax Error if PropName of MethodDefinition is "prototype".
negative: SyntaxError
---*/
class A {
static prototype() {}
}

View File

@ -0,0 +1,19 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassElement : static MethodDefinition
It is a Syntax Error if HasDirectSuper of MethodDefinition is true.
(set)
negative: SyntaxError
---*/
class A {
static set method(_) {
super();
}
}

View File

@ -0,0 +1,17 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5.1
description: >
ClassElement : static MethodDefinition
It is a Syntax Error if PropName of MethodDefinition is "prototype".
(set)
negative: SyntaxError
---*/
class A {
static set prototype() {}
}

View File

@ -0,0 +1,14 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 13.1.1
description: >
Block : { StatementList }
It is a Syntax Error if the LexicallyDeclaredNames of StatementList contains any duplicate entries.
negative: SyntaxError
---*/
{
class A {}
class A {}
}

View File

@ -0,0 +1,12 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 15.1.1
description: >
ScriptBody : StatementList
It is a Syntax Error if the LexicallyDeclaredNames of StatementList contains any duplicate entries.
negative: SyntaxError
---*/
class A {}
class A {}