about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2012-10-15 17:18:45 -0700
committerTim Chevalier <chevalier@alum.wellesley.edu>2012-10-15 17:46:09 -0700
commitb38092e9a2b5965ab8b8e73580e4d39ed701330a (patch)
tree483e5380eb4ab35f7463d5dea1e2a29ffcfe6bd1
parentbbc46d527d70ac0bcab6c2b0763f059efc27a142 (diff)
downloadrust-b38092e9a2b5965ab8b8e73580e4d39ed701330a.tar.gz
rust-b38092e9a2b5965ab8b8e73580e4d39ed701330a.zip
In ty::normalize_ty, don't replace self_regions with None
Instead, replace with re_static. This was causing ty::subst to
fail when called from trans::type_of::type_of.

Already discussed with nmatsakis and it's a small change, so
no review.

Closes #3447
-rw-r--r--src/rustc/middle/ty.rs14
-rw-r--r--src/test/run-pass/issue-3447.rs5
2 files changed, 12 insertions, 7 deletions
diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs
index 84510c7161e..90527e88bc8 100644
--- a/src/rustc/middle/ty.rs
+++ b/src/rustc/middle/ty.rs
@@ -1473,7 +1473,10 @@ fn subst(cx: ctxt,
             fold_regions_and_ty(
                 cx, typ,
                 |r| match r {
-                    re_bound(br_self) => substs.self_r.get(),
+                    re_bound(br_self) => substs.self_r.expect(
+                        #fmt("ty::subst: \
+                      Reference to self region when given substs with no \
+                      self region, ty = %s", ty_to_str(cx, typ))),
                     _ => r
                 },
                 |t| do_subst(cx, substs, t),
@@ -3910,9 +3913,11 @@ fn normalize_ty(cx: ctxt, t: t) -> t {
         ty_enum(did, r) =>
             match r.self_r {
                 Some(_) =>
-                    // This enum has a self region. Get rid of it
+                    // Use re_static since trans doesn't care about regions
                     mk_enum(cx, did,
-                            {self_r: None, self_ty: None, tps: r.tps}),
+                     {self_r: Some(ty::re_static),
+                      self_ty: None,
+                      tps: r.tps}),
                 None =>
                     t
             },
@@ -3921,7 +3926,8 @@ fn normalize_ty(cx: ctxt, t: t) -> t {
             match r.self_r {
               Some(_) =>
                 // Ditto.
-                mk_class(cx, did, {self_r: None, self_ty: None, tps: r.tps}),
+                mk_class(cx, did, {self_r: Some(ty::re_static), self_ty: None,
+                                   tps: r.tps}),
               None =>
                 t
             },
diff --git a/src/test/run-pass/issue-3447.rs b/src/test/run-pass/issue-3447.rs
index fab92ea6dca..7302163a312 100644
--- a/src/test/run-pass/issue-3447.rs
+++ b/src/test/run-pass/issue-3447.rs
@@ -1,4 +1,3 @@
-// xfail-test
 struct list<T> {
     element: &self/T,
     mut next: Option<@list<T>>
@@ -11,13 +10,13 @@ impl<T> list<T>{
             next: option::None
         };
 
-        self.next = Some(@newList);
+        self.next = Some(@(move newList));
     }
 }
 
 fn main() {
     let s = @"str";
-    let ls: list<@str> = list {
+    let ls = list {
         element: &s,
         next: option::None
     };