From aa642b3486d2ac7ff50b31e2d0e9640e4723847d Mon Sep 17 00:00:00 2001 From: Flavio Percoco Date: Tue, 13 Jan 2015 20:21:19 +0100 Subject: [PATCH] addressed comments --- src/librustc/middle/traits/select.rs | 11 ++-------- src/librustc/middle/ty.rs | 17 +++----------- src/librustc_typeck/coherence/overlap.rs | 8 +------ ...herence-conflicting-negative-trait-impl.rs | 15 ++++++++++--- src/test/compile-fail/coherence-orphan.rs | 6 +++++ src/test/compile-fail/marker-no-send.rs | 22 ------------------- src/test/compile-fail/marker-no-share.rs | 22 ------------------- .../compile-fail/traits-negative-impls.rs | 22 ++++++++++++++++++- 8 files changed, 45 insertions(+), 78 deletions(-) delete mode 100644 src/test/compile-fail/marker-no-send.rs delete mode 100644 src/test/compile-fail/marker-no-share.rs diff --git a/src/librustc/middle/traits/select.rs b/src/librustc/middle/traits/select.rs index 2e2d64e5636..62649653a69 100644 --- a/src/librustc/middle/traits/select.rs +++ b/src/librustc/middle/traits/select.rs @@ -2231,17 +2231,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { fn all_impls(&self, trait_def_id: ast::DefId) -> Vec { ty::populate_implementations_for_trait_if_necessary(self.tcx(), trait_def_id); - let mut trait_impls = match self.tcx().trait_impls.borrow().get(&trait_def_id) { + match self.tcx().trait_impls.borrow().get(&trait_def_id) { None => Vec::new(), Some(impls) => impls.borrow().clone() - }; - - match self.tcx().trait_negative_impls.borrow().get(&trait_def_id) { - None => {}, - Some(impls) => trait_impls.push_all(impls.borrow().as_slice()), - }; - - trait_impls + } } fn impl_obligations(&mut self, diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index fdd4b975caa..c72fbc74565 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -750,9 +750,6 @@ pub struct ctxt<'tcx> { /// Maps a trait onto a list of impls of that trait. pub trait_impls: RefCell>>>>, - /// Maps a trait onto a list of negative impls of that trait. - pub trait_negative_impls: RefCell>>>>, - /// Maps a DefId of a type to a list of its inherent impls. /// Contains implementations of methods that are inherent to a type. /// Methods in these implementations don't need to be exported. @@ -1894,7 +1891,7 @@ pub type PolyTypeOutlivesPredicate<'tcx> = PolyOutlivesPredicate, ty::R /// normal trait predicate (`T : TraitRef<...>`) and one of these /// predicates. Form #2 is a broader form in that it also permits /// equality between arbitrary types. Processing an instance of Form -/// \#2 eventually yields one of these `ProjectionPredicate` +/// #2 eventually yields one of these `ProjectionPredicate` /// instances to normalize the LHS. #[derive(Clone, PartialEq, Eq, Hash, Show)] pub struct ProjectionPredicate<'tcx> { @@ -2415,7 +2412,6 @@ pub fn mk_ctxt<'tcx>(s: Session, destructor_for_type: RefCell::new(DefIdMap::new()), destructors: RefCell::new(DefIdSet::new()), trait_impls: RefCell::new(DefIdMap::new()), - trait_negative_impls: RefCell::new(DefIdMap::new()), inherent_impls: RefCell::new(DefIdMap::new()), impl_items: RefCell::new(DefIdMap::new()), used_unsafe: RefCell::new(NodeSet::new()), @@ -6006,14 +6002,7 @@ pub fn record_trait_implementation(tcx: &ctxt, trait_def_id: DefId, impl_def_id: DefId) { - let trait_impls = match trait_impl_polarity(tcx, impl_def_id) { - Some(ast::ImplPolarity::Positive) => &tcx.trait_impls, - Some(ast::ImplPolarity::Negative) => &tcx.trait_negative_impls, - _ => tcx.sess.bug(&format!("tried to record a non-impl item with id {:?}", - impl_def_id)[]) - }; - - match trait_impls.borrow().get(&trait_def_id) { + match tcx.trait_impls.borrow().get(&trait_def_id) { Some(impls_for_trait) => { impls_for_trait.borrow_mut().push(impl_def_id); return; @@ -6021,7 +6010,7 @@ pub fn record_trait_implementation(tcx: &ctxt, None => {} } - trait_impls.borrow_mut().insert(trait_def_id, Rc::new(RefCell::new(vec!(impl_def_id)))); + tcx.trait_impls.borrow_mut().insert(trait_def_id, Rc::new(RefCell::new(vec!(impl_def_id)))); } /// Populates the type context with all the implementations for the given type diff --git a/src/librustc_typeck/coherence/overlap.rs b/src/librustc_typeck/coherence/overlap.rs index 97cb3c1213f..159b9d853c4 100644 --- a/src/librustc_typeck/coherence/overlap.rs +++ b/src/librustc_typeck/coherence/overlap.rs @@ -39,13 +39,7 @@ impl<'cx, 'tcx> OverlapChecker<'cx, 'tcx> { // check can populate this table further with impls from other // crates. let trait_def_ids: Vec<(ast::DefId, Vec)> = - self.tcx.trait_impls.borrow().iter().map(|(&k, v)| { - let mut impls = v.borrow().clone(); - if let Some(neg_impls) = self.tcx.trait_negative_impls.borrow().get(&k) { - impls.push_all(neg_impls.borrow().as_slice()); - } - (k, impls) - }).collect(); + self.tcx.trait_impls.borrow().iter().map(|(&k, v)| (k, v.borrow().clone())).collect(); for &(trait_def_id, ref impls) in trait_def_ids.iter() { self.check_for_overlapping_impls_of_trait(trait_def_id, impls); diff --git a/src/test/compile-fail/coherence-conflicting-negative-trait-impl.rs b/src/test/compile-fail/coherence-conflicting-negative-trait-impl.rs index 36c75465910..c9dfb8201a9 100644 --- a/src/test/compile-fail/coherence-conflicting-negative-trait-impl.rs +++ b/src/test/compile-fail/coherence-conflicting-negative-trait-impl.rs @@ -10,11 +10,20 @@ #![feature(optin_builtin_traits)] -struct TestType; +trait MyTrait {} -unsafe impl Send for TestType {} +struct TestType; + +unsafe impl Send for TestType {} +//~^ ERROR conflicting implementations for trait `core::marker::Send` +//~^^ ERROR conflicting implementations for trait `core::marker::Send` + +impl !Send for TestType {} //~^ ERROR conflicting implementations for trait `core::marker::Send` -impl !Send for TestType {} +unsafe impl Send for TestType {} +//~^ ERROR error: conflicting implementations for trait `core::marker::Send` + +impl !Send for TestType {} fn main() {} diff --git a/src/test/compile-fail/coherence-orphan.rs b/src/test/compile-fail/coherence-orphan.rs index 0bd0224b246..f9f965e1ae3 100644 --- a/src/test/compile-fail/coherence-orphan.rs +++ b/src/test/compile-fail/coherence-orphan.rs @@ -8,8 +8,11 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// ignore-tidy-linelength // aux-build:coherence-orphan-lib.rs +#![feature(optin_builtin_traits)] + extern crate "coherence-orphan-lib" as lib; use lib::TheTrait; @@ -22,4 +25,7 @@ impl TheTrait for isize { } //~ ERROR E0117 impl TheTrait for TheType { } +impl !Send for Vec { } //~ ERROR E0117 +//~^ ERROR conflicting + fn main() { } diff --git a/src/test/compile-fail/marker-no-send.rs b/src/test/compile-fail/marker-no-send.rs deleted file mode 100644 index cd253b2f9e5..00000000000 --- a/src/test/compile-fail/marker-no-send.rs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2013 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. - -// ignore-stage1 -// ignore-stage2 -// ignore-stage3 - -use std::marker; - -fn foo(p: P) { } - -fn main() -{ - foo(marker::NoSend); //~ ERROR the trait `core::marker::Send` is not implemented -} diff --git a/src/test/compile-fail/marker-no-share.rs b/src/test/compile-fail/marker-no-share.rs deleted file mode 100644 index d86b6a0a674..00000000000 --- a/src/test/compile-fail/marker-no-share.rs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2013 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. - -// ignore-stage1 -// ignore-stage2 -// ignore-stage3 - -use std::marker; - -fn foo(p: P) { } - -fn main() -{ - foo(marker::NoSync); //~ ERROR the trait `core::marker::Sync` is not implemented -} diff --git a/src/test/compile-fail/traits-negative-impls.rs b/src/test/compile-fail/traits-negative-impls.rs index a7d1d796801..3ef760053c7 100644 --- a/src/test/compile-fail/traits-negative-impls.rs +++ b/src/test/compile-fail/traits-negative-impls.rs @@ -8,6 +8,11 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// The dummy functions are used to avoid adding new cfail files. +// What happens is that the compiler attempts to squash duplicates and some +// errors are not reported. This way, we make sure that, for each function, different +// typeck phases are involved and all errors are reported. + #![feature(optin_builtin_traits)] use std::marker::Send; @@ -24,13 +29,28 @@ unsafe impl Sync for Outer2 {} fn is_send(_: T) {} fn is_sync(_: T) {} -fn main() { +fn dummy() { Outer(TestType); //~^ ERROR the trait `core::marker::Send` is not implemented for the type `TestType` is_send(TestType); //~^ ERROR the trait `core::marker::Send` is not implemented for the type `TestType` + is_send((8, TestType)); + //~^ ERROR the trait `core::marker::Send` is not implemented for the type `TestType` +} + +fn dummy2() { + is_send(Box::new(TestType)); + //~^ ERROR the trait `core::marker::Send` is not implemented for the type `TestType` +} + +fn dummy3() { + is_send(Box::new(Outer2(TestType))); + //~^ ERROR the trait `core::marker::Send` is not implemented for the type `TestType` +} + +fn main() { // This will complain about a missing Send impl because `Sync` is implement *just* // for T that are `Send`. Look at #20366 and #19950 is_sync(Outer2(TestType));