| // 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(); |
| } |