Commit graph

2134 commits

Author SHA1 Message Date
bors
fe7e1a45f3 Auto merge of #45294 - petrochenkov:prioplus, r=nikomatsakis
syntax: Lower priority of `+` in `impl Trait`/`dyn Trait`

Now you have to write `Fn() -> (impl A + B)` instead of `Fn() -> impl A + B`, this is consistent with priority of `+` in trait objects (`Fn() -> A + B` means `(Fn() -> A) + B`).

To make this viable I changed the syntax to also permit `+` in return types in function declarations
```
fn f() -> dyn A + B { ... } // OK, don't have to write `-> (dyn A + B)`

// This is acceptable, because `dyn A + B` here is an isolated type and
// not part of a larger type with various operator priorities in play
// like `dyn A + B` in `Fn() -> dyn A + B` despite syntax similarities.
```
but you still have to use `-> (dyn A + B)` in function types and function-like trait object types (see this PR's tests for examples).

This can be a breaking change for code using `impl Trait` on nightly. The thing that is most likely to break is `&impl A + B`, it needs to be rewritten as `&(impl A + B)`.

cc https://github.com/rust-lang/rust/issues/34511 https://github.com/rust-lang/rust/issues/44662 https://github.com/rust-lang/rfcs/pull/438
2018-01-30 08:23:41 +00:00
bors
7046a40623 Auto merge of #47767 - estebank:as-suggestion, r=petrochenkov
Correctly format `extern crate` conflict resolution help

Closes #45799. Follow up to @Cldfire's #45820.

If the `extern` statement that will have a suggestion ends on a `;`, synthesize a new span that doesn't include it.
2018-01-28 07:44:14 +00:00
Vadim Petrochenkov
f57ea7cb3d Make + in impl/dyn Trait non-associative 2018-01-27 22:38:28 +03:00
Vadim Petrochenkov
95d27c3b79 syntax: Permit + in return types of function declarations
`+` is still disallowed in function types and function-like traits
2018-01-27 22:37:30 +03:00
Vadim Petrochenkov
873b77531c syntax: Lower priority of + in impl Trait/dyn Trait 2018-01-27 22:37:30 +03:00
David Wood
c71cec8834
end_point handling multibyte characters correctly. 2018-01-27 11:46:27 +00:00
Esteban Küber
445e404ba4 Instead of modifying the item's span synthesize it 2018-01-26 15:06:09 -08:00
Cldfire
c39ad4b145 Correctly format extern crate conflict resolution help 2018-01-25 22:36:48 -08:00
Alex Crichton
98b375483c Rollup merge of #47502 - petrochenkov:label, r=eddyb
AST/HIR: Add a separate structure for labels
2018-01-25 12:48:49 -06:00
John Kåre Alsaker
ccf0d8399e Adds support for immovable generators. Move checking of invalid borrows across suspension points to borrowck. Fixes #44197, #45259 and #45093. 2018-01-23 05:10:38 +01:00
Vadim Petrochenkov
2d56abfbeb AST/HIR: Add a separate structure for labels 2018-01-22 23:13:12 +03:00
Esteban Küber
a4660dfea2 Point at unused arguments for format string
Avoid overlapping spans by only pointing at the arguments that are not
being used in the argument string. Enable libsyntax to have diagnostics
with multiple primary spans by accepting `Into<MultiSpan>` instead of
`Span`.
2018-01-15 21:38:12 -08:00
Vadim Petrochenkov
60c48dd16a syntax: Disambiguate generics and qualified paths 2018-01-14 18:10:19 +03:00
Vadim Petrochenkov
d19e4c4a85 syntax: Rewrite parsing of impls
Properly parse impls for the never type `!`
Recover from missing `for` in `impl Trait for Type`
Prohibit inherent default impls and default impls of auto traits
Change wording in more diagnostics to use "auto traits"
Some minor code cleanups in the parser
2018-01-14 18:10:05 +03:00
Vadim Petrochenkov
22598776b0 Re-add support for impl Trait for .. to the parser 2018-01-13 19:26:49 +03:00
leonardo.yvens
8b4d852f32 Address review. 2018-01-13 18:49:28 +03:00
leonardo.yvens
4e3953bbdd Parse auto trait inside fns.
Also refactored parsing auto traits.
2018-01-13 18:49:28 +03:00
leonardo.yvens
f93183adb4 Remove impl Foo for .. in favor of auto trait Foo
No longer parse it.
Remove AutoTrait variant from AST and HIR.
Remove backwards compatibility lint.
Remove coherence checks, they make no sense for the new syntax.
Remove from rustdoc.
2018-01-13 18:48:00 +03:00
bors
9b2f8ac29e Auto merge of #47242 - estebank:issue-15980, r=petrochenkov
`struct` pattern parsing and diagnostic tweaks

 - Recover from struct parse error on match and point out missing match
   body.
 - Point at struct when finding non-identifier while parsing its fields.
 - Add label to "expected identifier, found {}" error.

Fix #15980.
2018-01-13 12:42:33 +00:00
kennytm
e40a6fb133 Rollup merge of #47298 - cramertj:path-as-modrs, r=nikomatsakis
Treat #[path] files as mod.rs files

Fixes https://github.com/rust-lang/rust/issues/46936, cc @briansmith, @SergioBenitez, @nikomatsakis.

This (insta-stable) change treats files included via `#[path = "bla.rs"] mod foo;` as though they were `mod.rs` files. Namely, it allows them to include `mod` statements and looks for the child modules in sibling directories, rather than in relative `modname/childmodule.rs` files as happens for non-`mod.rs` files.

This change makes the `non_modrs_mods` feature backwards compatible with the existing usage in https://github.com/briansmith/ring, several versions of which are currently broken in beta. If we decide to merge, this change should be backported to beta.

cc https://github.com/rust-lang/rust/issues/37872

r? @jseyfried
2018-01-13 02:26:30 +08:00
Taylor Cramer
7b420cf3da Treat #[path] files as mod.rs files 2018-01-09 10:54:13 -08:00
bors
1b193de98a Auto merge of #47232 - keatinge:master, r=petrochenkov
Add help message for incorrect pattern syntax

When I was getting started with rust I often made the mistake of using `||` instead of `|` to match multiple patterns and spent a long time staring at my code wondering what was wrong.

for example:

```
fn main() {
    let x = 1;

    match x {
        1 || 2 => println!("1 or 2"),
        _ => println!("Something else"),
    }
}

```

If you compile this with current rustc you will see

```
error: expected one of `...`, `..=`, `..`, `=>`, `if`, or `|`, found `||`
 --> test.rs:5:11
  |
5 |         1 || 2 => println!("1 or 2"),
  |          -^^ unexpected token
  |          |
  |          expected one of `...`, `..=`, `..`, `=>`, `if`, or `|` here

error: aborting due to previous error
```

With my proposed change it will show:
```
error: unexpected token `||` after pattern
 --> test.rs:5:11
  |
5 |         1 || 2 => println!("1 or 2"),
  |           ^^
  |
  = help: did you mean to use `|` to specify multiple patterns instead?

error: aborting due to previous error
```
2018-01-08 07:11:47 +00:00
Esteban Küber
d17e38f4bf struct pattern parsing and diagnostic tweaks
- Recover from struct parse error on match and point out missing match
   body.
 - Point at struct when finding non-identifier while parsing its fields.
 - Add label to "expected identifier, found {}" error.
2018-01-07 17:04:36 -08:00
keatinge
6aafdc3781 Fix tidy error 2018-01-06 15:29:08 -05:00
keatinge
a9b746bb23 Use span_suggestion instead of span_err_help 2018-01-06 15:22:29 -05:00
keatinge
4436bca5af fix style 2018-01-06 10:05:02 -05:00
keatinge
dcb53d754b Emit non-fatal error instead 2018-01-06 10:01:54 -05:00
keatinge
13576dfcd4 fix capitalization 2018-01-06 08:37:01 -05:00
keatinge
41f58a7cf6 Add help message for incorrect pattern syntax 2018-01-06 07:47:51 -05:00
Vadim Petrochenkov
32db83b16e Support extern in paths 2018-01-03 18:09:20 +03:00
bors
1bcc6dc7ea Auto merge of #46895 - ricochet1k:macro-lifetimes, r=jseyfried
Allow lifetimes in macros

This is a resurrection of PR #41927 which was a resurrection of #33135, which is intended to fix #34303.

In short, this allows macros_rules! to use :lifetime as a matcher to match 'lifetimes.

Still to do:
- [x]  Feature gate
2018-01-01 07:21:23 +00:00
Zack M. Davis
b0f880ddd9 in which leading zeroes on tuple-struct accesses are abjured
Resolves #47073.
2017-12-30 21:16:16 -08:00
Matt Peterson
8b4bdc2f3f refactor lifetime out of is_lifetime 2017-12-30 21:47:45 -05:00
Matt Peterson
e838cfce03 Cleanup 2017-12-28 11:32:05 -05:00
Matt Peterson
ce76b1a1f3 Fix tests 2017-12-28 11:32:05 -05:00
Michael Hewson
e12b87096a replace parse_lifetime with expect_lifetime
made `parser::Parser::expect_lifetime` public, so it can be called from `macro_parser::parse_nt`
2017-12-28 11:32:05 -05:00
bors
c2ecab1121 Auto merge of #46732 - estebank:silence-recovered-blocks, r=petrochenkov
Do not emit type errors on recovered blocks

When a parse error occurs on a block, the parser will recover and create
a block with the statements collected until that point. Now a flag
stating that a recovery has been performed in this block is propagated
so that the type checker knows that the type of the block (which will be
identified as `()`) shouldn't be checked against the expectation to
reduce the amount of irrelevant diagnostic errors shown to the user.

Fix #44579.
2017-12-22 07:22:33 +00:00
Esteban Küber
aaf3e318fc Do not emit type errors on recovered blocks
When a parse error occurs on a block, the parser will recover and create
a block with the statements collected until that point. Now a flag
stating that a recovery has been performed in this block is propagated
so that the type checker knows that the type of the block (which will be
identified as `()`) shouldn't be checked against the expectation to
reduce the amount of irrelevant diagnostic errors shown to the user.
2017-12-21 14:57:42 -08:00
bors
250b492052 Auto merge of #45930 - jplatte:generics_refactoring, r=eddyb
Generics refactoring (groundwork for const generics)

These changes were suggested by @eddyb.

After this change, the `Generics` contain one `Vec` of an enum for the generic parameters, rather than two separate `Vec`s for lifetime and type parameters. Type params and const params will need to be in a shared `Vec` to preserve their ordering, and moving lifetimes into the same `Vec` should simplify the code that processes `Generics`.
2017-12-21 20:12:13 +00:00
Jonas Platte
78493ed21a Add GenericParam, refactor Generics in ast, hir, rustdoc
The Generics now contain one Vec of an enum for the generic parameters,
rather than two separate Vec's for lifetime and type parameters.

Additionally, places that previously used Vec<LifetimeDef> now use
Vec<GenericParam> instead.
2017-12-21 13:38:10 +01:00
Guillaume Gomez
2917ac6b59 Rollup merge of #46827 - petrochenkov:assocrecov2, r=estebank
syntax: Follow-up to the incorrect qpath recovery PR

cc https://github.com/rust-lang/rust/pull/46788

Add tests checking that "priority" of qpath recovery is higher than priority of unary and binary operators
Fix regressed parsing of paths with fn-like generic arguments
r? @estebank
2017-12-21 13:18:18 +01:00
bors
957dc8de63 Auto merge of #46531 - cramertj:no-mo-modrs, r=nikomatsakis
Implement non-mod.rs mod statements

Fixes https://github.com/rust-lang/rust/issues/45385, cc https://github.com/rust-lang/rust/issues/44660

This will fail tidy right now because it doesn't recognize my UI tests as feature-gate tests. However, I'm not sure if compile-fail will work out either because compile-fail usually requires there to be error patterns in the top-level file, which isn't possible with this feature. What's the recommended way to handle this?
2017-12-21 05:24:45 +00:00
Vadim Petrochenkov
d333752f5c Fix parsing of paths with fn-like generic arguments 2017-12-20 22:55:57 +03:00
Vadim Petrochenkov
9a68098e87 Move impls for qpath recovery trait from ast.rs 2017-12-20 22:43:47 +03:00
Taylor Cramer
07f51fb868 Implement non-mod.rs mod statements 2017-12-19 14:58:51 -08:00
topecongiro
7374fdcf54 Remove a token after closing delimiter from the span of macro in type position 2017-12-19 21:18:30 +09:00
Vadim Petrochenkov
70e5c37319 syntax: recovery for incorrect associated item paths like [T; N]::clone 2017-12-17 19:00:50 +03:00
Vadim Petrochenkov
a4aa26aaa0 syntax: Rename P::unwrap into P::into_inner 2017-12-17 02:21:29 +03:00
Zack M. Davis
d40197c471 in which .. is suggested for erroneous ... in struct field patterns
Resolves #46718.
2017-12-16 00:58:19 -08:00
Alex Burka
d4a28268cc add trait aliases to AST 2017-12-14 12:56:26 -05:00