4867 Commits

Author SHA1 Message Date
Alex Crichton
60541cdc1e Test fixes and rebase conflicts 2014-11-26 16:50:13 -08:00
Alex Crichton
2298084058 rollup merge of #19326: huonw/safer-syntax
This makes it correct (e.g. avoiding null pointers) and safe.
2014-11-26 16:50:12 -08:00
Alex Crichton
f4a775639c rollup merge of #19298: nikomatsakis/unboxed-closure-parse-the-plus
Implements RFC 438.

Fixes #19092.

This is a [breaking-change]: change types like `&Foo+Send` or `&'a mut Foo+'a` to `&(Foo+Send)` and `&'a mut (Foo+'a)`, respectively.

r? @brson
2014-11-26 16:49:46 -08:00
Alex Crichton
f40fa8304f rollup merge of #19288: steveklabnik/doc_style_cleanup
This is considered good convention.

This is about half of them in total, I just don't want an impossible to land patch. 😄
2014-11-26 16:49:36 -08:00
Alex Crichton
51d146a56a rollup merge of #19266: aochagavia/const
With this PR, the following code works:

```
#![feature(tuple_indexing)]
struct MyStruct { field1: uint }

const S: MyStruct = MyStruct { field1: 42u };
const T: (uint,) = (42u,);

struct ConstCheck {
    array1: [int, ..S.field1],
    array2: [int, ..T.0],
}
```

Closes https://github.com/rust-lang/rust/issues/19244
Related https://github.com/rust-lang/rust/issues/19265
2014-11-26 16:49:35 -08:00
Jakub Bukaj
5804a30686 Warn on pattern bindings that have the same name as a variant
...of the type being matched.

This change will result in a better diagnostic for code like the following:

```rust
enum Enum {
    Foo,
    Bar
}

fn f(x: Enum) {
    match x {
        Foo => (),
        Bar => ()
    }
}
```

which would currently simply fail with an unreachable pattern error
on the 2nd arm.

The user is advised to either use a qualified path in the patterns
or import the variants explicitly into the scope.
2014-11-26 22:21:52 +00:00
bors
1a44875af9 auto merge of #19176 : aturon/rust/stab-iter, r=alexcrichton
This is an initial pass at stabilizing the `iter` module. The module is
fairly large, but is also pretty polished, so most of the stabilization
leaves things as they are.

Some changes:

* Due to the new object safety rules, various traits needs to be split
  into object-safe traits and extension traits. This includes `Iterator`
  itself. While splitting up the traits adds some complexity, it will
  also increase flexbility: once we have automatic impls of `Trait` for
  trait objects over `Trait`, then things like the iterator adapters
  will all work with trait objects.

* Iterator adapters that use up the entire iterator now take it by
  value, which makes the semantics more clear and helps catch bugs. Due
  to the splitting of Iterator, this does not affect trait objects. If
  the underlying iterator is still desired for some reason, `by_ref` can
  be used. (Note: this change had no fallout in the Rust distro except
  for the useless mut lint.)

* In general, extension traits new and old are following an [in-progress
  convention](rust-lang/rfcs#445). As such, they
  are marked `unstable`.

* As usual, anything involving closures is `unstable` pending unboxed
  closures.

* A few of the more esoteric/underdeveloped iterator forms (like
  `RandomAccessIterator` and `MutableDoubleEndedIterator`, along with
  various unfolds) are left experimental for now.

* The `order` submodule is left `experimental` because it will hopefully
  be replaced by generalized comparison traits.

* "Leaf" iterators (like `Repeat` and `Counter`) are uniformly
  constructed by free fns at the module level. That's because the types
  are not otherwise of any significance (if we had `impl Trait`, you
  wouldn't want to define a type at all).

Closes #17701

Due to renamings and splitting of traits, this is a:

[breaking-change]
2014-11-26 17:42:07 +00:00
Niko Matsakis
c4a3be6bd1 Rote changes due to the fact that ast paths no longer carry this extraneous bounds. 2014-11-26 11:42:06 -05:00
Niko Matsakis
f4e29e7e9a Fixup various places that were doing &T+'a and do &(T+'a) 2014-11-26 11:42:06 -05:00
Niko Matsakis
74a1041a4d Implement the new parsing rules for types in the parser, modifying the AST appropriately. 2014-11-26 11:42:05 -05:00
bors
8fb027e398 auto merge of #19252 : japaric/rust/cow, r=aturon
- Add `IntoCow` trait, and put it in the prelude
- Add `is_owned`/`is_borrowed` methods to `Cow`
- Add `CowString`/`CowVec` type aliases (to `Cow<'_, String, str>`/`Cow<'_, Vec, [T]>` respectively)
- `Cow` implements: `Show`, `Hash`, `[Partial]{Eq,Ord}`
- `impl BorrowFrom<Cow<'a, T, B>> for B`

[breaking-change]s:

- `IntoMaybeOwned` has been removed from the prelude
- libcollections: `SendStr` is now an alias to `CowString<'static>` (it was aliased to `MaybeOwned<'static>`)
- libgraphviz:
  - `LabelText` variants now wrap `CowString` instead of `MaybeOwned`
  - `Nodes` and `Edges` are now type aliases to `CowVec` (they were aliased to `MaybeOwnedVec`)
- libstd/path: `Display::as_maybe_owned` has been renamed to `Display::as_cow` and now returns a `CowString`
- These functions now accept/return `Cow` instead of `MaybeOwned[Vector]`:
  - libregex: `Replacer::reg_replace`
  - libcollections: `str::from_utf8_lossy`
  - libgraphviz: `Id::new`, `Id::name`, `LabelText::pre_escaped_content`
  - libstd: `TaskBuilder::named`

r? @aturon
2014-11-26 12:02:16 +00:00
Steve Klabnik
f38e4e6d97 /** -> ///
This is considered good convention.
2014-11-25 21:24:16 -05:00
Aaron Turon
b299c2b57d Fallout from stabilization 2014-11-25 17:41:54 -08:00
Huon Wilson
4653ad0205 Make syntax::owned_slice a Box<[T]> wrapper.
This makes it correct (e.g. avoiding null pointers) and safe.
2014-11-26 11:55:39 +11:00
bors
eedfc07796 auto merge of #19011 : ricky26/rust/trait_supertraits, r=nikomatsakis
It looks like currently kinds required by traits are not propagated when they are wrapped in a TyTrait. Additionally, in SelectionContext::builtin_bound, no attempt is made to check whether the target trait or its supertraits require the kind specified.

This PR alters SelectionContext::builtin_bound to examine all supertraits in the target trait's bounds recursively for required kinds.

Alternatively, the kinds could be added to the TyTrait upon creation (by just setting its builtin_bounds to the union of the bounds requested in this instance and the bounds required by the trait), this option may have less overhead during compilation but information is lost about which kinds were explicitly requested for this instance (vs those specified by traits/supertraits) would be lost.
2014-11-25 22:36:59 +00:00
Jorge Aparicio
3293ab14e2 Deprecate MaybeOwned[Vector] in favor of Cow 2014-11-25 11:22:23 -05:00
Felix S. Klock II
c9a1c376fc Added fragments.rs: compute drop obligations remaining post moves.
Includes differentiation between assigned_fragments and
moved_fragments, support for all-but-one array fragments, and
instrumentation to print out the moved/assigned/unmmoved/parents for
each function, factored out into separate submodule.
2014-11-25 15:26:16 +01:00
Felix S. Klock II
21fe017ab0 Check other fields are consistent in LoanPath::common. 2014-11-25 15:26:16 +01:00
Felix S. Klock II
09d67fd777 Track what drop obligations are established on match arms.
This is accomplished by:

1. Add `MatchMode` enum to `expr_use_visitor`.

2. Computing the match mode for each pattern via a pre-pass, and then
   passing the mode along when visiting the pattern in
   expr_use_visitor.

3. Adding a `fn matched_pat` callback to expr_use_visitor, which is
   called on interior struct and enum nodes of the pattern (as opposed
   to `fn consume_pat`, which is only invoked for identifiers at the
   leaves of the pattern), and invoking it accordingly.

Of particular interest are the `cat_downcast` instances established
when matching enum variants.
2014-11-25 15:26:16 +01:00
Felix S. Klock II
6f7cb8c618 Override LoanPath Eq impl to enforce invariant: eq lp's always have eq types. 2014-11-25 15:26:16 +01:00
Felix S. Klock II
1217b829e8 MemCategorizationContext::pat_ty(BindByRef) yields type of borrowed val now.
This is to fix a problem where I could not reliably map attach the
type for each loan-path to the loan-path itself because the same
loan-path was ending up associated with two different types, because
the cmt's had diverged in their interpretation of the path.
2014-11-25 15:26:16 +01:00
Felix S. Klock II
91b88c54c2 Add ty to LoanPath.
To make this clean, refactored old `LoanPath` enum into a
`LoanPath` struct with a `ty::t` and a newly-added `LoanPathVariant` enum.

This enabled me to get rid of the ugly and fragile `LoanPath::to_type`
method, and I can probably also get rid of other stuff that was
supporting it, maybe.
2014-11-25 15:26:15 +01:00
Felix S. Klock II
d6c8f3b726 Add LpDowncast, LoanPath variant tracking downcasts in match arms.
`LpDowncast` carries the `DefId` of the variant itself.  To support
this, added the enum variant `DefId` to the `cat_downcast` variant in
`mem_categorization::categorization`.

(updated to fix mem_categorization to handle downcast of enum
struct-variants properly.)
2014-11-25 15:25:55 +01:00
Adolfo Ochagavía
fbde11297f Allow constant struct fields and tuple indexing 2014-11-25 10:25:14 +01:00
Jakub Bukaj
3594c588bb rollup merge of #19211: aochagavia/tuple-index
This breaks code like

```
let t = (42i, 42i);
... t.0::<int> ...;
```

Change this code to not contain an unused type parameter. For example:

```
let t = (42i, 42i);
... t.0 ...;
```

Closes https://github.com/rust-lang/rust/issues/19096

[breaking-change]

r? @aturon
2014-11-23 14:11:56 -05:00
Ricky Taylor
729bf447ab Search for implemented kinds recursively on Trait types. Fixes #15155 and #13155. 2014-11-23 12:24:34 +00:00
Adolfo Ochagavía
35316972ff Remove type parameters from ExprField and ExprTupField 2014-11-23 12:17:43 +01:00
Alex Crichton
1684419897 Register new snapshots 2014-11-21 14:15:33 -08:00
bors
47c1d437c9 auto merge of #18984 : sheroze1123/rust/fix17574, r=bstrie
Fix #17574
2014-11-21 11:36:45 +00:00
bors
770378a313 auto merge of #18773 : subhashb/rust/convert_remaining_failures_to_panic, r=steveklabnik
I have also renamed `fail` to `panic` in some non-documentation comments, where I thought it mattered.
Fixes #18677 

cc @steveklabnik
2014-11-20 23:02:01 +00:00
bors
d13aff1224 auto merge of #18750 : nikomatsakis/rust/issue-18333-skolemize-open-existential, r=nrc
In the general case, at least, it is not possible to make an object out of an unsized type. This is because the object type would have to store the fat pointer information for the `self` value *and* the vtable -- meaning it'd have to be a fat pointer with three words -- but for the compiler to know that the object requires three words, it would have to know the self-type of the object (is `self` a thin or fat pointer?), which of course it doesn't.

Fixes #18333.

r? @nick29581
2014-11-20 19:26:40 +00:00
Subhash Bhushan
bc9de771d5 Rename remaining Failures to Panic 2014-11-20 23:45:42 +05:30
Niko Matsakis
7a372e23cb Require that objects can only be made from Sized types. Fixes #18333. 2014-11-20 09:16:20 -05:00
bors
394269d16e auto merge of #19033 : pnkfelix/rust/fsk-introduce-scopedata-via-refactor, r=nikomatsakis
(Previously, scopes were solely identified with NodeId's; this
refactoring prepares for a future where that does not hold.)

Ground work for a proper fix to #8861.
2014-11-20 14:01:51 +00:00
Felix S. Klock II
5ff9087e05 Refactored new CodeExtent type for improved abstraction.
(Previously, statically identifiable scopes/regions were solely
identified with NodeId's; this refactoring prepares for a future
where that 1:1 correspondence does not hold.)
2014-11-20 13:10:03 +01:00
bors
1d81776209 auto merge of #19113 : nikomatsakis/rust/unboxed-boxed-closure-unification, r=acrichto
Use the expected type to infer the argument/return types of unboxed closures. Also, in `||` expressions, use the expected type to decide if the result should be a boxed or unboxed closure (and if an unboxed closure, what kind).

This supercedes PR #19089, which was already reviewed by @pcwalton.
2014-11-20 12:01:44 +00:00
Jakub Bukaj
7884dd9cec rollup merge of #19087: jakub-/issue-19086
Fixes #19086.

Whilst the code that this PR renders invalid was never meant to be valid, this is still a...

[breaking-change]
2014-11-19 22:39:29 +01:00
Jakub Bukaj
1faa09615e rollup merge of #19073: jakub-/issue-19069
Fixes #19069.

These were never intended not to be feature-gated but this PR is nonetheless a...

[breaking-change]
2014-11-19 22:39:12 +01:00
Jakub Bukaj
a22f06db19 rollup merge of #19040: alexcrichton/issue-18904
This commit applies the stabilization of std::fmt as outlined in [RFC 380][rfc].
There are a number of breaking changes as a part of this commit which will need
to be handled to migrated old code:

* A number of formatting traits have been removed: String, Bool, Char, Unsigned,
  Signed, and Float. It is recommended to instead use Show wherever possible or
  to use adaptor structs to implement other methods of formatting.

* The format specifier for Boolean has changed from `t` to `b`.

* The enum `FormatError` has been renamed to `Error` as well as becoming a unit
  struct instead of an enum. The `WriteError` variant no longer exists.

* The `format_args_method!` macro has been removed with no replacement. Alter
  code to use the `format_args!` macro instead.

* The public fields of a `Formatter` have become read-only with no replacement.
  Use a new formatting string to alter the formatting flags in combination with
  the `write!` macro. The fields can be accessed through accessor methods on the
  `Formatter` structure.

Other than these breaking changes, the contents of std::fmt should now also all
contain stability markers. Most of them are still #[unstable] or #[experimental]

[rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0380-stabilize-std-fmt.md
[breaking-change]

Closes #18904
2014-11-19 22:38:26 +01:00
Jakub Bukaj
0191b4983e rollup merge of #18940: nikomatsakis/issue-18899
Ensure that the type parameters passed to methods outlive the call expression.

Fixes #18899.

This is yet another case of forgotten to consistently enforce the constraints in every instance where they apply. Might be nice to try and refactor to make this whole thing more DRY, but for now here's a targeted fix.

r? @pcwalton
2014-11-19 22:37:11 +01:00
Jakub Bukaj
655eb44df3 rollup merge of #18868: nikomatsakis/issue-17388-unbound-path-assoc-type
This fixes #17388.

Note that we don't check type parameters in trait-references and so on, so we accept some nonsense (I opened https://github.com/rust-lang/rust/issues/18865). (It may be easier to just add support for `T::Foo` and deprecate the qpath code until we can implement it more robustly using the trait lookup infrastructure, not sure.)
2014-11-19 22:37:02 +01:00
Jakub Bukaj
1b5cbd0036 Forbid matching struct variants with tuple variant patterns 2014-11-19 21:14:48 +01:00
Niko Matsakis
b9c5cd4dc4 Use the expected type to decide whether || is an unboxed or boxed closure. 2014-11-19 13:35:21 -05:00
Niko Matsakis
3e2929d362 Merge the ExprFnBlock and ExprUnboxedClosure into one ExprClosure with an optional unboxed closure kind. 2014-11-19 13:35:20 -05:00
Niko Matsakis
ee9a7b60fa Pass the unadjusted type into the unsize_info function, which seems to be what it expects. Fixes #17322. 2014-11-19 10:02:04 -05:00
Niko Matsakis
0b6ec70197 Ensure that the type parameters passed to methods outlive the call expression. Fixes #18899. 2014-11-19 06:20:20 -05:00
Niko Matsakis
b64c7b83dd Refactor QPath to take an ast::TraitRef 2014-11-19 05:53:40 -05:00
Niko Matsakis
8e44688889 Deduce the argument types based on the expected type, trawling through the fulfillment contect if necessary. 2014-11-19 05:52:59 -05:00
Niko Matsakis
fe2fcb39f4 Move closure checking into its own file. Shrink check/mod.rs! 2014-11-19 05:31:16 -05:00
Alex Crichton
4af3494bb0 std: Stabilize std::fmt
This commit applies the stabilization of std::fmt as outlined in [RFC 380][rfc].
There are a number of breaking changes as a part of this commit which will need
to be handled to migrated old code:

* A number of formatting traits have been removed: String, Bool, Char, Unsigned,
  Signed, and Float. It is recommended to instead use Show wherever possible or
  to use adaptor structs to implement other methods of formatting.

* The format specifier for Boolean has changed from `t` to `b`.

* The enum `FormatError` has been renamed to `Error` as well as becoming a unit
  struct instead of an enum. The `WriteError` variant no longer exists.

* The `format_args_method!` macro has been removed with no replacement. Alter
  code to use the `format_args!` macro instead.

* The public fields of a `Formatter` have become read-only with no replacement.
  Use a new formatting string to alter the formatting flags in combination with
  the `write!` macro. The fields can be accessed through accessor methods on the
  `Formatter` structure.

Other than these breaking changes, the contents of std::fmt should now also all
contain stability markers. Most of them are still #[unstable] or #[experimental]

[rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0380-stabilize-std-fmt.md
[breaking-change]

Closes #18904
2014-11-18 21:16:22 -08:00