Commit graph

17339 commits

Author SHA1 Message Date
David Wood
a98aff7a5d
Updated test to reflect expected Mir output. 2017-11-17 00:08:34 +00:00
bors
d0f8e2913a Auto merge of #45825 - nikomatsakis:nll-factor-region-inference, r=arielb1
integrate MIR type-checker with NLL inference

This branch refactors NLL type inference so that it uses the MIR type-checker to gather constraints. Along the way, it also refactors how region constraints are gathered in the normal inference context mildly. The new setup is like this:

- What used to be `region_inference` is split into two parts:
    - `region_constraints`, which just collects up sets of constraints
    - `lexical_region_resolve`, which does the iterative, lexical region resolution
- When `resolve_regions_and_report_errors` is invoked, the inference engine converts the constraints into final values.
- In the MIR type checker, however, we do not invoke this method, but instead periodically take the region constraints and package them up for the NLL solver to use later.
    - This allows us to track when and where those constraints were incurred.
    - We also remove the central fulfillment context from the MIR type checker, instead instantiating new fulfillment contexts at each point. This allows us to capture the set of obligations that occurred at a particular point, and also to ensure that if the same obligation arises at two points, we will enforce the region constraints at both locations.
- The MIR type checker is also enhanced to instantiate late-bound-regions with fresh variables and handle a few other corner cases that arose.
- I also extracted some of the 'outlives' logic from the regionck, which will be needed later (see future work) to handle the type-outlives relationships.

One concern I have with this branch: since the MIR type checker is used even without the `-Znll` switch, I'm not sure if it will impact performance. One simple fix here would be to only enable the MIR type-checker if debug-assertions are enabled, since it just serves to validate the MIR. Longer term I hope to address this by improving the interface to the trait solver to be more query-based (ongoing work).

There is plenty of future work left. Here are two things that leap to mind:

- **Type-region outlives.** Currently, the NLL solver will ICE if it is required to handle a constraint like `T: 'a`. Fixing this will require a small amount of refactoring to extract the implied bounds code. I plan to follow a file-up bug on this (hopefully with mentoring instructions).
- **Testing.** It's a good idea to enumerate some of the tricky scenarios that need testing, but I think it'd be nice to try and parallelize some of the actual test writing (and resulting bug fixing):
    - Same obligation occurring at two points.
    - Well-formedness and trait obligations of various kinds (which are not all processed by the current MIR type-checker).
    - More tests for how subtyping and region inferencing interact.
    - More suggestions welcome!

r? @arielb1
2017-11-16 20:56:26 +00:00
bors
58d8761ab3 Auto merge of #46029 - GuillaumeGomez:rollup, r=GuillaumeGomez
Rollup of 6 pull requests

- Successful merges: #45951, #45973, #45984, #45993, #46005, #46010
- Failed merges:
2017-11-16 18:24:17 +00:00
Niko Matsakis
5a8c1eb61a leak the affects of closures on the free-region-map, like we used to
This restores the behavior of regionck with respect to the
free-region-map: that is, it collects all the relations from the fn
and its closures. This feels a bit fishy but it's the behavior we've
had for some time, and it will go away with NLL, so seems best to just
keep it.
2017-11-16 05:57:51 -05:00
Niko Matsakis
8cea0539d1 fix mir-opt NLL tests -- variable '_#0r is now 'static 2017-11-16 05:57:50 -05:00
Niko Matsakis
4b743da596 integrate NLL with MIR type-checker 2017-11-16 05:57:47 -05:00
Niko Matsakis
bea6b94273 fix error messages relating to removing lint for E0276 2017-11-16 05:57:44 -05:00
Niko Matsakis
23abd85138 rename region_inference module to region_constraints 2017-11-16 05:57:43 -05:00
Guillaume Gomez
b09af7064e Rollup merge of #46005 - GuillaumeGomez:short-unstable, r=nrc
Set short-message feature unstable

Fixes #45995.

r? @nrc
2017-11-16 10:05:06 +01:00
Guillaume Gomez
ed64b97d61 Rollup merge of #45984 - ExpHP:attr-error-context, r=estebank
Add context to E0084, E0517, E0518

A small diagnostic enhancement to get my feet wet.  Please scrutinize!

This modifies errors E0084, E0517, and E0518 to include both the annotation and the annotated item.  All of these errors already had labels; I moved the label to the other span, and rephrased it as necessary.

Fixes #45886
2017-11-16 10:05:04 +01:00
Guillaume Gomez
387fa844bb Rollup merge of #45951 - CrockAgile:master, r=michaelwoerister
incr: Update hash tests to use `except`-style checking

Part of #44924

r? @michaelwoerister
2017-11-16 10:05:02 +01:00
bors
edd9dbcdbb Auto merge of #45985 - arielb1:unsafe-dedup, r=eddyb
check_unsafety: fix unused unsafe block duplication

The duplicate error message is later removed by error message
deduplication, but it still appears on beta and is still a bug.

r? @eddyb
2017-11-16 08:31:59 +00:00
bors
1410d56040 Auto merge of #45920 - sunfishcode:trap-on-unreachable, r=Zoxc
Enable TrapUnreachable in LLVM.

This patch enables LLVM's TrapUnreachable flag, which tells it to translate `unreachable` instructions into hardware trap instructions, rather than allowing control flow to "fall through" into whatever code happens to follow it in memory.

This follows up on https://github.com/rust-lang/rust/issues/28728#issuecomment-332581533. For example, for @zackw's testcase [here](https://github.com/rust-lang/rust/issues/42009#issue-228745924), the output function contains a `ud2` instead of no code, so it won't "fall through" into whatever happens to be next in memory.

(I'm also working on the problem of LLVM optimizing away infinite loops, but the patch here is useful independently.)

I tested this patch on a few different codebases, and the code size increase ranged from 0.0% to 0.1%.
2017-11-16 06:10:36 +00:00
bors
b8c70b0fdf Auto merge of #45918 - chrisvittal:impl-trait-pr, r=nikomatsakis
Implement `impl Trait` in argument position (RFC1951, Universal quantification)

Implements the remainder of #44721, part of #34511.

**Note**: This PR currently allows argument position `impl Trait` in trait functions. The machinery is there to prevent this if we want to, but it currently does not.

Rename `hir::TyImplTrait` to `hir::TyImplTraitExistential` and add `hir::TyImplTraitUniversal(DefId, TyParamBounds)`. The `DefId` is needed to extract the index of the parameter in `ast_ty_to_ty`.

Introduce an `ImplTraitContext` enum to lowering to keep track of the kind and allowedness of `impl Trait` in that position. This new argument is passed through many places, all ending up in `lower_ty`.

Modify `generics_of` and `explicit_predicates_of` to collect the `impl Trait` args into anonymous synthetic generic parameters and to extend the predicates with the appropriate bounds.

Add a comparison of the 'syntheticness' of type parameters, that is, prevent the following.
```rust
trait Foo {
    fn foo(&self, &impl Debug);
}
impl Foo for Bar {
    fn foo<U: Debug>(&self, x: &U) { ... }
}
```
And vice versa.

Incedentally, supress `unused type parameter` errors if the type being compared is already a `TyError`.

**TODO**: I have tried to annotate open questions with **FIXME**s. The most notable ones that haven't been resolved are the names of the `impl Trait` types and the questions surrounding the new `compare_synthetic_generics` method.
1. For now, the names used for `impl Trait` parameters are `keywords::Invalid.name()`. I would like them to be `impl ...` if possible, but I haven't figured out a way to do that yet.
2. For `compare_synthetic_generics` I have tried to outline the open questions in the [function itself](3fc9e3705f/src/librustc_typeck/check/compare_method.rs (L714-L725))

r? @nikomatsakis
2017-11-15 22:47:54 +00:00
Niko Matsakis
0d78e40e88 convert EXTRA_REQUIREMENT_IN_IMPL into a hard error
cc #37166
2017-11-15 16:49:21 -05:00
Niko Matsakis
98d5db3350 add a new test featuring two impl traits to show what it looks like 2017-11-15 15:46:01 -05:00
Christopher Vittal
337dee4c80 Remove Fn trait + impl Trait rustdoc tests 2017-11-15 15:46:01 -05:00
Christopher Vittal
22f0940f2d Add cases to where-allowed.rs 2017-11-15 15:46:01 -05:00
Christopher Vittal
f710d41f77 Add/Fix stderr references for impl Trait ui tests 2017-11-15 15:46:01 -05:00
Christopher Vittal
b276429734 Disallow all impl Trait within Fn trait sugar
We already disallowed them to be in the arg list, such as
Fn(impl Debug), but now we disallow Fn() -> impl Debug.

Also remove the ImplTraitContext argument from the function
lower_parenthesized_parameter_data as it is now unused.

Comment out part of test run-pass/impl-trait/xcrate.rs that now fails.
2017-11-15 15:46:01 -05:00
Christopher Vittal
9b4372e3b1 Incorporate review feedback
Add requested comments, restructure some small bits of code. Fix extern
declarations allowing impl Trait.
2017-11-15 15:46:01 -05:00
Niko Matsakis
2786ea662d some tests featuring multiple bounds, other errors 2017-11-15 15:46:01 -05:00
Niko Matsakis
15001ee336 add a UI test showing the current output from an impl trait type 2017-11-15 15:46:01 -05:00
Niko Matsakis
9d71bf6d55 add some more positive tests
It'd be good to have a positive test for each case where it is
allowed, I should think.
2017-11-15 15:46:01 -05:00
Niko Matsakis
6f9fb91033 rename equality-universal to a more extensible naming scheme 2017-11-15 15:46:01 -05:00
Niko Matsakis
37dd79ff44 extend where-allowed.rs with many more cases
also merge disallowed and disallowed-2 into that set
2017-11-15 15:46:01 -05:00
Niko Matsakis
ebc4408fc0 rename many-cases to where-allowed 2017-11-15 15:46:01 -05:00
Niko Matsakis
2520279604 test we reject equivalent signatures with more than one argument 2017-11-15 15:46:01 -05:00
Christopher Vittal
7d25d2e054 Remove unamed parameters 2017-11-15 15:46:01 -05:00
Christopher Vittal
06dff80061 Add/Modify tests for argument position impl Trait 2017-11-15 15:46:01 -05:00
Christopher Vittal
bdff9463a0 Add universal_impl_trait feature gate
Move feature gate check to inside HIR lowering. Change error messages
and update tests.
2017-11-15 15:46:01 -05:00
Christopher Vittal
109f2dd36b Add new error comparision to hide desugaring
First some background:
To the compiler, the following two signatures in the trait vs the impl
are the same.

```rust
trait Foo {
    fn foo(&self, &impl Debug);
}
impl Foo for () {
    fn foo<U: Debug>(&self, x: &U) { ... }
}
```

We do not want to allow this, and so we add a new error and check.

The check just tests that all paramters 'syntheticness' match up. As
during collection, the impl Trait parameters are transformed into
anonymous synthetic generics.

Furthermore, causes a check for unused type parameters to be skipped in
check_bounds_are_used if there is already a TyError. Thus, an unused
input will not trigger `type parameter unused` errors.

Update the one test that checked for this error in the case of
a TyError.
2017-11-15 15:46:01 -05:00
bors
fa26421f56 Auto merge of #45938 - vramana:fix-ice-45698, r=arielb1
Fix End-user description not implemented for field access on `TyClosure

- [x] Add Tests
2017-11-15 20:18:13 +00:00
Guillaume Gomez
9338b4903a Set short-message feature unstable 2017-11-15 18:13:33 +01:00
Mikhail Modin
9e35fd262f fix test 2017-11-15 12:30:30 +03:00
Mikhail Modin
830d65c1ff add StorageDead handling 2017-11-15 11:21:05 +03:00
bors
f93a4928c2 Auto merge of #45922 - vramana:fix-45702, r=nikomatsakis
Fix MIR borrowck EndRegion not found

Fixes #45702

- [x] Add Tests
2017-11-15 04:48:16 +00:00
bors
8a98531973 Auto merge of #45913 - sinkuu:mir-inlining-closure, r=arielb1
Handle closures correctly in MIR inlining

Fixes #45894.
2017-11-15 01:32:30 +00:00
Michael Lamparski
ead9ac3b51 add NOTE: to test notes 2017-11-14 17:45:18 -05:00
Ramana Venkata
5144d3222f Fix printing of upvar in closures 2017-11-15 02:24:25 +05:30
Jeff Crocker
d1a83c6bd2
Remove checked arithmetic from if expression hash tests 2017-11-14 12:12:04 -08:00
bors
ff0f5de3b3 Auto merge of #45821 - djzin:unreachable-match-arms, r=nikomatsakis
always add an unreachable branch on matches to give more info to llvm

As part of https://github.com/djzin/rustc-optimization I discovered that some simple enum optimizations (src/unary/three_valued_enum.rs and src/unary/four_valued_enum.rs in the repo) are not applied - and the reason for this is that we erase the info that the discriminant of an enum is one of the options by putting the last one in an "otherwise" branch. This patch adds an extra branch so that LLVM can know what the possibilities are for the discriminant, which fixes the three- and four- valued cases.

Note that for whatever reason, this doesn't fix the case of 2 variants (most notably `Option` and `Result` have 2 variants) - a pass re-ordering might fix this or we may wish to add "assume" annotations on discriminants to force it to optimize.
2017-11-14 18:47:34 +00:00
Guillaume Gomez
01e979f7b1 Rollup merge of #45967 - matthewjasper:array-move-types, r=arielb1
MIR-borrowck: don't ICE for cannot move from array error

Closes #45694
compile-fail test E0508 now gives
```text
error[E0508]: cannot move out of type `[NonCopy; 1]`, a non-copy array (Ast)
  --> .\src\test\compile-fail\E0508.rs:18:18
   |
18 |     let _value = array[0];  //[ast]~ ERROR E0508
   |                  ^^^^^^^^
   |                  |
   |                  cannot move out of here
   |                  help: consider using a reference instead: `&array[0]`

error[E0508]: cannot move out of type `[NonCopy; 1]`, a non-copy array (Mir)
  --> .\src\test\compile-fail\E0508.rs:18:18
   |
18 |     let _value = array[0];  //[ast]~ ERROR E0508
   |                  ^^^^^^^^ cannot move out of here

error: aborting due to 2 previous errors
```
2017-11-14 16:52:12 +01:00
Guillaume Gomez
d0b11b9bd1 Rollup merge of #45950 - fitzgen:update-unary-and-binary-exprs-test-to-use-incr-except, r=michaelwoerister
incr: Make `unary_and_binary_exprs.rs` use `except`-style incremental checking

Part of #44924

r? @michaelwoerister
2017-11-14 16:52:10 +01:00
Guillaume Gomez
c95ef0d9d5 Rollup merge of #45941 - gaurikholkar:master, r=nikomatsakis
update match-expressions.rs with DepNode labels

As a part of #44924, I have updated the match-expressions.rs. The PR has tests verified for the following dependency nodes for let-expressions

- MirValidated
- MirOptimized
- TypeCheckTables
- TypeOfItem
- GenericsOfItem
- PredicatesOfItem
- FnSignature

cc @michaelwoerister
r? @nikomatsakis
2017-11-14 16:52:09 +01:00
Guillaume Gomez
013cd5af86 Rollup merge of #45815 - QuietMisdreavus:happy-little-notices, r=GuillaumeGomez
rustdoc: tweak notes on ignore/compile_fail examples

Part of https://github.com/rust-lang/rust/issues/44927

This is a softening of these notices to mention *why* a given example has a given callout, rather then telling viewers to be careful with an example. It also changes the character used for these samples from a warning logo to a circle-i/information logo.

![image](https://user-images.githubusercontent.com/5217170/32464361-5fbb5d9e-c305-11e7-8482-ce71b97a54df.png)
2017-11-14 16:52:07 +01:00
Ariel Ben-Yehuda
c0f7cce96e check_unsafety: fix unused unsafe block duplication
The duplicate error message is later removed by error message
deduplication, but it still appears on beta and is still a bug
2017-11-14 16:38:34 +02:00
Michael Lamparski
4d200f6954 un-add some notes from tests 2017-11-14 09:25:09 -05:00
Shotaro Yamada
a1f7bad4a7 Fix test 2017-11-14 22:29:09 +09:00
Michael Lamparski
dcbedf78a0 Add context to E0084, E00517, E0518
Show both the attribute and the item
2017-11-14 08:24:28 -05:00