From d174d917e291debb904d16641c7840e5539a1cc9 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 22 Sep 2011 15:28:49 -0700 Subject: [PATCH] Calculate the correct kind for unique boxes Issue #409 --- src/comp/middle/ty.rs | 6 +-- src/test/compile-fail/unique-unique-kind.rs | 9 ++++ src/test/run-pass/unique-kinds.rs | 59 +++++++++++++++++++++ 3 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 src/test/compile-fail/unique-unique-kind.rs create mode 100644 src/test/run-pass/unique-kinds.rs diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs index 7f80a439d84a..ab836a22e015 100644 --- a/src/comp/middle/ty.rs +++ b/src/comp/middle/ty.rs @@ -1019,13 +1019,9 @@ fn type_kind(cx: ctxt, ty: t) -> ast::kind { ty_box(mt) { result = ast::kind_shared; } - ty_uniq(mt) { - // FIXME (409): Calculate kind - result = ast::kind_unique; - } // Pointers and unique boxes / vecs raise pinned to shared, // otherwise pass through their pointee kind. - ty_ptr(tm) | ty_vec(tm) { + ty_ptr(tm) | ty_vec(tm) | ty_uniq(tm) { let k = type_kind(cx, tm.ty); if k == ast::kind_pinned { k = ast::kind_shared; } result = kind::lower_kind(result, k); diff --git a/src/test/compile-fail/unique-unique-kind.rs b/src/test/compile-fail/unique-unique-kind.rs new file mode 100644 index 000000000000..b40cf0770c08 --- /dev/null +++ b/src/test/compile-fail/unique-unique-kind.rs @@ -0,0 +1,9 @@ +// error-pattern: needed unique type + +fn f<~T>(i: T) { +} + +fn main() { + let i = ~@100; + f(i); +} \ No newline at end of file diff --git a/src/test/run-pass/unique-kinds.rs b/src/test/run-pass/unique-kinds.rs new file mode 100644 index 000000000000..2b3f79899a9e --- /dev/null +++ b/src/test/run-pass/unique-kinds.rs @@ -0,0 +1,59 @@ +fn unique() { + + fn f<~T>(i: T, j: T) { + assert i == j; + } + + fn g<~T>(i: T, j: T) { + assert i != j; + } + + let i = ~100; + let j = ~100; + f(i, j); + let i = ~100; + let j = ~101; + g(i, j); +} + +fn shared() { + + fn f<@T>(i: T, j: T) { + assert i == j; + } + + fn g<@T>(i: T, j: T) { + assert i != j; + } + + let i = ~100; + let j = ~100; + f(i, j); + let i = ~100; + let j = ~101; + g(i, j); +} + +fn pinned() { + + fn f(i: T, j: T) { + assert i == j; + } + + fn g(i: T, j: T) { + assert i != j; + } + + let i = ~100; + let j = ~100; + f(i, j); + let i = ~100; + let j = ~101; + g(i, j); +} + +fn main() { + unique(); + shared(); + pinned(); +} \ No newline at end of file