rollup merge of #23211: FlaPer87/oibit-send-and-friends

Fixes #23225

r? @nikomatsakis
This commit is contained in:
Alex Crichton
2015-03-23 15:07:21 -07:00
6 changed files with 79 additions and 48 deletions

View File

@@ -39,6 +39,8 @@ pub unsafe trait Send : MarkerTrait {
// empty. // empty.
} }
unsafe impl Send for .. { }
impl<T> !Send for *const T { } impl<T> !Send for *const T { }
impl<T> !Send for *mut T { } impl<T> !Send for *mut T { }
impl !Send for Managed { } impl !Send for Managed { }
@@ -203,6 +205,8 @@ pub unsafe trait Sync : MarkerTrait {
// Empty // Empty
} }
unsafe impl Sync for .. { }
impl<T> !Sync for *const T { } impl<T> !Sync for *const T { }
impl<T> !Sync for *mut T { } impl<T> !Sync for *mut T { }
impl !Sync for Managed { } impl !Sync for Managed { }

View File

@@ -5989,10 +5989,7 @@ pub fn item_variances(tcx: &ctxt, item_id: ast::DefId) -> Rc<ItemVariances> {
pub fn trait_has_default_impl(tcx: &ctxt, trait_def_id: DefId) -> bool { pub fn trait_has_default_impl(tcx: &ctxt, trait_def_id: DefId) -> bool {
populate_implementations_for_trait_if_necessary(tcx, trait_def_id); populate_implementations_for_trait_if_necessary(tcx, trait_def_id);
match tcx.lang_items.to_builtin_kind(trait_def_id) { tcx.traits_with_default_impls.borrow().contains_key(&trait_def_id)
Some(BoundSend) | Some(BoundSync) => true,
_ => tcx.traits_with_default_impls.borrow().contains_key(&trait_def_id),
}
} }
/// Records a trait-to-implementation mapping. /// Records a trait-to-implementation mapping.

View File

@@ -27,10 +27,10 @@ struct UnsafetyChecker<'cx, 'tcx:'cx> {
tcx: &'cx ty::ctxt<'tcx> tcx: &'cx ty::ctxt<'tcx>
} }
impl<'cx, 'tcx,'v> visit::Visitor<'v> for UnsafetyChecker<'cx, 'tcx> { impl<'cx, 'tcx, 'v> UnsafetyChecker<'cx, 'tcx> {
fn visit_item(&mut self, item: &'v ast::Item) { fn check_unsafety_coherence(&mut self, item: &'v ast::Item,
match item.node { unsafety: ast::Unsafety,
ast::ItemImpl(unsafety, polarity, _, _, _, _) => { polarity: ast::ImplPolarity) {
match ty::impl_trait_ref(self.tcx, ast_util::local_def(item.id)) { match ty::impl_trait_ref(self.tcx, ast_util::local_def(item.id)) {
None => { None => {
// Inherent impl. // Inherent impl.
@@ -76,6 +76,17 @@ impl<'cx, 'tcx,'v> visit::Visitor<'v> for UnsafetyChecker<'cx, 'tcx> {
} }
} }
} }
}
impl<'cx, 'tcx,'v> visit::Visitor<'v> for UnsafetyChecker<'cx, 'tcx> {
fn visit_item(&mut self, item: &'v ast::Item) {
match item.node {
ast::ItemDefaultImpl(unsafety, _) => {
self.check_unsafety_coherence(item, unsafety, ast::ImplPolarity::Positive);
}
ast::ItemImpl(unsafety, polarity, _, _, _, _) => {
self.check_unsafety_coherence(item, unsafety, polarity);
}
_ => { } _ => { }
} }

View File

@@ -563,6 +563,13 @@ impl<'a, 'v> Visitor<'v> for PostExpansionVisitor<'a> {
} }
} }
ast::ItemDefaultImpl(..) => {
self.gate_feature("optin_builtin_traits",
i.span,
"default trait implementations are experimental \
and possibly buggy");
}
ast::ItemImpl(_, polarity, _, _, _, _) => { ast::ItemImpl(_, polarity, _, _, _, _) => {
match polarity { match polarity {
ast::ImplPolarity::Negative => { ast::ImplPolarity::Negative => {

View File

@@ -21,4 +21,14 @@ impl MyTrait for .. {}
impl MyTrait for .. {} impl MyTrait for .. {}
//~^ ERROR conflicting implementations for trait `MyTrait` //~^ ERROR conflicting implementations for trait `MyTrait`
trait MySafeTrait: MarkerTrait {}
unsafe impl MySafeTrait for .. {}
//~^ ERROR implementing the trait `MySafeTrait` is not unsafe
unsafe trait MyUnsafeTrait: MarkerTrait {}
impl MyUnsafeTrait for .. {}
//~^ ERROR the trait `MyUnsafeTrait` requires an `unsafe impl` declaration
fn main() {} fn main() {}

View File

@@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![feature(optin_builtin_traits)]
pub mod bar { pub mod bar {
use std::marker; use std::marker;