/src/test/run-pass/block-expr-precedence.rs
http://github.com/jruderman/rust · Rust · 56 lines · 8 code · 5 blank · 43 comment · 9 complexity · f2d0c6bd3b5cb58d69c6e50bb71ed7a3 MD5 · raw file
- // This test has some extra semis in it that the pretty-printer won't
- // reproduce so we don't want to automatically reformat it
- // no-reformat
- /*
- *
- * When you write a block-expression thing followed by
- * a lone unary operator, you can get a surprising parse:
- *
- * if (...) { ... }
- * -num;
- *
- * for example, or:
- *
- * if (...) { ... }
- * *box;
- *
- * These will parse as subtraction and multiplication binops.
- * To get them to parse "the way you want" you need to brace
- * the leading unops:
- * if (...) { ... }
- * {-num};
- *
- * or alternatively, semi-separate them:
- *
- * if (...) { ... };
- * -num;
- *
- * This seems a little wonky, but the alternative is to lower
- * precedence of such block-like exprs to the point where
- * you have to parenthesize them to get them to occur in the
- * RHS of a binop. For example, you'd have to write:
- *
- * 12 + (if (foo) { 13 } else { 14 });
- *
- * rather than:
- *
- * 12 + if (foo) { 13 } else { 14 };
- *
- * Since we want to maintain the ability to write the latter,
- * we leave the parens-burden on the trailing unop case.
- *
- */
- fn main() {
- let num = 12;
- assert if (true) { 12 } else { 12 } - num == 0;
- assert 12 - if (true) { 12 } else { 12 } == 0;
- if (true) { 12; } {-num};
- if (true) { 12; }; {-num};
- if (true) { 12; };;; -num;
- }