Commit Graph

62769 Commits

Author SHA1 Message Date
Ulrik Sverdrup
6fda0fe891 cmp: Implement all PartialOrd methods for Reverse
When making a forwarding wrapper we must in general forward all methods,
so that we use the type's own `lt` for example instead of the default.

Example important case: f32's partial_cmp does several operations but
its lt is a primitive.
2017-03-30 17:29:19 +02:00
GAJaloyan
ea28196214 removing trailing whitespaces 2017-03-30 17:02:51 +02:00
GAJaloyan
f82705403f adding debug in consume_body function
When in debug_assertions=true mode, the function consume_body lacks some debug output, which makes it harder to follow the control flow. This commit adds this needed debug.
2017-03-30 16:31:16 +02:00
bors
7ae95e5489 Auto merge of #40224 - nikomatsakis:issue-39808, r=eddyb
change the strategy for diverging types

The new strategy is as follows. First, the `!` type is assigned
in two cases:

- a block with a diverging statement and no tail expression (e.g.,
  `{return;}`);
- any expression with the type `!` is considered diverging.

Second, we track when we are in a diverging state, and we permit a value
of any type to be coerced **into** `!` if the expression that produced
it is diverging. This means that `fn foo() -> ! { panic!(); 22 }`
type-checks, even though the block has a type of `usize`.

Finally, coercions **from** the `!` type to any other are always
permitted.

Fixes #39808.
Fixes #39984.
2017-03-30 14:20:20 +00:00
Luxko
8804a4a6d9 Add missing link in unstable-book
add link to specialization's tracking issue
2017-03-30 20:36:07 +08:00
Niko Matsakis
2414222b17 remove comments that were tripping up pretty printer 2017-03-30 08:18:03 -04:00
Niko Matsakis
744f666445 fix error message for issue-10176.rs 2017-03-30 08:18:03 -04:00
Niko Matsakis
fb99d87c46 update UI test
We no longer give suggestions; this is presumably related to the changes
I made in coercion. However, those suggestions appear to be wrong
anyhow!
2017-03-30 08:18:02 -04:00
Niko Matsakis
e97fc5247a kill the graphviz-flowgraph tests
They are so annoying to update, and haven't caught any bugs afaik.
2017-03-30 08:18:02 -04:00
Niko Matsakis
1b5768df4e document diverges more correctly 2017-03-30 08:18:02 -04:00
Niko Matsakis
8450add8be fix X as ! behavior 2017-03-30 08:18:02 -04:00
Niko Matsakis
7eeddb4093 add test illustrating current "coerce to !" behavior 2017-03-30 08:18:02 -04:00
Niko Matsakis
8c6156e1d1 have coercion supply back the target type
The `try_coerce` method coerces from a source to a target
type, possibly inserting adjustments. It should guarantee
that the post-adjustment type is a subtype of the target type
(or else that some side-constraint has been registered which will lead
to an error). However, it used to return the (possibly adjusted) source
as the type of the expression rather than the target. This led to
less good downstream errors.

To work around this, the code around blocks -- and particular tail
expressions in blocks -- had some special case manipulation. However,
since that code is now using the more general `CoerceMany` construct (to
account for breaks), it can no longer take advantage of that. This lead
to some regressions in compile-fail tests were errors were reported at
"less good" locations than before.

This change modifies coercions to return the target type when successful
rather the source type. This extends the behavior from blocks to all
coercions. Typically this has limited effect but on a few tests yielded
better errors results (and avoided regressions, of course).

This change also restores the hint about removing semicolons which went
missing (by giving 'force-unit' coercions a chance to add notes etc).
2017-03-30 08:18:01 -04:00
Niko Matsakis
d08a6da1f0 remove Clone from FnCtxt 2017-03-30 07:56:58 -04:00
Niko Matsakis
127a7d643d rename only_has_type_or_fresh_var to coercion_target_type 2017-03-30 07:56:58 -04:00
Niko Matsakis
d448329849 fix handling of blocks with CoerceMany 2017-03-30 07:56:58 -04:00
Niko Matsakis
f83706454f coercion now depends on whether the expression diverges
Before I was checking this in `demand_coerce` but that's not really the
right place. The right place is to move that into the coercion routine
itself.
2017-03-30 07:55:29 -04:00
Niko Matsakis
bad79484fb avoid allocating a vector when the coercion sites are known upfront 2017-03-30 07:55:29 -04:00
Niko Matsakis
609bfe82fd cherry-pick over the tests I wrote for the reachability code
For the most part, the current code performs similarly, although it
differs in some particulars. I'll be nice to have these tests for
judging future changes, as well.
2017-03-30 07:55:29 -04:00
Niko Matsakis
a60e27e25b pacify the mercilous tidy 2017-03-30 07:55:29 -04:00
Niko Matsakis
f11b7d33bb add regression test for #39808
Fixes #39808
2017-03-30 07:55:29 -04:00
Niko Matsakis
2f526cc897 we now get an extra unreachable code warning in this test 2017-03-30 07:55:29 -04:00
Niko Matsakis
5cd99aa167 more detailed tests around diverging type variables 2017-03-30 07:55:29 -04:00
Niko Matsakis
52e524a357 make try_find_coercion_lub private; we always use CoerceMany 2017-03-30 07:55:29 -04:00
Niko Matsakis
cecccd9bef whitespace changes, debug message 2017-03-30 07:55:29 -04:00
Niko Matsakis
140165f22e rewrite ExprArray processing to use CoerceMany 2017-03-30 07:55:29 -04:00
Niko Matsakis
16a71cce51 rework how we handle the type of loops
First, we keep a `CoerceMany` now to find the LUB of all the break
expressions. Second, this `CoerceMany` is actually an
`Option<CoerceMany>`, and we store `None` for loops where "break with an
expression" is disallowed. This avoids silly duplicate errors about a
type mismatch, since the loops pass already reports an error that the
break cannot have an expression. Finally, since we now detect an invalid
break target during HIR lowering, refactor `find_loop` to be infallible.

Adjust tests as needed:

- some spans from breaks are slightly different
- break up a single loop into multiple since `CoerceMany` silences
  redundant and derived errors
- add a ui test that we only give on error for loop-break-value
2017-03-30 07:55:29 -04:00
Niko Matsakis
1ae620bbeb do not eagerly convert ! to a diverging variable
Instead, wait until coercion time.  This has some small effects on a few
tests (one less temporary, generally better errors when trying to call
methods or otherwise "force" the type).
2017-03-30 07:55:29 -04:00
Niko Matsakis
4967f1ae57 document the diverges flag etc 2017-03-30 07:55:29 -04:00
Niko Matsakis
a6e6be5f88 port return expressions to use CoerceMany
This slightly affects the error messages in one particular compile-fail
test.
2017-03-30 07:55:29 -04:00
Niko Matsakis
b725272b26 port if-then-else to use CoerceMany 2017-03-30 07:55:29 -04:00
Niko Matsakis
56847af916 port the match code to use CoerceMany
`match { }` now (correctly?) indicates divergence, which results in more
unreachable warnings. We also avoid fallback to `!` if there is just one
arm (see new test: `match-unresolved-one-arm.rs`).
2017-03-30 07:55:29 -04:00
Niko Matsakis
dad3140407 introduce (but do not yet use) a CoerceMany API
The existing pattern for coercions is fairly complex. `CoerceMany`
enapsulates it better into a helper.
2017-03-30 07:55:29 -04:00
Niko Matsakis
eeb6447bbf add an ObligationCauseCode we'll use later (ReturnNoExpression) 2017-03-30 07:55:29 -04:00
Niko Matsakis
27f4b57602 add a TypeVariableOrigin we'll use later (DerivingFn) 2017-03-30 07:55:29 -04:00
Niko Matsakis
555b6d69b2 add some debug logs to type_variable.rs 2017-03-30 07:55:29 -04:00
Niko Matsakis
4c6c26eba1 change the strategy for diverging types
The new strategy is as follows. First, the `!` type is assigned
in two cases:

- a block with a diverging statement and no tail expression (e.g.,
  `{return;}`);
- any expression with the type `!` is considered diverging.

Second, we track when we are in a diverging state, and we permit a value
of any type to be coerced **into** `!` if the expression that produced
it is diverging. This means that `fn foo() -> ! { panic!(); 22 }`
type-checks, even though the block has a type of `usize`.

Finally, coercions **from** the `!` type to any other are always
permitted.

Fixes #39808.
2017-03-30 07:55:29 -04:00
Niko Matsakis
066d44bc0d refactor the targeted_by_break field
In master, this field was an arbitrary node-id (in fact, an id for
something that doesn't even exist in the HIR -- the `catch` node).
Breaks targeting this block used that id. In the newer system, this
field is a boolean, and any breaks targeted this block will use the
id of the block.
2017-03-30 07:55:29 -04:00
Niko Matsakis
6a47fa1d3d remove unneeded & that now fails to coerce
cc https://github.com/rust-lang/rust/issues/40924
2017-03-30 07:55:29 -04:00
Niko Matsakis
6c02272926 update comment 2017-03-30 07:55:29 -04:00
Niko Matsakis
276bba9039 refactor if so that the "then type" is an expression 2017-03-30 07:55:29 -04:00
Thomas Jespersen
b376386228 Replace hardcoded forward slash with path::MAIN_SEPARATOR
Fixes #40149
2017-03-30 13:51:16 +02:00
raph
1be84cee75 Update process.rs 2017-03-30 09:55:44 +02:00
bors
fe151194e9 Auto merge of #40597 - jseyfried:improve_span_expn_info, r=jseyfried
macros: improve `Span`'s expansion information

This PR improves `Span`'s expansion information. More specifically:
 - It refactors AST node span construction to preserve expansion information.
   - Today, we only use the underlying tokens' `BytePos`s, throwing away the `ExpnId`s.
   - This improves the accuracy of AST nodes' expansion information, fixing #30506.
 - It refactors `span.expn_id: ExpnId` to `span.ctxt: SyntaxContext` and removes `ExpnId`.
   - This gives all tokens as much hygiene information as `Ident`s.
   - This is groundwork for procedural macros 2.0 `TokenStream` API.
   - This is also groundwork for declarative macros 2.0, which will need this hygiene information for some non-`Ident` tokens.
 - It simplifies processing of spans' expansion information throughout the compiler.
 - It fixes #40649.
 - It fixes #39450 and fixes part of #23480.

r? @nrc
2017-03-30 06:48:52 +00:00
Jeffrey Seyfried
8fde04b4a2 Improve Path spans. 2017-03-30 05:44:56 +00:00
bors
6afa0d42ff Auto merge of #40917 - aidanhs:aphs-no-appveyor-cache, r=aturon
Disable appveyor cache

Reverts just appveyor part of https://github.com/rust-lang/rust/pull/40780. r? @aturon
2017-03-30 02:11:55 +00:00
Guillaume Gomez
08a741eabf Add support for image, rules and footnotes 2017-03-29 19:48:06 -06:00
Aidan Hobson Sayers
fe0fbbff5c Disable appveyor cache 2017-03-30 01:33:45 +01:00
Nick Cameron
e3acebff66 save-analysis: track associated types 2017-03-30 12:14:04 +13:00
Camille TJHOA
b36cff5c4f Improve os::linux documentation (#29367) 2017-03-29 23:44:39 +02:00