kennytm
4f184eb6a3
Rollup merge of #48012 - scottmcm:faster-rangeinclusive-fold, r=alexcrichton
...
Override try_[r]fold for RangeInclusive
Because the last item needs special handling, it seems that LLVM has trouble canonicalizing the loops in external iteration. With the override, it becomes obvious that the start==end case exits the loop (as opposed to the one *after* that exiting the loop in external iteration).
Demo adapted from https://github.com/rust-lang/rust/issues/45222
```rust
#[no_mangle]
pub fn foo3r(n: u64) -> u64 {
let mut count = 0;
(0..n).for_each(|_| {
(0 ..= n).rev().for_each(|j| {
count += j;
})
});
count
}
```
<details>
<summary>Current nightly ASM, 100 lines (https://play.rust-lang.org/?gist=f5674c702c6e2045c3aab5d03763e5f6&version=nightly&mode=release )</summary>
```asm
foo3r:
pushq %rbx
.Lcfi0:
.Lcfi1:
testq %rdi, %rdi
je .LBB0_1
testb $1, %dil
jne .LBB0_4
xorl %eax, %eax
xorl %r8d, %r8d
cmpq $1, %rdi
jne .LBB0_11
jmp .LBB0_23
.LBB0_1:
xorl %eax, %eax
popq %rbx
retq
.LBB0_4:
xorl %r8d, %r8d
movq $-1, %r9
xorl %eax, %eax
movq %rdi, %r11
xorl %r10d, %r10d
jmp .LBB0_5
.LBB0_8:
addq %r11, %rax
movq %rsi, %r11
movq %rdx, %r10
.LBB0_5:
cmpq %r11, %r10
movl $1, %ecx
cmovbq %r9, %rcx
cmoveq %r8, %rcx
testq %rcx, %rcx
movl $0, %esi
movl $1, %edx
je .LBB0_8
cmpq $-1, %rcx
jne .LBB0_9
leaq -1(%r11), %rsi
movq %r10, %rdx
jmp .LBB0_8
.LBB0_9:
movl $1, %r8d
cmpq $1, %rdi
je .LBB0_23
.LBB0_11:
xorl %r9d, %r9d
movq $-1, %r10
.LBB0_12:
movq %rdi, %rsi
xorl %r11d, %r11d
jmp .LBB0_13
.LBB0_16:
addq %rsi, %rax
movq %rcx, %rsi
movq %rbx, %r11
.LBB0_13:
cmpq %rsi, %r11
movl $1, %edx
cmovbq %r10, %rdx
cmoveq %r9, %rdx
testq %rdx, %rdx
movl $0, %ecx
movl $1, %ebx
je .LBB0_16
cmpq $-1, %rdx
jne .LBB0_17
leaq -1(%rsi), %rcx
movq %r11, %rbx
jmp .LBB0_16
.LBB0_17:
movq %rdi, %rcx
xorl %r11d, %r11d
jmp .LBB0_18
.LBB0_21:
addq %rcx, %rax
movq %rsi, %rcx
movq %rbx, %r11
.LBB0_18:
cmpq %rcx, %r11
movl $1, %edx
cmovbq %r10, %rdx
cmoveq %r9, %rdx
testq %rdx, %rdx
movl $0, %esi
movl $1, %ebx
je .LBB0_21
cmpq $-1, %rdx
jne .LBB0_22
leaq -1(%rcx), %rsi
movq %r11, %rbx
jmp .LBB0_21
.LBB0_22:
addq $2, %r8
cmpq %rdi, %r8
jne .LBB0_12
.LBB0_23:
popq %rbx
retq
.Lfunc_end0:
```
</details><br>
With this PR:
```asm
foo3r:
test rcx, rcx
je .LBB3_1
lea r8, [rcx - 1]
lea rdx, [rcx - 2]
mov rax, r8
mul rdx
shld rdx, rax, 63
imul r8, r8
add r8, rcx
sub r8, rdx
imul r8, rcx
mov rax, r8
ret
.LBB3_1:
xor r8d, r8d
mov rax, r8
ret
```
2018-02-07 03:23:25 +08:00
kennytm
e2f6e134c1
Rollup merge of #48003 - mbrubeck:docs, r=steveklabnik
...
Fix info about generic impls in AsMut docs
This text was copy-pasted from the `AsRef` docs to `AsMut`, but needed some additional adjustments for correctness.
2018-02-06 02:13:54 +08:00
Scott McMurray
1b1e887f4d
Override try_[r]fold for RangeInclusive
...
Because the last item needs special handling, it seems that LLVM has trouble canonicalizing the loops in external iteration. With the override, it becomes obvious that the start==end case exits the loop (as opposed to the one *after* that exiting the loop in external iteration).
2018-02-04 23:48:40 -08:00
Matt Brubeck
f243f9239d
Fix info about generic impls in AsMut docs
...
This text was copy-pasted from the `AsRef` docs to `AsMut`, but needed
some additional adjustments for correctness.
2018-02-04 11:57:36 -08:00
kennytm
e17ebdf344
Rollup merge of #47892 - Badel2:const_type_id_of, r=oli-obk
...
Turn `type_id` into a constant intrinsic
https://github.com/rust-lang/rust/issues/27745
The method `get_type_id` in `Any` is intended to support reflection. It's currently unstable in favor of using an associated constant instead. This PR makes the `type_id` intrinsic a constant intrinsic, the same as `size_of` and `align_of`, allowing `TypeId::of` to be a `const fn`, which will allow using an associated constant in `Any`.
2018-02-05 01:27:36 +08:00
oberien
6caec2c049
Document TrustedLen guarantees more explicitly
2018-02-04 16:09:32 +01:00
oberien
75474ff132
TrustedLen for Repeat / RangeFrom test cases
2018-02-04 16:09:32 +01:00
oberien
a1809d5784
Implement TrustedLen for Take<Repeat> and Take<RangeFrom>
2018-02-04 16:09:32 +01:00
kennytm
3a0a423d61
Rollup merge of #47973 - perlun:patch-1, r=dtolnay
...
copy_nonoverlapping example: Fixed typo
The comment referred to a variable using an incorrect name. (it has probably been renamed since the comment was written, or the comment was copied elsewhere - I noted the example in libcore has the `tmp` name for the temporary variable.)
2018-02-03 16:08:27 +08:00
Per Lundberg
321e429b9f
copy_nonoverlapping example: Fixed typo
...
The comment referred to a variable using an incorrect name. (it has probably been renamed since the comment was written, or the comment was copied elsewhere - I noted the example in libcore has the `tmp` name for the temporary variable.)
2018-02-02 22:44:14 +02:00
kennytm
7c6380cdcf
Rollup merge of #47919 - varkor:to_degrees-precision, r=rkruppe Use constant for 180/π in to_degrees The current f32|f64.to_degrees implementation uses a division to calculate 180/π, which causes a loss of precision. Using a constant is still not perfect (implementing a maximally-precise algorithm would come with a high performance cost), but improves precision with a minimal change. As per the discussion in #29944 , this fixes #29944 (the costs of improving the precision further would not outweigh the gains).
2018-02-02 22:48:49 +08:00
kennytm
3600bfb3f0
Rollup merge of #46156 - SimonSapin:patch-14, r=withoutboats
...
Document the size of bool
2018-02-02 16:29:11 +08:00
Esteban Küber
2dee07b12a
Remove cast suggestions
2018-02-01 15:06:22 -08:00
Esteban Küber
621e61bff9
Add filter to detect local crates for rustc_on_unimplemented
2018-02-01 15:06:21 -08:00
Esteban Küber
4c92a02b64
Change rustc_on_unimplemented for Iterator and binops
2018-02-01 15:06:21 -08:00
Esteban Küber
c1383e4dc4
Add filtering options to rustc_on_unimplemented
...
- filter error on the evaluated value of `Self`
- filter error on the evaluated value of the type arguments
- add argument to include custom note in diagnostic
- allow the parser to parse `Self` when processing attributes
- add custom message to binops
2018-02-01 15:06:20 -08:00
Badel2
196fad0d00
Turn type_id into a constant intrinsic
...
Add rustc_const_unstable attribute for `any::TypeId::of`
Add test for `const fn TypeId::of`
2018-02-01 23:03:19 +01:00
varkor
e34c31bf02
Use constant for 180/π in to_degrees
...
The current `f32|f64.to_degrees` implementation uses a division to calculate 180/π, which causes a loss of precision. Using a constant is still not perfect (implementing a maximally-precise algorithm would come with a high performance cost), but improves precision with a minimal change.
2018-02-01 18:35:51 +00:00
kennytm
af95302d3c
Rollup merge of #47552 - oberien:stepby-nth, r=dtolnay
...
Specialize StepBy::nth
This allows optimizations of implementations of the inner iterator's `.nth` method.
2018-02-01 02:34:15 +08:00
kennytm
0370717296
Rollup merge of #47840 - penpalperson:master, r=bluss
...
Marked Debug implementations for primitive types as #[inline]
Change for issue #47792 .
2018-01-31 16:36:06 +08:00
penpalperson
deba3890c5
Changed back inline markings.
2018-01-30 05:31:38 -07:00
Clar Charr
aab712cbc8
Move time::Duration to libcore
2018-01-29 18:16:43 -05:00
penpalperson
81e49597bf
Added inline to fmt for debug implementations of primitives.
2018-01-28 21:55:05 -07:00
bors
21882aad72
Auto merge of #47204 - varkor:unsafecell-into_inner-safe, r=alexcrichton
...
Make UnsafeCell::into_inner safe
This fixes #35067 . It will require a Crater run as discussed in that
issue.
2018-01-28 19:01:51 +00:00
bors
0119b44270
Auto merge of #47772 - arthurprs:iter-position-bounds-check, r=dtolnay
...
Use the slice length to hint the optimizer about iter.position result
Using the len of the iterator doesn't give the same result.
That's also why we can't generalize it to all TrustedLen iterators.
Problem demo: https://godbolt.org/g/MXg2ae
Fix demo: https://godbolt.org/g/P8q5aZ
Second attempt of #47333
Third attempt of #45501
Fixes #45964
2018-01-28 10:41:34 +00:00
tinaun
838ddbf908
derive PartialEq and Eq for ParseCharError
...
unlike the other Parse*Error types, ParseCharError didn't have these implemented for whatever reason
2018-01-26 18:52:27 -05:00
arthurprs
4f7109a424
Use the slice length to hint the optimizer
...
Using the len of the iterator doesn't give the same result.
That's also why we can't generalize it to all TrustedLen iterators.
2018-01-26 12:49:14 +01:00
Simon Sapin
399dcd1127
Add missing micro version number component in stability attributes.
2018-01-24 22:25:42 +01:00
bors
9758ff9c0b
Auto merge of #47299 - cramertj:unsafe-placer, r=alexcrichton
...
Make core::ops::Place an unsafe trait
Consumers of `Place` would reasonably expect that the `pointer` function returns a valid pointer to memory that can actually be written to.
2018-01-24 07:22:22 +00:00
bors
a538fe7ce7
Auto merge of #46931 - clarcharr:float_bits_core, r=alexcrichton
...
Expose float from_bits and to_bits in libcore.
These methods have no dependencies on libm and thus should be offered in libcore.
2018-01-24 03:02:15 +00:00
Simon Sapin
f15c816932
Make PanicInfo::message available for std::panic! with a formatting string.
...
This enables PanicInfo’s Display impl to show the panic message in those cases.
2018-01-23 18:31:09 +01:00
Simon Sapin
0e60287b41
Implement Display for PanicInfo and Location
...
Due to being in libcore,
this impl cannot access PanicInfo::payload if it’s a String.
2018-01-23 18:04:50 +01:00
Simon Sapin
9e96c1ef7f
Add an unstable PanicInfo::message(&self) -> Option<&fmt::Arguments> method
2018-01-23 17:24:19 +01:00
Simon Sapin
2f98f4b12b
Move PanicInfo and Location to libcore
...
Per https://rust-lang.github.io/rfcs/2070-panic-implementation.html
2018-01-23 16:38:26 +01:00
Simon Sapin
b8ffc8a3d8
Add an unstable cast<U>() -> NonNull<U> method to NonNull<T>.
...
This is less verbose than going through raw pointers to cast with `as`.
2018-01-22 09:22:21 +01:00
varkor
f129374d11
Use repeat instead of RangeFrom
2018-01-21 19:45:27 +00:00
Simon Sapin
6461c9bdd3
Implement Eq, PartialEq, Ord, PartialOrd, and Hash for NonNull<_>
2018-01-21 10:30:24 +01:00
Simon Sapin
ad37e3fc01
Move Debug for NonNull impl closer to other trait impls
2018-01-21 09:48:58 +01:00
Simon Sapin
3f557947ab
NonNull ended up landing in 1.25
2018-01-21 09:48:23 +01:00
Guillaume Gomez
0e270fc842
Rollup merge of #47193 - cramertj:result-opts, r=TimNN
...
Add transpose conversions for nested Option and Result
These impls are useful when working with combinator
methods that expect an option or a result, but you
have a `Result<Option<T>, E>` instead of an `Option<Result<T, E>>`
or vice versa.
2018-01-20 22:32:42 +01:00
Simon Sapin
76b686f78d
Rename NonNull::empty to dangling.
2018-01-20 11:09:23 +01:00
Simon Sapin
a1db237cd4
Preserve formatting options in Debug for NonNull/Unique
2018-01-20 11:09:23 +01:00
Simon Sapin
943a9e707c
Fix some doc-comment examples for earlier API refactor
...
https://github.com/rust-lang/rust/pull/41064
2018-01-20 11:09:23 +01:00
Simon Sapin
55c50cd8ac
Stabilize std::ptr::NonNull
2018-01-20 11:09:23 +01:00
Simon Sapin
2d51e74580
Remove a deprecated (renamed) and unstable method of NonNull
2018-01-20 11:09:23 +01:00
Simon Sapin
c97c1f7dc3
Mark Unique as perma-unstable, with the feature renamed to ptr_internals.
2018-01-20 11:09:23 +01:00
Simon Sapin
fb03a49c25
Replace Unique<T> with NonZero<T> in Alloc trait
2018-01-20 10:55:16 +01:00
Simon Sapin
f19baf0977
Rename std::ptr::Shared to NonNull
...
`Shared` is now a deprecated `type` alias.
CC https://github.com/rust-lang/rust/issues/27730#issuecomment-352800629
2018-01-20 10:55:16 +01:00
Corey Farwell
ba5d7a66e8
Implement Debug for ptr::Shared and ptr::Unique.
...
Fixes https://github.com/rust-lang/rust/issues/46755 .
2018-01-20 10:55:16 +01:00
oberien
4a0da4cf2c
Spacing
2018-01-20 00:41:21 +01:00