// Ensure array or object literals with trailing property accessors are not
// treated as nested destructuring patterns in assignment destructuring
// contexts.

// Array destructuring with normal element.
[{a: 0}.x] = [];
[[0].x] = [];

// Array destructuring with spread element.
[...{a: 0}.x] = [];
[...[0].x] = [];

// Object destructuring with normal property.
({a: {b: 0}.x} = {});
({a: [0].x} = {});

// Object destructuring with spread property.
({...{b: 0}.x} = {});
({...[0].x} = {});

// Object literal with initializer shorthand in destructuring context.
assertThrowsInstanceOf(() => Function(`[{a = 0}.x] = [];`), SyntaxError);
assertThrowsInstanceOf(() => Function(`[...{a = 0}.x] = [];`), SyntaxError);
assertThrowsInstanceOf(() => Function(`({a: {b = 0}.x} = {});`), SyntaxError);
assertThrowsInstanceOf(() => Function(`({...{b = 0}.x} = {});`), SyntaxError);

// Object destructuring with "eval" or "arguments" shorthand in strict mode.
(function() {
    "use strict";

    // Ensure "eval" resp. "arguments" is not treated as an assignment.
    [{eval}.x] = [];
    [...{eval}.x] = [];
    ({a: {eval}.x} = {});
    ({...{eval}.x} = {});

    [{arguments}.x] = [];
    [...{arguments}.x] = [];
    ({a: {arguments}.x} = {});
    ({...{arguments}.x} = {});
})();

if (typeof reportCompare === "function")
    reportCompare(0, 0);
