Commit Graph

10480 Commits

Author SHA1 Message Date
Dylan DPC d276e6942e Rollup merge of #68348 - xfix:patch-14, r=nagisa
Make iter::Empty<T> Send and Sync for any T

Continuing from #57682

It's quite funny, when I initially submitted this pull request, I said "Likely nobody will be using that property of `iter::empty`", but then a year later I got a compilation error because it wasn't `Send` and `Sync`.

Unfortunately, `PhantomData<fn() -> T>` still errors out. Oh well. I proposed `
struct PhantomFnWorkaround<T>(fn() -> T);`, but dtolnay did not like it, so using explicit implementations.
2020-01-19 17:22:09 +05:30
Mazdak Farrokhzad e8819b62b4 Rollup merge of #68342 - lcnr:type_name_docs, r=Dylan-DPC
improve type_name_of_val docs

suggested by @Globidev in https://github.com/rust-lang/rust/issues/66359#issuecomment-575016612
2020-01-18 19:36:08 +01:00
Mazdak Farrokhzad 3ccb0f9b8f slice_patterns: remove internal uses of gate 2020-01-18 19:33:47 +01:00
Konrad Borowski a70b240189 Make iter::Empty<T> implement Send and Sync for any T 2020-01-18 18:50:10 +01:00
lcnr/Bastian Kauschke 6b7f3e50df improve type_name_of_val docs 2020-01-18 14:43:08 +01:00
Dylan DPC d3589aa4ed Rollup merge of #66564 - foeb:66219-document-unsafe-sync-cell-str, r=Amanieu
Document unsafe blocks in core::{cell, str, sync}

Split from #66506 (issue #66219). Hopefully doing a chunk at a time is more manageable!

r? @RalfJung
2020-01-17 18:53:38 +05:30
Phoebe Bell 022a7de26f Add SAFETY comment for atomic example 2020-01-16 19:26:02 -08:00
Phoebe Bell 0f2ee495e9 Fix formatting: ./x.py fmt 2020-01-16 18:50:53 -08:00
Phoebe Bell c103c284b9 Move comments for tidy 2020-01-16 18:38:04 -08:00
Phoebe Bell ca2fae8edb Elaborate on SAFETY comments 2020-01-16 18:32:21 -08:00
Phoebe Bell e0140ffeb0 Apply suggestions from code review
Co-Authored-By: Ralf Jung <post@ralfj.de>
2020-01-16 18:27:44 -08:00
Phoebe Bell a93e99cae7 Fix typo "gurantees -> guarantees" 2020-01-16 18:27:08 -08:00
Phoebe Bell 19fdc6e091 Document unsafe blocks in core::{cell, str, sync} 2020-01-16 18:26:14 -08:00
bors 8cacf50563 Auto merge of #66716 - derekdreery:debug_non_exhaustive, r=dtolnay
Implement `DebugStruct::non_exhaustive`.

This patch adds a function (finish_non_exhaustive) to add ellipsis before the closing brace when formatting using `DebugStruct`.

 ## Example

 ```rust
 #![feature(debug_non_exhaustive)]
 use std::fmt;

 struct Bar {
     bar: i32,
     hidden: f32,
 }

 impl fmt::Debug for Bar {
     fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
         fmt.debug_struct("Bar")
            .field("bar", &self.bar)
            .non_exhaustive(true) // Show that some other field(s) exist.
            .finish()
     }
 }

 assert_eq!(
     format!("{:?}", Bar { bar: 10, hidden: 1.0 }),
     "Bar { bar: 10, .. }",
 );
 ```
2020-01-17 00:20:48 +00:00
Richard Dodd 73124df6eb Rust ./x.py fmt 2020-01-16 20:11:16 +00:00
Dylan DPC 1389caf860 Rollup merge of #68096 - varkor:diagnostic-cleanup, r=Centril
Clean up some diagnostics by making them more consistent

In general:

- Diagnostic should start with a lowercase letter.
- Diagnostics should not end with a full stop.
- Ellipses contain three dots.
- Backticks should encode Rust code.

I also reworded a couple of messages to make them read more clearly.

It might be sensible to create a style guide for diagnostics, so these informal conventions are written down somewhere, after which we could audit the existing diagnostics.

r? @Centril
2020-01-16 11:58:02 +05:30
Dylan DPC 6270e49ce7 Rollup merge of #68232 - Mark-Simulacrum:unicode-tables, r=joshtriplett
Optimize size/speed of Unicode datasets

The overall implementation has the same general idea as the prior approach,
which was based on a compressed trie structure, but modified to use less space
(and, coincidentally, be an overall performance improvement).

Sizes | Old | New | New/current
-- | -- | -- | --
Alphabetic | 4616 | 2982 | 64.60%
Case_Ignorable | 3144 | 2112 | 67.18%
Cased | 2376 | 934 | 39.31%
Cc | 19 | 43 | 226.32%
Grapheme_Extend | 3072 | 1734 | 56.45%
Lowercase | 2328 | 985 | 42.31%
N | 2648 | 1239 | 46.79%
Uppercase | 1978 | 934 | 47.22%
White_Space | 241 | 140 | 58.09%
  |   |   |
Total | 20422 | 11103 | 54.37%

This table shows the size of the old and new tables in bytes. The most important
of these tables is "Grapheme_Extend", as it is present in essentially all Rust
programs due to being called from `str`'s Debug impl (`char::escape_debug`). In
a representative case given by this [blog post] for the embedded world, the
shrinking in this PR shrinks the final binary by 1,604 bytes, from 14,440 to
12,836.

The performance of these new tables, based on the (rough) benchmark of linearly
scanning the entire valid set of chars, querying for each `is_*`, is roughly
~50% better, though in some cases is either on par or slightly (3-5%) worse. In
practice, I believe the size benefits of this PR are the main concern. The new
implementation has been tested to be equivalent to the current nightly in terms
of returned values on the set of valid chars.

A (relatively) high-level explanation of the specific compression scheme used
can be found [in the generator].

This is split into three commits -- the first adds the generator which produces
the Rust code for the tables, the second adds support code for the lookup, and
the third actually swaps the current implementation out for the new one.

[blog post]: https://jamesmunns.com/blog/fmt-unreasonably-expensive/
[in the generator]: https://github.com/Mark-Simulacrum/rust/blob/unicode-tables/src/tools/unicode-table-generator/src/raw_emitter.rs
2020-01-15 22:49:27 +05:30
Yuki Okushi e800fe199c Rollup merge of #67784 - Mark-Simulacrum:residual-pad-integral, r=dtolnay
Reset Formatter flags on exit from pad_integral

This fixes a bug where after calling pad_integral with appropriate flags, the
fill and alignment flags would be set to '0' and 'Right' and left as such even
after exiting pad_integral, which meant that future calls on the same Formatter
would get incorrect flags reported.

This is quite difficult to observe in practice, as almost all formatting
implementations in practice don't call `Display::fmt` directly, but rather use
`write!` or a similar macro, which means that they cannot observe the effects of
the wrong flags (as `write!` creates a fresh Formatter instance). However, we
include a test case.

A manual check leads me to believe this is the only case where we failed to reset the flags appropriately, but I could have missed something.
2020-01-15 21:51:42 +09:00
Mark Rousskov efcda04739 Replace old tables with new unicode data 2020-01-14 19:11:28 -05:00
Mark Rousskov 40ad877851 Add support code for new unicode_data module 2020-01-14 19:11:15 -05:00
Richard Dodd 9864ec499f Implement finish_non_exhaustive for DebugStruct. 2020-01-14 16:57:59 +00:00
varkor 8461fa5119 Diagnostics should not end with a full stop 2020-01-12 15:37:50 +00:00
Lukas Lueg c5a9a14c9f Constify alloc::Layout
Tracking issue #67521, Layout::new in #66254
2020-01-11 16:59:15 +01:00
Mazdak Farrokhzad 50d76d6471 Rollup merge of #68114 - ecstatic-morse:fix-feature-gating, r=Centril
Don't require `allow_internal_unstable` unless `staged_api` is enabled.

#63770 changed `qualify_min_const_fn` to require `allow_internal_unstable` for *all* crates that used an unstable feature, regardless of whether `staged_api` was enabled or the `fn` that used that feature was stably const. In practice, this meant that every crate in the ecosystem that wanted to use nightly features added `#![feature(const_fn)]`, which skips `qualify_min_const_fn` entirely.

After this PR, crates that do not have `#![feature(staged_api)]` will only need to enable the feature they are interested in. For example, `#![feature(const_if_match)]` will be enough to enable `if` and `match` in constants. Crates with `staged_api` (e.g., `libstd`) require `#[allow_internal_unstable]` to be added to a function if it uses nightly features unless that function is also marked `#[rustc_const_unstable]`. This prevents proliferation of `#[allow_internal_unstable]` into functions that are not callable in a `const` context on stable.

r? @oli-obk (author of #63770)
cc @Centril
2020-01-11 12:36:14 +01:00
Lzu Tao c2c2d3b32b Update test after renaming Result::as_deref 2020-01-11 03:26:09 +00:00
Lzu Tao a5f42397be Rename Result::as_deref_ok to as_deref 2020-01-11 03:08:40 +00:00
Dylan MacKenzie 09b5c854de Remove unnecessary const_fn feature gates
This flag opts out of the min-const-fn checks entirely, which is usually
not what we want. The few cases where the flag is still necessary have
been annotated.
2020-01-10 18:51:12 -08:00
Yuki Okushi 2dbcf0841a Rollup merge of #66045 - mzabaluev:unwrap-infallible, r=dtolnay
Add method Result::into_ok

Implementation of https://github.com/rust-lang/rfcs/pull/2799

Tracking issue #61695
2020-01-11 04:50:45 +09:00
Yuki Okushi 9e83df0f69 Rollup merge of #68054 - tspiteri:null-unchecked-as_mut, r=cramertj
doc: add Null-unchecked version section to mut pointer as_mut method

The [`as_ref`](https://doc.rust-lang.org/std/primitive.pointer.html#method.as_ref-1) method already has a *Null-unchecked version* section, its example is a modification of the example in the main `as_ref` section. Similarly the example in this PR is a modification of the example in main [`as_mut`](https://doc.rust-lang.org/std/primitive.pointer.html#method.as_mut) section.

Fixes #68032.
2020-01-10 04:18:43 +09:00
Yuki Okushi ee90f09ea0 Rollup merge of #67935 - Thomasdezeeuw:issue_67669, r=withoutboats
Relax the Sized bounds on Pin::map_unchecked(_mut)

Fixes #67669.
2020-01-10 04:18:36 +09:00
CAD97 d860def8e2 Mark Layout::new as const stable 2020-01-09 13:41:43 -05:00
Christopher Durham e47fec56dd Make Layout::new const 2020-01-09 13:41:40 -05:00
Trevor Spiteri f8428cf8d8 doc: add Null-unchecked version section to mut pointer as_mut method
The as_ref method already has a Null-unchecked version section, its
example is a modification of the example in the main as_ref section.
Similarly the example in this commit is a modification of the example
in main as_mut section.
2020-01-09 14:51:58 +01:00
Mazdak Farrokhzad 5ea69781f4 Rollup merge of #67966 - popzxc:core-std-matches, r=Centril
Use matches macro in libcore and libstd

This PR replaces matches like

```rust
match var {
    value => true,
    _ => false,
}
```

with use of `matches!` macro.

r? @Centril
2020-01-09 00:22:10 +01:00
Mazdak Farrokhzad 11f0013378 Rollup merge of #67884 - anp:allow-unused-const-attr, r=oli-obk
Fix incremental builds of core by allowing unused attribute.

I *think* that the same problem as in https://github.com/rust-lang/rust/issues/65023 was introduced by https://github.com/rust-lang/rust/pull/67657. This works around the current incrcomp issue with these attributes by allowing it here. This resolves the near-term issue for me, at least.
2020-01-09 00:22:08 +01:00
Yuki Okushi 1c9b8036bf Rollup merge of #67887 - anp:tracked-std-panics, r=nagisa
`Option::{expect,unwrap}` and `Result::{expect, expect_err, unwrap, unwrap_err}` have `#[track_caller]`

The annotated functions now produce panic messages pointing to the location where they were called, rather than `core`'s internals.
2020-01-09 00:29:15 +09:00
Yuki Okushi 256f401b85 Rollup merge of #67798 - matklad:spin-thouse-docs, r=Amanieu
Remove wrong advice about spin locks from `spin_loop_hint` docs

Using a pure spin lock for a critical section in a preemptable thread
is always wrong, however short the critical section may be. The thread
might be preempted, which will cause all other threads to hammer
busily at the core for the whole quant. Moreover, if threads have
different priorities, this might lead to a priority inversion problem
and a deadlock. More generally, a spinlock is not more efficient than
a well-written mutex, which typically does several spin iterations at
the start anyway.

The advise about UP vs SMP is also irrelevant in the context of
preemptive threads.

See also accompanying piece: https://matklad.github.io/2020/01/02/spinlocs-considered-harmful.html

And another, independent piece: https://probablydance.com/2019/12/30/measuring-mutexes-spinlocks-and-how-bad-the-linux-scheduler-really-is

EDIT: obligatory disclosure that I am not an expert in these things, and might be terribly wrong :)
2020-01-09 00:29:09 +09:00
Igor Aleksanov f720469fd0 Use matches macro in libcore and libstd 2020-01-08 07:10:28 +03:00
Thomas de Zeeuw d288c28ff3 Relax the Sized bounds on Pin::map_unchecked(_mut) 2020-01-06 15:41:09 +01:00
Dylan DPC 34716a31db Rollup merge of #67915 - lzutao:Self, r=Centril
Use Self instead of $type

r? @Dylan-DPC
2020-01-06 12:00:23 +05:30
Lzu Tao c7dbf5ad54 Use Self instead of $type 2020-01-06 04:33:31 +00:00
Lucas Pardue cb8c071eb5 macros: typo fix
spotted while reviewing the todo!macro docs
2020-01-06 01:55:24 +00:00
Aleksey Kladov b25eeef88d Add more nuanced advice about spin_loop_hint 2020-01-05 20:37:22 +01:00
Adam Perry 7a6af7eb0e Result's panics have #[track_caller]. 2020-01-04 19:52:37 -08:00
Adam Perry 2e9d573d3f Option's panics are all #[track_caller].
Also includes a simple test with a custom panic hook to ensure we don't regress.
2020-01-04 19:52:37 -08:00
Adam Perry 3458aba0f9 Fix incremental builds of core by allowing unused attribute.
The same problem as in https://github.com/rust-lang/rust/issues/65023 was
introduced by https://github.com/rust-lang/rust/pull/67657. This works
around the current incrcomp issue with these attributes by allowing it
here.
2020-01-04 18:20:52 -08:00
jumbatm 525cd2d7c1 Re-add comment about behaviour of inline. 2020-01-05 08:01:32 +10:00
Dylan DPC cce055daef Rollup merge of #67137 - anp:tracked-panic-internals, r=eddyb
libstd uses `core::panic::Location` where possible.

cc @eddyb
2020-01-04 23:52:44 +05:30
Adam Perry eaccda009f core and std macros and panic internals use panic::Location::caller. 2020-01-04 10:02:17 -08:00
Mazdak Farrokhzad 745f771484 Rollup merge of #67845 - jumbatm:also-unconst-hack-abs, r=oli-obk
Also remove const-hack for abs

Closes #67842.

r? @oli-obk
2020-01-04 02:19:55 +01:00