Skip to content

Commit b38092e

Browse files
committed
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
1 parent bbc46d5 commit b38092e

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed

src/rustc/middle/ty.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -1473,7 +1473,10 @@ fn subst(cx: ctxt,
14731473
fold_regions_and_ty(
14741474
cx, typ,
14751475
|r| match r {
1476-
re_bound(br_self) => substs.self_r.get(),
1476+
re_bound(br_self) => substs.self_r.expect(
1477+
#fmt("ty::subst: \
1478+
Reference to self region when given substs with no \
1479+
self region, ty = %s", ty_to_str(cx, typ))),
14771480
_ => r
14781481
},
14791482
|t| do_subst(cx, substs, t),
@@ -3910,9 +3913,11 @@ fn normalize_ty(cx: ctxt, t: t) -> t {
39103913
ty_enum(did, r) =>
39113914
match r.self_r {
39123915
Some(_) =>
3913-
// This enum has a self region. Get rid of it
3916+
// Use re_static since trans doesn't care about regions
39143917
mk_enum(cx, did,
3915-
{self_r: None, self_ty: None, tps: r.tps}),
3918+
{self_r: Some(ty::re_static),
3919+
self_ty: None,
3920+
tps: r.tps}),
39163921
None =>
39173922
t
39183923
},
@@ -3921,7 +3926,8 @@ fn normalize_ty(cx: ctxt, t: t) -> t {
39213926
match r.self_r {
39223927
Some(_) =>
39233928
// Ditto.
3924-
mk_class(cx, did, {self_r: None, self_ty: None, tps: r.tps}),
3929+
mk_class(cx, did, {self_r: Some(ty::re_static), self_ty: None,
3930+
tps: r.tps}),
39253931
None =>
39263932
t
39273933
},

src/test/run-pass/issue-3447.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// xfail-test
21
struct list<T> {
32
element: &self/T,
43
mut next: Option<@list<T>>
@@ -11,13 +10,13 @@ impl<T> list<T>{
1110
next: option::None
1211
};
1312

14-
self.next = Some(@newList);
13+
self.next = Some(@(move newList));
1514
}
1615
}
1716

1817
fn main() {
1918
let s = @"str";
20-
let ls: list<@str> = list {
19+
let ls = list {
2120
element: &s,
2221
next: option::None
2322
};

0 commit comments

Comments
 (0)