Commit graph

447 commits

Author SHA1 Message Date
Mazdak Farrokhzad
e72df7edad parse_labeled_expr: add a suggestion on missing colon. 2020-03-10 08:35:23 +01:00
Mazdak Farrokhzad
addbc5b9df unify/improve/simplify attribute parsing 2020-03-10 08:35:23 +01:00
Mazdak Farrokhzad
be86b2d37b parse: recover on fn foo() = expr; 2020-03-10 08:32:34 +01:00
Mazdak Farrokhzad
055733f3b3 parse: recover on &'lt $expr / 'lt $expr. 2020-03-10 08:32:34 +01:00
Mazdak Farrokhzad
8ee220c447 more reuse in block parsing & improve diagnostics. 2020-03-10 08:32:34 +01:00
Mazdak Farrokhzad
c303c4463c use error_block_no_opening_brace more 2020-03-10 08:32:34 +01:00
Mazdak Farrokhzad
4ec997503c
Rollup merge of #69201 - Aaron1011:feature/permit-if-attr, r=Centril
Permit attributes on 'if' expressions

Previously, attributes on 'if' expressions (e.g. `#[attr] if true {}`)
were disallowed during parsing. This made it impossible for macros to
perform any custom handling of such attributes (e.g. stripping them
away), since a compilation error would be emitted before they ever had a
chance to run.

This PR permits attributes on 'if' expressions ('if-attrs' from here on).
Both built-in attributes (e.g. `#[allow]`, `#[cfg]`) and proc-macro attributes are supported.

We still do *not* accept attributes on 'other parts' of an if-else
chain. That is, the following code snippet still fails to parse:

```rust
if true {} #[attr] else if false {} else #[attr] if false {} #[attr]
else {}
```

Closes https://github.com/rust-lang/rust/issues/68618
2020-03-09 12:57:44 +01:00
Mazdak Farrokhzad
10f999b72d
Rollup merge of #69773 - matthiaskrgr:typos, r=petrochenkov
fix various typos
2020-03-07 17:27:32 +01:00
Mazdak Farrokhzad
1a1f948deb
Rollup merge of #69708 - estebank:tiny, r=petrochenkov
On mismatched delimiters, only point at empty blocks that are in the same line

We point at empty blocks when we have mismatched braces to detect cases where editors auto insert `}` after writing `{`. Gate this to only the case where the entire span is in the same line so we never point at explicitly empty blocks.
2020-03-07 17:27:29 +01:00
Mazdak Farrokhzad
111724f5e2
Rollup merge of #68985 - daboross:fix-35813, r=Centril
Parse & reject postfix operators after casts

This adds an explicit error messages for when parsing `x as Type[0]` or similar expressions. Our add an extra parse case for parsing any postfix operator (dot, indexing, method calls, await) that triggers directly after parsing `as` expressions.

My friend and I worked on this together, but they're still deciding on a github username and thus I'm submitting this for both of us.

It will immediately error out, but will also provide the rest of the parser with a useful parse tree to deal with.

There's one decision we made in how this produces the parse tree. In the situation `&x as T[0]`, one could imagine this parsing as either `&((x as T)[0])` or `((&x) as T)[0]`. We chose the latter for ease of implementation, and as it seemed the most intuitive.

Feedback welcome! This is our first change to the parser section, and it might be completely horrible.

Fixes #35813.
2020-03-07 08:15:21 +01:00
Matthias Krüger
4c2b0f1631 bless tests 2020-03-06 19:37:22 +01:00
Aaron Hill
e50fd5a3dc
Update stderr 2020-03-04 16:54:16 -05:00
Aaron Hill
7f19358c9e
Move if-attr tests to their own directory 2020-03-04 16:43:14 -05:00
Aaron Hill
e11cdfdae4
Add run-pass test suggested by @joshtriplett 2020-03-04 16:43:14 -05:00
Aaron Hill
b00f6745c4
Remove recovery test 2020-03-04 16:43:14 -05:00
Aaron Hill
9a299e4e21
Test trying to cfg-remove an if expression 2020-03-04 16:43:14 -05:00
Aaron Hill
e9ec47bb70
Test that stmt_expr_attrs properly gates if-attrs 2020-03-04 16:43:13 -05:00
Aaron Hill
e912d9d7ec
Test #[allow(unused)] on if expression 2020-03-04 16:43:13 -05:00
Aaron Hill
f63b88c761
Permit attributes on 'if' expressions
Previously, attributes on 'if' expressions (e.g. #[attr] if true {})
were disallowed during parsing. This made it impossible for macros to
perform any custom handling of such attributes (e.g. stripping them
away), since a compilation error would be emitted before they ever had a
chance to run.

This PR permits attributes on 'if' expressions ('if-attrs' from here on).
Both built-in attributes (e.g. `#[allow]`, `#[cfg]`) are supported.

We still do *not* accept attributes on 'other parts' of an if-else
chain. That is, the following code snippet still fails to parse:

```rust
if true {} #[attr] else if false {} else #[attr] if false {} #[attr]
else {}
```
2020-03-04 16:43:13 -05:00
Esteban Küber
81f435dd37 On mismatched delimiters, only point at empty blocks that are in the same line 2020-03-04 11:05:17 -08:00
Mazdak Farrokhzad
176fe3f8ac encode ; stmt w/o expr as StmtKind::Empty 2020-03-01 23:02:17 +01:00
Guillaume Gomez
8ce9460b7a Update UI tests 2020-02-28 16:01:04 +01:00
bors
6d69caba11 Auto merge of #68434 - varkor:astconv-mismatch-error, r=nikomatsakis
Move generic arg/param validation to `create_substs_for_generic_args` to resolve various const generics issues

This changes some diagnostics, but I think they're around as helpful as the previous ones, and occur infrequently regardless.

Fixes https://github.com/rust-lang/rust/issues/68257.
Fixes https://github.com/rust-lang/rust/issues/68398.

r? @eddyb
2020-02-27 18:38:19 +00:00
Mazdak Farrokhzad
1c75f5aaa1 parse: test bad variants wrt. issue 48137. 2020-02-24 00:59:38 +01:00
Mazdak Farrokhzad
fde5939d1c parse: tweak diagnostic wordings 2020-02-24 00:59:38 +01:00
Mazdak Farrokhzad
62930d3151 parse/ast: move Defaultness into variants. 2020-02-24 00:59:38 +01:00
Mazdak Farrokhzad
842027f35b parse: NtItem -> parse_item_common. 2020-02-24 00:59:38 +01:00
Mazdak Farrokhzad
b01c1e2092 parser: tweak item kind wording 2020-02-24 00:59:38 +01:00
Mazdak Farrokhzad
ab84914fe4 parser: tweak unmatched wording 2020-02-24 00:59:38 +01:00
Mazdak Farrokhzad
abc46a579b parse: harden default test. 2020-02-24 00:59:38 +01:00
Mazdak Farrokhzad
a05c83b2eb parse: use parse_item_common in parse_assoc_item_. 2020-02-24 00:59:38 +01:00
Mazdak Farrokhzad
a63f35daee parse: use parse_item_common in parse_foreign_item. 2020-02-24 00:59:38 +01:00
Mazdak Farrokhzad
a920a05603 parse: recover default on free items. 2020-02-24 00:59:38 +01:00
Mazdak Farrokhzad
fa2a792491 add Span to ast::Defaultness::Default. 2020-02-24 00:59:38 +01:00
David Ross
f434c6e636 Use multipart suggestion
This is a modified version of estebank's suggestion, with a bit of
extra cleanup now that we don't need the different cases for if we can
turn a span into a string or not.
2020-02-22 12:33:06 -08:00
David Ross
fa1f547f82 Add more double cast + method call tests 2020-02-22 11:36:09 -08:00
varkor
bead79ebc6 Add note regarding argument ordering 2020-02-22 11:34:29 +00:00
varkor
039045c49b Move generic arg / param validation to create_substs_for_generic_args 2020-02-22 00:28:18 +00:00
Mazdak Farrokhzad
9f3dfd29a2 parse: allow type Foo: Ord syntactically. 2020-02-22 00:19:27 +01:00
Mazdak Farrokhzad
6c6d45c6e7
Rollup merge of #69236 - Centril:mut-parens-at-recovery, r=estebank
parse: recover `mut (x @ y)` as `(mut x @ mut y)`.

Follow up to https://github.com/rust-lang/rust/pull/68992#discussion_r376829749 and https://github.com/rust-lang/rust/pull/63945.

Specifically, when given `let mut (x @ y)` we recover with `let (mut x @ mut y)` as the suggestion:

```rust
error: `mut` must be attached to each individual binding
  --> $DIR/mut-patterns.rs:12:9
   |
LL |     let mut (x @ y) = 0;
   |         ^^^^^^^^^^^ help: add `mut` to each binding: `(mut x @ mut y)`
   |
   = note: `mut` may be followed by `variable` and `variable @ pattern`
```

r? @matthewjasper @estebank
2020-02-18 22:16:31 +01:00
Mazdak Farrokhzad
b864d23f34
Rollup merge of #69194 - Centril:assoc-extern-fuse, r=petrochenkov
parse: fuse associated and extern items up to defaultness

Language changes:

- The grammar of extern `type` aliases is unified with associated ones, and becomes:
  ```rust
  TypeItem = "type" ident generics {":" bounds}? where_clause {"=" type}? ";" ;
  ```

  Semantic restrictions (`ast_validation`) are added to forbid any parameters in `generics`, any bounds in `bounds`, and any predicates in `where_clause`, as well as the presence of a type expression (`= u8`).

  (Work still remains to fuse this with free `type` aliases, but this can be done later.)

- The grammar of constants and static items (free, associated, and extern) now permits the absence of an expression, and becomes:

  ```rust
  GlobalItem = {"const" {ident | "_"} | "static" "mut"? ident} {"=" expr}? ";" ;
  ```

  - A semantic restriction is added to enforce the presence of the expression (the body).
  - A semantic restriction is added to reject `const _` in associated contexts.

Together, these changes allow us to fuse the grammar of associated items and extern items up to `default`ness which is the main goal of the PR.

-----------------------

We are now very close to fully fusing the entirely of item parsing and their ASTs. To progress further, we must make a decision: should we parse e.g. `default use foo::bar;` and whatnot? Accepting that is likely easiest from a parsing perspective, as it does not require using look-ahead, but it is perhaps not too onerous to only accept it for `fn`s (and all their various qualifiers), `const`s, `static`s, and `type`s.

r? @petrochenkov
2020-02-18 22:16:26 +01:00
Dylan DPC
d1f175b2ad
Rollup merge of #69192 - JohnTitor:add-tests, r=Centril
Add more regression tests

Closes #39618
Closes #51798
Closes #62894
Closes #63952
Closes #68653

r? @Centril
2020-02-18 16:07:24 +01:00
Mazdak Farrokhzad
0b1e08cb55 parse: recover mut (x @ y) as (mut x @ mut y). 2020-02-17 16:08:13 +01:00
bors
0176a9eef8 Auto merge of #69129 - Centril:macro-legacy-errors, r=petrochenkov
Transition macro_legacy_warnings into a hard error

Fixes https://github.com/rust-lang/rust/issues/67098.

r? @petrochenkov
2020-02-17 11:54:49 +00:00
David Ross
8ef3da0858 Fix test stderr after rebasing on master. 2020-02-15 22:08:29 -08:00
David Ross
c2d7ffb8a9 Remove trailing whitespace 2020-02-15 19:51:02 -08:00
David Ross
f82ca8b0ef Add more error cases to issue 35813 tests 2020-02-15 19:51:02 -08:00
David Ross
940f65782c Parse & reject postfix operators after casts
This adds parsing for expressions like 'x as Ty[0]' which will
immediately error out, but still give the rest of the parser a valid
parse tree to continue.
2020-02-15 19:50:50 -08:00
Mazdak Farrokhzad
d6238bd8d4 reject assoc statics & extern consts during parsing 2020-02-15 22:21:00 +01:00
Mazdak Farrokhzad
0e0c0286a2 fuse extern & associated item parsing up to defaultness 2020-02-15 20:57:12 +01:00