Skip to content

Rollup of 5 pull requests #32001

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Mar 2, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions src/libcollectionstest/str.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1508,6 +1508,19 @@ generate_iterator_test! {
with str::rsplitn;
}

#[test]
fn different_str_pattern_forwarding_lifetimes() {
use std::str::pattern::Pattern;

fn foo<'a, P>(p: P) where for<'b> &'b P: Pattern<'a> {
for _ in 0..3 {
"asdf".find(&p);
}
}

foo::<&str>("x");
}

mod bench {
use test::{Bencher, black_box};

Expand Down
6 changes: 6 additions & 0 deletions src/libcore/cell.rs
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,9 @@ impl<T:Copy> Cell<T> {
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<T> Send for Cell<T> where T: Send {}

#[stable(feature = "rust1", since = "1.0.0")]
impl<T> !Sync for Cell<T> {}

#[stable(feature = "rust1", since = "1.0.0")]
impl<T:Copy> Clone for Cell<T> {
#[inline]
Expand Down Expand Up @@ -461,6 +464,9 @@ impl<T: ?Sized> RefCell<T> {
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<T: ?Sized> Send for RefCell<T> where T: Send {}

#[stable(feature = "rust1", since = "1.0.0")]
impl<T: ?Sized> !Sync for RefCell<T> {}

#[stable(feature = "rust1", since = "1.0.0")]
impl<T: Clone> Clone for RefCell<T> {
#[inline]
Expand Down
8 changes: 4 additions & 4 deletions src/libcore/slice.rs
Original file line number Diff line number Diff line change
Expand Up @@ -285,12 +285,12 @@ impl<T> SliceExt for [T] {

#[inline]
unsafe fn get_unchecked(&self, index: usize) -> &T {
&*(self.repr().data.offset(index as isize))
&*(self.as_ptr().offset(index as isize))
}

#[inline]
fn as_ptr(&self) -> *const T {
self.repr().data
self as *const [T] as *const T
}

fn binary_search_by<F>(&self, mut f: F) -> Result<usize, usize> where
Expand Down Expand Up @@ -448,12 +448,12 @@ impl<T> SliceExt for [T] {

#[inline]
unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
&mut *(self.repr().data as *mut T).offset(index as isize)
&mut *self.as_mut_ptr().offset(index as isize)
}

#[inline]
fn as_mut_ptr(&mut self) -> *mut T {
self.repr().data as *mut T
self as *mut [T] as *mut T
}

#[inline]
Expand Down
2 changes: 1 addition & 1 deletion src/libcore/str/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1894,7 +1894,7 @@ impl StrExt for str {

#[inline]
fn as_ptr(&self) -> *const u8 {
self.repr().data
self as *const str as *const u8
}

#[inline]
Expand Down
2 changes: 1 addition & 1 deletion src/libcore/str/pattern.rs
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,7 @@ impl<'a, F> Pattern<'a> for F where F: FnMut(char) -> bool {
/////////////////////////////////////////////////////////////////////////////

/// Delegates to the `&str` impl.
impl<'a, 'b> Pattern<'a> for &'b &'b str {
impl<'a, 'b, 'c> Pattern<'a> for &'c &'b str {
pattern_methods!(StrSearcher<'a, 'b>, |&s| s, |s| s);
}

Expand Down
85 changes: 15 additions & 70 deletions src/librustc_privacy/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1129,43 +1129,19 @@ impl<'a, 'tcx, 'v> Visitor<'v> for PrivacyVisitor<'a, 'tcx> {

struct SanePrivacyVisitor<'a, 'tcx: 'a> {
tcx: &'a ty::ctxt<'tcx>,
in_block: bool,
}

impl<'a, 'tcx, 'v> Visitor<'v> for SanePrivacyVisitor<'a, 'tcx> {
/// We want to visit items in the context of their containing
/// module and so forth, so supply a crate for doing a deep walk.
fn visit_nested_item(&mut self, item: hir::ItemId) {
self.visit_item(self.tcx.map.expect_item(item.id))
}

fn visit_item(&mut self, item: &hir::Item) {
self.check_sane_privacy(item);
if self.in_block {
self.check_all_inherited(item);
}

let orig_in_block = self.in_block;

// Modules turn privacy back on, otherwise we inherit
self.in_block = if let hir::ItemMod(..) = item.node { false } else { orig_in_block };

intravisit::walk_item(self, item);
self.in_block = orig_in_block;
}

fn visit_block(&mut self, b: &'v hir::Block) {
let orig_in_block = replace(&mut self.in_block, true);
intravisit::walk_block(self, b);
self.in_block = orig_in_block;
}
}

impl<'a, 'tcx> SanePrivacyVisitor<'a, 'tcx> {
/// Validates all of the visibility qualifiers placed on the item given. This
/// ensures that there are no extraneous qualifiers that don't actually do
/// anything. In theory these qualifiers wouldn't parse, but that may happen
/// later on down the road...
/// Validate that items that shouldn't have visibility qualifiers don't have them.
/// Such qualifiers can be set by syntax extensions even if the parser doesn't allow them,
/// so we check things like variant fields too.
fn check_sane_privacy(&self, item: &hir::Item) {
let check_inherited = |sp, vis, note: &str| {
if vis != hir::Inherited {
Expand All @@ -1179,13 +1155,12 @@ impl<'a, 'tcx> SanePrivacyVisitor<'a, 'tcx> {
};

match item.node {
// implementations of traits don't need visibility qualifiers because
// that's controlled by having the trait in scope.
hir::ItemImpl(_, _, _, Some(..), _, ref impl_items) => {
check_inherited(item.span, item.vis,
"visibility qualifiers have no effect on trait impls");
for impl_item in impl_items {
check_inherited(impl_item.span, impl_item.vis, "");
check_inherited(impl_item.span, impl_item.vis,
"visibility qualifiers have no effect on trait impl items");
}
}
hir::ItemImpl(_, _, _, None, _, _) => {
Expand All @@ -1200,41 +1175,15 @@ impl<'a, 'tcx> SanePrivacyVisitor<'a, 'tcx> {
check_inherited(item.span, item.vis,
"place qualifiers on individual functions instead");
}
hir::ItemStruct(..) | hir::ItemEnum(..) | hir::ItemTrait(..) |
hir::ItemConst(..) | hir::ItemStatic(..) | hir::ItemFn(..) |
hir::ItemMod(..) | hir::ItemExternCrate(..) |
hir::ItemUse(..) | hir::ItemTy(..) => {}
}
}

/// When inside of something like a function or a method, visibility has no
/// control over anything so this forbids any mention of any visibility
fn check_all_inherited(&self, item: &hir::Item) {
let check_inherited = |sp, vis| {
if vis != hir::Inherited {
span_err!(self.tcx.sess, sp, E0447,
"visibility has no effect inside functions or block expressions");
}
};

check_inherited(item.span, item.vis);
match item.node {
hir::ItemImpl(_, _, _, _, _, ref impl_items) => {
for impl_item in impl_items {
check_inherited(impl_item.span, impl_item.vis);
}
}
hir::ItemForeignMod(ref fm) => {
for fi in &fm.items {
check_inherited(fi.span, fi.vis);
}
}
hir::ItemStruct(ref vdata, _) => {
for f in vdata.fields() {
check_inherited(f.span, f.node.kind.visibility());
hir::ItemEnum(ref def, _) => {
for variant in &def.variants {
for field in variant.node.data.fields() {
check_inherited(field.span, field.node.kind.visibility(),
"visibility qualifiers have no effect on variant fields");
}
}
}
hir::ItemDefaultImpl(..) | hir::ItemEnum(..) | hir::ItemTrait(..) |
hir::ItemStruct(..) | hir::ItemTrait(..) |
hir::ItemConst(..) | hir::ItemStatic(..) | hir::ItemFn(..) |
hir::ItemMod(..) | hir::ItemExternCrate(..) |
hir::ItemUse(..) | hir::ItemTy(..) => {}
Expand Down Expand Up @@ -1821,13 +1770,9 @@ pub fn check_crate(tcx: &ty::ctxt,

let krate = tcx.map.krate();

// Sanity check to make sure that all privacy usage and controls are
// reasonable.
let mut visitor = SanePrivacyVisitor {
tcx: tcx,
in_block: false,
};
intravisit::walk_crate(&mut visitor, krate);
// Sanity check to make sure that all privacy usage is reasonable.
let mut visitor = SanePrivacyVisitor { tcx: tcx };
krate.visit_all_items(&mut visitor);

// Figure out who everyone's parent is
let mut visitor = ParentVisitor {
Expand Down
2 changes: 1 addition & 1 deletion src/libstd/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ fn main() {

let target = env::var("TARGET").unwrap();
let host = env::var("HOST").unwrap();
if !target.contains("apple") && !target.contains("msvc") {
if !target.contains("apple") && !target.contains("msvc") && !target.contains("emscripten"){
build_libbacktrace(&host, &target);
}

Expand Down
6 changes: 6 additions & 0 deletions src/libstd/sync/mpsc/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,9 @@ pub struct Receiver<T> {
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<T: Send> Send for Receiver<T> { }

#[stable(feature = "rust1", since = "1.0.0")]
impl<T> !Sync for Receiver<T> { }

/// An iterator over messages on a receiver, this iterator will block
/// whenever `next` is called, waiting for a new message, and `None` will be
/// returned when the corresponding channel has hung up.
Expand Down Expand Up @@ -327,6 +330,9 @@ pub struct Sender<T> {
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<T: Send> Send for Sender<T> { }

#[stable(feature = "rust1", since = "1.0.0")]
impl<T> !Sync for Sender<T> { }

/// The sending-half of Rust's synchronous channel type. This half can only be
/// owned by one thread, but it can be cloned to send to other threads.
#[stable(feature = "rust1", since = "1.0.0")]
Expand Down
17 changes: 0 additions & 17 deletions src/test/compile-fail/comm-not-freeze-receiver.rs

This file was deleted.

17 changes: 0 additions & 17 deletions src/test/compile-fail/comm-not-freeze.rs

This file was deleted.

20 changes: 0 additions & 20 deletions src/test/compile-fail/no_share-rc.rs

This file was deleted.

34 changes: 34 additions & 0 deletions src/test/compile-fail/not-sync.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright 2016 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use std::cell::{Cell, RefCell};
use std::rc::{Rc, Weak};
use std::sync::mpsc::{Receiver, Sender, SyncSender};

fn test<T: Sync>() {}

fn main() {
test::<Cell<i32>>();
//~^ ERROR marker::Sync` is not implemented for the type `core::cell::Cell<i32>`
test::<RefCell<i32>>();
//~^ ERROR marker::Sync` is not implemented for the type `core::cell::RefCell<i32>`

test::<Rc<i32>>();
//~^ ERROR marker::Sync` is not implemented for the type `alloc::rc::Rc<i32>`
test::<Weak<i32>>();
//~^ ERROR marker::Sync` is not implemented for the type `alloc::rc::Weak<i32>`

test::<Receiver<i32>>();
//~^ ERROR marker::Sync` is not implemented for the type `std::sync::mpsc::Receiver<i32>`
test::<Sender<i32>>();
//~^ ERROR marker::Sync` is not implemented for the type `std::sync::mpsc::Sender<i32>`
test::<SyncSender<i32>>();
//~^ ERROR marker::Sync` is not implemented for the type `std::sync::mpsc::SyncSender<i32>`
}
Loading