From 038aa0e8e958a78f01f7a322e2465fd4488fa021 Mon Sep 17 00:00:00 2001 From: Flavio Percoco Date: Mon, 12 Jan 2015 10:59:22 +0100 Subject: [PATCH] Allow negative impls just for Send and Sync --- src/librustc_typeck/check/wf.rs | 12 +++++++++++ .../typeck-negative-impls-builtin.rs | 20 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 src/test/compile-fail/typeck-negative-impls-builtin.rs diff --git a/src/librustc_typeck/check/wf.rs b/src/librustc_typeck/check/wf.rs index baa4850ce4a..e6390212c60 100644 --- a/src/librustc_typeck/check/wf.rs +++ b/src/librustc_typeck/check/wf.rs @@ -76,6 +76,18 @@ impl<'ccx, 'tcx> CheckTypeWellFormedVisitor<'ccx, 'tcx> { ast::ItemImpl(_, ast::ImplPolarity::Positive, _, _, _, _) => { self.check_impl(item); } + ast::ItemImpl(_, ast::ImplPolarity::Negative, _, Some(ref tref), _, _) => { + let trait_ref = ty::node_id_to_trait_ref(ccx.tcx, tref.ref_id); + match ccx.tcx.lang_items.to_builtin_kind(trait_ref.def_id) { + Some(ty::BoundSend) | Some(ty::BoundSync) => {} + Some(_) | None => { + ccx.tcx.sess.span_err( + item.span, + format!("negative impls are currently \ + allowed just for `Send` and `Sync`").as_slice()) + } + } + } ast::ItemFn(..) => { self.check_item_type(item); } diff --git a/src/test/compile-fail/typeck-negative-impls-builtin.rs b/src/test/compile-fail/typeck-negative-impls-builtin.rs new file mode 100644 index 00000000000..9da79b11cf0 --- /dev/null +++ b/src/test/compile-fail/typeck-negative-impls-builtin.rs @@ -0,0 +1,20 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(optin_builtin_traits)] + +struct TestType; + +trait TestTrait {} + +impl !TestTrait for TestType {} +//~^ ERROR negative impls are currently allowed just for `Send` and `Sync` + +fn main() {}