blob: 166f42cbc495e75b7f89affc0923006f643a2248 [file] [log] [blame]
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/// @assertion Unary expressions invoke unary operators on objects.
/// unaryExpression:
/// prefixOperator unaryExpression |
/// awaitExpression |
/// postfixExpression |
/// (minusOperator | tildeOperator) super |
/// incrementOperator assignableExpression
/// ;
/// prefixOperator:
/// minusOperator |
/// negationOperator |
/// tildeOperator
/// ;
/// minusOperator:
/// ‘-’ |
/// ;
/// negationOperator:
/// ‘!’ |
/// ;
/// tildeOperator:
/// ‘˜’
/// ;
/// A unary expression is either a postfix expression, an await expression or
/// an invocation of a prefix operator on an expression or an invocation of a
/// unary operator on either super or an expression e.
/// @description Checks that expressions with a prefix operator which fit into
/// this production don't cause compile-time errors.
/// @author msyabro
class S {
var x = 1;
operator -() {return -x;}
operator [](var ind) {return x;}
operator []=(var ind, var val) {x = val;}
}
class A extends S {
test() {
//prefixOperator postfixExpression
-x--;
~x--;
//combination of prefix and increment operator
try {- --x;} catch (e) {}
try {~--x;} catch (e) {}
try {-++x;} catch (e) {}
try {~++x;} catch (e) {}
//prefixOperator postfixExpression>primary>identifier
-x;
~x;
~~x;
//prefix operators with literals
try {-1;} catch (e) {}
try {~2;} catch (e) {}
try {-this;} catch (e) {}
!!false;
!!!true;
!!!!false;
!!!!!!true;
//prefix operators with various expressions
try {~(1 + 2);} catch (e) {}
// super with selector
try {-super[0];} catch (ok) {}
try {~super.x;} catch (ok) {}
try {!super[0];} catch (ok) {}
}
}
main() {
A a = new A();
a.test();
}