diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs index 878c58f2402..5fced36e408 100644 --- a/src/rustc/middle/ty.rs +++ b/src/rustc/middle/ty.rs @@ -1526,7 +1526,10 @@ fn type_kind(cx: ctxt, ty: t) -> kind { } lowest } - ty_res(did, inner, tps) { kind_send_only() } + ty_res(did, inner, tps) { + let inner = subst(cx, tps, inner); + (kind_const() & type_kind(cx, inner)) | kind_send_only() + } ty_param(_, did) { // FIXME: type params shouldn't be implicitly copyable (#2449) let k = param_bounds_to_kind(cx.ty_param_bounds.get(did.node)); diff --git a/src/test/compile-fail/non-const.rs b/src/test/compile-fail/non-const.rs index 193fdb4a16b..320bc1d25f8 100644 --- a/src/test/compile-fail/non-const.rs +++ b/src/test/compile-fail/non-const.rs @@ -3,6 +3,7 @@ fn foo(_x: T) { } resource r(_x: int) {} +resource r2(_x: @mut int) {} fn main() { foo({f: 3}); @@ -13,7 +14,8 @@ fn main() { foo(~mut 1); //! ERROR missing `const` foo(@1); foo(@mut 1); //! ERROR missing `const` - foo(r(1)); //! ERROR missing `const` + foo(r(1)); // this is okay now. + foo(r2(@mut 1)); //! ERROR missing `const` foo("123"); foo({f: {mut f: 1}}); //! ERROR missing `const` }