Commit Graph

49131 Commits

Author SHA1 Message Date
Scott Olson
080994a189 Add 'mut' to MIR temp variable debug output. 2016-01-04 16:11:33 -06:00
Scott Olson
c9a7171e10 Pretty-print ReturnPointer as 'return' in MIR. 2016-01-04 16:11:33 -06:00
Scott Olson
19a50e4f2a Pretty-print static lvalues in MIR as just their path. 2016-01-04 16:11:33 -06:00
Scott Olson
6a33221ea5 Improve pretty-printing of references in MIR. 2016-01-04 16:11:33 -06:00
Scott Olson
522354415e Pretty-print aggregates more prettily in MIR. 2016-01-04 16:11:32 -06:00
Scott Olson
9db76f311d Use fmt::Result instead of Result<(), Error>. 2016-01-04 16:11:32 -06:00
Scott Olson
5a0c1b3a88 Print BasicBlock names in lowercase. 2016-01-04 16:11:32 -06:00
Scott Olson
661976cbd1 Add a human-readable textual form for MIR.
This can be dumped for a particular `fn` with the attribute
`#![rustc_mir(pretty = "filename.mir"]`.
2016-01-04 16:11:32 -06:00
bors
badc23b6ad Auto merge of #30602 - tsion:mir-graphviz-display, r=nikomatsakis
r? @nikomatsakis

cc @eddyb @nagisa

This PR changes most of the MIR graphviz debug output, making it smaller and more consistent. Also, it changes all fonts to monospace and adds a graph label containing the type of the `fn` the MIR is for and all the values (arguments, named bindings, and compiler temporaries).

I chose to re-write the graphviz output code instead of using the existing libgraphviz API because I found it much easier to prototype usage of various graphviz features when I had full control of the text output. It also makes the code simpler, I think.

Below are a bunch of example functions and links to their output images on the current nightly vs. this PR. File names starting with numbers (e.g. `80-factorial_fold-new.png`) are for closures. There's still a bunch of low hanging fruit to make it even better, particularly around aggregates and references.

I also imagine the textual output for MIR will be able to closely match the graphviz output. The list of statements should look identical and the terminators will be the same except that the text form will have a list of target blocks (potentially using the same edge labels as the graphviz does). I can PR a simple text output right after this PR.

This is my first large change to the compiler, so if anything should be reorganized/renamed/etc, let me know! Also, feel free to bikeshed the details of the output, though any minor changes can come in future PRs.

```rust
fn empty() {}
```

http://vps.solson.me/mir-graphviz/empty-new.png
http://vps.solson.me/mir-graphviz/empty-old.png

```rust
fn constant() -> i32 {
    42
}
```

http://vps.solson.me/mir-graphviz/constant-new.png
http://vps.solson.me/mir-graphviz/constant-old.png

```rust
fn increment(x: i32) -> i32 {
    x + 1
}
```

http://vps.solson.me/mir-graphviz/increment-new.png
http://vps.solson.me/mir-graphviz/increment-old.png

```rust
fn factorial_recursive(n: usize) -> usize {
    if n == 0 {
        1
    } else {
        n * factorial_recursive(n - 1)
    }
}
```

http://vps.solson.me/mir-graphviz/factorial_recursive-new.png
http://vps.solson.me/mir-graphviz/factorial_recursive-old.png

```rust
fn factorial_iterative(n: usize) -> usize {
    let mut prod = 1;
    for x in 1..n {
        prod *= x;
    }
    prod
}
```

http://vps.solson.me/mir-graphviz/factorial_iterative-new.png
http://vps.solson.me/mir-graphviz/factorial_iterative-old.png

```rust
fn factorial_fold(n: usize) -> usize {
    (1..n).fold(1, |prod, x| prod * x)
}
```

http://vps.solson.me/mir-graphviz/factorial_fold-new.png
http://vps.solson.me/mir-graphviz/factorial_fold-old.png
http://vps.solson.me/mir-graphviz/80-factorial_fold-new.png
http://vps.solson.me/mir-graphviz/80-factorial_fold-old.png

```rust
fn collatz(mut n: usize) {
    while n != 1 {
        if n % 2 == 0 {
            n /= 2;
        } else {
            n = 3 * n + 1;
        }
    }
}
```

http://vps.solson.me/mir-graphviz/collatz-new.png
http://vps.solson.me/mir-graphviz/collatz-old.png

```rust
fn multi_switch(n: usize) -> usize {
    match n {
        5 | 10 | 15 => 3,
        20 | 30 => 2,
        _ => 1,
    }
}
```

http://vps.solson.me/mir-graphviz/multi_switch-new.png
http://vps.solson.me/mir-graphviz/multi_switch-old.png
2016-01-04 20:24:35 +00:00
bors
5e8cb3819b Auto merge of #30523 - ubsan:wrapping_op_assign, r=eddyb
Add OpAssign to Wrapping<T>, plus fix some problems in core::num::wrapping

including, but not limited to:

* Testing Wrapping<T>
* Pull out a lot of broken code that doesn't need to be there with the new stage0 compiler
* Adding Rem and RemAssign to Wrapping<T>
* Removed 3 (assumed accidental) re-exports, which is a minor [breaking-change].
* Change shl and shr to take all integer types, instead of a usize; this is a more major [breaking-change], because of values that were inferred before, but brings us in line with the integer shifts.

Fixes #30524 and #30523
2016-01-04 18:37:21 +00:00
bors
b62289153c Auto merge of #30553 - luqmana:mir-match-arm-guards, r=nikomatsakis
Fixes #30527.

```Rust

fn main() {
    let _abc = match Some(101i8) {
        Some(xyz) if xyz > 100 => xyz,
        Some(_) => -1,
        None => -2
    };
}
```

Resulting MIR now includes the `Some(xyz)` arm, guard and all:
![match.dot](https://cloud.githubusercontent.com/assets/287063/11999413/066f7610-aa8b-11e5-927b-24215af57fc4.png)

~~Not quite sure how to write a test for this.~~ Thinking too hard, just tested the end result.

r? @nikomatsakis
2016-01-04 16:54:11 +00:00
bors
543bb03d3e Auto merge of #30690 - LawrenceWoodman:patch-2, r=steveklabnik
`fs::File` was being referenced without either calling via `std::fs::File` or by using `File` after having used `std::fs::File`.  Also `Path` was being referenced without first having used `std::path::Path`.
2016-01-04 14:09:15 +00:00
Lawrence Woodman
0c3d6b46ac Add missing use statements
fs::File was being referenced without either calling via std::fs::File or by using File after having used fs::File.  Also Path was being referenced without first having used std::path::Path.
2016-01-04 07:21:48 +00:00
bors
191ff2d8fd Auto merge of #30651 - nagisa:mir-fix-equality-checks, r=eddyb
This is not a fix to checks themselves per se (though we still use `Eq` MIR test instead of calling `PartialEq::eq`), but rather how we handle items we encounter in pattern position.

Previously we would just call `PartialEq` with the constant and the matchee, but now we essentially inline the constant instead. E.g. these two snippets are functionally equivalent at MIR level:

```
match val { Some(42) => true, _ => false }
```
and
```
const SECRET: Option<u8> = Some(42);
match val { SECRET => true, _ => false }
```

This approach also allows for more optimizations of matches. I.e. It can now exploit `SwitchInt` to switch on number inside a `Some` regardless of whether the value being an item or not.

This is based on @tsion’s already approved PR so I could reuse the file for more tests.

r? @eddyb
cc @nikomatsakis @tsion
2016-01-04 03:07:59 +00:00
bors
99e59dec5a Auto merge of #29732 - nathansizemore:master, r=steveklabnik 2016-01-04 00:27:40 +00:00
bors
8f11a9ef4e Auto merge of #30677 - diwic:master, r=bluss
Obviously we can't remove the character one past the end of the String. And we can't today either - we'll just panic at char_at() instead - but if we're going to keep that assertion, we should at least have a correct assertion.
2016-01-03 21:00:46 +00:00
bors
cae9267d47 Auto merge of #29949 - fhahn:issue-21659-show-relevant-trait-impls, r=arielb1
This PR for #21659 uses `DefId.for_each_relevant_impl()` to show other possible implementations in the "trait not implemented" message.
2016-01-03 19:14:20 +00:00
Nicholas Mazzuca
402259da38 Take out Op<T>/OpAssign<T> for Wrapping<T> 2016-01-02 15:34:55 -08:00
Florian Hahn
a8d60708ec Refactor candidate selection 2016-01-03 00:11:48 +01:00
Nicholas Mazzuca
cd3aa31e6d Finish test implementation 2016-01-02 14:36:28 -08:00
diwic
8b398ed823 Fix off-by-one in String::remove
Obviously we can't remove the character one past the end of the String. And we can't today either - we'll just panic at char_at() instead - but if we're going to keep that assertion, we should at least have a correct assertion.
2016-01-02 22:36:50 +01:00
Florian Hahn
25e4389866 Use for_each_impl 2016-01-02 19:47:41 +01:00
Florian Hahn
ba24fbd404 Manually check trait implementations 2016-01-02 19:47:02 +01:00
Florian Hahn
6093ea8039 Add more tests 2016-01-02 19:46:31 +01:00
Florian Hahn
2c52cb424a Limit displaying relevant trait impls to 4 2016-01-02 19:46:31 +01:00
bors
4744472fe0 Auto merge of #30264 - GuillaumeGomez:patch-5, r=Manishearth
r? @Manishearth

Also: should I merged both commits? Not sure if it's really useful to keep the first one.
2016-01-02 16:56:15 +00:00
bors
44f020883e Auto merge of #30675 - jimmantooth:master, r=apasel422 2016-01-02 13:58:57 +00:00
Scott Olson
56343cd653 Add 'mut' to temporary vars in MIR graphviz output. 2016-01-02 07:12:35 -06:00
James Mantooth
877d55c1e0 Grammar fixes 2016-01-02 01:26:22 -06:00
Nathan
3e9d5fea48 Adjusted heading and created dedicated section in std::io docs 2016-01-02 00:27:16 -05:00
Nathan
66e842b6de Links and punctionaction fixes. 2016-01-02 00:25:42 -05:00
Nathan
7f36a18df8 Added platform notes to std::fs public functions. 2016-01-02 00:25:42 -05:00
Guillaume Gomez
55955f5a45 Add E0463 error explanation 2016-01-02 02:39:45 +01:00
bors
d4b67cd7cc Auto merge of #30672 - nagisa:to-degrad-stab, r=sfackler
f64 methods have been stable since rust 1.0, but f32 never got stabilised.

I suggest backporting this to beta as well (needs changing stablilisation version then).

r? @aturon

Fixes https://github.com/rust-lang/rfcs/issues/1438
2016-01-01 22:42:04 +00:00
Simonas Kazlauskas
c921abf9c0 Stabilise f32::to_{degrees,radians} to match f64
f64 methods have been stable since rust 1.0, but f32 never got stabilised.
2016-01-02 00:07:16 +02:00
Florian Hahn
335298e7b6 Show similar trait implementations if no matching impl is found
closes #21659
2016-01-01 17:50:43 +01:00
bors
5446139387 Auto merge of #30670 - emoon:fs-copy-comment, r=steveklabnik
When looking in the documentation I often scan the examples the first thing I do. In these 3 cases it's not obvious which direction the operation happens by adding this comment it makes it more obvious.

r? @steveklabnik
2016-01-01 16:38:40 +00:00
bors
88e819f478 Auto merge of #30663 - apasel422:ll, r=bluss
CC #30642

r? @Gankro
2016-01-01 13:51:38 +00:00
Simonas Kazlauskas
add7410af6 Fix equality checks in matches 2016-01-01 14:55:57 +02:00
Nicholas Mazzuca
f96243295a In the middle of the implementation 2016-01-01 04:28:26 -08:00
Daniel Collin
9a7e2329f2 Added comment in which direction operation happens 2016-01-01 10:09:24 +01:00
bors
bfb4212ee2 Auto merge of #30648 - tshepang:missing-graves, r=steveklabnik 2016-01-01 00:38:43 +00:00
bors
9c53c9234b Auto merge of #30645 - tshepang:grammar, r=steveklabnik 2015-12-31 22:44:02 +00:00
bors
b9075d6f53 Auto merge of #30616 - arcnmx:cstr-asref, r=aturon
Are trait impls still insta-stable? Considering that this design has been around for a long time on `String` and `OsString` it probably doesn't matter much...

The `From` impl is a bit strange to me. It's stolen from `OsString` but I'm not really sure about it... `String` just impls `From<&str>` instead, would that make more sense?
2015-12-31 20:52:17 +00:00
Andrew Paseltiner
c9fd3d4f91 Make LinkedList and its read-only iterators covariant
CC #30642
2015-12-31 15:22:22 -05:00
arcnmx
53878e7546 CStr impl stability 2015-12-31 14:21:40 -05:00
arcnmx
965556d162 impl From<&CStr> for CString 2015-12-31 14:15:27 -05:00
bors
7d9543345c Auto merge of #28469 - DenisKolodin:master, r=steveklabnik 2015-12-31 18:57:27 +00:00
bors
53cd573bc8 Auto merge of #30660 - nagisa:rollup, r=steveklabnik
- Successful merges: #30365, #30565, #30590, #30630
- Failed merges:
2015-12-31 17:05:34 +00:00
Simonas Kazlauskas
7448f4861a Rollup merge of #30630 - tsion:mir-closure-args, r=nagisa
Previously, all references to closure arguments went to the argument before the one they should (e.g. to `arg1` when it was supposed to go to `arg2`). This was because the MIR builder did not account for the implicit arguments that come before the explicit arguments, and closures have one implicit argument - the struct containing the captures.

This is my test code and a diff of the MIR generated for the closure:

```rust
let a = 2i32;
let _f = |b: i32| -> i32 { a + b }:
```

```diff
--- old	2015-12-29 23:16:32.027926372 -0600
+++ new	2015-12-29 23:16:42.975400757 -0600
@@ -1,22 +1,22 @@
 fn(arg0: &[closure@closure-args.rs:8:14: 8:39 a:&i32], arg1: i32) -> i32 {
     let var0: i32; // b
     let tmp0: ();
     let tmp1: i32;
     let tmp2: i32;

     bb0: {
-        var0 = arg0;
+        var0 = arg1;
         tmp1 = (*(*arg0).0);
         tmp2 = var0;
         ReturnPointer = Add(tmp1, tmp2);
         goto -> bb1;
     }

     bb1: {
         return;
     }

     bb2: {
         diverge;
     }
 }
```

(If you're wondering where this text MIR output comes from, it's from another branch of mine waiting on https://github.com/rust-lang/rust/pull/30602 to get merged.)
2015-12-31 18:52:20 +02:00