// Copyright (C) 2019 Alexey Shvayka. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: prod-UnaryExpression
description: >
  While increments and decrements are restricted to use with NewTarget,
  other unary operators should not throw SyntaxError.
info: |
  UnaryExpression[Yield, Await]:
    UpdateExpression[?Yield, ?Await]:
      LeftHandSideExpression[?Yield, ?Await]:
        NewExpression[?Yield, ?Await]:
          MemberExpression[Yield, Await]:
            MetaProperty:
              NewTarget
features: [new.target, async-functions]
flags: [async]
---*/

(function() { assert.sameValue(delete (new.target), true); })();
(function() { assert.sameValue(void new.target, undefined); })();
new function() { assert.sameValue(typeof new.target, 'function'); };
new function() { assert.sameValue(+(new.target), NaN); };
(function() { assert.sameValue(-(new.target), NaN); })();
new function() { assert.sameValue(~new.target, -1); };
(function() { assert.sameValue(!new.target, true); })();
new function() { assert.sameValue(delete void typeof +-~!(new.target), true); };

(async function() {
  assert.sameValue(await new.target, undefined);
})().then($DONE, $DONE);
