Commit Graph

58759 Commits

Author SHA1 Message Date
Eduard-Mihai Burtescu
3a5b45aae5 Rollup merge of #37667 - alexcrichton:fix-llvm-version, r=japaric
rustc_llvm: Require 3.9 for --link-static

Apparently stock Ubuntu 16.04 includes LLVM 3.8 which doesn't have this flag.
2016-11-10 03:46:29 +02:00
Eduard-Mihai Burtescu
e733667210 Rollup merge of #37664 - est31:master, r=nrc
Document the question mark operator in reference and the book's syntax index

The question mark operator will be stabilized for the Rust 1.13 release (unfortunately). Even though I don't like the operator, it still should be documented in the syntax index in the book and in the reference.

Maybe there are people who also want to change the book's chapters on error handling, depending on their views of what idiomatic error handling is, now that the operator is stable, but I don't want to and I'd prefer to keep this PR focused on the reference and syntax index only.

Please also apply this PR to the beta branch of rust.
2016-11-10 03:46:28 +02:00
Eduard-Mihai Burtescu
8cc6be1bcb Rollup merge of #37661 - brson:qmarkstab, r=nikomatsakis
question_mark was stabilized in 1.13
2016-11-10 03:46:28 +02:00
Eduard-Mihai Burtescu
368281a110 Rollup merge of #37412 - eddyb:lazy-6, r=nikomatsakis
[6/n] rustc: transition HIR function bodies from Block to Expr.

_This is part of a series ([prev](https://github.com/rust-lang/rust/pull/37408) | [next](https://github.com/rust-lang/rust/pull/37676)) of patches designed to rework rustc into an out-of-order on-demand pipeline model for both better feature support (e.g. [MIR-based](https://github.com/solson/miri) early constant evaluation) and incremental execution of compiler passes (e.g. type-checking), with beneficial consequences to IDE support as well.
If any motivation is unclear, please ask for additional PR description clarifications or code comments._

<hr>

The main change here is that functions and closures both use `Expr` instead of `Block` for their bodies.
For closures this actually allows a honest representation of brace-less closure bodies, e.g. `|x| x + 1` is now distinguishable from `|x| { x + 1 }`, therefore this PR is `[syntax-breaking]` (cc @Manishearth).

Using `Expr` allows more logic to be shared between constant bodies and function bodies, with some small such changes already part of this PR, and eventually easing #35078 and per-body type tables.

Incidentally, there used to be some corners cut here and there and as such I had to (re)write divergence tracking for type-checking so that it is capable of understanding basic structured control-flow:

``` rust
fn a(x: bool) -> i32 {
    // match also works (as long as all arms diverge)
    if x { panic!("true") } else { return 1; }
    0 // "unreachable expression" after this PR
}
```

And since liveness' "not all control paths return a value" moved to type-checking we can have nice things:

``` rust
// before & after:
fn b() -> i32 { 0; } // help: consider removing this semicolon

// only after this PR
fn c() -> i32 { { 0; } } // help: consider removing this semicolon
fn d() { let x: i32 = { 0; }; } // help: consider removing this semicolon
fn e() { f({ 0; }); } // help: consider removing this semicolon
```
2016-11-10 03:46:28 +02:00
Eduard-Mihai Burtescu
8d4a3500ff Rollup merge of #37402 - eddyb:lazy-3, r=nikomatsakis
[3/n] rustc: unify and simplify managing associated items.

_This is part of a series ([prev](https://github.com/rust-lang/rust/pull/37401) | [next](https://github.com/rust-lang/rust/pull/37404)) of patches designed to rework rustc into an out-of-order on-demand pipeline model for both better feature support (e.g. [MIR-based](https://github.com/solson/miri) early constant evaluation) and incremental execution of compiler passes (e.g. type-checking), with beneficial consequences to IDE support as well.
If any motivation is unclear, please ask for additional PR description clarifications or code comments._

<hr>

`ImplOrTraitItem`/`impl_or_trait_item` have been renamed to `AssociatedItem`/`associated_item`.

The common fields from (what used to be) `ty::ImplOrTraitItem`'s variants have been pulled out, leaving only an `AssociatedKind` C-like enum to distinguish between methods, constants and types.

The type information has been removed from `AssociatedItem`, and as such the latter can now be computed on-demand from the local HIR map, i.e. an extern-crate-enabled `TraitItem | ImplItem`.
It may be moved to HIR in the future, if we intend to start using HIR types cross-crate.

`ty::ExplicitSelfCategory` has been moved to `rustc_typeck` and is produced on-demand from the signature of the method, and a `method_has_self_argument` field on `AssociatedItem`, which is used to indicate that the first argument is a sugary "method receiver" and as such, method call syntax can be used.
2016-11-10 03:46:27 +02:00
Esteban Küber
43aed325aa Show one error for duplicated type definitions
For the following code:

```rustc
struct Bar;
struct Bar;

fn main () {
}
```

show

```nocode
error[E0428]: a type named `Bar` has already been defined in this module
  --> src/test/compile-fail/E0428.rs:12:1
   |
11 | struct Bar;
   | ----------- previous definition of `Bar` here
12 | struct Bar;
   | ^^^^^^^^^^^

error: aborting due to previous error
```

instead of

```nocode
error[E0428]: a type named `Bar` has already been defined in this module
  --> src/test/compile-fail/E0428.rs:12:1
   |
11 | struct Bar;
   | ----------- previous definition of `Bar` here
12 | struct Bar;
   | ^^^^^^^^^^^

error[E0428]: a value named `Bar` has already been defined in this module
  --> src/test/compile-fail/E0428.rs:12:1
   |
11 | struct Bar;
   | ----------- previous definition of `Bar` here
12 | struct Bar;
   | ^^^^^^^^^^^

error: aborting due to 2 previous errors
```
2016-11-09 16:19:49 -08:00
Eduard Burtescu
de0ffadb67 rustc: unify and simplify managing associated items. 2016-11-10 02:06:34 +02:00
Eduard Burtescu
8e9106c531 tests: fix fallout in pretty-printing output exact-match tests. 2016-11-10 01:44:53 +02:00
Eduard Burtescu
9ce1044bd5 tests: fix fallout in flowgraph graphviz comparison dot files. 2016-11-10 01:44:53 +02:00
Eduard Burtescu
6b3cc0b8c8 rustc_typeck: correctly track "always-diverges" and "has-type-errors". 2016-11-10 01:44:53 +02:00
Eduard Burtescu
ff0830d749 rustc: use an Expr instead of a Block for function bodies. 2016-11-10 01:44:45 +02:00
Eduard Burtescu
49772fbf5d syntax: don't fake a block around closures' bodies during parsing. 2016-11-10 01:44:45 +02:00
bors
0b46947d35 Auto merge of #37603 - arielb1:max-slice-length, r=nikomatsakis
_match: correct max_slice_length logic

The logic used to be wildly wrong, but before the HAIR patch its wrongness was in most cases hidden by another bug.

Fixes #37598.

r? @nikomatsakis
2016-11-09 15:13:58 -08:00
bors
da2ce22768 Auto merge of #37670 - eddyb:rollup, r=eddyb
Rollup of 15 pull requests

- Successful merges: #36868, #37134, #37229, #37250, #37370, #37428, #37432, #37472, #37524, #37614, #37622, #37627, #37636, #37644, #37654
- Failed merges: #37463, #37542, #37645
2016-11-09 11:58:25 -08:00
Eduard-Mihai Burtescu
60c74b76c4 Rollup merge of #37654 - michaelwoerister:test-let-ich, r=nikomatsakis
ICH: Add tests for let- and match-expressions.

r? @nikomatsakis
2016-11-09 20:51:19 +02:00
Eduard-Mihai Burtescu
a41a87eb74 Rollup merge of #37644 - nrc:save-derive-span, r=eddyb
save-analysis: don't choke on stripped doc attributes
2016-11-09 20:51:19 +02:00
Eduard-Mihai Burtescu
3292f407e7 Rollup merge of #37636 - karpinski:issue-34915, r=nikomatsakis
Marking the 'no-stack-check' codegen option as deprecated (Issue #34915)

Attempts to finish resolving issue #34915. Based on pull request #35156, which was closed due to inactivity.
2016-11-09 20:51:19 +02:00
Eduard-Mihai Burtescu
e0894cafd5 Rollup merge of #37627 - GuillaumeGomez:missing_urls_bis, r=frewsxcv
Add missing urls and few local rewrites

r? @steveklabnik
2016-11-09 20:51:18 +02:00
Eduard-Mihai Burtescu
aad4f29f7b Rollup merge of #37622 - ollie27:cstring, r=alexcrichton
Slightly optimise CString

Avoid a reallocation in CString::from and CStr::to_owned.
2016-11-09 20:51:18 +02:00
Eduard-Mihai Burtescu
5ebd7c50a0 Rollup merge of #37614 - keeperofdakeys:proc_macro, r=jseyfried
macros 1.1: Allow proc_macro functions to declare attributes to be mark as used

This PR allows proc macro functions to declare attribute names that should be marked as used when attached to the deriving item. There are a few questions for this PR.

- Currently this uses a separate attribute named `#[proc_macro_attributes(..)]`, is this the best choice?
- In order to make this work, the `check_attribute` function had to be modified to not error on attributes marked as used. This is a pretty large change in semantics, is there a better way to do this?
- I've got a few clones where I don't know if I need them (like turning `item` into a `TokenStream`), can these be avoided?
- Is switching to `MultiItemDecorator` the right thing here?

Also fixes https://github.com/rust-lang/rust/issues/37563.
2016-11-09 20:51:18 +02:00
Eduard-Mihai Burtescu
3d2ffa06ea Rollup merge of #37524 - alexcrichton:vendor, r=brson
Vendor all rustbuild dependencies in this repo

This commit vendors all crates.io dependencies into the rust-lang/rust repository using the `cargo-vendor` tool. This is done in an effort to make rustbuild distro-ready by ensuring that our source tarballs are self-contained units which don't need extraneous network downloads.

A new `src/vendor` directory is created with all vendored crates, and Cargo, when using rustbuild, is configured to use this directory. Over time we can deduplicate this directory with the actual src tree (e.g. src/librustc_serialize, src/liblibc, src/libgetopts, ...). For now though that's left to a separate commit.
2016-11-09 20:51:17 +02:00
Eduard-Mihai Burtescu
e10e49d815 Rollup merge of #37472 - joshtriplett:doc-fmt-write-io-write, r=brson
Document convention for using both fmt::Write and io::Write

Using a trait's methods (like `Write::write_fmt` as used in `writeln!` and other macros) requires importing that trait directly (not just the module containing it).  Both `fmt::Write` and `io::Write` provide compatible `Write::write_fmt` methods, and code can use `writeln!` and other macros on both an object implementing `fmt::Write` (such as a `String`) and an object implementing `io::Write` (such as `Stderr`).  However, importing both `Write` traits produces an error due to the name conflict.

The convention I've seen renames both of them on import, to `FmtWrite` and `IoWrite` respectively.  Document that convention in the Rust documentation for `write!` and `writeln!`, with examples.
2016-11-09 20:51:17 +02:00
Eduard-Mihai Burtescu
d712882228 Rollup merge of #37432 - achanda:send_to, r=alexcrichton
Clarify that send_to might panic in certain cases

Closes #34202

r? @alexcrichton
2016-11-09 20:51:16 +02:00
Eduard-Mihai Burtescu
bd9969fb11 Rollup merge of #37428 - estebank:generic-type-error-span, r=sanxiyn
Point to type argument span when used as trait

Given the following code:

``` rust
struct Foo<T: Clone>(T);

use std::ops::Add;

impl<T: Clone, Add> Add for Foo<T> {
  type Output = usize;

  fn add(self, rhs: Self) -> Self::Output {
    unimplemented!();
  }
}
```

present the following output:

``` nocode
error[E0404]: `Add` is not a trait
 --> file3.rs:5:21
  |
5 | impl<T: Clone, Add> Add for Okok<T> {
  |                ---  ^^^ expected trait, found type parameter
  |                |
  |                type parameter defined here
```

Fixes #35987.
2016-11-09 20:51:16 +02:00
Eduard-Mihai Burtescu
7f2853fda3 Rollup merge of #37370 - estebank:signature-2-empire-strikes-back, r=nikomatsakis
Include type of missing trait methods in error

Provide either a span pointing to the original definition of missing
trait items, or a message with the inferred definitions.

Fixes #24626. Follow up to PR #36371.

If PR #37369 lands, missing trait items that present a multiline span will be able to show the entirety of the item definition on the error itself, instead of just the first line.
2016-11-09 20:51:16 +02:00
Eduard-Mihai Burtescu
6c7b43375a Rollup merge of #37250 - liigo:rustdoc-unsafe-fns, r=steveklabnik
rustdoc: mark unsafe fns in module page with superscript icons

Note: I'v changed the mark style. Now use superscript ⚠(U+26A0) (the old one is '[Unsafe]' literal).
Basically per https://botbot.me/mozilla/rust-docs/2016-10-19/?msg=75112017&page=1

![unsafe-fn-icon](https://cloud.githubusercontent.com/assets/346530/19633650/7f6e1eea-99e6-11e6-8d09-31aec83e46a5.png)

![unsafe-fn](https://cloud.githubusercontent.com/assets/346530/19472050/39daded2-9558-11e6-9148-3cb12afd1c9a.png)
2016-11-09 20:51:15 +02:00
Eduard-Mihai Burtescu
dc8ac2679a Rollup merge of #37229 - nnethercote:FxHasher, r=nikomatsakis
Replace FNV with a faster hash function.

Hash table lookups are very hot in rustc profiles and the time taken within `FnvHash` itself is a big part of that. Although FNV is a simple hash, it processes its input one byte at a time. In contrast, Firefox has a homespun hash function that is also simple but works on multiple bytes at a time. So I tried it out and the results are compelling:

```
futures-rs-test  4.326s vs  4.212s --> 1.027x faster (variance: 1.001x, 1.007x)
helloworld       0.233s vs  0.232s --> 1.004x faster (variance: 1.037x, 1.016x)
html5ever-2016-  5.397s vs  5.210s --> 1.036x faster (variance: 1.009x, 1.006x)
hyper.0.5.0      5.018s vs  4.905s --> 1.023x faster (variance: 1.007x, 1.006x)
inflate-0.1.0    4.889s vs  4.872s --> 1.004x faster (variance: 1.012x, 1.007x)
issue-32062-equ  0.347s vs  0.335s --> 1.035x faster (variance: 1.033x, 1.019x)
issue-32278-big  1.717s vs  1.622s --> 1.059x faster (variance: 1.027x, 1.028x)
jld-day15-parse  1.537s vs  1.459s --> 1.054x faster (variance: 1.005x, 1.003x)
piston-image-0. 11.863s vs 11.482s --> 1.033x faster (variance: 1.060x, 1.002x)
regex.0.1.30     2.517s vs  2.453s --> 1.026x faster (variance: 1.011x, 1.013x)
rust-encoding-0  2.080s vs  2.047s --> 1.016x faster (variance: 1.005x, 1.005x)
syntex-0.42.2   32.268s vs 31.275s --> 1.032x faster (variance: 1.014x, 1.022x)
syntex-0.42.2-i 17.629s vs 16.559s --> 1.065x faster (variance: 1.013x, 1.021x)
```

(That's a stage1 compiler doing debug builds. Results for a stage2 compiler are similar.)

The attached commit is not in a state suitable for landing because I changed the implementation of FnvHasher without changing its name (because that would have required touching many lines in the compiler). Nonetheless, it is a good place to start discussions.

Profiles show very clearly that this new hash function is a lot faster to compute than FNV. The quality of the new hash function is less clear -- it seems to do better in some cases and worse in others (judging by the number of instructions executed in `Hash{Map,Set}::get`).

CC @brson, @arthurprs
2016-11-09 20:51:15 +02:00
Eduard-Mihai Burtescu
2321d11b8c Rollup merge of #37134 - GuillaumeGomez:display_tag, r=steveklabnik
Print more tags in rustdoc

r? @steveklabnik

cc @frewsxcv

A little screenshot:

<img width="1440" alt="screen shot 2016-10-13 at 01 41 53" src="https://cloud.githubusercontent.com/assets/3050060/19331745/873cd71e-90e6-11e6-88f8-715668366a3f.png">
2016-11-09 20:51:15 +02:00
Eduard-Mihai Burtescu
f433209248 Rollup merge of #36868 - petrochenkov:adtstab, r=nikomatsakis
Partially stabilize RFC 1506 "Clarify relationships between ADTs"

Lifted restrictions on tuple structs/variants are stabilized, i.e. `S{..}` can be used with any structs and empty tuple structs are permitted without feature gate.
Numeric fields in struct expressions/patterns `S { 0: a, 1: b }` are **NOT** stabilized.
This was implemented 1.5 months ago in Rust 1.12, but this is a tiny technical change that could probably go even without RFC/stabilization period.

cc https://github.com/rust-lang/rust/issues/35626 https://github.com/rust-lang/rust/pull/36871
r? @nikomatsakis
2016-11-09 20:51:15 +02:00
Alex Crichton
cc2c812701 rustc_llvm: Require 3.9 for --link-static
Apparently stock Ubuntu 16.04 includes LLVM 3.8 which doesn't have this flag.
2016-11-09 09:12:38 -08:00
bors
bca365e688 Auto merge of #36520 - estebank:dataless-enum, r=brson
Reword error when data-less enum variant called as function

Given a file like:

``` rust
enum Test {
    Variant,
    Variant2 {a: u32},
}

fn main(){
    let x = Test::Variant("Hello");
    let y = Test::Variant2("World");
}
```

Both errors now look similar:

``` bash
error[E0423]: `Test::Variant2` is the name of a struct or struct variant, but this expression uses it like a function name
  --> file3.rs:10:13
   |
10 |     let y = Test::Variant2("Hello");
   |             ^^^^^^^^^^^^^^ struct called like a function
   |
   = help: did you mean to write: `Test::Variant2 { /* fields */ }`?

error: `Test::Variant` is the name of a data-less enum, but this expression uses it like a function name
 --> file3.rs:9:13
  |
9 |     let x = Test::Variant("World");
  |             ^^^^^^^^^^^^^^^^^^^^^^ data-less enum called like a function
  |
  = help: did you mean to write: `Test::Variant`?
note: defined here
 --> file3.rs:2:5
  |
2 |     Variant,
  |     ^^^^^^^

error: aborting due to previous error
```

Re: #28533
2016-11-09 08:51:23 -08:00
Jonas Schievink
fb7a8294f8 proc_macro_plugin: Wrap nonexistent filename in <>
I'm not sure how big of an issue this can become in practice, but `FileMap`s made from something that's not a file are supposed to wrap the file name in `<>`.

For an example fix, see kevinmehall/rust-peg@332fd4dbae. There, it caused cargo to always recompile a crate using rust-peg, even when nothing was changed, because cargo sees that the dummy file doesn't exist.
2016-11-09 14:55:39 +01:00
bors
02aa42860d Auto merge of #37657 - steveklabnik:rollup, r=steveklabnik
Rollup of 8 pull requests

- Successful merges: #35102, #37425, #37483, #37588, #37601, #37610, #37650, #37652
- Failed merges:
2016-11-09 05:35:23 -08:00
bors
966c70085a Auto merge of #37651 - alexcrichton:fix-deps, r=alexcrichton
rustbuild: Fix dependencies of check-error-index

This depends on the error index actually existing rather than just the tool to
generate the error index.
2016-11-09 01:15:20 -08:00
Abhishek Chanda
50bfc23816 Clarify that send_to might return an error in certain cases
Closes #34202
2016-11-09 09:03:33 +00:00
est31
1e9aad752b Document the question mark operator 2016-11-09 08:37:05 +01:00
Wesley Wiser
a62a67cc6a Add documentation for some of the add/sub/mul intrinsics
Part of #34338
2016-11-08 22:03:27 -05:00
Wesley Wiser
a3f75fb072 Add documentation for the volatile_read and volatile_write intrinsics
Part of #34338
2016-11-08 22:03:23 -05:00
Wesley Wiser
bc4fc6567c Add documentation for many of the atomic_* intrinsics
Part of #34338
2016-11-08 22:03:08 -05:00
Brian Anderson
ba92b01e9a question_mark was stabilized in 1.13 2016-11-09 02:35:36 +00:00
Esteban Küber
a820d99eb2 Group unused import warnings per path list
Given a file

```rust
use std::collections::{BinaryHeap, BTreeMap, BTreeSet};

fn main() {}
```

Show a single warning, instead of three for each unused import:

```nocode
warning: unused imports, #[warn(unused_imports)] on by default
 --> foo.rs:1:24
  |
1 | use std::collections::{BinaryHeap, BTreeMap, BTreeSet};
  |                        ^^^^^^^^^^  ^^^^^^^^  ^^^^^^^^
```

Include support for lints pointing at `MultilineSpan`s, instead of just
`Span`s.
2016-11-08 17:44:21 -08:00
Niko Matsakis
c4285359a4 introduce a fudge_regions_if_ok to address false region edges
Fixes #37655.
2016-11-08 18:58:12 -05:00
Esteban Küber
3edb4fc563 Point to type argument span when used as trait
Given the following code:

```rust
struct Foo<T: Clone>(T);

use std::ops::Add;

impl<T: Clone, Add> Add for Foo<T> {
    type Output = usize;

    fn add(self, rhs: Self) -> Self::Output {
      unimplemented!();
    }
}
```

present the following output:

```nocode
error[E0404]: `Add` is not a trait
 --> file3.rs:5:21
  |
5 | impl<T: Clone, Add> Add for Okok<T> {
  |                ---  ^^^ expected trait, found type parameter
  |                |
  |                type parameter defined here
```
2016-11-08 14:17:18 -08:00
Alex Crichton
860c6ab3c1 rustbuild: Fix check-error-index step
If it ran too soon there wasn't a `test` directory lying around but we'll need
one!
2016-11-08 13:49:48 -08:00
Mikhail Modin
cfdf7633f0 Improve "Doesn't live long enough" error
case with temporary variable
2016-11-09 00:28:50 +03:00
Steve Klabnik
5c92c2c6a9 Rollup merge of #37652 - SimonSapin:arc-count-doc, r=alexcrichton
More proeminent warning in Arc::{strong,weak}_count docs.

CC https://github.com/rust-lang/rust/issues/28356#issuecomment-259212258
2016-11-08 16:20:58 -05:00
Steve Klabnik
48c4d1740e Rollup merge of #37650 - GuillaumeGomez:missing_urls_product, r=steveklabnik
Add missing urls for Sum and Product traits

r? @steveklabnik
2016-11-08 16:20:57 -05:00
Steve Klabnik
5bfc21dcb6 Rollup merge of #37610 - oldmanmike:unary-and-binary-tests, r=michaelwoerister
Add unary and binary tests for incr-comp

This is my draft of tests for unary and binary expressions as desired by #37520 for use in the test suite for hashes in incremental compilation. Feedback would be wonderful, if there's any changes I need to make I would appreciate the code review.

?r @michaelwoerister
2016-11-08 16:20:57 -05:00
Steve Klabnik
d2fd20152b Rollup merge of #37601 - brson:book-without-tiers, r=steveklabnik
book: Removed platform compatibility table, link to the forge

The content is duplicated, and it doesn't need to be in this location.
It's mostly trivia that doesn't apply to most of the audience.

The forge is up to date.

r? @steveklabnik cc @alexcrichton
2016-11-08 16:20:57 -05:00
Steve Klabnik
e6b6586667 Rollup merge of #37588 - GuillaumeGomez:missing_io_urls, r=frewsxcv
Add missing urls on io structs

r? @steveklabnik
2016-11-08 16:20:57 -05:00