diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/rustc/middle/ty.rs | 10 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-2718-a.rs | 12 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs index fa93925fa88..3a9d320c77e 100644 --- a/src/rustc/middle/ty.rs +++ b/src/rustc/middle/ty.rs @@ -1218,7 +1218,6 @@ fn type_needs_drop(cx: ctxt, ty: t) -> bool { accum } } - ty_tup(elts) { for elts.each {|m| if type_needs_drop(cx, m) { accum = true; } } accum @@ -1720,6 +1719,7 @@ fn is_instantiable(cx: ctxt, r_ty: t) -> bool { fn type_structurally_contains(cx: ctxt, ty: t, test: fn(sty) -> bool) -> bool { let sty = get(ty).struct; + #debug("type_structurally_contains: %s", ty_to_str(cx, ty)); if test(sty) { ret true; } alt sty { ty_enum(did, substs) { @@ -1737,6 +1737,14 @@ fn type_structurally_contains(cx: ctxt, ty: t, test: fn(sty) -> bool) -> } ret false; } + ty_class(did, substs) { + for lookup_class_fields(cx, did).each {|field| + let ft = lookup_field_type(cx, did, field.id, substs); + if type_structurally_contains(cx, ft, test) { ret true; } + } + ret false; + } + ty_tup(ts) { for ts.each {|tt| if type_structurally_contains(cx, tt, test) { ret true; } diff --git a/src/test/compile-fail/issue-2718-a.rs b/src/test/compile-fail/issue-2718-a.rs new file mode 100644 index 00000000000..1eb8d4a1b69 --- /dev/null +++ b/src/test/compile-fail/issue-2718-a.rs @@ -0,0 +1,12 @@ +class send_packet<T: copy> { + let p: T; + new(p: T) { self.p = p; } +} + + +mod pingpong { + type ping = send_packet<pong>; + enum pong = send_packet<ping>; //! ERROR illegal recursive enum type; wrap the inner value in a box to make it representable +} + +fn main() {} |
