Skip to content
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

Rollup of 11 pull requests #72727

Merged
merged 24 commits into from
May 29, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
ef485c6
Impl Error for Infallible
a1phyr Apr 7, 2020
2ce3f85
Tweak and stabilize AtomicN::fetch_update
sfackler May 3, 2020
31c8205
Update src/libcore/sync/atomic.rs
sfackler May 3, 2020
ba0d0c2
Stabilization of weak-into-raw
vorner May 17, 2020
1d7a731
Stabilize AtomicN::fetch_min and AtomicN::fetch_max
Amanieu May 18, 2020
526dbd3
Clarified the documentation for Formatter::precision
Lucretiel May 22, 2020
d01f131
Improve E0601 explanation
GuillaumeGomez May 23, 2020
cd5f228
Added a codegen test for a recent optimization for overflow-checks=on
alex May 24, 2020
37bdb3b
Update UI test
GuillaumeGomez May 26, 2020
593d1ee
improve diagnostics suggestion for missing `@` in slice id binding t…
chrissimpkins May 27, 2020
461891a
remove redundant `mk_const`
lcnr May 28, 2020
d4ef174
Whitelist #[allow_internal_unstable]
jonas-schievink May 28, 2020
85f4f1c
Clarify the documentation of take
poliorcetics May 29, 2020
a08a03c
Rollup merge of #71633 - a1phyr:infallible_error, r=dtolnay
JohnTitor May 29, 2020
ea5848d
Rollup merge of #71843 - sfackler:cas-loop-cleanup, r=dtolnay
JohnTitor May 29, 2020
d472f8e
Rollup merge of #72288 - vorner:stabilize-weak-into-raw, r=dtolnay
JohnTitor May 29, 2020
986c60c
Rollup merge of #72324 - Amanieu:atomic_minmax, r=dtolnay
JohnTitor May 29, 2020
6ab9f65
Rollup merge of #72452 - Lucretiel:precision-doc, r=dtolnay
JohnTitor May 29, 2020
6786c7d
Rollup merge of #72495 - GuillaumeGomez:cleanup-e0601, r=Dylan-DPC
JohnTitor May 29, 2020
d19b51e
Rollup merge of #72534 - chrissimpkins:fix-72373, r=estebank
JohnTitor May 29, 2020
05229f7
Rollup merge of #72547 - alex:patch-1, r=oli-obk
JohnTitor May 29, 2020
054fbf4
Rollup merge of #72711 - lcnr:fixme-heyho, r=jonas-schievink
JohnTitor May 29, 2020
5207428
Rollup merge of #72713 - rust-lang:jonas-schievink-patch-2, r=Mark-Si…
JohnTitor May 29, 2020
fb506af
Rollup merge of #72720 - poliorcetics:clarify-take-doc, r=joshtriplett
JohnTitor May 29, 2020
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
16 changes: 4 additions & 12 deletions src/liballoc/rc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -580,8 +580,6 @@ impl<T: ?Sized> Rc<T> {
/// # Examples
///
/// ```
/// #![feature(weak_into_raw)]
///
/// use std::rc::Rc;
///
/// let x = Rc::new("hello".to_owned());
Expand All @@ -590,7 +588,7 @@ impl<T: ?Sized> Rc<T> {
/// assert_eq!(x_ptr, Rc::as_ptr(&y));
/// assert_eq!(unsafe { &*x_ptr }, "hello");
/// ```
#[unstable(feature = "weak_into_raw", issue = "60728")]
#[stable(feature = "weak_into_raw", since = "1.45.0")]
pub fn as_ptr(this: &Self) -> *const T {
let ptr: *mut RcBox<T> = NonNull::as_ptr(this.ptr);
let fake_ptr = ptr as *mut T;
Expand Down Expand Up @@ -1681,8 +1679,6 @@ impl<T> Weak<T> {
/// # Examples
///
/// ```
/// #![feature(weak_into_raw)]
///
/// use std::rc::Rc;
/// use std::ptr;
///
Expand All @@ -1700,7 +1696,7 @@ impl<T> Weak<T> {
/// ```
///
/// [`null`]: ../../std/ptr/fn.null.html
#[unstable(feature = "weak_into_raw", issue = "60728")]
#[stable(feature = "weak_into_raw", since = "1.45.0")]
pub fn as_ptr(&self) -> *const T {
let offset = data_offset_sized::<T>();
let ptr = self.ptr.cast::<u8>().as_ptr().wrapping_offset(offset);
Expand All @@ -1718,8 +1714,6 @@ impl<T> Weak<T> {
/// # Examples
///
/// ```
/// #![feature(weak_into_raw)]
///
/// use std::rc::{Rc, Weak};
///
/// let strong = Rc::new("hello".to_owned());
Expand All @@ -1735,7 +1729,7 @@ impl<T> Weak<T> {
///
/// [`from_raw`]: struct.Weak.html#method.from_raw
/// [`as_ptr`]: struct.Weak.html#method.as_ptr
#[unstable(feature = "weak_into_raw", issue = "60728")]
#[stable(feature = "weak_into_raw", since = "1.45.0")]
pub fn into_raw(self) -> *const T {
let result = self.as_ptr();
mem::forget(self);
Expand All @@ -1762,8 +1756,6 @@ impl<T> Weak<T> {
/// # Examples
///
/// ```
/// #![feature(weak_into_raw)]
///
/// use std::rc::{Rc, Weak};
///
/// let strong = Rc::new("hello".to_owned());
Expand All @@ -1788,7 +1780,7 @@ impl<T> Weak<T> {
/// [`Weak`]: struct.Weak.html
/// [`new`]: struct.Weak.html#method.new
/// [`forget`]: ../../std/mem/fn.forget.html
#[unstable(feature = "weak_into_raw", issue = "60728")]
#[stable(feature = "weak_into_raw", since = "1.45.0")]
pub unsafe fn from_raw(ptr: *const T) -> Self {
if ptr.is_null() {
Self::new()
Expand Down
16 changes: 4 additions & 12 deletions src/liballoc/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -579,8 +579,6 @@ impl<T: ?Sized> Arc<T> {
/// # Examples
///
/// ```
/// #![feature(weak_into_raw)]
///
/// use std::sync::Arc;
///
/// let x = Arc::new("hello".to_owned());
Expand All @@ -589,7 +587,7 @@ impl<T: ?Sized> Arc<T> {
/// assert_eq!(x_ptr, Arc::as_ptr(&y));
/// assert_eq!(unsafe { &*x_ptr }, "hello");
/// ```
#[unstable(feature = "weak_into_raw", issue = "60728")]
#[stable(feature = "weak_into_raw", since = "1.45.0")]
pub fn as_ptr(this: &Self) -> *const T {
let ptr: *mut ArcInner<T> = NonNull::as_ptr(this.ptr);
let fake_ptr = ptr as *mut T;
Expand Down Expand Up @@ -1449,8 +1447,6 @@ impl<T> Weak<T> {
/// # Examples
///
/// ```
/// #![feature(weak_into_raw)]
///
/// use std::sync::Arc;
/// use std::ptr;
///
Expand All @@ -1468,7 +1464,7 @@ impl<T> Weak<T> {
/// ```
///
/// [`null`]: ../../std/ptr/fn.null.html
#[unstable(feature = "weak_into_raw", issue = "60728")]
#[stable(feature = "weak_into_raw", since = "1.45.0")]
pub fn as_ptr(&self) -> *const T {
let offset = data_offset_sized::<T>();
let ptr = self.ptr.cast::<u8>().as_ptr().wrapping_offset(offset);
Expand All @@ -1486,8 +1482,6 @@ impl<T> Weak<T> {
/// # Examples
///
/// ```
/// #![feature(weak_into_raw)]
///
/// use std::sync::{Arc, Weak};
///
/// let strong = Arc::new("hello".to_owned());
Expand All @@ -1503,7 +1497,7 @@ impl<T> Weak<T> {
///
/// [`from_raw`]: struct.Weak.html#method.from_raw
/// [`as_ptr`]: struct.Weak.html#method.as_ptr
#[unstable(feature = "weak_into_raw", issue = "60728")]
#[stable(feature = "weak_into_raw", since = "1.45.0")]
pub fn into_raw(self) -> *const T {
let result = self.as_ptr();
mem::forget(self);
Expand Down Expand Up @@ -1531,8 +1525,6 @@ impl<T> Weak<T> {
/// # Examples
///
/// ```
/// #![feature(weak_into_raw)]
///
/// use std::sync::{Arc, Weak};
///
/// let strong = Arc::new("hello".to_owned());
Expand All @@ -1557,7 +1549,7 @@ impl<T> Weak<T> {
/// [`Weak`]: struct.Weak.html
/// [`Arc`]: struct.Arc.html
/// [`forget`]: ../../std/mem/fn.forget.html
#[unstable(feature = "weak_into_raw", issue = "60728")]
#[stable(feature = "weak_into_raw", since = "1.45.0")]
pub unsafe fn from_raw(ptr: *const T) -> Self {
if ptr.is_null() {
Self::new()
Expand Down
3 changes: 2 additions & 1 deletion src/libcore/fmt/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1618,7 +1618,8 @@ impl<'a> Formatter<'a> {
self.width
}

/// Optionally specified precision for numeric types.
/// Optionally specified precision for numeric types. Alternatively, the
/// maximum width for string types.
///
/// # Examples
///
Expand Down
11 changes: 11 additions & 0 deletions src/libcore/iter/traits/iterator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1180,6 +1180,17 @@ pub trait Iterator {
/// assert_eq!(iter.next(), Some(2));
/// assert_eq!(iter.next(), None);
/// ```
///
/// If less than `n` elements are available,
/// `take` will limit itself to the size of the underlying iterator:
///
/// ```
/// let v = vec![1, 2];
/// let mut iter = v.into_iter().take(5);
/// assert_eq!(iter.next(), Some(1));
/// assert_eq!(iter.next(), Some(2));
/// assert_eq!(iter.next(), None);
/// ```
#[inline]
#[stable(feature = "rust1", since = "1.0.0")]
fn take(self, n: usize) -> Take<Self>
Expand Down
38 changes: 13 additions & 25 deletions src/libcore/sync/atomic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1807,13 +1807,12 @@ new value. Returns a `Result` of `Ok(previous_value)` if the function returned `

Note: This may call the function multiple times if the value has been changed from other threads in
the meantime, as long as the function returns `Some(_)`, but the function will have been applied
but once to the stored value.
only once to the stored value.

`fetch_update` takes two [`Ordering`] arguments to describe the memory
ordering of this operation. The first describes the required ordering for loads
and failed updates while the second describes the required ordering when the
operation finally succeeds. Beware that this is different from the two
modes in [`compare_exchange`]!
`fetch_update` takes two [`Ordering`] arguments to describe the memory ordering of this operation.
The first describes the required ordering for when the operation finally succeeds while the second
describes the required ordering for loads. These correspond to the success and failure orderings of
[`compare_exchange`] respectively.

Using [`Acquire`] as success ordering makes the store part
of this operation [`Relaxed`], and using [`Release`] makes the final successful load
Expand All @@ -1831,24 +1830,21 @@ and must be equivalent to or weaker than the success ordering.
# Examples

```rust
#![feature(no_more_cas)]
", $extra_feature, "use std::sync::atomic::{", stringify!($atomic_type), ", Ordering};

let x = ", stringify!($atomic_type), "::new(7);
assert_eq!(x.fetch_update(|_| None, Ordering::SeqCst, Ordering::SeqCst), Err(7));
assert_eq!(x.fetch_update(|x| Some(x + 1), Ordering::SeqCst, Ordering::SeqCst), Ok(7));
assert_eq!(x.fetch_update(|x| Some(x + 1), Ordering::SeqCst, Ordering::SeqCst), Ok(8));
assert_eq!(x.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |_| None), Err(7));
assert_eq!(x.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |x| Some(x + 1)), Ok(7));
assert_eq!(x.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |x| Some(x + 1)), Ok(8));
assert_eq!(x.load(Ordering::SeqCst), 9);
```"),
#[inline]
#[unstable(feature = "no_more_cas",
reason = "no more CAS loops in user code",
issue = "48655")]
#[stable(feature = "no_more_cas", since = "1.45.0")]
#[$cfg_cas]
pub fn fetch_update<F>(&self,
mut f: F,
set_order: Ordering,
fetch_order: Ordering,
set_order: Ordering) -> Result<$int_type, $int_type>
mut f: F) -> Result<$int_type, $int_type>
where F: FnMut($int_type) -> Option<$int_type> {
let mut prev = self.load(fetch_order);
while let Some(next) = f(prev) {
Expand Down Expand Up @@ -1882,7 +1878,6 @@ using [`Release`] makes the load part [`Relaxed`].
# Examples

```
#![feature(atomic_min_max)]
", $extra_feature, "use std::sync::atomic::{", stringify!($atomic_type), ", Ordering};

let foo = ", stringify!($atomic_type), "::new(23);
Expand All @@ -1893,7 +1888,6 @@ assert_eq!(foo.load(Ordering::SeqCst), 42);
If you want to obtain the maximum value in one step, you can use the following:

```
#![feature(atomic_min_max)]
", $extra_feature, "use std::sync::atomic::{", stringify!($atomic_type), ", Ordering};

let foo = ", stringify!($atomic_type), "::new(23);
Expand All @@ -1902,9 +1896,7 @@ let max_foo = foo.fetch_max(bar, Ordering::SeqCst).max(bar);
assert!(max_foo == 42);
```"),
#[inline]
#[unstable(feature = "atomic_min_max",
reason = "easier and faster min/max than writing manual CAS loop",
issue = "48655")]
#[stable(feature = "atomic_min_max", since = "1.45.0")]
#[$cfg_cas]
pub fn fetch_max(&self, val: $int_type, order: Ordering) -> $int_type {
// SAFETY: data races are prevented by atomic intrinsics.
Expand Down Expand Up @@ -1933,7 +1925,6 @@ using [`Release`] makes the load part [`Relaxed`].
# Examples

```
#![feature(atomic_min_max)]
", $extra_feature, "use std::sync::atomic::{", stringify!($atomic_type), ", Ordering};

let foo = ", stringify!($atomic_type), "::new(23);
Expand All @@ -1946,7 +1937,6 @@ assert_eq!(foo.load(Ordering::Relaxed), 22);
If you want to obtain the minimum value in one step, you can use the following:

```
#![feature(atomic_min_max)]
", $extra_feature, "use std::sync::atomic::{", stringify!($atomic_type), ", Ordering};

let foo = ", stringify!($atomic_type), "::new(23);
Expand All @@ -1955,9 +1945,7 @@ let min_foo = foo.fetch_min(bar, Ordering::SeqCst).min(bar);
assert_eq!(min_foo, 12);
```"),
#[inline]
#[unstable(feature = "atomic_min_max",
reason = "easier and faster min/max than writing manual CAS loop",
issue = "48655")]
#[stable(feature = "atomic_min_max", since = "1.45.0")]
#[$cfg_cas]
pub fn fetch_min(&self, val: $int_type, order: Ordering) -> $int_type {
// SAFETY: data races are prevented by atomic intrinsics.
Expand Down
5 changes: 3 additions & 2 deletions src/librustc_error_codes/error_codes/E0601.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
No `main` function was found in a binary crate. To fix this error, add a
`main` function. For example:
No `main` function was found in a binary crate.

To fix this error, add a `main` function:

```
fn main() {
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_feature/builtin_attrs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
// FIXME(#14407)
ungated!(rustc_const_stable, Whitelisted, template!(List: r#"feature = "name""#)),
gated!(
allow_internal_unstable, Normal, template!(Word, List: "feat1, feat2, ..."),
allow_internal_unstable, Whitelisted, template!(Word, List: "feat1, feat2, ..."),
"allow_internal_unstable side-steps feature gating and stability checks",
),
gated!(
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_mir/transform/const_prop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -606,7 +606,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
Operand::Constant(Box::new(Constant {
span,
user_ty: None,
literal: self.tcx.mk_const(*ty::Const::from_scalar(self.tcx, scalar, ty)),
literal: ty::Const::from_scalar(self.tcx, scalar, ty),
}))
}

Expand Down
20 changes: 20 additions & 0 deletions src/librustc_parse/parser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -672,6 +672,26 @@ impl<'a> Parser<'a> {
}
}

// If this was a missing `@` in a binding pattern
// bail with a suggestion
// https://github.com/rust-lang/rust/issues/72373
if self.prev_token.is_ident() && &self.token.kind == &token::DotDot {
let msg = format!(
"if you meant to bind the contents of \
the rest of the array pattern into `{}`, use `@`",
pprust::token_to_string(&self.prev_token)
);
expect_err
.span_suggestion_verbose(
self.prev_token.span.shrink_to_hi().until(self.token.span),
&msg,
" @ ".to_string(),
Applicability::MaybeIncorrect,
)
.emit();
break;
}

// Attempt to keep parsing if it was an omitted separator.
match f(self) {
Ok(t) => {
Expand Down
3 changes: 2 additions & 1 deletion src/libstd/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
// reconsider what crate these items belong in.

use core::array;
use core::convert::Infallible;

use crate::alloc::{AllocErr, LayoutErr};
use crate::any::TypeId;
Expand Down Expand Up @@ -474,7 +475,7 @@ impl Error for string::FromUtf16Error {
}

#[stable(feature = "str_parse_error2", since = "1.8.0")]
impl Error for string::ParseError {
impl Error for Infallible {
fn description(&self) -> &str {
match *self {}
}
Expand Down
26 changes: 26 additions & 0 deletions src/test/codegen/integer-overflow.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// no-system-llvm
// compile-flags: -O -C overflow-checks=on

#![crate_type = "lib"]


pub struct S1<'a> {
data: &'a [u8],
position: usize,
}

// CHECK-LABEL: @slice_no_index_order
#[no_mangle]
pub fn slice_no_index_order<'a>(s: &'a mut S1, n: usize) -> &'a [u8] {
// CHECK-NOT: slice_index_order_fail
let d = &s.data[s.position..s.position+n];
s.position += n;
return d;
}

// CHECK-LABEL: @test_check
#[no_mangle]
pub fn test_check<'a>(s: &'a mut S1, x: usize, y: usize) -> &'a [u8] {
// CHECK: slice_index_order_fail
&s.data[x..y]
}
9 changes: 9 additions & 0 deletions src/test/ui/issues/issue-72373.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
fn foo(c: &[u32], n: u32) -> u32 {
match *c {
[h, ..] if h > n => 0,
[h, ..] if h == n => 1,
[h, ref ts..] => foo(c, n - h) + foo(ts, n),
//~^ ERROR expected one of `,`, `@`, `]`, or `|`, found `..`
[] => 0,
}
}
13 changes: 13 additions & 0 deletions src/test/ui/issues/issue-72373.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
error: expected one of `,`, `@`, `]`, or `|`, found `..`
--> $DIR/issue-72373.rs:5:19
|
LL | [h, ref ts..] => foo(c, n - h) + foo(ts, n),
| ^^ expected one of `,`, `@`, `]`, or `|`
|
help: if you meant to bind the contents of the rest of the array pattern into `ts`, use `@`
|
LL | [h, ref ts @ ..] => foo(c, n - h) + foo(ts, n),
| ^

error: aborting due to previous error

Loading