6965: Properly attach attributes to Param instead of parent ParamList r=matklad a=Veykril

Fixes #2783, fixes #2781

The problem with `let _a = [0,#[cfg(feature = "L")]0];` has already been fixed some time ago it seems:
<details>
  <summary>Syntax Tree for the const item</summary>

```
  LET_STMT@200..236
    LET_KW@200..203 "let"
    WHITESPACE@203..204 " "
    IDENT_PAT@204..206
      NAME@204..206
        IDENT@204..206 "_a"
    WHITESPACE@206..207 " "
    EQ@207..208 "="
    WHITESPACE@208..209 " "
    ARRAY_EXPR@209..235
      L_BRACK@209..210 "["
      LITERAL@210..211
        INT_NUMBER@210..211 "0"
      COMMA@211..212 ","
      LITERAL@212..234
        ATTR@212..233
          POUND@212..213 "#"
          L_BRACK@213..214 "["
          PATH@214..217
            PATH_SEGMENT@214..217
              NAME_REF@214..217
                IDENT@214..217 "cfg"
          TOKEN_TREE@217..232
            L_PAREN@217..218 "("
            IDENT@218..225 "feature"
            WHITESPACE@225..226 " "
            EQ@226..227 "="
            WHITESPACE@227..228 " "
            STRING@228..231 "\"L\""
            R_PAREN@231..232 ")"
          R_BRACK@232..233 "]"
        INT_NUMBER@233..234 "0"
      R_BRACK@234..235 "]"
    SEMICOLON@235..236 ";"
```
</details>

Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
bors[bot] 2020-12-21 08:54:31 +00:00 committed by GitHub
commit 9bb9fbab3a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 199 additions and 147 deletions

View file

@ -156,11 +156,13 @@ fn tuple_expr(p: &mut Parser) -> CompletedMarker {
let mut saw_expr = false;
while !p.at(EOF) && !p.at(T![')']) {
saw_expr = true;
if !p.at_ts(EXPR_FIRST) {
p.error("expected expression");
// test tuple_attrs
// const A: (i64, i64) = (1, #[cfg(test)] 2);
if !expr_with_attrs(p) {
break;
}
expr(p);
if !p.at(T![')']) {
saw_comma = true;
p.expect(T![,]);

View file

@ -47,20 +47,23 @@ fn list_(p: &mut Parser, flavor: Flavor) {
if let FnDef = flavor {
// test self_param_outer_attr
// fn f(#[must_use] self) {}
let m = p.start();
attributes::outer_attrs(p);
opt_self_param(p);
opt_self_param(p, m);
}
while !p.at(EOF) && !p.at(ket) {
// test param_outer_arg
// fn f(#[attr1] pat: Type) {}
let m = p.start();
attributes::outer_attrs(p);
if !p.at_ts(PARAM_FIRST) {
p.error("expected value parameter");
m.abandon(p);
break;
}
let param = param(p, flavor);
let param = param(p, m, flavor);
if !p.at(ket) {
p.expect(T![,]);
}
@ -77,9 +80,8 @@ const PARAM_FIRST: TokenSet = patterns::PATTERN_FIRST.union(types::TYPE_FIRST);
struct Variadic(bool);
fn param(p: &mut Parser, flavor: Flavor) -> Variadic {
fn param(p: &mut Parser, m: Marker, flavor: Flavor) -> Variadic {
let mut res = Variadic(false);
let m = p.start();
match flavor {
// test param_list_vararg
// extern "C" { fn printf(format: *const i8, ...) -> i32; }
@ -151,10 +153,8 @@ fn variadic_param(p: &mut Parser) -> bool {
// fn d(&'a mut self, x: i32) {}
// fn e(mut self) {}
// }
fn opt_self_param(p: &mut Parser) {
let m;
fn opt_self_param(p: &mut Parser, m: Marker) {
if p.at(T![self]) || p.at(T![mut]) && p.nth(1) == T![self] {
m = p.start();
p.eat(T![mut]);
p.eat(T![self]);
// test arb_self_types
@ -174,9 +174,8 @@ fn opt_self_param(p: &mut Parser) {
(T![&], T![mut], T![self], _) => 3,
(T![&], LIFETIME_IDENT, T![self], _) => 3,
(T![&], LIFETIME_IDENT, T![mut], T![self]) => 4,
_ => return,
_ => return m.abandon(p),
};
m = p.start();
p.bump_any();
if p.at(LIFETIME_IDENT) {
lifetime(p);