about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/comp/middle/trans_common.rs5
-rw-r--r--src/comp/middle/ty.rs6
-rw-r--r--src/comp/syntax/util/interner.rs12
3 files changed, 12 insertions, 11 deletions
diff --git a/src/comp/middle/trans_common.rs b/src/comp/middle/trans_common.rs
index b0c64b1d474..80bab14170d 100644
--- a/src/comp/middle/trans_common.rs
+++ b/src/comp/middle/trans_common.rs
@@ -833,10 +833,7 @@ pure fn type_has_static_size(cx: @crate_ctxt, t: ty::t) -> bool {
 }
 
 pure fn non_ty_var(cx: @crate_ctxt, t: ty::t) -> bool {
-    // Not obviously referentially transparent, but
-    // type interner shouldn't be changing at this point.
-    // FIXME: how to make that clearer?
-    let st = unchecked { ty::struct(cx.tcx, t) };
+    let st = ty::struct(cx.tcx, t);
     alt st {
       ty::ty_var(_) { false }
       _          { true }
diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs
index a91f7946c7d..1f3b58c00ce 100644
--- a/src/comp/middle/ty.rs
+++ b/src/comp/middle/ty.rs
@@ -841,7 +841,7 @@ fn sequence_element_type(cx: ctxt, ty: t) -> t {
 }
 
 pure fn type_is_tup_like(cx: ctxt, ty: t) -> bool {
-    let sty = unchecked { struct(cx, ty) };
+    let sty = struct(cx, ty);
     alt sty {
       ty_box(_) | ty_rec(_) | ty_tup(_) | ty_tag(_,_) { true }
       _ { false }
@@ -1624,9 +1624,7 @@ fn ty_fn_abi(cx: ctxt, fty: t) -> ast::native_abi {
 }
 
 pure fn ty_fn_ret(cx: ctxt, fty: t) -> t {
-    // Should be pure, as type interner contents
-    // shouldn't change once set...
-    let sty = unchecked { struct(cx, fty) };
+    let sty = struct(cx, fty);
     alt sty {
       ty::ty_fn(_, _, r, _, _) { ret r; }
       ty::ty_native_fn(_, _, r) { ret r; }
diff --git a/src/comp/syntax/util/interner.rs b/src/comp/syntax/util/interner.rs
index 164b38fe870..67324491267 100644
--- a/src/comp/syntax/util/interner.rs
+++ b/src/comp/syntax/util/interner.rs
@@ -28,7 +28,13 @@ fn intern<@T>(itr: interner<T>, val: T) -> uint {
     }
 }
 
-pure fn get<@T>(itr: interner<T>, idx: uint) -> T { ret itr.vect[idx]; }
-
-pure fn len<T>(itr: interner<T>) -> uint { ret vec::len(itr.vect); }
+// |get| isn't "pure" in the traditional sense, because it can go from
+// failing to returning a value as items are interned. But for typestate,
+// where we first check a pred and then rely on it, ceasing to fail is ok.
+pure fn get<@T>(itr: interner<T>, idx: uint) -> T {
+    unchecked {
+        itr.vect[idx]
+    }
+}
 
+fn len<T>(itr: interner<T>) -> uint { ret vec::len(itr.vect); }