333 Commits

Author SHA1 Message Date
bors
c0d0e68be4 Auto merge of #35712 - oli-obk:exclusive_range_patterns, r=nikomatsakis
exclusive range patterns

adds `..` patterns to the language under a feature gate (`exclusive_range_pattern`).

This allows turning

``` rust
match i {
    0...9 => {},
    10...19 => {},
    20...29 => {},
    _ => {}
}
```

into

``` rust
match i {
    0..10 => {},
    10..20 => {},
    20..30 => {},
    _ => {}
}
```
2017-01-25 02:17:33 +00:00
bors
98c3128c39 Auto merge of #39127 - canndrew:unreachable-pattern-errors-into-warnings, r=arielb1
Change unreachable pattern ICEs to warnings

Allow code with unreachable `?` and `for` patterns to compile.
Add some tests.
2017-01-22 08:56:27 +00:00
Jeffrey Seyfried
191abc4264 Remove unused extern crates. 2017-01-22 01:31:02 +00:00
Andrew Cann
ef9f0ab43e Fix some nits 2017-01-21 10:53:16 +08:00
Oliver Schneider
c951341a78
add exclusive range patterns under a feature gate 2017-01-19 10:13:32 +01:00
Andrew Cann
1c51f60ee2 Change unreachable patterns ICEs to warnings
Allow code with unreachable `?` and `for` patterns to compile.
Add some tests.
2017-01-17 21:32:27 +08:00
Simonas Kazlauskas
e97f104da6 Fix two const-eval issues related to i128 negation
First issue here was the fact that we’d only allow negating integers in i64 range in case the
integer was not infered yes. While this is not the direct cause of the issue, its still good to fix
it.

The real issue here is the code handling specifically the `min_value` literals. While I128_OVERFLOW
has the expected value (0x8000_..._0000), match using this value as a pattern is handled
incorrectly by the stage1 compiler (it seems to be handled correctly, by the stage2 compiler). So
what we do here is extract this pattern into an explicit `==` until the next snapshot.

Fixes #38987
2017-01-11 19:38:44 +02:00
Eduard-Mihai Burtescu
cde0a7e7e0 rustc: store ty::Tables separately for each body (except closures'). 2017-01-06 22:23:29 +02:00
Eduard-Mihai Burtescu
85a4a192c7 rustc: keep track of tables everywhere as if they were per-body. 2017-01-06 22:23:29 +02:00
Andrew Cann
275c19d5b6 fix doc test for E0001 2017-01-06 01:00:03 +08:00
Andrew Cann
291c84aad4 Un-remove E0001, put a notice on it instead 2017-01-05 23:48:02 +08:00
Andrew Cann
70b7bd94cc Fix build after rebase 2017-01-04 11:07:32 +08:00
Andrew Cann
e9ffc409bc Spelling. s/forrest/forest 2017-01-03 15:54:23 +08:00
Niko Matsakis
699b25ff3a fix comment that got split in two 2017-01-03 15:54:23 +08:00
Andrew Cann
9f83e962de Fix build after rebase.
Mostly just rename stuff.
Visibility checks use DefIds rather than NodeIds now.
2017-01-03 15:54:23 +08:00
Andrew Cann
4136ba072e Remove E0001 diagnostic 2017-01-03 15:48:29 +08:00
Andrew Cann
5ba61edbd0 Disable unreachable patterns error entirely 2017-01-03 15:48:29 +08:00
Andrew Cann
7946597f75 Refactor is_uninhabited
We now cache the inhabitedness of types in the GlobalCtxt.

Rather than calculating whether a type is visibly uninhabited from a given
NodeId we calculate the full set of NodeIds from which a type is visibly
uninhabited then cache that set. We can then use that to answer queries about
the inhabitedness of a type relative to any given node.
2017-01-03 15:48:29 +08:00
Andrew Cann
d2827aa9bc Fix build after rebase 2017-01-03 15:48:29 +08:00
Andrew Cann
cfc45d52bb Style fix 2017-01-03 15:33:31 +08:00
Andrew Cann
9ba9cd5fd5 Improve error message, fix and add tests.
Changes the non-exhaustive match error message to generate more general
witnesses.
2017-01-03 15:33:31 +08:00
Andrew Cann
9c5e86d0cd More pattern matching for empty types changes
Fix is_uninhabited for enum types. It used to assume that an enums variant's
fields were all private.

Fix MIR generation for irrefutable Variant pattern matches. This allows code
like this to work:

    let x: Result<32, !> = Ok(123);
    let Ok(y) = x;

Carry type information on dummy wildcard patterns. Sometimes we need to expand
these patterns into their constructors and we don't want to be expanding a
TyError into a Constructor::Single.
2017-01-03 15:33:31 +08:00
Andrew Cann
bcdbe942e1 Make is_useful handle empty types properly 2017-01-03 15:31:46 +08:00
Andrew Cann
9ad20442e8 Start enabling empty types in pattern matching.
Remove the assumption at the start of is_useful that any suitably-long array of
wildcard patterns is useful relative the any empty vector. Instead we just
continue to recurse column-wise over the matrix.

This assumption is false in the presence of empty types.
eg. in the simplest case:

let x: ! = ...;
match x {
    // This pattern should not be considered useful by the algorithm
    _   => ...
}
2017-01-03 15:30:19 +08:00
Eduard-Mihai Burtescu
c6e130e89b rustc_const_eval: convert constants to Pattern instead of hir::Pat. 2017-01-01 22:17:18 +02:00
Eduard-Mihai Burtescu
c001b0940c rustc_const_eval: build Pattern instead of hir::Pat for pretty-printing. 2017-01-01 20:57:21 +02:00
Simonas Kazlauskas
b0e55a83a8 Such large. Very 128. Much bits.
This commit introduces 128-bit integers. Stage 2 builds and produces a working compiler which
understands and supports 128-bit integers throughout.

The general strategy used is to have rustc_i128 module which provides aliases for iu128, equal to
iu64 in stage9 and iu128 later. Since nowhere in rustc we rely on large numbers being supported,
this strategy is good enough to get past the first bootstrap stages to end up with a fully working
128-bit capable compiler.

In order for this strategy to work, number of locations had to be changed to use associated
max_value/min_value instead of MAX/MIN constants as well as the min_value (or was it max_value?)
had to be changed to use xor instead of shift so both 64-bit and 128-bit based consteval works
(former not necessarily producing the right results in stage1).

This commit includes manual merge conflict resolution changes from a rebase by @est31.
2016-12-30 15:15:44 +01:00
Eduard-Mihai Burtescu
4aae835803 rustc: always print nested nodes where a HIR map is available. 2016-12-28 11:29:20 +02:00
Eduard-Mihai Burtescu
f64e73b6ec rustc: simplify constant cross-crate loading and rustc_passes::consts. 2016-12-28 11:29:19 +02:00
Eduard-Mihai Burtescu
f89856be6c rustc: move function arguments into hir::Body. 2016-12-28 11:29:19 +02:00
Eduard-Mihai Burtescu
e64f64a2fc rustc: separate bodies for static/(associated)const and embedded constants. 2016-12-28 11:27:57 +02:00
Eduard-Mihai Burtescu
864928297d rustc: separate TraitItem from their parent Item, just like ImplItem. 2016-12-28 11:21:45 +02:00
Jeffrey Seyfried
f10f50b426 Refactor how global paths are represented (for both ast and hir). 2016-12-22 06:14:35 +00:00
bors
c80c31a502 Auto merge of #38053 - eddyb:lazy-9, r=nikomatsakis
[9/n] rustc: move type information out of AdtDef and TraitDef.

_This is part of a series ([prev](https://github.com/rust-lang/rust/pull/37688) | [next]()) 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>

Both `AdtDef` and `TraitDef` contained type information (field types, generics and predicates) which was required to create them, preventing their use before that type information exists, or in the case of field types, *mutation* was required, leading to a variance-magicking implementation of `ivar`s.

This PR takes that information out and the resulting cleaner setup could even eventually end up merged with HIR, because, just like `AssociatedItem` before it, there's no dependency on types anymore.
(With one exception, variant discriminants should probably be moved into their own map later.)
2016-12-02 15:06:36 +00:00
Alex Crichton
2186660b51 Update the bootstrap compiler
Now that we've got a beta build, let's use it!
2016-11-30 10:38:08 -08:00
Eduard-Mihai Burtescu
07ff914be1 rustc: simplify AdtDef by removing the field types and ty::ivar. 2016-11-29 21:24:26 +02:00
Niko Matsakis
104125d5f7 revamp Visitor with a single method for controlling nested visits 2016-11-29 13:04:27 +01:00
Florian Diebold
8575184b39 Fix rebase breakage 2016-11-29 13:04:27 +01:00
Florian Diebold
f0ce5bb66b Split nested_visit_mode function off from nested_visit_map
... and make the latter mandatory to implement.
2016-11-29 13:04:27 +01:00
Florian Diebold
d0ae2c8142 Refactor inlined items some more
They don't implement FnLikeNode anymore, instead are handled differently
further up in the call tree. Also, keep less information (just def ids
for the args).
2016-11-29 13:04:27 +01:00
Florian Diebold
f75c8a98dd Add make tidy fixes 2016-11-29 13:04:27 +01:00
Florian Diebold
c91037b964 Fix cross-crate associated constant evaluation 2016-11-29 13:04:27 +01:00
Florian Diebold
936dbbce37 Give function bodies their own dep graph node 2016-11-29 13:04:27 +01:00
Florian Diebold
16eedd2a78 Save bodies of functions for inlining into other crates
This is quite hacky and I hope to refactor it a bit, but at least it
seems to work.
2016-11-29 13:04:27 +01:00
Florian Diebold
8e754736dc rustc_const_eval: fix compilation 2016-11-29 13:04:27 +01:00
Eduard-Mihai Burtescu
962633cdbb rustc: embed path resolutions into the HIR instead of keeping DefMap. 2016-11-28 04:18:10 +02:00
Eduard Burtescu
16b5c2cfef rustc: desugar UFCS as much as possible during HIR lowering. 2016-11-28 04:18:10 +02:00
Andrew Cann
d756f61a5a Make is_uninhabited respect privacy 2016-11-22 13:22:31 +08:00
Nicholas Nethercote
382d3b043e Change HirVec<P<T>> to HirVec<T> in Expr.
This changes structures like this:
```
[ ExprArray | 8 | P ]
                  |
                  v
                  [ P | P | P | P | P | P | P | P ]
                    |
                    v
                    [ ExprTup | 2 | P ]
                                    |
                                    v
                                    [ P | P ]
                                      |
                                      v
                                      [ Expr ]
```
to this:
```
[ ExprArray | 8 | P ]
                  |
                  v
                  [ [ ExprTup | 2 | P ] | ... ]
                                    |
                                    v
                                    [ Expr | Expr ]
```
2016-11-22 08:18:31 +11:00
Jeffrey Seyfried
e85a0d70b8 Use Symbol instead of InternedString in the AST, HIR, and various other places. 2016-11-21 09:00:55 +00:00