Commit Graph

56080 Commits

Author SHA1 Message Date
Niko Matsakis
b2c7922d7f move free encode fns into methods of IndexBuilder 2016-08-17 09:03:50 -04:00
Niko Matsakis
92f269e665 put ecx into IndexBuilder so we don't have to pass 2016-08-17 08:03:50 -04:00
Niko Matsakis
25bb51d98f store ecx, not dep-graph 2016-08-17 07:51:12 -04:00
Niko Matsakis
85ac63e9ec rename CrateIndex to IndexBuilder 2016-08-17 07:51:12 -04:00
Niko Matsakis
b5fa8ab593 move CrateIndex into its own module 2016-08-17 07:39:11 -04:00
bors
6c0d66af69 Auto merge of #35236 - nrc:rustdoc-redirects, r=@alexcrichton
rustdoc: redirect URLs

cc #35020 which does this properly

r? @alexcrichton
2016-08-17 03:20:13 -07:00
bors
d6d0590469 Auto merge of #35605 - eddyb:substs, r=nikomatsakis
Remove the ParamSpace separation from formal and actual generics in rustc.

This is the first step towards enabling the typesystem implemented by `rustc` to be extended
(with generic modules, HKT associated types, generics over constants, etc.).

The current implementation splits all formal (`ty::Generics`) and actual (`Substs`) lifetime and type parameters (and even `where` clauses) into 3 "parameter spaces":
* `TypeSpace` for `enum`, `struct`, `trait` and `impl`
* `SelfSpace` for `Self` in a `trait`
* `FnSpace` for functions and methods

For example, in `<X as Trait<A, B>>::method::<T, U>`, the `Substs` are `[[A, B], [X], [T, U]]`.
The representation uses a single `Vec` with 2 indices where it's split into the 3 "parameter spaces".
Such a simplistic approach doesn't scale beyond the Rust 1.0 typesystem, and its existence was mainly motivated by keeping code manipulating generic parameters correct, across all possible situations.

Summary of changes:
* `ty::Generics` are uniformly stored and can be queried with `tcx.lookup_generics(def_id)`
 * the `typeck::collect` changes for this resulted in a function to lazily compute the `ty::Generics` for a local node, given only its `DefId` - this can be further generalized to other kinds of type information
* `ty::Generics` and `ty::GenericPredicates` now contain only their own parameters (or `where` clauses, respectively), and refer to their "parent", forming a linked list
 * right now most items have one level of nesting, only associated items and variants having two
 * in the future, if `<X as mod1<A>::mod2<B>::mod3::Trait<C>>::Assoc<Y>` is supported, it would be represented by item with the path `mod1::mod2::mod3::Trait::Assoc`, and 4 levels of generics: `mod1` with `[A]`, `mod2` with `[B]`, `Trait` with `[X, C]` and `Assoc` with `[Y]`
* `Substs` gets two new APIs for working with arbitrary items:
 * `Substs::for_item(def_id, mk_region, mk_type)` will construct `Substs` expected by the definition `def_id`, calling `mk_region` for lifetime parameters and `mk_type` for type parameters, and it's guaranteed to *always* return `Substs` compatible with `def_id`
 * `substs.rebase_onto(from_base_def_id, to_base_substs)` can be used if `substs` is for an item nested within `from_base_def_id` (e.g. an associated item), to replace the "outer parameters" with `to_base_substs` - for example, you can translate a method's `Substs` between a `trait` and an `impl` (in both directions) if you have the `DefId` of one and `Substs` for the other
* trait objects, without a `Self` in their `Substs`, use *solely* `ExistentialTraitRef` now, letting `TraitRef` assume it *always* has a `Self` present
* both `TraitRef` and `ExistentialTraitRef` get methods which do operations on their `Substs` which are valid only for traits (or trait objects, respectively)
* `Substs` loses its "parameter spaces" distinction, with effectively no code creating `Substs` in an ad-hoc manner, or inspecting them, without knowing what shape they have already

Future plans:
* combine both lifetimes and types in a single `Vec<Kind<'tcx>>` where `Kind` would be a tagged pointer that can be `Ty<'tcx>`, `&'tcx ty::Region` or, in the future, potentially-polymorphic constants
 * this would require some performance investigation, if it implies a lot of dynamic checks
* introduce an abstraction for `(T, Substs)`, where the `Substs` are even more hidden away from code
manipulating it; a precedent for this is `Instance` in trans, which has `T = DefId`; @nikomatsakis also referred to this, as "lazy substitution", when `T = Ty`
* rewrite type pretty-printing to fully take advantage of this to inject actual in the exact places of formal generic parameters in any paths
* extend the set of type-level information (e.g. beyond `ty::Generics`) that can be lazily queried during `typeck` and introduce a way to do those queries from code that can't refer to `typeck` directly
 * this is almost unrelated but is necessary for DAG-shaped recursion between constant evaluation and type-level information, i.e. for implementing generics over constants

r? @nikomatsakis
cc @rust-lang/compiler

cc @nrc Could get any perf numbers ahead of merging this?
2016-08-16 22:52:55 -07:00
Jacob
7675e4b514 Update E0009 to new format 2016-08-16 22:21:31 -07:00
Neil Williams
4254b31078 Update minimum CMake version in README
The minimum got bumped in the LLVM upgrade of #34743.
2016-08-16 21:30:17 -07:00
Nick Cameron
879637f7b0 Review changes 2016-08-17 16:12:37 +12:00
Eduard Burtescu
9453d9b8ad rustc: remove ParamSpace from Substs. 2016-08-17 06:32:00 +03:00
Eduard Burtescu
6f5e455c2d rustc: split GenericPredicates of a method from its parent predicates. 2016-08-17 05:50:57 +03:00
Eduard Burtescu
3e74e5bffe rustc: split Generics of a method from its parent Generics. 2016-08-17 05:50:57 +03:00
Eduard Burtescu
c1cfd58cbd rustc: remove SelfSpace from ParamSpace. 2016-08-17 05:50:57 +03:00
Eduard Burtescu
4158673ad7 rustc: reduce Substs and Generics to a simple immutable API. 2016-08-17 05:50:57 +03:00
Eduard Burtescu
bfdfa1ce1d rustc_typeck: use Substs::from_generics instead of manually building them. 2016-08-17 05:50:57 +03:00
Eduard Burtescu
4b25f08512 rustc: move trait objects from TraitRef to ExistentialTraitRef. 2016-08-17 05:50:57 +03:00
Eduard Burtescu
5ef6af09e3 rustc: move defaulting's use of &mut Substs from InferCtxt to typeck. 2016-08-17 05:50:57 +03:00
Eduard Burtescu
c87063f07e rustc: avoid using subst::VecPerParamSpace::{empty,new} directly. 2016-08-17 05:50:57 +03:00
Eduard Burtescu
77dc61b5c6 rustc: force all raw accesses to VecPerParamSpace through as_full_slice. 2016-08-17 05:50:57 +03:00
Eduard Burtescu
b354ae95a2 rustc: move the SelfSpace before TypeSpace in Substs. 2016-08-17 05:50:57 +03:00
Eduard Burtescu
e314636b86 rustc: use Vec instead of VecPerParamSpace for ty::GenericPredicates. 2016-08-17 05:50:57 +03:00
bors
9376da6f77 Auto merge of #35559 - frewsxcv:slice-iter-as-ref, r=alexcrichton
Implement `AsRef<[T]>` for `std::slice::Iter`.

`AsRef` is designed for conversions that are "cheap" (as per
the API docs). It is the case that retrieving the underlying
data of `std::slice::Iter` is cheap. In my opinion, there's no
ambiguity about what slice data will be returned, otherwise,
I would be more cautious about implementing `AsRef`.
2016-08-16 19:44:10 -07:00
Eduard Burtescu
34f856e905 Update LLVM to include 4 backported commits by @majnemer. 2016-08-17 05:37:48 +03:00
Chris Stankus
f0ff2d32c8 E0403 update error format 2016-08-16 20:49:09 -05:00
Andrew Paseltiner
7e148cd062
Make vec::IntoIter covariant again
Closes #35721
2016-08-16 20:45:07 -04:00
bors
1bf5fa3269 Auto merge of #35538 - cgswords:libproc_macro, r=nrc
Kicking off libproc_macro

This PR introduces `libproc_macro`, which is currently quite bare-bones (just a few macro construction tools and an initial `quote!` macro).

This PR also introduces a few test cases for it, and an additional `shim` file (at `src/libsyntax/ext/proc_macro_shim.rs` to allow a facsimile usage of Macros 2.0 *today*!
2016-08-16 16:35:10 -07:00
Dustin Bensing
4cfdf634c1 Update E0005 Unit-Test 2016-08-17 00:40:08 +02:00
Nick Cameron
77ca7dd107 rustdoc: redirects from sane, namespaced URLs to Rustdoc's ridiculous ones
cc #35020 which does this properly
2016-08-17 10:30:39 +12:00
Nick Cameron
a41454bf65 rustdoc: add namespaces for items 2016-08-17 10:30:39 +12:00
Nick Cameron
7a7cd644cb rustdoc: refactoring and tidying up
pulled out of #35020
2016-08-17 10:30:39 +12:00
Jorge Aparicio
1cf9cafeb1 add mips-uclibc targets
These targets cover OpenWRT 15.05 devices, which use the soft float ABI
and the uclibc library. None of the other built-in mips targets covered
those devices (mips-gnu is hard float and glibc-based, mips-musl is
musl-based).

With this commit one can now build std for these devices using these
commands:

```
$ configure --enable-rustbuild --target=mips-unknown-linux-uclibc
$ make
```

cc #35673
2016-08-16 17:12:51 -05:00
Dustin Bensing
1fc18aab5d Update E0005 to use a label 2016-08-16 23:50:32 +02:00
Amanieu d'Antras
330b7f7359 Implement RFC 1649 2016-08-16 22:22:53 +01:00
bors
514d4cef24 Auto merge of #35354 - tomgarcia:covariant-drain, r=alexcrichton
Made vec_deque::Drain, hash_map::Drain, and hash_set::Drain covariant

Fixed the rest of the Drain iterators.
2016-08-16 13:26:15 -07:00
cgswords
98c8e0a05d Proc_macro is alive 2016-08-16 13:17:36 -07:00
Mikhail Modin
193b9ae86b update to new error format E0409 2016-08-16 22:13:09 +03:00
Knight
3caa451b9d Updated E0394 to new error message 2016-08-17 03:02:25 +08:00
Knight
d2e78956c3 Updated E0422 to new error message 2016-08-17 03:02:25 +08:00
Brian Anderson
16fc02569d Bump version to 1.13 2016-08-16 11:29:50 -07:00
bors
db7300d414 Auto merge of #35637 - japaric:no-builtins-lto, r=alexcrichton
exclude `#![no_builtins]` crates from LTO

this prevents intrinsics like `memcpy` from being mis-optimized to
infinite recursive calls when LTO is used.

fixes #31544
closes #35540

---

r? @alexcrichton
cc @Amanieu
2016-08-16 10:13:18 -07:00
Corey Farwell
dc22186efb Add basic unit test for std::slice::Iter::as_slice. 2016-08-16 11:20:43 -04:00
Corey Farwell
3808dc3560 Implement AsRef<[T]> for std::slice::Iter.
`AsRef` is designed for conversions that are "cheap" (as per
the API docs). It is the case that retrieving the underlying
data of `std::slice::Iter` is cheap. In my opinion, there's no
ambiguity about what slice data will be returned, otherwise,
I would be more cautious about implementing `AsRef`.
2016-08-16 11:14:52 -04:00
bors
1de5b7e8c2 Auto merge of #35617 - jseyfried:fix_unused_cfg_attr_path, r=eddyb
Fix incorrect unused import warnings on `cfg_attr`ed `path` attributes

Fixes #35584.
r? @eddyb
2016-08-16 06:32:20 -07:00
Seo Sanghyeon
3aa63400a2 Use UI test to test spans, instead of forced line break 2016-08-16 20:46:50 +09:00
Matthew Piziak
c186da706d RangeFull for-loop iteration fails because of IntoIterator
Saying that "[for-loop iteration] fails because .. has no IntoIterator
impl" is more direct than saying "...no Iterator impl" because for loops
sugar into IntoIterator invocations. It just happens that the other
Range* operators implement Iterator and rely on the fact that
`IntoIterator` is implemented for `T: Iterator`.
2016-08-16 06:54:45 -04:00
Seo Sanghyeon
d52eb1ab0c RUST_NEW_ERROR_FORMAT is no more 2016-08-16 16:52:30 +09:00
bors
e25542cb02 Auto merge of #35162 - canndrew:bang_type_coerced, r=nikomatsakis
Implement the `!` type

This implements the never type (`!`) and hides it behind the feature gate `#[feature(never_type)]`. With the feature gate off, things should build as normal (although some error messages may be different). With the gate on, `!` is usable as a type and diverging type variables (ie. types that are unconstrained by anything in the code) will default to `!` instead of `()`.
2016-08-16 00:12:12 -07:00
Corey Farwell
bc52bdcedc Implement Debug for std::vec::IntoIter.
Display all the remaining items of the iterator, similar to the `Debug`
implementation for `core::slice::Iter`:

f0bab98695/src/libcore/slice.rs (L930-L937)

Using the `as_slice` method that was added in:

https://github.com/rust-lang/rust/pull/35447
2016-08-15 23:45:12 -04:00
Jorge Aparicio
e996405696 test that a no_builtins crate is passed to the linker 2016-08-15 18:24:14 -05:00