3915 Commits

Author SHA1 Message Date
Sean McArthur
44440e5c18 core: split into fmt::Show and fmt::String
fmt::Show is for debugging, and can and should be implemented for
all public types. This trait is used with `{:?}` syntax. There still
exists #[derive(Show)].

fmt::String is for types that faithfully be represented as a String.
Because of this, there is no way to derive fmt::String, all
implementations must be purposeful. It is used by the default format
syntax, `{}`.

This will break most instances of `{}`, since that now requires the type
to impl fmt::String. In most cases, replacing `{}` with `{:?}` is the
correct fix. Types that were being printed specifically for users should
receive a fmt::String implementation to fix this.

Part of #20013

[breaking-change]
2015-01-06 14:49:42 -08:00
Niko Matsakis
2375a79152 Implement impl reachability rules. This is a [breaking-change]. Type
parameters on impls must now also appear in the trait ref, self type,
or some associated type declared on the impl. This ensures that they
are constrianed in some way and that the semantics of the trait system
are well-defined (always a good thing).

There are three major ways to fix this error:

1. Convert the trait to use associated types; most often the type
   parameters are not constrained because they are in fact outputs of
   the impl.

2. Move the type parameters to methods.

3. Add an additional type parameter to the self type or trait so that
   the unused parameter can appear there.

In some cases, it is not possible to fix the impl because the trait
definition needs to be changed first (and that may be out of your
control). In that case, for the time being, you can opt out of these
rules by using `#[old_impl_check]` on the impl and adding a
`#![feature(old_impl_check)]` to your crate declaration.
2015-01-06 17:17:48 -05:00
Niko Matsakis
3ed7f067dc Fix fallout in libs. For the most part I just tagged impls as #[old_impl_check]. 2015-01-06 17:17:48 -05:00
Nick Cameron
791f545685 Pretty print empty structs properly 2015-01-07 10:49:00 +13:00
Nick Cameron
e970db37a9 Remove old slicing hacks and make new slicing work 2015-01-07 10:49:00 +13:00
Corey Richardson
5a4ca31918 test fallout from isize/usize 2015-01-06 16:48:33 -05:00
Nick Cameron
f7ff37e4c5 Replace full slice notation with index calls 2015-01-07 10:46:33 +13:00
Nick Cameron
503709708c Change std::kinds to std::markers; flatten std::kinds::marker
[breaking-change]
2015-01-07 09:45:28 +13:00
Corey Richardson
abcbe27695 syntax/rustc: implement isize/usize 2015-01-06 15:15:07 -05:00
Dylan Ede
25eada1574 [breaking change] Revert Entry behaviour to take keys by value. 2015-01-06 11:59:26 -08:00
Corey Richardson
6680c9c5c7 syntax: implement 'macro input future proofing'
See RFC 550 (https://github.com/rust-lang/rfcs/pull/550) for the motivation
and details.

If this breaks your code, add one of the listed tokens after the relevant
non-terminal in your matcher.

[breaking-change]
2015-01-06 12:03:12 -05:00
Alex Crichton
4b359e3aee More test fixes! 2015-01-05 22:58:37 -08:00
Alex Crichton
7975fd9cee rollup merge of #20482: kmcallister/macro-reform
Conflicts:
	src/libflate/lib.rs
	src/libstd/lib.rs
	src/libstd/macros.rs
	src/libsyntax/feature_gate.rs
	src/libsyntax/parse/parser.rs
	src/libsyntax/show_span.rs
	src/test/auxiliary/macro_crate_test.rs
	src/test/compile-fail/lint-stability.rs
	src/test/run-pass/intrinsics-math.rs
	src/test/run-pass/tcp-connect-timeouts.rs
2015-01-05 19:01:17 -08:00
Alex Crichton
384e218789 Merge remote-tracking branch 'nrc/sized-2' into rollup
Conflicts:
	src/liballoc/boxed.rs
	src/libcollections/btree/map.rs
	src/libcollections/slice.rs
	src/libcore/borrow.rs
	src/libcore/cmp.rs
	src/libcore/ops.rs
	src/libstd/c_str.rs
	src/libstd/collections/hash/map.rs
	src/libsyntax/parse/obsolete.rs
	src/test/compile-fail/unboxed-closure-sugar-default.rs
	src/test/compile-fail/unboxed-closure-sugar-equiv.rs
	src/test/compile-fail/unboxed-closure-sugar-lifetime-elision.rs
	src/test/compile-fail/unboxed-closure-sugar-region.rs
	src/test/compile-fail/unsized3.rs
	src/test/run-pass/associated-types-conditional-dispatch.rs
2015-01-05 18:55:41 -08:00
Alex Crichton
afbce050ca rollup merge of #20556: japaric/no-for-sized
Conflicts:
	src/libcollections/slice.rs
	src/libcollections/str.rs
	src/libcore/borrow.rs
	src/libcore/cmp.rs
	src/libcore/ops.rs
	src/libstd/c_str.rs
	src/test/compile-fail/issue-19009.rs
2015-01-05 18:47:45 -08:00
Alex Crichton
cf8a11e98b rollup merge of #20594: nikomatsakis/orphan-ordered
Conflicts:
	src/libsyntax/feature_gate.rs
2015-01-05 18:42:34 -08:00
Alex Crichton
b24431970e rollup merge of #20568: huonw/ungate-AT-globs
These aren't in their final form, but are all aiming to be part of 1.0, so at the very least encouraging usage now to find the bugs is nice.

Also, the widespread roll-out of associated types in the standard library indicates they're getting good, and it's lame to have to activate a feature in essentially every crate ever.
2015-01-05 18:42:00 -08:00
Alex Crichton
bb5e16b4b8 rollup merge of #20554: huonw/mut-pattern
Conflicts:
	src/librustc_typeck/check/_match.rs
2015-01-05 18:38:51 -08:00
Alex Crichton
3d9923d0d5 rollup merge of #20424: jroesch/tuple-struct-where-clause-fix
Fixes #17904. All the cases that I believe we should support are detailed in the test case, let me know if there is there is any more desired behavior. cc @japaric.

r? @nikomatsakis or whoever is appropriate.
2015-01-05 18:36:30 -08:00
Alex Crichton
0dd07429ab rollup merge of #20258: sanxiyn/show-span-2 2015-01-05 18:36:28 -08:00
Alex Crichton
7f4f79cbd7 rollup merge of #20099: P1start/parse-more-macro-ops
Closes #20093.
2015-01-05 18:36:25 -08:00
Keegan McAllister
c2e26972e3 Un-gate macro_rules 2015-01-05 18:21:14 -08:00
Keegan McAllister
416137eb31 Modernize macro_rules! invocations
macro_rules! is like an item that defines a macro.  Other items don't have a
trailing semicolon, or use a paren-delimited body.

If there's an argument for matching the invocation syntax, e.g. parentheses for
an expr macro, then I think that applies more strongly to the *inner*
delimiters on the LHS, wrapping the individual argument patterns.
2015-01-05 18:21:14 -08:00
Keegan McAllister
c9f0ff3813 Reserve the keyword 'macro' 2015-01-05 18:21:14 -08:00
Keegan McAllister
aa69cbde82 Allow selective macro import 2015-01-05 18:21:13 -08:00
Keegan McAllister
0816255c80 Move #[macro_reexport] to extern crate 2015-01-05 18:21:13 -08:00
Keegan McAllister
60be2f52d2 Replace #[phase] with #[plugin] / #[macro_use] / #[no_link] 2015-01-05 18:21:13 -08:00
Nick Cameron
8f3a424322 Fix the obsolete message 2015-01-06 14:25:06 +13:00
Nick Cameron
e0684e8769 Fallout 2015-01-06 14:20:48 +13:00
Nick Cameron
48f50e1e98 Obsolete Sized? T
[breaking-change]

Use `T: ?Sized`
2015-01-06 14:20:47 +13:00
Nick Cameron
595a082587 Remove the prefix in ObsoleteSyntax variants 2015-01-06 13:23:29 +13:00
Jorge Aparicio
799332fa3f syntax: remove dead code 2015-01-05 17:22:16 -05:00
Jorge Aparicio
58b0d7479f syntax: make the closure type f: |uint| -> bool syntax obsolete 2015-01-05 17:22:16 -05:00
Jorge Aparicio
714a5b7f5e remove TyClosure 2015-01-05 17:22:15 -05:00
Jorge Aparicio
07a8e7cfb5 syntax: remove remaining boxed closures 2015-01-05 17:22:12 -05:00
Niko Matsakis
6e68fd09ed Implement new orphan rule that requires that impls of remote traits meet the following two criteria:
- the self type includes some local type; and,
- type parameters in the self type must be constrained by a local type.

A type parameter is called *constrained* if it appears in some type-parameter of a local type.

Here are some examples that are accepted. In all of these examples, I
assume that `Foo` is a trait defined in another crate. If `Foo` were
defined in the local crate, then all the examples would be legal.

- `impl Foo for LocalType`
- `impl<T> Foo<T> for LocalType` -- T does not appear in Self, so it is OK
- `impl<T> Foo<T> for LocalType<T>` -- T here is constrained by LocalType
- `impl<T> Foo<T> for (LocalType<T>, T)` -- T here is constrained by LocalType

Here are some illegal examples (again, these examples assume that
`Foo` is not local to the current crate):

- `impl Foo for int` -- the Self type is not local
- `impl<T> Foo for T` -- T appears in Self unconstrained by a local type
- `impl<T> Foo for (LocalType, T)` -- T appears in Self unconstrained by a local type

This is a [breaking-change]. For the time being, you can opt out of
the new rules by placing `#[old_orphan_check]` on the trait (and
enabling the feature gate where the trait is defined). Longer term,
you should restructure your traits to avoid the problem. Usually this
means changing the order of parameters so that the "central" type
parameter is in the `Self` position.

As an example of that refactoring, consider the `BorrowFrom` trait:

```rust
pub trait BorrowFrom<Sized? Owned> for Sized? {
    fn borrow_from(owned: &Owned) -> &Self;
}
```

As defined, this trait is commonly implemented for custom pointer
types, such as `Arc`. Those impls follow the pattern:

```rust
impl<T> BorrowFrom<Arc<T>> for T {...}
```

Unfortunately, this impl is illegal because the self type `T` is not
local to the current crate. Therefore, we are going to change the order of the parameters,
so that `BorrowFrom` becomes `Borrow`:

```rust
pub trait Borrow<Sized? Borrowed> for Sized? {
    fn borrow_from(owned: &Self) -> &Borrowed;
}
```

Now the `Arc` impl is written:

```rust
impl<T> Borrow<T> for Arc<T> { ... }
```

This impl is legal because the self type (`Arc<T>`) is local.
2015-01-05 17:17:26 -05:00
Jorge Aparicio
cd4205a970 tweak the obsolete syntax message 2015-01-05 15:19:38 -05:00
Keegan McAllister
677b7cad3d Reformat metadata for exported macros
Instead of copy-pasting the whole macro_rules! item from the original .rs file,
we serialize a separate name, attributes list, and body, the latter as
pretty-printed TTs.  The compilation of macro_rules! macros is decoupled
somewhat from the expansion of macros in item position.

This filters out comments, and facilitates selective imports.
2015-01-05 12:00:57 -08:00
Keegan McAllister
5bf385be6a Rename macro_escape to macro_use
In the future we want to support

    #[macro_use(foo, bar)]
    mod macros;

but it's not an essential part of macro reform.  Reserve the syntax for now.
2015-01-05 12:00:57 -08:00
Keegan McAllister
fc58479323 Stop using macro_escape as an inner attribute
In preparation for the rename.
2015-01-05 12:00:57 -08:00
Jorge Aparicio
4ed2800701 syntax: obsolete the for Sized? syntax 2015-01-05 14:56:49 -05:00
Jorge Aparicio
774588fd9d sed -i -s 's/ for Sized?//g' **/*.rs 2015-01-05 14:56:49 -05:00
Keegan McAllister
538288176a Implement macro re-export
Fixes #17103.
2015-01-05 11:38:12 -08:00
Keegan McAllister
e2a9c04e19 Allow leading :: in use items 2015-01-05 11:38:12 -08:00
Keegan McAllister
ad7c647773 Add a special macro nonterminal $crate 2015-01-05 11:38:12 -08:00
Keegan McAllister
5e5924b799 Replace LetSyntaxTT with MacroRulesTT
The implementation of LetSyntaxTT was specialized to macro_rules! in various
ways. This gets rid of the false generality and simplifies the code.
2015-01-05 11:38:12 -08:00
Huon Wilson
6e3d78f06f Ungate default type parameters.
These are in scope for 1.0, and this is good to e.g. find as many bugs
as possible.
2015-01-05 20:00:10 +11:00
Huon Wilson
6795148169 Ungate globs.
These are in scope for 1.0, so this is good to e.g. make it easier find
bugs.
2015-01-05 20:00:10 +11:00
Huon Wilson
82a96a11ab Ungate associated types.
They work pretty well now, and the stdlib is using them everywhere so
they're impossible to avoid anyway.
2015-01-05 20:00:10 +11:00
Jared Roesch
c02fac471a Refactor struct parsing and add tests 2015-01-05 00:46:01 -08:00