Bug 1530879 - Update the test262 import to upstream rev b7c9c6c78b65f63df93650c11476225f38bcd1fa. r=jorendorff
authorJeff Walden <jwalden@mit.edu>
Tue, 26 Feb 2019 17:06:48 -0800
changeset 461660 d43af7026a45a55f27d0592a4571cdd49ca02e68
parent 461659 03c7eccbb595ce3684ce67363b68b74f42f00d7b
child 461661 075e7b0295529f13de5cdb3443cc1f045b9ba994
push id35626
push usercsabou@mozilla.com
push dateThu, 28 Feb 2019 11:31:08 +0000
treeherdermozilla-central@2ea0c1db7e60 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjorendorff
bugs1530879
milestone67.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1530879 - Update the test262 import to upstream rev b7c9c6c78b65f63df93650c11476225f38bcd1fa. r=jorendorff
js/src/tests/test262/GIT-INFO
js/src/tests/test262/intl402/Locale/canonicalize-locale-list-take-locale.js
js/src/tests/test262/intl402/Locale/constructor-options-language-valid-undefined.js
js/src/tests/test262/intl402/Locale/constructor-options-language-valid.js
js/src/tests/test262/intl402/Locale/constructor-parse-twice.js
js/src/tests/test262/intl402/Locale/extensions-grandfathered.js
js/src/tests/test262/intl402/Locale/getters-grandfathered.js
js/src/tests/test262/intl402/Locale/likely-subtags-grandfathered.js
js/src/tests/test262/language/expressions/arrow-function/params-duplicate.js
js/src/tests/test262/language/expressions/async-arrow-function/early-errors-arrow-duplicate-parameters-strict.js
js/src/tests/test262/language/expressions/async-arrow-function/early-errors-arrow-duplicate-parameters.js
js/src/tests/test262/language/expressions/object/method-definition/early-errors-object-async-method-duplicate-parameters.js
js/src/tests/test262/language/expressions/object/method-definition/early-errors-object-method-duplicate-parameters.js
js/src/tests/test262/language/statements/class/definition/early-errors-class-async-method-duplicate-parameters.js
js/src/tests/test262/language/statements/class/definition/early-errors-class-method-duplicate-parameters.js
--- a/js/src/tests/test262/GIT-INFO
+++ b/js/src/tests/test262/GIT-INFO
@@ -1,7 +1,5 @@
-commit d7c8a12e68af1f8713082b73ff25a945c9c597d5
-Author: Mathias Bynens <mathias@qiwi.be>
-Date:   Wed Jan 23 10:56:03 2019 -0500
+commit b7c9c6c78b65f63df93650c11476225f38bcd1fa
+Author: Frank Yung-Fong Tang <41213225+FrankYFTang@users.noreply.github.com>
+Date:   Thu Jan 24 09:34:03 2019 -0800
 
-    Remove invalid line terminator tests (#2044)
-    
-    https://github.com/tc39/test262/pull/2020#issuecomment-456581449
+    Remove unsupported irregular grandfathered tags. (#2029)
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/intl402/Locale/canonicalize-locale-list-take-locale.js
@@ -0,0 +1,56 @@
+// |reftest| skip -- Intl.Locale is not supported
+// Copyright 2019 Google Inc.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-intl.locale
+description: >
+    Verifies CanonicalizeLocaleList will take Intl.Locale as locales.
+info: |
+    CanonicalizeLocaleList ( locales )
+    3. If Type(locales) is String or locales has an [[InitializedLocale]] internal slot, then
+       a. Let O be CreateArrayFromList(« locales »).
+
+       c. iii. If Type(kValue) is Object and kValue has an [[InitializedLocale]] internal slot, then
+            1. Let tag be kValue.[[Locale]].
+          iv. Else,
+            1. Let tag be ? ToString(kValue).
+features: [Intl.Locale]
+---*/
+
+const tag = "ar";
+const tag2 = "fa";
+const tag3 = "zh";
+const loc = new Intl.Locale(tag);
+
+// Monkey-patching Intl.Locale
+class PatchedLocale extends Intl.Locale {
+  constructor(tag, options) {
+    super(tag, options);
+  }
+  toString() {
+    // this should NOT get called.
+    assert(false, "toString should not be called")
+  }
+}
+const ploc = new PatchedLocale(tag2);
+
+// Test Intl.Locale as the only argument
+let res = Intl.getCanonicalLocales(loc);
+assert.sameValue(res.length, 1);
+assert.sameValue(res[0], tag);
+
+// Test Monkey-patched Intl.Locale as the only argument
+res = Intl.getCanonicalLocales(ploc);
+assert.sameValue(res.length, 1);
+assert.sameValue(res[0], tag2);
+
+// Test Intl.Locale and the Monkey-patched one are in
+// array.
+res = Intl.getCanonicalLocales([loc, tag3, ploc]);
+assert.sameValue(res.length, 3);
+assert.sameValue(res[0], tag);
+assert.sameValue(res[1], tag3);
+assert.sameValue(res[2], tag2);
+
+reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/Locale/constructor-options-language-valid-undefined.js
+++ b/js/src/tests/test262/intl402/Locale/constructor-options-language-valid-undefined.js
@@ -9,35 +9,38 @@ description: >
 info: |
     Intl.Locale( tag [, options] )
     10. If options is undefined, then
     11. Else
         a. Let options be ? ToObject(options).
     12. Set tag to ? ApplyOptionsToTag(tag, options).
 
     ApplyOptionsToTag( tag, options )
+
+    2. If IsStructurallyValidLanguageTag(tag) is false, throw a RangeError exception.
     ...
-    9. If tag matches neither the privateuse nor the grandfathered production, then
-        b. If language is not undefined, then
-            i. Set tag to tag with the substring corresponding to the language production replaced by the string language.
+
+    IsStructurallyValidLanguageTag ( locale )
+
+    The IsStructurallyValidLanguageTag abstract operation verifies that the
+    locale argument (which must be a String value)
+
+    represents a well-formed Unicode BCP 47 Locale Identifier" as specified in
+    Unicode Technical Standard 35 section 3.2, or successor,
 
 features: [Intl.Locale]
 ---*/
 
 assert.sameValue(
   new Intl.Locale('en', {language: undefined}).toString(),
   'en',
   `new Intl.Locale('en', {language: undefined}).toString() returns "en"`
 );
 
 assert.sameValue(
   new Intl.Locale('en-US', {language: undefined}).toString(),
   'en-US',
   `new Intl.Locale('en-US', {language: undefined}).toString() returns "en-US"`
 );
 
-assert.sameValue(
-  new Intl.Locale('en-els', {language: undefined}).toString(),
-  'en-els',
-  `new Intl.Locale('en-els', {language: undefined}).toString() returns "en-els"`
-);
+assert.throws(RangeError, () => new Intl.Locale('en-els', {language: undefined}));
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/Locale/constructor-options-language-valid.js
+++ b/js/src/tests/test262/intl402/Locale/constructor-options-language-valid.js
@@ -10,28 +10,33 @@ info: |
     Intl.Locale( tag [, options] )
     10. If options is undefined, then
     11. Else
         a. Let options be ? ToObject(options).
     12. Set tag to ? ApplyOptionsToTag(tag, options).
 
     ApplyOptionsToTag( tag, options )
     ...
-    9. If tag matches neither the privateuse nor the grandfathered production, then
-        b. If language is not undefined, then
-            i. Set tag to tag with the substring corresponding to the language production replaced by the string language.
+    2. If IsStructurallyValidLanguageTag(tag) is false, throw a RangeError exception.
+
+    IsStructurallyValidLanguageTag ( locale )
+
+    The IsStructurallyValidLanguageTag abstract operation verifies that the
+    locale argument (which must be a String value)
+
+    represents a well-formed Unicode BCP 47 Locale Identifier" as specified in
+    Unicode Technical Standard 35 section 3.2, or successor,
 
 features: [Intl.Locale]
 ---*/
 
 const validLanguageOptions = [
   [null, 'null'],
   ['zh-cmn', 'cmn'],
   ['ZH-CMN', 'cmn'],
-  ['abcd', 'abcd'],
   [{ toString() { return 'de' } }, 'de'],
 ];
 for (const [language, expected] of validLanguageOptions) {
   let expect = expected || 'en';
 
   assert.sameValue(
     new Intl.Locale('en', {language}).toString(),
     expect,
@@ -40,17 +45,22 @@ for (const [language, expected] of valid
 
   expect = (expected || 'en') + '-US';
   assert.sameValue(
     new Intl.Locale('en-US', {language}).toString(),
     expect,
     `new Intl.Locale('en-US', {language: "${language}"}).toString() returns "${expect}"`
   );
 
-  expect = expected || 'en-els';
-  assert.sameValue(
-    new Intl.Locale('en-els', {language}).toString(),
-    expect,
-    `new Intl.Locale('en-els', {language: "${language}"}).toString() returns "${expect}"`
-  );
+  assert.throws(RangeError, () => new Intl.Locale('en-els', {language}));
+
+}
+
+const invalidLanguageOptions = [
+    'abcd',
+];
+for (const language of invalidLanguageOptions) {
+  assert.throws(RangeError, () => new Intl.Locale('en', {language}));
+  assert.throws(RangeError, () => new Intl.Locale('en-US', {language}));
+  assert.throws(RangeError, () => new Intl.Locale('en-els', {language}));
 }
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/Locale/constructor-parse-twice.js
+++ b/js/src/tests/test262/intl402/Locale/constructor-parse-twice.js
@@ -9,91 +9,53 @@ description: >
 info: |
   Intl.Locale( tag [, options] )
   12. Set tag to ? ApplyOptionsToTag(tag, options).
   14. Let calendar be ? GetOption(options, "calendar", "string", undefined, undefined).
   16. Set opt.[[ca]] to calendar.
   30. Let r be ! ApplyUnicodeExtensionToTag(tag, opt, relevantExtensionKeys).
 
   ApplyOptionsToTag( tag, options )
-  9. If tag matches neither the privateuse nor the grandfathered production, then
-  10. Return CanonicalizeLanguageTag(tag).
+  ...
+  2. If IsStructurallyValidLanguageTag(tag) is false, throw a RangeError exception.
+
+  IsStructurallyValidLanguageTag ( locale )
+
+  The IsStructurallyValidLanguageTag abstract operation verifies that the
+  locale argument (which must be a String value)
+
+  represents a well-formed Unicode BCP 47 Locale Identifier" as specified in
+  Unicode Technical Standard 35 section 3.2, or successor,
+
 features: [Intl.Locale]
 ---*/
 
 const testData = [
-  // Irregular grandfathered tags.
-
-  // "en-GB-oed" is a grandfathered tag, so we can't add "US". After it is
-  // canonicalized to "en-GB-oxendict" we can append "US" and "u-ca-gregory".
-  {
-    tag: "en-GB-oed",
-    options: {
-      region: "US",
-      calendar: "gregory",
-    },
-    canonical: "en-US-oxendict-u-ca-gregory",
-  },
-
-  // Canonicalized version of the above, which we can add "US" to right away.
+  // Canonicalized version of "en-GB-oed", which we can add "US" to right away.
   {
     tag: "en-GB-oxendict",
     options: {
       region: "US",
       calendar: "gregory",
     },
     canonical: "en-US-oxendict-u-ca-gregory",
   },
-
-  // Regular grandfathered tags.
-
-  // "no-bok" is a grandfathered, so "NO"/"SE" isn't added. After
-  // canonicalization we can append "NO"/"SE" and "u-ca-gregory".
-  {
-    tag: "no-bok",
-    options: {
-      region: "NO",
-      calendar: "gregory",
-    },
-    canonical: "nb-NO-u-ca-gregory",
-  },
-
-  {
-    tag: "no-bok",
-    options: {
-      region: "SE",
-      calendar: "gregory",
-    },
-    canonical: "nb-SE-u-ca-gregory",
-  },
-
-  // "no-bok-NO" isn't a grandfathered tag, so we can replace "NO" with "SE"
-  // and can also append "u-ca-gregory".
-  {
-    tag: "no-bok-NO",
-    options: {
-      region: "SE",
-      calendar: "gregory",
-    },
-    canonical: "no-bok-SE-u-ca-gregory",
-  },
-
-  // "no-bok-SE" isn't a grandfathered tag, so we can replace "SE" with "NO"
-  // and can also append "u-ca-gregory".
-  {
-    tag: "no-bok-SE",
-    options: {
-      region: "NO",
-      calendar: "gregory",
-    },
-    canonical: "no-bok-NO-u-ca-gregory",
-  },
 ];
 
 for (const {tag, options, canonical} of testData) {
   assert.sameValue(
     new Intl.Locale(tag, options).toString(),
     canonical,
     `new Intl.Locale("${tag}", ${options}).toString() returns "${canonical}"`
   );
 }
 
+assert.throws(RangeError, () =>
+    new Intl.Locale("no-bok", {region: "NO", calendar: "gregory"}));
+assert.throws(RangeError, () =>
+    new Intl.Locale("no-bok", {region: "SE", calendar: "gregory"}));
+assert.throws(RangeError, () =>
+    new Intl.Locale("no-bok-NO", {region: "SE", calendar: "gregory"}));
+assert.throws(RangeError, () =>
+    new Intl.Locale("no-bok-SE", {region: "NO", calendar: "gregory"}));
+
+
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/Locale/extensions-grandfathered.js
+++ b/js/src/tests/test262/intl402/Locale/extensions-grandfathered.js
@@ -3,67 +3,31 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-intl.locale
 description: >
     Verifies handling of options with grandfathered tags.
 info: |
     ApplyOptionsToTag( tag, options )
+    ...
+    2. If IsStructurallyValidLanguageTag(tag) is false, throw a RangeError exception.
 
-    ...
-    9. If tag matches neither the privateuse nor the grandfathered production, then
-    ...
-
-    ApplyUnicodeExtensionToTag( tag, options, relevantExtensionKeys )
+    IsStructurallyValidLanguageTag ( locale )
 
-    ...
-    2. If tag matches the privateuse or the grandfathered production, then
-        a. Let result be a new Record.
-        b. Repeat for each element key of relevantExtensionKeys in List order,
-            i. Set result.[[<key>]] to undefined.
-        c. Set result.[[locale]] to tag.
-        d. Return result.
-    ...
-    7. Repeat for each element key of relevantExtensionKeys in List order,
-        e. Let optionsValue be options.[[<key>]].
-        f. If optionsValue is not undefined, then
-            ii. Let value be optionsValue.
-            iv. Else,
-                1. Append the Record{[[Key]]: key, [[Value]]: value} to keywords.
-    ...
+    The IsStructurallyValidLanguageTag abstract operation verifies that the
+    locale argument (which must be a String value)
+
+    represents a well-formed Unicode BCP 47 Locale Identifier" as specified in
+    Unicode Technical Standard 35 section 3.2, or successor,
 
 features: [Intl.Locale]
 ---*/
 
 const testData = [
-    // Irregular grandfathered without modern replacement.
-    {
-        tag: "i-default",
-        options: {
-            language: "fr",
-            script: "Cyrl",
-            region: "DE",
-            numberingSystem: "latn",
-        },
-        canonical: "fr-Cyrl-DE-u-nu-latn",
-    },
-
-    // Irregular grandfathered with modern replacement.
-    {
-        tag: "en-gb-oed",
-        options: {
-            language: "fr",
-            script: "Cyrl",
-            region: "US",
-            numberingSystem: "latn",
-        },
-        canonical: "fr-Cyrl-US-oxendict-u-nu-latn",
-    },
-
     // Regular grandfathered without modern replacement.
     {
         tag: "cel-gaulish",
         options: {
             language: "fr",
             script: "Cyrl",
             region: "FR",
             numberingSystem: "latn",
@@ -88,9 +52,19 @@ for (const {tag, options, canonical} of 
     const loc = new Intl.Locale(tag, options);
     assert.sameValue(loc.toString(), canonical);
 
     for (const [name, value] of Object.entries(options)) {
         assert.sameValue(loc[name], value);
     }
 }
 
+assert.throws(RangeError, () =>
+    new Intl.Locale("i-default",
+      {language: "fr", script: "Cyrl", region: "DE", numberingSystem: "latn"}
+      ));
+
+assert.throws(RangeError, () =>
+    new Intl.Locale("en-gb-oed",
+      {language: "fr", script: "Cyrl", region: "US", numberingSystem: "latn"}
+      ));
+
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/Locale/getters-grandfathered.js
+++ b/js/src/tests/test262/intl402/Locale/getters-grandfathered.js
@@ -3,46 +3,40 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-intl.locale
 description: >
     Verifies getters with grandfathered tags.
 info: |
     get Intl.Locale.prototype.baseName
-    4. If locale does not match the langtag production, return locale.
     5. Return the substring of locale corresponding to the
        language ["-" script] ["-" region] *("-" variant)
-       subsequence of the langtag grammar.
+       subsequence of the  unicode_language_id grammar.
 
     get Intl.Locale.prototype.language
-    4. If locale matches the privateuse or the grandfathered production, return locale.
+    5. Return the substring of locale corresponding to the
+       unicode_language_subtag production.
 
     get Intl.Locale.prototype.script
-    4. If locale matches the privateuse or the grandfathered production, return undefined.
+    6. Return the substring of locale corresponding to the
+       unicode_script_subtag production.
 
     get Intl.Locale.prototype.region
-    4. If locale matches the privateuse or the grandfathered production, return undefined.
+    6. Return the substring of locale corresponding to the unicode_region_subtag
+       production.
 features: [Intl.Locale]
 ---*/
 
-// Irregular grandfathered language tag.
-var loc = new Intl.Locale("i-default");
-assert.sameValue(loc.baseName, "i-default"); // Step 4.
-assert.sameValue(loc.language, "i-default");
-assert.sameValue(loc.script, undefined);
-assert.sameValue(loc.region, undefined);
-
 // Regular grandfathered language tag.
 var loc = new Intl.Locale("cel-gaulish");
 assert.sameValue(loc.baseName, "cel-gaulish"); // Step 5.
 assert.sameValue(loc.language, "cel-gaulish");
 assert.sameValue(loc.script, undefined);
 assert.sameValue(loc.region, undefined);
 
 // Regular grandfathered language tag.
-var loc = new Intl.Locale("zh-min");
-assert.sameValue(loc.baseName, "zh-min"); // Step 5.
-assert.sameValue(loc.language, "zh-min");
-assert.sameValue(loc.script, undefined);
-assert.sameValue(loc.region, undefined);
+assert.throws(RangeError, () => new Intl.Locale("zh-min"));
+
+assert.throws(RangeError, () => new Intl.Locale("i-default"));
+
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/Locale/likely-subtags-grandfathered.js
+++ b/js/src/tests/test262/intl402/Locale/likely-subtags-grandfathered.js
@@ -3,156 +3,89 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-intl.locale
 description: >
     Verifies canonicalization, minimization and maximization of specific tags.
 info: |
     ApplyOptionsToTag( tag, options )
-    10. Return CanonicalizeLanguageTag(tag).
+
+    2. If IsStructurallyValidLanguageTag(tag) is false, throw a RangeError exception.
+
+    9. Set tag to CanonicalizeLanguageTag(tag).
+
+    CanonicalizeLanguageTag( tag )
+
+    The CanonicalizeLanguageTag abstract operation returns the canonical and
+    case-regularized form of the locale argument (which must be a String value
+    that is a structurally valid Unicode BCP 47 Locale Identifier as verified by
+    the IsStructurallyValidLanguageTag abstract operation).
+
+    IsStructurallyValidLanguageTag ( locale )
+
+    The IsStructurallyValidLanguageTag abstract operation verifies that the
+    locale argument (which must be a String value)
+
+    represents a well-formed Unicode BCP 47 Locale Identifier" as specified in
+    Unicode Technical Standard 35 section 3.2, or successor,
+
 
     Intl.Locale.prototype.maximize ()
     3. Let maximal be the result of the Add Likely Subtags algorithm applied to loc.[[Locale]].
 
     Intl.Locale.prototype.minimize ()
     3. Let minimal be the result of the Remove Likely Subtags algorithm applied to loc.[[Locale]].
 features: [Intl.Locale]
 ---*/
 
 const irregularGrandfathered = [
-    {
-        tag: "en-GB-oed",
-        canonical: "en-GB-oxendict",
-        maximized: "en-Latn-GB-oxendict",
-    },
-    {
-        tag: "i-ami",
-        canonical: "ami",
-    },
-    {
-        tag: "i-bnn",
-        canonical: "bnn",
-    },
-    {
-        tag: "i-default",
-        canonical: "i-default",
-    },
-    {
-        tag: "i-enochian",
-        canonical: "i-enochian",
-    },
-    {
-        tag: "i-hak",
-        canonical: "hak",
-        maximized: "hak-Hans-CN",
-    },
-    {
-        tag: "i-klingon",
-        canonical: "tlh",
-    },
-    {
-        tag: "i-lux",
-        canonical: "lb",
-        maximized: "lb-Latn-LU",
-    },
-    {
-        tag: "i-mingo",
-        canonical: "i-mingo",
-    },
-    {
-        tag: "i-navajo",
-        canonical: "nv",
-        maximized: "nv-Latn-US",
-    },
-    {
-        tag: "i-pwn",
-        canonical: "pwn",
-    },
-    {
-        tag: "i-tao",
-        canonical: "tao",
-    },
-    {
-        tag: "i-tay",
-        canonical: "tay",
-    },
-    {
-        tag: "i-tsu",
-        canonical: "tsu",
-    },
-    {
-        tag: "sgn-BE-FR",
-        canonical: "sfb",
-    },
-    {
-        tag: "sgn-BE-NL",
-        canonical: "vgt",
-    },
-    {
-        tag: "sgn-CH-DE",
-        canonical: "sgg",
-    },
+    "en-GB-oed",
+    "i-ami",
+    "i-bnn",
+    "i-default",
+    "i-enochian",
+    "i-hak",
+    "i-klingon",
+    "i-lux",
+    "i-mingo",
+    "i-navajo",
+    "i-pwn",
+    "i-tao",
+    "i-tay",
+    "i-tsu",
+    "sgn-BE-FR",
+    "sgn-BE-NL",
+    "sgn-CH-DE",
 ];
 
-for (const {tag, canonical, maximized = canonical, minimized = canonical} of irregularGrandfathered) {
-    assert.sameValue(Intl.getCanonicalLocales(tag)[0], canonical);
-
-    const loc = new Intl.Locale(tag);
-    assert.sameValue(loc.toString(), canonical);
-
-    assert.sameValue(loc.maximize().toString(), maximized);
-    assert.sameValue(loc.maximize().maximize().toString(), maximized);
-
-    assert.sameValue(loc.minimize().toString(), minimized);
-    assert.sameValue(loc.minimize().minimize().toString(), minimized);
-
-    assert.sameValue(loc.maximize().minimize().toString(), minimized);
-    assert.sameValue(loc.minimize().maximize().toString(), maximized);
+for (const tag of irregularGrandfathered) {
+    assert.throws(RangeError, () => new Intl.Locale(tag));
 }
 
 const regularGrandfathered = [
     {
         tag: "art-lojban",
         canonical: "jbo",
         maximized: "jbo-Latn-001",
     },
     {
         tag: "cel-gaulish",
         canonical: "cel-gaulish",
     },
     {
-        tag: "no-bok",
-        canonical: "nb",
-        maximized: "nb-Latn-NO",
-    },
-    {
-        tag: "no-nyn",
-        canonical: "nn",
-        maximized: "nn-Latn-NO",
-    },
-    {
         tag: "zh-guoyu",
         canonical: "cmn",
     },
     {
         tag: "zh-hakka",
         canonical: "hak",
         maximized: "hak-Hans-CN",
     },
     {
-        tag: "zh-min",
-        canonical: "zh-min",
-    },
-    {
-        tag: "zh-min-nan",
-        canonical: "nan",
-        maximized: "nan-Hans-CN",
-    },
-    {
         tag: "zh-xiang",
         canonical: "hsn",
         maximized: "hsn-Hans-CN",
     },
 ];
 
 for (const {tag, canonical, maximized = canonical, minimized = canonical} of regularGrandfathered) {
     assert.sameValue(Intl.getCanonicalLocales(tag)[0], canonical);
@@ -165,16 +98,27 @@ for (const {tag, canonical, maximized = 
 
     assert.sameValue(loc.minimize().toString(), minimized);
     assert.sameValue(loc.minimize().minimize().toString(), minimized);
 
     assert.sameValue(loc.maximize().minimize().toString(), minimized);
     assert.sameValue(loc.minimize().maximize().toString(), maximized);
 }
 
+const regularGrandfatheredWithExtLang = [
+    "no-bok",
+    "no-nyn",
+    "zh-min",
+    "zh-min-nan",
+];
+
+for (const tag of regularGrandfatheredWithExtLang) {
+    assert.throws(RangeError, () => new Intl.Locale(tag));
+}
+
 // Add constiants, extensions, and privateuse subtags to regular grandfathered
 // language tags and ensure it produces the "expected" result.
 const extras = [
     "fonipa",
     "a-not-assigned",
     "u-attr",
     "u-co",
     "u-co-phonebk",
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/language/expressions/arrow-function/params-duplicate.js
@@ -0,0 +1,34 @@
+// |reftest| error:SyntaxError
+// Copyright 2019 Mike Pennisi. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-arrow-function-definitions
+description: Formal parameters may not contain duplicates
+info: |
+  # 14.2 Arrow Function Definitions
+
+  When the production
+
+    ArrowParameters:CoverParenthesizedExpressionAndArrowParameterList
+
+  is recognized the following grammar is used to refine the interpretation
+  of CoverParenthesizedExpressionAndArrowParameterList:
+
+    ArrowFormalParameters[Yield, Await]:
+      (UniqueFormalParameters[?Yield, ?Await])
+
+  # 14.1.2 Static Semantics: Early Errors
+
+  UniqueFormalParameters:FormalParameters
+
+  - It is a Syntax Error if BoundNames of FormalParameters contains any
+    duplicate elements.
+negative:
+  phase: parse
+  type: SyntaxError
+---*/
+
+$DONOTEVALUATE();
+
+0, (a, a) => { };
deleted file mode 100644
--- a/js/src/tests/test262/language/expressions/async-arrow-function/early-errors-arrow-duplicate-parameters-strict.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// |reftest| error:SyntaxError
-'use strict';
-// Copyright 2016 Microsoft, Inc. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-author: Brian Terlson <brian.terlson@microsoft.com>
-esid: pending
-description: >
-  If strict mode, early error rules for StrictFormalParameters are applied
-negative:
-  phase: parse
-  type: SyntaxError
-flags: [onlyStrict]
----*/
-
-$DONOTEVALUATE();
-
-async(a, a) => { }
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/language/expressions/async-arrow-function/early-errors-arrow-duplicate-parameters.js
@@ -0,0 +1,35 @@
+// |reftest| error:SyntaxError
+// Copyright 2016 Microsoft, Inc. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Brian Terlson <brian.terlson@microsoft.com>
+esid: sec-async-arrow-function-definitions
+description: Formal parameters may not contain duplicates
+info: |
+  # 14.2 Arrow Function Definitions
+
+  When the production
+
+    ArrowParameters:CoverParenthesizedExpressionAndArrowParameterList
+
+  is recognized the following grammar is used to refine the interpretation
+  of CoverParenthesizedExpressionAndArrowParameterList:
+
+    ArrowFormalParameters[Yield, Await]:
+      (UniqueFormalParameters[?Yield, ?Await])
+
+  # 14.1.2 Static Semantics: Early Errors
+
+  UniqueFormalParameters:FormalParameters
+
+  - It is a Syntax Error if BoundNames of FormalParameters contains any
+    duplicate elements.
+negative:
+  phase: parse
+  type: SyntaxError
+---*/
+
+$DONOTEVALUATE();
+
+async(a, a) => { }
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/language/expressions/object/method-definition/early-errors-object-async-method-duplicate-parameters.js
@@ -0,0 +1,29 @@
+// |reftest| error:SyntaxError
+// Copyright 2016 Microsoft, Inc. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Brian Terlson <brian.terlson@microsoft.com>
+esid: sec-async-function-definitions
+description: Formal parameters may not contain duplicates
+info: |
+  # 14.7 Async Function Definitions
+
+   AsyncMethod[Yield, Await]:
+     async[no LineTerminator here]PropertyName[?Yield, ?Await](UniqueFormalParameters[~Yield, +Await]){AsyncFunctionBody}
+
+  # 14.1.2 Static Semantics: Early Errors
+
+  UniqueFormalParameters:FormalParameters
+
+  - It is a Syntax Error if BoundNames of FormalParameters contains any
+    duplicate elements.
+negative:
+  phase: parse
+  type: SyntaxError
+---*/
+
+$DONOTEVALUATE();
+({
+  async foo(a, a) { }
+})
--- a/js/src/tests/test262/language/expressions/object/method-definition/early-errors-object-method-duplicate-parameters.js
+++ b/js/src/tests/test262/language/expressions/object/method-definition/early-errors-object-method-duplicate-parameters.js
@@ -1,18 +1,28 @@
 // |reftest| error:SyntaxError
-// Copyright 2016 Microsoft, Inc. All rights reserved.
+// Copyright 2019 Mike Pennisi. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-author: Brian Terlson <brian.terlson@microsoft.com>
-esid: pending
-description: >
-  Early error rules for StrictFormalParameters are applied
+esid: sec-method-definitions
+description: Formal parameters may not contain duplicates
+info: |
+  # 14.3 Method Definitions
+
+  MethodDefinition[Yield, Await]:
+    PropertyName[?Yield, ?Await](UniqueFormalParameters[~Yield, ~Await]){FunctionBody[~Yield, ~Await]}
+
+  # 14.1.2 Static Semantics: Early Errors
+
+  UniqueFormalParameters:FormalParameters
+
+  - It is a Syntax Error if BoundNames of FormalParameters contains any
+    duplicate elements.
 negative:
   phase: parse
   type: SyntaxError
 ---*/
 
 $DONOTEVALUATE();
 ({
-  async foo(a, a) { }
+  foo(a, a) { }
 })
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/language/statements/class/definition/early-errors-class-async-method-duplicate-parameters.js
@@ -0,0 +1,30 @@
+// |reftest| error:SyntaxError
+// Copyright 2016 Microsoft, Inc. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Brian Terlson <brian.terlson@microsoft.com>
+esid: sec-async-function-definitions
+description: Formal parameters may not contain duplicates
+info: |
+  # 14.7 Arrow Function Definitions
+
+  AsyncMethod[Yield, Await]:
+    async[no LineTerminator here]PropertyName[?Yield, ?Await](UniqueFormalParameters[~Yield, +Await]){AsyncFunctionBody}
+
+  # 14.1.2 Static Semantics: Early Errors
+
+  UniqueFormalParameters:FormalParameters
+
+  - It is a Syntax Error if BoundNames of FormalParameters contains any
+    duplicate elements.
+negative:
+  phase: parse
+  type: SyntaxError
+---*/
+
+$DONOTEVALUATE();
+
+class Foo {
+  async foo(a, a) { }
+}
--- a/js/src/tests/test262/language/statements/class/definition/early-errors-class-method-duplicate-parameters.js
+++ b/js/src/tests/test262/language/statements/class/definition/early-errors-class-method-duplicate-parameters.js
@@ -1,19 +1,29 @@
 // |reftest| error:SyntaxError
-// Copyright 2016 Microsoft, Inc. All rights reserved.
+// Copyright 2019 Mike Pennisi. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-author: Brian Terlson <brian.terlson@microsoft.com>
-esid: pending
-description: >
-  Early error rules for StrictFormalParameters are applied
+esid: sec-method-definitions
+description: Formal parameters may not contain duplicates
+info: |
+  # 14.3 Method Definitions
+
+  MethodDefinition[Yield, Await]:
+    PropertyName[?Yield, ?Await](UniqueFormalParameters[~Yield, ~Await]){FunctionBody[~Yield, ~Await]}
+
+  # 14.1.2 Static Semantics: Early Errors
+
+  UniqueFormalParameters:FormalParameters
+
+  - It is a Syntax Error if BoundNames of FormalParameters contains any
+    duplicate elements.
 negative:
   phase: parse
   type: SyntaxError
 ---*/
 
 $DONOTEVALUATE();
 
 class Foo {
-  async foo(a, a) { }
+  foo(a, a) { }
 }