aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-08-05 10:04:11 -0700
committerGraydon Hoare <[email protected]>2010-08-05 10:04:11 -0700
commit29987b56e1dafff4a850eef4e668a364340fc59b (patch)
tree6b760dd4406b6bb0087f040626f1b0e37a542f82
parentAdd to std._io some formatter/type-specific-writer mechanism. Make a few typ... (diff)
downloadrust-29987b56e1dafff4a850eef4e668a364340fc59b.tar.xz
rust-29987b56e1dafff4a850eef4e668a364340fc59b.zip
Move 'as' precedence up to just above relational; support indexing str and vec by all integral types. Closes #94.
-rw-r--r--src/Makefile1
-rw-r--r--src/boot/be/x86.ml19
-rw-r--r--src/boot/fe/pexp.ml50
-rw-r--r--src/boot/me/trans.ml3
-rw-r--r--src/boot/me/type.ml9
-rw-r--r--src/test/run-pass/integral-indexing.rs22
6 files changed, 67 insertions, 37 deletions
diff --git a/src/Makefile b/src/Makefile
index 7236e02f..0476240c 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -464,6 +464,7 @@ TEST_XFAILS_LLVM := $(TASK_XFAILS) \
i8-incr.rs \
import.rs \
inner-module.rs \
+ integral-indexing.rs \
iter-range.rs \
iter-ret.rs \
large-records.rs \
diff --git a/src/boot/be/x86.ml b/src/boot/be/x86.ml
index 217149c7..2ec34890 100644
--- a/src/boot/be/x86.ml
+++ b/src/boot/be/x86.ml
@@ -1936,15 +1936,20 @@ let zero (dst:Il.cell) (count:Il.operand) : Asm.frag =
;;
let mov (signed:bool) (dst:Il.cell) (src:Il.operand) : Asm.frag =
- if is_ty8 (Il.cell_scalar_ty dst) || is_ty8 (Il.operand_scalar_ty src)
+ if is_ty8 (Il.cell_scalar_ty dst)
then
begin
- (match dst with
- Il.Reg (Il.Hreg r, _)
- -> assert (is_ok_r8 r) | _ -> ());
- (match src with
- Il.Cell (Il.Reg (Il.Hreg r, _))
- -> assert (is_ok_r8 r) | _ -> ());
+ match dst with
+ Il.Reg (Il.Hreg r, _) -> assert (is_ok_r8 r)
+ | _ -> ()
+ end;
+
+ if is_ty8 (Il.operand_scalar_ty src)
+ then
+ begin
+ match src with
+ Il.Cell (Il.Reg (Il.Hreg r, _)) -> assert (is_ok_r8 r)
+ | _ -> ()
end;
match (signed, dst, src) with
diff --git a/src/boot/fe/pexp.ml b/src/boot/fe/pexp.ml
index fb2d91a0..3e17e0e4 100644
--- a/src/boot/fe/pexp.ml
+++ b/src/boot/fe/pexp.ml
@@ -817,11 +817,33 @@ and parse_or_pexp (ps:pstate) : pexp =
step lhs
+and parse_as_pexp (ps:pstate) : pexp =
+ let apos = lexpos ps in
+ let pexp = ctxt "as pexp" parse_or_pexp ps in
+ let rec step accum =
+ match peek ps with
+ AS ->
+ bump ps;
+ let tapos = lexpos ps in
+ let t = parse_ty ps in
+ let bpos = lexpos ps in
+ let t = span ps tapos bpos t in
+ let node =
+ span ps apos bpos
+ (PEXP_unop ((Ast.UNOP_cast t), accum))
+ in
+ step node
+
+ | _ -> accum
+ in
+ step pexp
+
+
and parse_relational_pexp (ps:pstate) : pexp =
let name = "relational pexp" in
let apos = lexpos ps in
- let lhs = ctxt (name ^ " lhs") parse_or_pexp ps in
- let build = binop_build ps name apos parse_or_pexp in
+ let lhs = ctxt (name ^ " lhs") parse_as_pexp ps in
+ let build = binop_build ps name apos parse_as_pexp in
let rec step accum =
match peek ps with
LT -> build accum step Ast.BINOP_lt
@@ -883,30 +905,8 @@ and parse_oror_pexp (ps:pstate) : pexp =
step lhs
-and parse_as_pexp (ps:pstate) : pexp =
- let apos = lexpos ps in
- let pexp = ctxt "as pexp" parse_oror_pexp ps in
- let rec step accum =
- match peek ps with
- AS ->
- bump ps;
- let tapos = lexpos ps in
- let t = parse_ty ps in
- let bpos = lexpos ps in
- let t = span ps tapos bpos t in
- let node =
- span ps apos bpos
- (PEXP_unop ((Ast.UNOP_cast t), accum))
- in
- step node
-
- | _ -> accum
- in
- step pexp
-
-
and parse_pexp (ps:pstate) : pexp =
- parse_as_pexp ps
+ parse_oror_pexp ps
and parse_mutable_and_pexp (ps:pstate) : (Ast.mutability * pexp) =
let mutability = parse_mutability ps in
diff --git a/src/boot/me/trans.ml b/src/boot/me/trans.ml
index f2bb2287..f54a5d65 100644
--- a/src/boot/me/trans.ml
+++ b/src/boot/me/trans.ml
@@ -914,7 +914,8 @@ let trans_visitor
let atop = trans_atom at in
let unit_sz = ty_sz_in_current_frame ty in
let idx = next_vreg_cell word_sty in
- emit (Il.binary Il.UMUL idx atop unit_sz);
+ mov idx atop;
+ emit (Il.binary Il.UMUL idx (Il.Cell idx) unit_sz);
let elt_mem = trans_bounds_check (deref cell) (Il.Cell idx) in
(Il.Mem (elt_mem, referent_type abi ty), ty)
in
diff --git a/src/boot/me/type.ml b/src/boot/me/type.ml
index 787855f0..23210ea1 100644
--- a/src/boot/me/type.ml
+++ b/src/boot/me/type.ml
@@ -380,19 +380,20 @@ let check_stmt (cx:Semant.ctxt) : (fn_ctx -> Ast.stmt -> unit) =
sprintf_itype ()
| `Type (Ast.TY_vec ty_vec), Ast.COMP_atom atom ->
- demand Ast.TY_int (check_atom atom);
+ demand_integer (check_atom atom);
LTYPE_mono ty_vec
| `Type (Ast.TY_vec _), _ ->
- Common.err None "the vector type '%a' must be indexed via an int"
+ Common.err None
+ "the vector type '%a' must be indexed by an integral type"
sprintf_itype ()
| `Type Ast.TY_str, Ast.COMP_atom atom ->
- demand Ast.TY_int (check_atom atom);
+ demand_integer (check_atom atom);
LTYPE_mono (Ast.TY_mach Common.TY_u8)
| `Type Ast.TY_str, _ ->
- Common.err None "strings must be indexed via an int"
+ Common.err None "strings must be indexed by an integral type"
| `Type (Ast.TY_box ty_box), Ast.COMP_deref -> LTYPE_mono ty_box
diff --git a/src/test/run-pass/integral-indexing.rs b/src/test/run-pass/integral-indexing.rs
new file mode 100644
index 00000000..fe7d147c
--- /dev/null
+++ b/src/test/run-pass/integral-indexing.rs
@@ -0,0 +1,22 @@
+// This is a testcase for issue #94.
+
+fn main() {
+
+ let vec[int] v = vec(0, 1, 2, 3, 4, 5);
+ let str s = "abcdef";
+ check (v.(3u) == 3);
+ check (v.(3u8) == 3);
+ check (v.(3i8) == 3);
+ check (v.(3u32) == 3);
+ check (v.(3i32) == 3);
+
+ log v.(3u8);
+
+ check (s.(3u) == 'd' as u8);
+ check (s.(3u8) == 'd' as u8);
+ check (s.(3i8) == 'd' as u8);
+ check (s.(3u32) == 'd' as u8);
+ check (s.(3i32) == 'd' as u8);
+
+ log s.(3u8);
+} \ No newline at end of file