Skip to content

Commit 15cef37

Browse files
committed
Get rid of the >>> operator and make >> logical or arithmetic depending on the signedness. Closes #2417.
1 parent 8d7f3bd commit 15cef37

File tree

14 files changed

+49
-79
lines changed

14 files changed

+49
-79
lines changed

src/librustsyntax/ast.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,8 @@ enum binop {
201201
bitxor,
202202
bitand,
203203
bitor,
204-
lsl,
205-
lsr,
206-
asr,
204+
shl,
205+
shr,
207206
eq,
208207
lt,
209208
le,

src/librustsyntax/ast_util.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,8 @@ fn binop_to_str(op: binop) -> str {
7272
bitxor { ret "^"; }
7373
bitand { ret "&"; }
7474
bitor { ret "|"; }
75-
lsl { ret "<<"; }
76-
lsr { ret ">>"; }
77-
asr { ret ">>>"; }
75+
shl { ret "<<"; }
76+
shr { ret ">>"; }
7877
eq { ret "=="; }
7978
lt { ret "<"; }
8079
le { ret "<="; }
@@ -90,9 +89,8 @@ pure fn lazy_binop(b: binop) -> bool {
9089
9190
pure fn is_shift_binop(b: binop) -> bool {
9291
alt b {
93-
lsl { true }
94-
lsr { true }
95-
asr { true }
92+
shl { true }
93+
shr { true }
9694
_ { false }
9795
}
9896
}
@@ -353,7 +351,7 @@ fn operator_prec(op: ast::binop) -> uint {
353351
mul | div | rem { 12u }
354352
// 'as' sits between here with 11
355353
add | subtract { 10u }
356-
lsl | lsr | asr { 9u }
354+
shl | shr { 9u }
357355
bitand { 8u }
358356
bitxor { 7u }
359357
bitor { 6u }

src/librustsyntax/parse/common.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,8 @@ fn check_restricted_keywords_(p: parser, w: ast::ident) {
114114
fn expect_gt(p: parser) {
115115
if p.token == token::GT {
116116
p.bump();
117-
} else if p.token == token::BINOP(token::LSR) {
117+
} else if p.token == token::BINOP(token::SHR) {
118118
p.swap(token::GT, p.span.lo + 1u, p.span.hi);
119-
} else if p.token == token::BINOP(token::ASR) {
120-
p.swap(token::BINOP(token::LSR), p.span.lo + 1u, p.span.hi);
121119
} else {
122120
let mut s: str = "expecting ";
123121
s += token_to_str(p.reader, token::GT);
@@ -132,8 +130,7 @@ fn parse_seq_to_before_gt<T: copy>(sep: option<token::token>,
132130
p: parser) -> [T] {
133131
let mut first = true;
134132
let mut v = [];
135-
while p.token != token::GT && p.token != token::BINOP(token::LSR) &&
136-
p.token != token::BINOP(token::ASR) {
133+
while p.token != token::GT && p.token != token::BINOP(token::SHR) {
137134
alt sep {
138135
some(t) { if first { first = false; } else { expect(p, t); } }
139136
_ { }

src/librustsyntax/parse/lexer.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ fn next_token_inner(rdr: reader) -> token::token {
392392
rdr.bump();
393393
alt rdr.curr {
394394
'=' { rdr.bump(); ret token::LE; }
395-
'<' { ret binop(rdr, token::LSL); }
395+
'<' { ret binop(rdr, token::SHL); }
396396
'-' {
397397
rdr.bump();
398398
alt rdr.curr {
@@ -407,12 +407,7 @@ fn next_token_inner(rdr: reader) -> token::token {
407407
rdr.bump();
408408
alt rdr.curr {
409409
'=' { rdr.bump(); ret token::GE; }
410-
'>' {
411-
if rdr.next() == '>' {
412-
rdr.bump();
413-
ret binop(rdr, token::ASR);
414-
} else { ret binop(rdr, token::LSR); }
415-
}
410+
'>' { ret binop(rdr, token::SHR); }
416411
_ { ret token::GT; }
417412
}
418413
}

src/librustsyntax/parse/parser.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,9 +1119,8 @@ fn parse_assign_expr(p: parser) -> @expr {
11191119
token::CARET { aop = bitxor; }
11201120
token::AND { aop = bitand; }
11211121
token::OR { aop = bitor; }
1122-
token::LSL { aop = lsl; }
1123-
token::LSR { aop = lsr; }
1124-
token::ASR { aop = asr; }
1122+
token::SHL { aop = shl; }
1123+
token::SHR { aop = shr; }
11251124
}
11261125
p.get_id(); // see ast_util::op_expr_callee_id
11271126
ret mk_expr(p, lo, rhs.span.hi, expr_assign_op(aop, lhs, rhs));

src/librustsyntax/parse/prec.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,8 @@ fn token_to_binop(tok: token) -> option<ast::binop> {
2525
// 'as' sits between here with 11
2626
BINOP(PLUS) { some(add) }
2727
BINOP(MINUS) { some(subtract) }
28-
BINOP(LSL) { some(lsl) }
29-
BINOP(LSR) { some(lsr) }
30-
BINOP(ASR) { some(asr) }
28+
BINOP(SHL) { some(shl) }
29+
BINOP(SHR) { some(shr) }
3130
BINOP(AND) { some(bitand) }
3231
BINOP(CARET) { some(bitxor) }
3332
BINOP(OR) { some(bitor) }

src/librustsyntax/parse/token.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ enum binop {
1414
CARET,
1515
AND,
1616
OR,
17-
LSL,
18-
LSR,
19-
ASR,
17+
SHL,
18+
SHR,
2019
}
2120

2221
enum token {
@@ -78,9 +77,8 @@ fn binop_to_str(o: binop) -> str {
7877
CARET { ret "^"; }
7978
AND { ret "&"; }
8079
OR { ret "|"; }
81-
LSL { ret "<<"; }
82-
LSR { ret ">>"; }
83-
ASR { ret ">>>"; }
80+
SHL { ret "<<"; }
81+
SHR { ret ">>"; }
8482
}
8583
}
8684

src/rustc/middle/const_eval.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ fn eval_const_expr(tcx: middle::ty::ctxt, e: @expr) -> const_val {
4444
mul { const_int(a * b) } div { const_int(a / b) }
4545
rem { const_int(a % b) } and | bitand { const_int(a & b) }
4646
or | bitor { const_int(a | b) } bitxor { const_int(a ^ b) }
47-
lsl { const_int(a << b) } lsr { const_int(a >> b) }
48-
asr { const_int(a >>> b) }
47+
shl { const_int(a << b) } shr { const_int(a >> b) }
4948
eq { fromb(a == b) } lt { fromb(a < b) }
5049
le { fromb(a <= b) } ne { fromb(a != b) }
5150
ge { fromb(a >= b) } gt { fromb(a > b) }
@@ -58,9 +57,7 @@ fn eval_const_expr(tcx: middle::ty::ctxt, e: @expr) -> const_val {
5857
mul { const_uint(a * b) } div { const_uint(a / b) }
5958
rem { const_uint(a % b) } and | bitand { const_uint(a & b) }
6059
or | bitor { const_uint(a | b) } bitxor { const_uint(a ^ b) }
61-
lsl { const_int((a << b) as i64) }
62-
lsr { const_int((a >> b) as i64) }
63-
asr { const_int((a >>> b) as i64) }
60+
shl { const_uint(a << b) } shr { const_uint(a >> b) }
6461
eq { fromb(a == b) } lt { fromb(a < b) }
6562
le { fromb(a <= b) } ne { fromb(a != b) }
6663
ge { fromb(a >= b) } gt { fromb(a > b) }

src/rustc/middle/trans/base.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1617,9 +1617,12 @@ fn trans_eager_binop(cx: block, op: ast::binop, lhs: ValueRef,
16171617
ast::bitor { Or(cx, lhs, rhs) }
16181618
ast::bitand { And(cx, lhs, rhs) }
16191619
ast::bitxor { Xor(cx, lhs, rhs) }
1620-
ast::lsl { Shl(cx, lhs, rhs) }
1621-
ast::lsr { LShr(cx, lhs, rhs) }
1622-
ast::asr { AShr(cx, lhs, rhs) }
1620+
ast::shl { Shl(cx, lhs, rhs) }
1621+
ast::shr {
1622+
if ty::type_is_signed(intype) {
1623+
AShr(cx, lhs, rhs)
1624+
} else { LShr(cx, lhs, rhs) }
1625+
}
16231626
_ {
16241627
let cmpr = trans_compare(cx, op, lhs, lhs_t, rhs, rhs_t);
16251628
cx = cmpr.bcx;
@@ -4565,9 +4568,11 @@ fn trans_const_expr(cx: @crate_ctxt, e: @ast::expr) -> ValueRef {
45654568
ast::bitxor { llvm::LLVMConstXor(te1, te2) }
45664569
ast::bitand { llvm::LLVMConstAnd(te1, te2) }
45674570
ast::bitor { llvm::LLVMConstOr(te1, te2) }
4568-
ast::lsl { llvm::LLVMConstShl(te1, te2) }
4569-
ast::lsr { llvm::LLVMConstLShr(te1, te2) }
4570-
ast::asr { llvm::LLVMConstAShr(te1, te2) }
4571+
ast::shl { llvm::LLVMConstShl(te1, te2) }
4572+
ast::shr {
4573+
if signed { llvm::LLVMConstAShr(te1, te2) }
4574+
else { llvm::LLVMConstLShr(te1, te2) }
4575+
}
45714576
ast::eq |
45724577
ast::lt |
45734578
ast::le |

src/rustc/middle/ty.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2704,9 +2704,8 @@ fn is_binopable(_cx: ctxt, ty: t, op: ast::binop) -> bool {
27042704
ast::bitxor { opcat_bit }
27052705
ast::bitand { opcat_bit }
27062706
ast::bitor { opcat_bit }
2707-
ast::lsl { opcat_shift }
2708-
ast::lsr { opcat_shift }
2709-
ast::asr { opcat_shift }
2707+
ast::shl { opcat_shift }
2708+
ast::shr { opcat_shift }
27102709
ast::eq { opcat_eq }
27112710
ast::ne { opcat_eq }
27122711
ast::lt { opcat_rel }

src/rustc/middle/typeck/check.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -867,8 +867,8 @@ fn check_expr_with_unifier(fcx: @fn_ctxt,
867867
fn binop_method(op: ast::binop) -> option<str> {
868868
alt op {
869869
ast::add | ast::subtract | ast::mul | ast::div | ast::rem |
870-
ast::bitxor | ast::bitand | ast::bitor | ast::lsl | ast::lsr |
871-
ast::asr { some(ast_util::binop_to_str(op)) }
870+
ast::bitxor | ast::bitand | ast::bitor | ast::shl | ast::shr
871+
{ some(ast_util::binop_to_str(op)) }
872872
_ { none }
873873
}
874874
}

src/test/run-pass/binops.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ fn test_char() {
4747
assert (ch10 / ch4 == ch2);
4848
assert (ch10 % ch4 == ch2);
4949
assert (ch10 >> ch2 == ch2);
50-
assert (ch10 >>> ch2 == ch2);
5150
assert (ch10 << ch4 == 160 as char);
5251
assert (ch10 | ch4 == 14 as char);
5352
assert (ch10 & ch2 == ch2);

src/test/run-pass/bitwise.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
#[cfg(target_arch = "x86")]
44
fn target() {
5-
assert (-1000 >> 3 == 536870787);
5+
assert (-1000 as uint >> 3u == 536870787u);
66
}
77

88
#[cfg(target_arch = "x86_64")]
99
fn target() {
10-
assert (-1000 >> 3 == 2305843009213693827);
10+
assert (-1000 as uint >> 3u == 2305843009213693827u);
1111
}
1212

1313
fn general() {
@@ -24,7 +24,7 @@ fn general() {
2424
assert (0xf0 | 0xf == 0xff);
2525
assert (0xf << 4 == 0xf0);
2626
assert (0xf0 >> 4 == 0xf);
27-
assert (-16 >>> 2 == -4);
27+
assert (-16 >> 2 == -4);
2828
assert (0b1010_1010 | 0b0101_0101 == 0xff);
2929
}
3030

src/test/run-pass/shift.rs

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,71 +16,56 @@ fn test_expr() {
1616
let v4 = 4 as u8;
1717
let v2 = 2 as u8;
1818
assert (v10 >> v2 == v2 as uint);
19-
assert (v10 >>> v2 == v2 as uint);
2019
assert (v10 << v4 == 160 as uint);
2120

2221
let v10 = 10 as u8;
2322
let v4 = 4 as uint;
2423
let v2 = 2 as uint;
2524
assert (v10 >> v2 == v2 as u8);
26-
assert (v10 >>> v2 == v2 as u8);
2725
assert (v10 << v4 == 160 as u8);
2826

2927
let v10 = 10 as int;
3028
let v4 = 4 as i8;
3129
let v2 = 2 as i8;
3230
assert (v10 >> v2 == v2 as int);
33-
assert (v10 >>> v2 == v2 as int);
3431
assert (v10 << v4 == 160 as int);
3532

3633
let v10 = 10 as i8;
3734
let v4 = 4 as int;
3835
let v2 = 2 as int;
3936
assert (v10 >> v2 == v2 as i8);
40-
assert (v10 >>> v2 == v2 as i8);
4137
assert (v10 << v4 == 160 as i8);
4238

4339
let v10 = 10 as uint;
4440
let v4 = 4 as int;
4541
let v2 = 2 as int;
4642
assert (v10 >> v2 == v2 as uint);
47-
assert (v10 >>> v2 == v2 as uint);
4843
assert (v10 << v4 == 160 as uint);
4944
}
5045

5146
fn test_const() {
5247
const r1_1: uint = 10u >> 2u8;
53-
const r2_1: uint = 10u >>> 2u8;
54-
const r3_1: uint = 10u << 4u8;
48+
const r2_1: uint = 10u << 4u8;
5549
assert r1_1 == 2 as uint;
56-
assert r2_1 == 2 as uint;
57-
assert r3_1 == 160 as uint;
50+
assert r2_1 == 160 as uint;
5851

5952
const r1_2: u8 = 10u8 >> 2u;
60-
const r2_2: u8 = 10u8 >>> 2u;
61-
const r3_2: u8 = 10u8 << 4u;
53+
const r2_2: u8 = 10u8 << 4u;
6254
assert r1_2 == 2 as u8;
63-
assert r2_2 == 2 as u8;
64-
assert r3_2 == 160 as u8;
55+
assert r2_2 == 160 as u8;
6556

6657
const r1_3: int = 10 >> 2i8;
67-
const r2_3: int = 10 >>> 2i8;
68-
const r3_3: int = 10 << 4i8;
58+
const r2_3: int = 10 << 4i8;
6959
assert r1_3 == 2 as int;
70-
assert r2_3 == 2 as int;
71-
assert r3_3 == 160 as int;
60+
assert r2_3 == 160 as int;
7261

7362
const r1_4: i8 = 10i8 >> 2;
74-
const r2_4: i8 = 10i8 >>> 2;
75-
const r3_4: i8 = 10i8 << 4;
63+
const r2_4: i8 = 10i8 << 4;
7664
assert r1_4 == 2 as i8;
77-
assert r2_4 == 2 as i8;
78-
assert r3_4 == 160 as i8;
65+
assert r2_4 == 160 as i8;
7966

8067
const r1_5: uint = 10u >> 2i8;
81-
const r2_5: uint = 10u >>> 2i8;
82-
const r3_5: uint = 10u << 4i8;
68+
const r2_5: uint = 10u << 4i8;
8369
assert r1_5 == 2 as uint;
84-
assert r2_5 == 2 as uint;
85-
assert r3_5 == 160 as uint;
70+
assert r2_5 == 160 as uint;
8671
}

0 commit comments

Comments
 (0)