Commit graph

65107 commits

Author SHA1 Message Date
Felix S. Klock II 163d40d1d8 Update test/codegen/drop.rs to reflect inconsequential change in basic block ordering. 2017-06-12 13:06:42 +02:00
Felix S. Klock II 5eff019779 Update basic_assignment test to reflect small changes to codegen. 2017-06-12 13:06:42 +02:00
Felix S. Klock II 9dd55276a6 Leverage mir-opt to encode tests for EndRegion.
The tests use `-Z identify_regions` so one can eyeball output for
sanity. The tests with closures use `-Z span_free_formats` so that
host-specific paths do not get embedded into the dumped MIR.

The tests check against MIR dump output immediately prior to borrowck
(determined by hand to be the dump from after the "qualify-consts"
pass) since that is when `EndRegion` will be most relevant in the near
term.
2017-06-12 13:06:42 +02:00
Felix S. Klock II 0a5211e809 Add post-pass to remove EndRegions of unborrowed extents. 2017-06-12 13:06:42 +02:00
Felix S. Klock II 1d315cf7da Add EndRegion statement kind to MIR.
* Emit `EndRegion` for every code-extent for which we observe a
   borrow. To do this, we needed to thread source info back through
   to `fn in_scope`, which makes this commit a bit more painful than
   one might have expected.

 * There is `end_region` emission in `Builder::pop_scope` and in
   `Builder::exit_scope`; the first handles falling out of a scope
   normally, the second handles e.g. `break`.

 * Remove `EndRegion` statements during the erase_regions mir
   transformation.

 * Preallocate the terminator block, and throw an `Unreachable` marker
   on it from the outset. Then overwrite that Terminator as necessary
   on demand.

 * Instead of marking the scope as needs_cleanup after seeing a
   borrow, just treat every scope in the chain as being part of the
   diverge_block (after any *one* of them has separately signalled
   that it needs cleanup, e.g. due to having a destructor to run).

 * Allow for resume terminators to be patched when looking up drop flags.

   (In particular, `MirPatch::new` has an explicit code path,
   presumably previously unreachable, that patches up such resume
   terminators.)

 * Make `Scope` implement `Debug` trait.

 * Expanded a stray comment: we do not emit StorageDead on diverging
   paths, but that end behavior might not be desirable.
2017-06-12 13:06:42 +02:00
Felix S. Klock II 7c0c4cde80 Pass span through diverge_cleanup down to build_diverge_scope where it
can be used for building the diverge path's terminator.
2017-06-12 13:04:33 +02:00
Felix S. Klock II a658bb21e4 Paired source_info with extent; thread both through to pts where EndRegion will need construction. 2017-06-12 13:04:33 +02:00
Felix S. Klock II cbed41a174 Add destruction extents around blocks and statements in HAIR. 2017-06-12 13:04:33 +02:00
Felix S. Klock II 609813bbc2 -Z identify_regions toggles rendering of (previously hidden) unnamed regions.
Unlike `-Z verbose`, it is succinct.

It uniquely identifies regions when displaying them, and distinguishes
code extents from user-specified lifetimes in the output by leveraging
a syntactic restriction: you cannot write a lifetime that starts with
a numeric character.

For example, it prints '<num>ce for the more verbose
`ReScope(CodeExtent(<num>))`.
2017-06-12 13:04:33 +02:00
Felix S. Klock II 20df0e9491 Add -Z span_free_rvalues.
This is solely a hack to make comparing test output plausible; it
makes closures print as [closure@node_id] instead of
[closure@span-with-host-path] in debug printouts.
2017-06-12 13:04:33 +02:00
Georg Brandl 2366c464a7 Add dedicated docstrings to Sum/Product impl of Result
(and fix a minor grammar typo below)
2017-06-12 10:50:28 +02:00
bors 0a5218b506 Auto merge of #42572 - ollie27:rustdoc_create_dir_all, r=GuillaumeGomez
rustdoc: Use `create_dir_all` to create output directory

Currently rustdoc will fail if passed `-o foo/doc` if the `foo`
directory doesn't exist.

Also remove unneeded `mkdir` as `create_dir_all` can now handle
concurrent invocations since #39799.
2017-06-12 08:49:51 +00:00
Michael Woerister fdff2d3588 Add some documentation to the dep_node module. 2017-06-12 10:25:42 +02:00
Esteban Küber 3a7dbf48fe Suggest non-ambiguous comparison after cast
```
warning: `<` is interpreted as a start of generic arguments for `usize`, not comparison
  --> $DIR/issue-22644.rs:16:33
   |
16 |     println!("{}", a as usize < b);
   |                                 ^ expected one of `!`, `(`, `+`, `,`, `::`, or `>` here
   |
help: if you want to compare the casted value then write
   |     println!("{}", (a as usize) < b);
```
2017-06-11 23:47:26 -07:00
Mark Buer 0389d40ce0 Capture elapsed duration in Thread::park_timeout example 2017-06-12 13:43:58 +09:30
bors 54eeef14a3 Auto merge of #42419 - ucarion:ucarion-explain-rc-arc-abbrev, r=frewsxcv
Explicate what "Rc" and "Arc" stand for.

A person on the weekly "Easy Questions" Reddit thread [was mystified by what `Arc`/`Rc` means](https://www.reddit.com/r/rust/comments/6dyud9/hey_rustaceans_got_an_easy_question_ask_here/did87ds/). Though this is explained in various places, it's not mentioned in the documentation directly.

This PR adds an explanation of the `Rc`/`Arc` acronyms to their respective documentations. There are two things I'm not sure of:

* Does "Rc" mean "Reference Count**er**" or "Reference Count**ed**"? ~~I went with the former.~~ *Edit:* I've changed this to use the latter alternative.
* Should this information be spelled out elsewhere, such as in the docs for the `rc` module?
2017-06-12 04:08:14 +00:00
Nick Cameron 34bd80a782 Fix rebasing error 2017-06-12 14:29:59 +12:00
Nick Cameron d438b8180c Fix a bug where Json API save-analysis was not labelled as such 2017-06-12 14:14:23 +12:00
Nick Cameron cb7fcdd520 Impl and trait item sigs 2017-06-12 14:14:23 +12:00
Nick Cameron 5ebb0e2498 Implement a bunch more signature functions 2017-06-12 14:14:23 +12:00
Nick Cameron 35abf139a2 Small refactoring + docs 2017-06-12 14:14:23 +12:00
Nick Cameron a2a999f035 Use the new signature stuff
And fix a couple of bugs
2017-06-12 14:14:23 +12:00
Nick Cameron 0058fdd110 Update rls-data 2017-06-12 14:14:23 +12:00
Nick Cameron 600237fa19 Add a sig module to save-analysis
Generates signatures for use in Rustdoc and similar tools.
2017-06-12 14:14:23 +12:00
bors 29ef41215c Auto merge of #42585 - GuillaumeGomez:E0609, r=Susurrus
Add E0609

Part of #42229.

cc @Susurrus
2017-06-11 23:51:04 +00:00
Guillaume Gomez 2f37894740 Add E0610 2017-06-12 01:47:01 +02:00
Esteban Küber a6d32153a6 Learn to parse a as usize < b
Parsing `a as usize > b` always works, but `a as usize < b` was a
parsing error because the parser would think the `<` started a generic
type argument for `usize`. The parser now attempts to parse as before,
and if a DiagnosticError is returned, try to parse again as a type with
no generic arguments. If this fails, return the original
`DiagnosticError`.
2017-06-11 13:40:04 -07:00
bors e2eaef8497 Auto merge of #42155 - seanmonstar:unimplemented, r=sfackler
core: allow messages in unimplemented!() macro

This makes `unimplemented!()` match `unreachable!()`, allowing a message and possible formatting to be provided to better explain what and/or why something is not implemented.

I've used this myself in hyper for a while, include the type and method name, to better help while prototyping new modules, like `unimplemented!("Conn::poll_complete")`, or `unimplemented!("Conn::poll; state={:?}", state)`.
2017-06-11 18:56:27 +00:00
Guillaume Gomez f4dd365bbb Add E0609 2017-06-11 19:48:53 +02:00
Oliver Middleton 7298dabdb3 rustdoc: Stop stripping empty modules
There is no good reason to strip empty modules with no documentation and
doing so causes subtle problems.
2017-06-11 18:26:01 +01:00
Oliver Middleton 429dc51bfe rustdoc: Link directly to associated types
Rather than just linking to the trait.

Also simplifies the logic used to decide whether to render the full
QPath.
2017-06-11 18:20:48 +01:00
bors 27650ee8ab Auto merge of #40454 - djzin:fast-swap, r=sfackler
speed up mem::swap

I would have thought that the mem::swap code didn't need an intermediate variable precisely because the pointers are guaranteed never to alias. And.. it doesn't! It seems that llvm will also auto-vectorize this case for large structs, but alas it doesn't seem to have all the aliasing info it needs and so will add redundant checks (and even not bother with autovectorizing for small types). Looks like a lot of performance could still be gained here, so this might be a good test case for future optimizer improvements.

Here are the current benchmarks for the simd version of mem::swap; the timings are in cycles (code below) measured with 10 iterations. The timings for sizes > 32 which are not a multiple of 8 tend to be ever so slightly faster in the old code, but not always. For large struct sizes (> 1024) the new code shows a marked improvement.

\* = latest commit
† = subtracted from other measurements

| arr_length	| noop<sup>†</sup>	| rust_stdlib	| simd_u64x4\*	| simd_u64x8
|------------------|------------|-------------------|-------------------|-------------------
8|80|90|90|90
16|72|177|177|177
24|32|76|76|76
32|68|188|112|188
40|32|80|60|80
48|32|84|56|84
56|32|108|72|108
64|32|108|72|76
72|80|350|220|230
80|80|350|220|230
88|80|420|270|270
96|80|420|270|270
104|80|500|320|320
112|80|490|320|320
120|72|528|342|342
128|48|360|234|234
136|72|987|387|387
144|80|1070|420|420
152|64|856|376|376
160|68|804|400|400
168|80|1060|520|520
176|80|1070|520|520
184|32|464|228|228
192|32|504|228|228
200|32|440|248|248
208|72|987|573|573
216|80|1464|220|220
224|48|852|450|450
232|72|1182|666|666
240|32|428|288|288
248|32|428|308|308
256|80|860|770|770
264|80|1130|820|820
272|80|1340|820|820
280|80|1220|870|870
288|72|1227|804|804
296|72|1356|849|849
2017-06-11 16:40:52 +00:00
Inokentiy Babushkin afe841587d
External spans: fixed unit tests and addressed review. 2017-06-11 16:45:51 +02:00
bors 07a2dd41c5 Auto merge of #42569 - birkenfeld:patch-2, r=frewsxcv
Simplify FromIterator example of Result

The previous version may be clearer for newcomers, but this is how you'd write it idiomaticly.
2017-06-11 14:29:56 +00:00
Inokentiy Babushkin 634cd2ce73
Updated UI tests to include rendered external spans. 2017-06-11 15:09:49 +02:00
Inokentiy Babushkin 9a8bbe9da9
Added hash verification to external source loading. 2017-06-11 13:48:54 +02:00
Inokentiy Babushkin a5b8851e22
Added consumption logic for external sources in FileMap
We now fetch source lines from the `external_src` member as a secondary
fallback if no regular source is present, that is, if the file map
belongs to an external crate and the source has been fetched from disk.
2017-06-11 13:31:40 +02:00
Inokentiy Babushkin c04aa4ed0c
Improved lazy external source loading and inserted calls. 2017-06-11 11:47:00 +02:00
bors 4bf5c99afc Auto merge of #42580 - tommyip:import-error, r=petrochenkov
Only emit one error for `use foo::self;`

Currently `use foo::self;` would emit both E0429 and E0432. This commit silence the latter one (assuming `foo` is a valid module).

Fixes #42559
2017-06-10 21:35:31 +00:00
Campbell Barton 11ee1b0b2e Add missing term 'disjoint' from matches, rmatches
This follows `match_indices`
2017-06-11 06:17:12 +10:00
bors b7613f8281 Auto merge of #42563 - eddyb:infer, r=nikomatsakis
Disentangle InferCtxt, MemCategorizationContext and ExprUseVisitor.

At some point in the past, `InferCtxt` started being used to replace an old "`Typer`" abstraction, which provided access to `TypeckTables` and had optionally type inference to account for.
That didn't play so nicely with the `'gcx`/`'tcx` split and I had to introduce `borrowck_fake_infer_ctxt`.
The situation wasn't great but it wasn't too painful inside `rustc` itself.

Recently I've found that method being used in clippy, which does need EUV (before we make it plausible to run lints on HAIR or MIR), and set out to separate inference from tables, for the sake of lint authors.
Also fixes #42435 to make it trivial to compute type layout or use EUV from lints.

The remaining uses of `TypeckTables` in `InferCtxt` are for closure kinds and signatures, used in trait selection and projection normalization. The solution there is likely to add them as bounds to `ParamEnv`.

r? @nikomatsakis
cc @mcarton @llogiq @Manishearth
2017-06-10 19:21:24 +00:00
Inokentiy Babushkin c2c31b2db3
Added external crates' sources to FileMap.
They are now handled in their own member to prevent mutating access to
the `src` member. This way, we can safely load external sources, while
keeping the mutation of local source strings off-limits.
2017-06-10 21:08:32 +02:00
Inokentiy Babushkin dd8f7cd126
Moved FileMap construction to it's own constructor.
The rationale is that BOM stripping is needed for lazy source loading
for external crates, and duplication can be avoided by moving the
corresponding functionality to libsyntax_pos.
2017-06-10 16:09:51 +02:00
Eduard-Mihai Burtescu fc5c31c48c rustc: make the comon case of tcx.infer_ctxt(()) nicer. 2017-06-10 15:29:53 +03:00
Eduard-Mihai Burtescu 63481a57dc rustc: make InferCtxt optional in MemCategorizationContext. 2017-06-10 15:29:18 +03:00
Tommy Ip b89db83e6c Only emit one error for use foo::self;
Currently `use foo::self;` would emit both E0429 and E0432. This
commit silence the latter one (assuming `foo` is a valid module).

Fixes #42559
2017-06-10 13:03:11 +01:00
Inokentiy Babushkin 3d2cff0c94
Added source hashes to FileMap
We can use these to perform lazy loading of source files belonging to
external crates. That way we will be able to show the source code of
external spans that have been translated.
2017-06-10 13:39:39 +02:00
Eduard-Mihai Burtescu 1f874ded52 rustc: do not depend on infcx.tables in MemCategorizationContext. 2017-06-10 14:34:45 +03:00
Inokentiy Babushkin 70fa1fbea7
Added a StableHasherResult impl for u128. 2017-06-10 12:21:24 +02:00
bors 995f741a0e Auto merge of #42556 - scottmcm:ctz-nz, r=BurntSushi
Get LLVM to stop generating dead assembly in next_power_of_two

It turns out that LLVM can turn `@llvm.ctlz.i64(_, true)` into `@llvm.ctlz.i64(_, false)` ([`ctlz`](http://llvm.org/docs/LangRef.html#llvm-ctlz-intrinsic)) where valuable, but never does the opposite.  That leads to some silly assembly getting generated in certain cases.

A contrived-but-clear example https://is.gd/VAIKuC:
```rust
fn foo(x:u64) -> u32 {
    if x == 0 { return !0; }
    x.leading_zeros()
}
```
Generates
```asm
	testq	%rdi, %rdi
	je	.LBB0_1
	je	.LBB0_3    ; <-- wha?
	bsrq	%rdi, %rax
	xorq	$63, %rax
	retq
.LBB0_1:
	movl	$-1, %eax
	retq
.LBB0_3:
	movl	$64, %eax  ; <-- dead
	retq
```

I noticed this in `next_power_of_two`, which without this PR generates the following:
```asm
	cmpq	$2, %rcx
	jae	.LBB1_2
	movl	$1, %eax
	retq
.LBB1_2:
	decq	%rcx
	je	.LBB1_3
	bsrq	%rcx, %rcx
	xorq	$63, %rcx
	jmp	.LBB1_5
.LBB1_3:
	movl	$64, %ecx  ; <-- dead
.LBB1_5:
	movq	$-1, %rax
	shrq	%cl, %rax
	incq	%rax
	retq
```

And with this PR becomes
```asm
	cmpq	$2, %rcx
	jae	.LBB0_2
	movl	$1, %eax
	retq
.LBB0_2:
	decq	%rcx
	bsrq	%rcx, %rcx
	xorl	$63, %ecx
	movq	$-1, %rax
	shrq	%cl, %rax
	incq	%rax
	retq
```
2017-06-10 09:11:36 +00:00