Commit Graph

124265 Commits

Author SHA1 Message Date
Tomasz Miąsko
7a5d3abfb1 Avoid writes without any data in Write::write_all_vectored
Previously, when non-empty sequence of empty IoSlices have been provided
to `Write::write_all_vectored`, the buffers would be written as is with
`Write::write_vectored` and subsequently the return value `Ok(0)` would
be misinterpreted as an error.

Avoid writes without any data by advancing the buffers first. This
matches the documented behaviour of `Write::write_all_vectored`
and is analogous to what happens in `Write::write_all`.
2020-07-26 12:25:02 +02:00
Ralf Jung
069e84a118 move getting the initial value of a static into helper function 2020-07-26 12:02:03 +02:00
Yuki Okushi
8dcf86887c
Add test for issue-72911 2020-07-26 18:54:54 +09:00
Yuki Okushi
832d0a7667
Add test for issue-56445 2020-07-26 18:54:24 +09:00
Ralf Jung
debe597a9a check that even referencing a TLS static during CTFE fails 2020-07-26 11:12:22 +02:00
Ralf Jung
1d9efbbd8f Miri: replace canonical_alloc_id mechanism by extern_static_alloc_id which is called only when a pointer is 'imported' into the machine 2020-07-26 11:11:17 +02:00
bors
13f9aa1909 Auto merge of #74664 - pnadon:Miri-rename-undef-uninit, r=RalfJung
Miri rename undef uninit

Renamed parts of code within the `librustc_middle/mir/interpret/` directory.

Related issue [#71193](https://github.com/rust-lang/rust/issues/71193)
2020-07-26 09:09:43 +00:00
bors
461707c5a1 Auto merge of #74060 - kpp:remove_length_at_most_32, r=dtolnay
Remove trait LengthAtMost32

This is a continuation of https://github.com/rust-lang/rust/pull/74026 preserving the original burrbull's commit.

I talked to @burrbull, he suggested me to finish his PR.
2020-07-26 05:50:51 +00:00
bors
a4dd850720 Auto merge of #74735 - Aaron1011:fix/wf-impl-self-type, r=estebank
Use the proper span when WF-checking an impl self type
2020-07-26 03:03:19 +00:00
bors
8e5489ca67 Auto merge of #74728 - 16yuki0702:fix_typo, r=jonas-schievink
Fix rustc docs typo.
2020-07-26 01:20:15 +00:00
bors
bb85981a3a Auto merge of #74670 - tmandry:issue-73818, r=matthewjasper
Normalize bounds fully when checking defaulted types

When checking that the default type for `<T as X>::Y` is valid in this example:

```
trait X { type Y: PartialEq<<Self as X>::Y> }
impl X for T { default type Y = S; }
```

We will have to prove the bound `S: PartialEq<<T as X>::Y>`. In this case
we want `<T as X>::Y` to normalize to `S`. This is valid because we are
checking the default value specifically here. Add `<T as X>::Y = S` to the
ParamEnv for normalization _of the bound we are checking_ only.

Fixes #73818.

---

I noticed that adding this to the env for bounds checking didn't break any tests. Not sure if this is because we can't rely on it to prove anything, or because of missing test coverage.

r? @matthewjasper, @nikomatsakis
2020-07-25 23:37:07 +00:00
bors
d6953df146 Auto merge of #74760 - tmandry:roll, r=tmandry
Update rustfmt and rls

Closes #74080, #74081.

rls changes:
- deps: update racer and cargo

rustfmt changes:
- preparation for potential rustfmt 1.4.19 (#4283)
- chore: backport 8157a3f0afe978d3e953420577f8344db7e905bf
- deps: bump rustc-ap to v669
- deps: bump rustc-ap-* to v668
- deps: bump rustc-ap* to v666
- Use correct span for match arms with the leading pipe and attributes (#3975)
2020-07-25 21:53:56 +00:00
Tyler Mandry
e193cb1fde Update Cargo.lock 2020-07-25 14:26:31 -07:00
Tyler Mandry
5e6380adc5 Update rustfmt
Changes:
- preparation for potential rustfmt 1.4.19 (#4283)
- chore: backport 8157a3f0afe978d3e953420577f8344db7e905bf
- deps: bump rustc-ap to v669
- deps: bump rustc-ap-* to v668
- deps: bump rustc-ap* to v666
- Use correct span for match arms with the leading pipe and attributes (#3975)
2020-07-25 14:26:31 -07:00
Tyler Mandry
c6526b3d25 Update rls
Changes:
- deps: update racer and cargo
2020-07-25 14:26:27 -07:00
Tyler Mandry
e35d2867f1 Fix diagnostic by using predicate in GATs too 2020-07-25 13:52:47 -07:00
Tyler Mandry
31a3bb59ce Remove manual normalization in compare_projection_bounds 2020-07-25 13:48:29 -07:00
bors
8cb94fc552 Auto merge of #74246 - GuillaumeGomez:cleanup-e0719, r=Dylan-DPC
Clean up E0719 explanation

r? @Dylan-DPC
2020-07-25 20:11:20 +00:00
bors
f06e8e157c Auto merge of #74687 - estebank:bracketless-turbofish, r=matthewjasper
Detect turbofish missing surrounding angle brackets

Fix #74065.
2020-07-25 18:16:43 +00:00
Philippe Nadon
ef9c4f5cef Miri: rename "undef" to "uninit"
renamed Allocation::check_defined_and_ptr to Allocation::check_init_and_ptr

renamed Allocation::check_defined_and_ptr to Allocation::check_init_and_ptr

in src/librustc_middle/mir/interpret/allocation.rs

renamed Allocation::is_defined and Allocation::check_defined, fixed documentation

renamed Allocation::is_defined and Allocation::check_defined to is_init and check_init respectively.

Fixed documentation so it correctly refers to "initialization" instead of "defined"-ness

renamed Allocation::mark_definedness

renamed Allocation::mark_definedness to Allocation::mark_init

Renamed new_state parameter in Allocation::mark_init

Renamed new_state to is_init, as the latter is more descriptive.

renamed functions in AllocationDefinedness

renamed AllocationDefinedness::all_bytes_undef and AllocationDefinedness::mark_compressed_undef_range to no_bytes_init and mark_compressed_init_range respectively.

renamed AllocationDefinedness to InitMaskCompressed

renamed Immediate::to_scalar_or_undef

renamed to to_scalar_or_uninit

fixed comment references to "undef"

Changed comments referring to "undef" and "definedness" to "initialization" and "initialization state" in src/librustc_mir/interpret/memory.rs and src/librustc_middle/mir/interpret/allocation.rs

changed references to "undef" in comments and a variable

Changed some comments referring to "undef" to use "uninitialized" instead. Also changed a variable from "undef_end" to "uninit_end".
All changes were made within src/librustc_middle/mir/interpret/allocation.rs.

Changed more comments referring to undef

Changed comments to use "uninitialized" instead of "undef" in src/librustc_middle/mir/interpret/allocation.rs.
2020-07-25 11:04:55 -06:00
Oliver Scherer
79c0db4cc8 Clean up some uses of logging in ui tests 2020-07-25 18:36:44 +02:00
bors
fe08fb7b1e Auto merge of #74510 - LukasKalbertodt:fix-range-from-index-panic, r=hanna-kruppe
Fix panic message when `RangeFrom` index is out of bounds

Before, the `Range` method was called with `end = slice.len()`. Unfortunately, because `Range::index` first checks the order of the indices (start has to be smaller than end), an out of bounds index leads to `core::slice::slice_index_order_fail` being called. This prints the message 'slice index starts at 27 but ends at 10', which is worse than 'index 27 out of range for slice of length 10'. This is not only useful to normal users reading panic messages, but also for people inspecting assembly and being confused by `slice_index_order_fail` calls.

You can see the produced assembly [here](https://rust.godbolt.org/z/GzMGWf) and try on Playground [here](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=aada5996b2f3848075a6d02cf4055743). (By the way. this is only about which panic function is called; I'm pretty sure it does not improve anything about performance).
2020-07-25 16:27:24 +00:00
Takayuki Nakata
c81bbd05b9 Fix FP useless_conversion
Fix #5833.
2020-07-25 23:58:22 +09:00
Rich Kadel
12ddd6073a Fixed coverage map issues; better aligned with LLVM APIs
Found some problems with the coverage map encoding when testing with
more than one counter per function.

While debugging, I realized some better ways to structure the Rust
implementation of the coverage mapping generator. I refactored somewhat,
resulting in less code overall, expanded coverage of LLVM Coverage Map
capabilities, and much closer alignment with LLVM data structures, APIs,
and naming.

This should be easier to follow and easier to maintain.
2020-07-25 07:39:51 -07:00
bors
037d8e747d Auto merge of #74488 - CAD97:layout_for_value_raw, r=hanna-kruppe
re-add Layout::for_value_raw

Tracking issue: #69835

This was accidentally removed in #70362 56cbf2f22a.
Originally added in #69079.
2020-07-25 14:01:41 +00:00
bors
73ca84dfa1 Auto merge of #74741 - aticu:master, r=jonas-schievink
Improve documentation of `String::from_raw_parts`
2020-07-25 12:17:21 +00:00
aticu
44d8b4c8b1 Document UTF-8 validity of String::from_raw_parts 2020-07-25 14:06:32 +02:00
aticu
e7949bc2f4 Fix wrong name in String::from_raw_parts docs 2020-07-25 14:04:56 +02:00
Kan-Ru Chen
0e2ec8ca83 Ensure stack when parsing large if expressions 2020-07-25 18:58:18 +09:00
Kan-Ru Chen
304aca409d Ensure stack when type checking and building MIR for large if expressions 2020-07-25 18:58:11 +09:00
Steven Malis
617dd0a8b9 Fix commas. 2020-07-25 02:47:16 -07:00
Steven Malis
9e42d3e434 Pull out some shared code into a new function 2020-07-25 02:09:00 -07:00
Aaron Hill
116ad51c2c
Use the proper span when WF-checking an impl self type 2020-07-25 02:11:55 -04:00
bors
0e11fc8053 Auto merge of #74652 - poliorcetics:clarify-vec-drain-doc, r=jyn514
Improve the documentation for Vec::drain

Fixes #73844.

@rusbot modify labels: A-collections, C-enhancement, T-doc, T-libs
2020-07-25 03:38:30 +00:00
bors
c4e173472b Auto merge of #74017 - poliorcetics:where-keyword, r=jyn514
Document the where keyword

Partial fix of #34601 (and last PR for it 🎉).

This documents the `where` keyword.

@rustbot modify labels: T-doc,C-enhancement
2020-07-25 01:44:22 +00:00
16yuki0702
04b2deb381 Fix rustc docs typo. 2020-07-25 10:14:14 +09:00
bors
1e55f584b3 Auto merge of #73645 - poliorcetics:ref-keyword, r=jyn514
Document the ref keyword

Partial fix for #34601.

This documents the `ref` keyword with two examples, one failing to compile because the `ref` keyword is missing, and the same example fixed with the keyword inserted in the correct place.

It also explains (very *very* rapidly) the differences between `&` and `ref`.

I put a link to the best place I could find in the Reference but there may be something better that I didn't find.
2020-07-24 23:55:16 +00:00
bors
5ef299eb98 Auto merge of #74681 - RalfJung:miri-extern-fn, r=oli-obk
Miri: use extern fn to expose interpreter operations to program; fix leak checker on Windows

This PR realizes an idea that @oli-obk has been suggesting for a while: to use Miri-specific `extern` functions to provide some extra capabilities to the program. Initially, we have two of these methods, which libstd itself needs:
* `miri_start_panic`, which replaces the intrinsic of the same name (mostly for consistency, to avoid having multiple mechanisms for Miri-specific functionality).
* `miri_static_root`, which adds an allocation to a list of static "roots" that Miri considers as not having leaked (including all memory reachable through them). This is needed for https://github.com/rust-lang/miri/issues/1302.

We use `extern` functions instead of intrinsics for this so that user code can more easily call these Miri hoolks -- e.g. `miri_static_root` should be useful for https://github.com/rust-lang/miri/issues/1318.

The Miri side of this is at https://github.com/rust-lang/miri/pull/1485.

r? @oli-obk
2020-07-24 22:00:23 +00:00
bors
d8cf749570 Auto merge of #74507 - lcnr:const-prop-into-op, r=oli-obk
add `visit_operand` to const prop

r? @oli-obk
2020-07-24 20:10:34 +00:00
bors
fe07ece978 Auto merge of #74724 - Manishearth:rollup-plbt8fe, r=Manishearth
Rollup of 8 pull requests

Successful merges:

 - #72954 (revise RwLock for HermitCore)
 - #74367 (Rearrange the pipeline of `pow` to gain efficiency)
 - #74491 (Optimize away BitAnd and BitOr when possible)
 - #74639 (Downgrade glibc to 2.11.1 for ppc, ppc64 and s390x)
 - #74661 (Refactor `region_name`: add `RegionNameHighlight`)
 - #74692 (delay_span_bug instead of silent ignore)
 - #74698 (fixed error reporting for mismatched traits)
 - #74715 (Add a system for creating diffs across multiple mir optimizations.)

Failed merges:

r? @ghost
2020-07-24 18:03:55 +00:00
Alexis Bourget
654c180d05 Apply suggestion from review 2020-07-24 19:55:08 +02:00
Alexis Bourget
6af60d3e24 Fix nits, rework the second example of select (the one deliberately failing to compile) 2020-07-24 19:33:52 +02:00
Alexis Bourget
79f052bd4f Fix nits 2020-07-24 19:06:26 +02:00
Manish Goregaokar
5d1d94e7b8
Rollup merge of #74715 - oli-obk:mir_pass_diff, r=wesleywiser
Add a system for creating diffs across multiple mir optimizations.

r? @wesleywiser
2020-07-24 10:01:41 -07:00
Manish Goregaokar
7f24c7d39e
Rollup merge of #74698 - ayrtonm:handle-traitref-mismatch, r=estebank
fixed error reporting for mismatched traits

mismatched traits were previously referred to as types

closes #72217
2020-07-24 10:01:39 -07:00
Manish Goregaokar
db83a21de1
Rollup merge of #74692 - Mark-Simulacrum:delay-bug, r=pnkfelix
delay_span_bug instead of silent ignore

This is a follow-up to #74557.

r? @pnkfelix
2020-07-24 10:01:38 -07:00
Manish Goregaokar
ceaef731a9
Rollup merge of #74661 - SNCPlay42:lifetime-names-refactor, r=estebank
Refactor `region_name`: add `RegionNameHighlight`

This PR does not change any diagnostics itself, rather it enables further code changes, but I would like to get approval for the refactoring first before making use of it.

In `rustc_mir::borrow_check::diagnostics::region_name`, there is code that allows for, when giving a synthesized name like `'1` to an anonymous lifetime, pointing at e.g. the exact '`&`' that introduces the lifetime.

This PR decouples that code from the specific case of arguments, adding a new enum `RegionNameHighlight`, enabling future changes to use it in other places.

This allows:

* We could change the other `AnonRegionFrom*` variants to use `RegionNameHighlight` to precisely point at where lifetimes are introduced in other locations when they have type annotations, e.g. a closure return `|...| -> &i32`.
  * Because of how async functions are lowered this affects async functions as well, see #74072
* for #74597, we could add a second, optional `RegionNameHighlight` to the `AnonRegionFromArgument` variant that highlights a lifetime in the return type of a function when, due to elision, this is the same as the argument lifetime.
* in https://github.com/rust-lang/rust/issues/74497#issuecomment-6606229707 I noticed that a diagnostic was trying to introduce a lifetime `'2` in the opaque type `impl std::future::Future`. The code for the case of arguments has [code to handle cases like this](bbebe7351f/src/librustc_mir/borrow_check/diagnostics/region_name.rs (L365)) but not the others. This refactoring would allow the same code path to handle this.
  * It might be appropriate to add another variant of `RegionNameHighlight` to say something like `lifetime '1 appears in the opaque type impl std::future::Future`.

These are quite a few changes so I thought I would make sure the refactoring is OK before I start making changes that rely on it. :)
2020-07-24 10:01:36 -07:00
Manish Goregaokar
a4024ba4eb
Rollup merge of #74639 - msirringhaus:master, r=cuviper
Downgrade glibc to 2.11.1 for ppc, ppc64 and s390x

As discussed in #73782
I've tested these changes on rust 1.43.0 for all the specified archs and used the resulting binaries to bootstrap building rust 1.43.1.
I've also shortly tested these changes on master on ppc64.
2020-07-24 10:01:34 -07:00
Manish Goregaokar
e59effed30
Rollup merge of #74491 - xldenis:constant-binop-opt, r=oli-obk
Optimize away BitAnd and BitOr when possible

This PR lets `const_prop` optimize away `a | true == true` , `a & false == false` and `a * 0 = 0`. While I was writing this I've realized that constant propagation misses a lot of opportunities. For example:  https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=2a4b45e772f214210a36749b27223bb0

Constant propagation doesn't seem to... propagate constants, additionally the way constant propagation is currently setup makes it tricky to add cases like `a | false == a`.

I tried to organize `eval_rvalue_with_identities` to make the pattern of the optimizations easier to see but it still obscurs what should be a simple peephole optmization.

cc @oli-obk
2020-07-24 10:01:32 -07:00
Manish Goregaokar
3226d72338
Rollup merge of #74367 - Neutron3529:patch-1, r=nagisa
Rearrange the pipeline of `pow` to gain efficiency

The check of the `exp` parameter seems useless if we execute the while-loop more than once.
The original implementation of `pow` function using one more comparison if the `exp==0` and may break the pipeline of the cpu, which may generate a slower code.
The performance gap between the old and the new implementation may be small, but IMO, at least the newer one looks more beautiful.

---

bench prog:
```
#![feature(test)]
extern crate test;
#[macro_export]macro_rules! timing{
($a:expr)=>{let time=std::time::Instant::now();{$a;}print!("{:?} ",time.elapsed())};
($a:expr,$b:literal)=>{let time=std::time::Instant::now();let mut a=0;for _ in 0..$b{a^=$a;}print!("{:?} {} ",time.elapsed(),a)}
}
#[inline]
pub fn pow_rust(x:i64, mut exp: u32) -> i64 {
    let mut base = x;
    let mut acc = 1;
    while exp > 1 {
        if (exp & 1) == 1 {
            acc = acc * base;
        }
        exp /= 2;
        base = base * base;
    }
    if exp == 1 {
        acc = acc * base;
    }
    acc
}
#[inline]
pub fn pow_new(x:i64, mut exp: u32) -> i64 {
    if exp==0{
        1
    }else{
        let mut base = x;
        let mut acc = 1;
        while exp > 1 {
            if (exp & 1) == 1 {
                acc = acc * base;
            }
            exp >>= 1;
            base = base * base;
        }
        acc * base
    }
}

fn main(){
let a=2i64;
let b=1_u32;
println!();
timing!(test::black_box(a).pow(test::black_box(b)),100000000);
timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
println!();
timing!(test::black_box(a).pow(test::black_box(b)),100000000);
timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
println!();
timing!(test::black_box(a).pow(test::black_box(b)),100000000);
timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
println!();
timing!(test::black_box(a).pow(test::black_box(b)),100000000);
timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
println!();
timing!(test::black_box(a).pow(test::black_box(b)),100000000);
timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
println!();
timing!(test::black_box(a).pow(test::black_box(b)),100000000);
timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
println!();
timing!(test::black_box(a).pow(test::black_box(b)),100000000);
timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
println!();
timing!(test::black_box(a).pow(test::black_box(b)),100000000);
timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
println!();
}
```
bench in my laptop:
```
neutron@Neutron:/me/rust$ rc commit.rs
rustc commit.rs  && ./commit

3.978419716s 0 4.079765171s 0 3.964630622s 0
3.997127013s 0 4.260304804s 0 3.997638211s 0
3.963195544s 0 4.11657718s 0 4.176054164s 0
3.830128579s 0 3.980396122s 0 3.937258567s 0
3.986055948s 0 4.127804162s 0 4.018943411s 0
4.185568857s 0 4.217512517s 0 3.98313603s 0
3.863018225s 0 4.030447988s 0 3.694878237s 0
4.206987927s 0 4.137608047s 0 4.115564664s 0
neutron@Neutron:/me/rust$ rc commit.rs -O
rustc commit.rs -O && ./commit

162.111993ms 0 165.107125ms 0 166.26924ms 0
175.20479ms 0 205.062565ms 0 176.278791ms 0
174.408975ms 0 166.526899ms 0 201.857604ms 0
146.190062ms 0 168.592821ms 0 154.61411ms 0
199.678912ms 0 168.411598ms 0 162.129996ms 0
147.420765ms 0 209.759326ms 0 154.807907ms 0
165.507134ms 0 188.476239ms 0 157.351524ms 0
121.320123ms 0 126.401229ms 0 114.86428ms 0
```
2020-07-24 10:01:30 -07:00