Don't get stuck in tuple exprs

This commit is contained in:
Aleksey Kladov 2018-09-08 10:35:05 +03:00
parent a0a347eac9
commit febbc9acdd
4 changed files with 484 additions and 96 deletions

View file

@ -108,6 +108,10 @@ fn tuple_expr(p: &mut Parser) -> CompletedMarker {
let mut saw_expr = false;
while !p.at(EOF) && !p.at(R_PAREN) {
saw_expr = true;
if !EXPR_FIRST.contains(p.current()) {
p.error("expected expression");
break;
}
expr(p);
if !p.at(R_PAREN) {
saw_comma = true;

View file

@ -0,0 +1,7 @@
fn f<T: (Copy) + (?Sized) + (for<'a> Trait<'a>)>() {}
fn main() {
let _: Box<(Copy) + (?Sized) + (for<'a> Trait<'a>)>;
let _: Box<(?Sized) + (for<'a> Trait<'a>) + (Copy)>;
let _: Box<(for<'a> Trait<'a>) + (Copy) + (?Sized)>;
}

View file

@ -0,0 +1,310 @@
ROOT@[0; 240)
FN_DEF@[0; 53)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
NAME@[3; 4)
IDENT@[3; 4) "f"
TYPE_PARAM_LIST@[4; 48)
L_ANGLE@[4; 5)
TYPE_PARAM@[5; 47)
NAME@[5; 6)
IDENT@[5; 6) "T"
COLON@[6; 7)
WHITESPACE@[7; 8)
L_PAREN@[8; 9)
PATH_TYPE@[9; 13)
PATH@[9; 13)
PATH_SEGMENT@[9; 13)
NAME_REF@[9; 13)
IDENT@[9; 13) "Copy"
R_PAREN@[13; 14)
WHITESPACE@[14; 15)
PLUS@[15; 16)
WHITESPACE@[16; 17)
L_PAREN@[17; 18)
QUESTION@[18; 19)
PATH_TYPE@[19; 24)
PATH@[19; 24)
PATH_SEGMENT@[19; 24)
NAME_REF@[19; 24)
IDENT@[19; 24) "Sized"
R_PAREN@[24; 25)
WHITESPACE@[25; 26)
PLUS@[26; 27)
WHITESPACE@[27; 28)
L_PAREN@[28; 29)
FOR_TYPE@[29; 46)
FOR_KW@[29; 32)
TYPE_PARAM_LIST@[32; 36)
L_ANGLE@[32; 33)
LIFETIME_PARAM@[33; 35)
LIFETIME@[33; 35) "'a"
R_ANGLE@[35; 36)
WHITESPACE@[36; 37)
PATH_TYPE@[37; 46)
PATH@[37; 46)
PATH_SEGMENT@[37; 46)
NAME_REF@[37; 42)
IDENT@[37; 42) "Trait"
TYPE_ARG_LIST@[42; 46)
L_ANGLE@[42; 43)
LIFETIME_ARG@[43; 45)
LIFETIME@[43; 45) "'a"
R_ANGLE@[45; 46)
R_PAREN@[46; 47)
R_ANGLE@[47; 48)
PARAM_LIST@[48; 50)
L_PAREN@[48; 49)
R_PAREN@[49; 50)
WHITESPACE@[50; 51)
BLOCK@[51; 53)
L_CURLY@[51; 52)
R_CURLY@[52; 53)
WHITESPACE@[53; 55)
FN_DEF@[55; 239)
FN_KW@[55; 57)
WHITESPACE@[57; 58)
NAME@[58; 62)
IDENT@[58; 62) "main"
PARAM_LIST@[62; 64)
L_PAREN@[62; 63)
R_PAREN@[63; 64)
WHITESPACE@[64; 65)
BLOCK@[65; 239)
L_CURLY@[65; 66)
WHITESPACE@[66; 71)
LET_STMT@[71; 121)
LET_KW@[71; 74)
WHITESPACE@[74; 75)
PLACEHOLDER_PAT@[75; 76)
UNDERSCORE@[75; 76)
COLON@[76; 77)
WHITESPACE@[77; 78)
PATH_TYPE@[78; 121)
PATH@[78; 88)
PATH_SEGMENT@[78; 88)
NAME_REF@[78; 81)
IDENT@[78; 81) "Box"
TYPE_ARG_LIST@[81; 88)
L_ANGLE@[81; 82)
TYPE_ARG@[82; 88)
PAREN_TYPE@[82; 88)
L_PAREN@[82; 83)
PATH_TYPE@[83; 87)
PATH@[83; 87)
PATH_SEGMENT@[83; 87)
NAME_REF@[83; 87)
IDENT@[83; 87) "Copy"
R_PAREN@[87; 88)
err: `expected COMMA`
err: `expected R_ANGLE`
WHITESPACE@[88; 89)
PLUS@[89; 90)
WHITESPACE@[90; 91)
L_PAREN@[91; 92)
QUESTION@[92; 93)
PATH_TYPE@[93; 98)
PATH@[93; 98)
PATH_SEGMENT@[93; 98)
NAME_REF@[93; 98)
IDENT@[93; 98) "Sized"
R_PAREN@[98; 99)
WHITESPACE@[99; 100)
PLUS@[100; 101)
WHITESPACE@[101; 102)
L_PAREN@[102; 103)
FOR_TYPE@[103; 120)
FOR_KW@[103; 106)
TYPE_PARAM_LIST@[106; 110)
L_ANGLE@[106; 107)
LIFETIME_PARAM@[107; 109)
LIFETIME@[107; 109) "'a"
R_ANGLE@[109; 110)
WHITESPACE@[110; 111)
PATH_TYPE@[111; 120)
PATH@[111; 120)
PATH_SEGMENT@[111; 120)
NAME_REF@[111; 116)
IDENT@[111; 116) "Trait"
TYPE_ARG_LIST@[116; 120)
L_ANGLE@[116; 117)
LIFETIME_ARG@[117; 119)
LIFETIME@[117; 119) "'a"
R_ANGLE@[119; 120)
R_PAREN@[120; 121)
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[121; 123)
ERROR@[121; 122)
R_ANGLE@[121; 122)
SEMI@[122; 123)
WHITESPACE@[123; 128)
LET_STMT@[128; 141)
LET_KW@[128; 131)
WHITESPACE@[131; 132)
PLACEHOLDER_PAT@[132; 133)
UNDERSCORE@[132; 133)
COLON@[133; 134)
WHITESPACE@[134; 135)
PATH_TYPE@[135; 141)
PATH@[135; 141)
PATH_SEGMENT@[135; 141)
NAME_REF@[135; 138)
IDENT@[135; 138) "Box"
TYPE_ARG_LIST@[138; 141)
L_ANGLE@[138; 139)
TYPE_ARG@[139; 141)
PAREN_TYPE@[139; 141)
L_PAREN@[139; 140)
err: `expected type`
ERROR@[140; 141)
QUESTION@[140; 141)
err: `expected R_PAREN`
err: `expected COMMA`
err: `expected R_ANGLE`
err: `expected SEMI`
EXPR_STMT@[141; 146)
PATH_EXPR@[141; 146)
PATH@[141; 146)
PATH_SEGMENT@[141; 146)
NAME_REF@[141; 146)
IDENT@[141; 146) "Sized"
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[146; 147)
ERROR@[146; 147)
R_PAREN@[146; 147)
err: `expected SEMI`
WHITESPACE@[147; 148)
err: `expected expression`
EXPR_STMT@[148; 149)
ERROR@[148; 149)
PLUS@[148; 149)
err: `expected SEMI`
WHITESPACE@[149; 150)
EXPR_STMT@[150; 151)
PAREN_EXPR@[150; 151)
L_PAREN@[150; 151)
err: `expected expression`
err: `expected R_PAREN`
err: `expected SEMI`
EXPR_STMT@[151; 157)
FOR_EXPR@[151; 157)
FOR_KW@[151; 154)
err: `expected pattern`
ERROR@[154; 155)
L_ANGLE@[154; 155)
err: `expected IN_KW`
err: `expected expression`
ERROR@[155; 157)
LIFETIME@[155; 157) "'a"
err: `expected a block`
err: `expected expression`
EXPR_STMT@[157; 158)
ERROR@[157; 158)
R_ANGLE@[157; 158)
err: `expected SEMI`
WHITESPACE@[158; 159)
EXPR_STMT@[159; 180)
BIN_EXPR@[159; 180)
BIN_EXPR@[159; 178)
BIN_EXPR@[159; 169)
BIN_EXPR@[159; 167)
PATH_EXPR@[159; 164)
PATH@[159; 164)
PATH_SEGMENT@[159; 164)
NAME_REF@[159; 164)
IDENT@[159; 164) "Trait"
L_ANGLE@[164; 165)
err: `expected expression`
ERROR@[165; 167)
LIFETIME@[165; 167) "'a"
R_ANGLE@[167; 168)
err: `expected expression`
ERROR@[168; 169)
R_PAREN@[168; 169)
WHITESPACE@[169; 170)
PLUS@[170; 171)
WHITESPACE@[171; 172)
PAREN_EXPR@[172; 178)
L_PAREN@[172; 173)
PATH_EXPR@[173; 177)
PATH@[173; 177)
PATH_SEGMENT@[173; 177)
NAME_REF@[173; 177)
IDENT@[173; 177) "Copy"
R_PAREN@[177; 178)
R_ANGLE@[178; 179)
err: `expected expression`
ERROR@[179; 180)
SEMI@[179; 180)
err: `expected SEMI`
WHITESPACE@[180; 185)
LET_STMT@[185; 235)
LET_KW@[185; 188)
WHITESPACE@[188; 189)
PLACEHOLDER_PAT@[189; 190)
UNDERSCORE@[189; 190)
COLON@[190; 191)
WHITESPACE@[191; 192)
PATH_TYPE@[192; 235)
PATH@[192; 215)
PATH_SEGMENT@[192; 215)
NAME_REF@[192; 195)
IDENT@[192; 195) "Box"
TYPE_ARG_LIST@[195; 215)
L_ANGLE@[195; 196)
TYPE_ARG@[196; 215)
PAREN_TYPE@[196; 215)
L_PAREN@[196; 197)
FOR_TYPE@[197; 214)
FOR_KW@[197; 200)
TYPE_PARAM_LIST@[200; 204)
L_ANGLE@[200; 201)
LIFETIME_PARAM@[201; 203)
LIFETIME@[201; 203) "'a"
R_ANGLE@[203; 204)
WHITESPACE@[204; 205)
PATH_TYPE@[205; 214)
PATH@[205; 214)
PATH_SEGMENT@[205; 214)
NAME_REF@[205; 210)
IDENT@[205; 210) "Trait"
TYPE_ARG_LIST@[210; 214)
L_ANGLE@[210; 211)
LIFETIME_ARG@[211; 213)
LIFETIME@[211; 213) "'a"
R_ANGLE@[213; 214)
R_PAREN@[214; 215)
err: `expected COMMA`
err: `expected R_ANGLE`
WHITESPACE@[215; 216)
PLUS@[216; 217)
WHITESPACE@[217; 218)
L_PAREN@[218; 219)
PATH_TYPE@[219; 223)
PATH@[219; 223)
PATH_SEGMENT@[219; 223)
NAME_REF@[219; 223)
IDENT@[219; 223) "Copy"
R_PAREN@[223; 224)
WHITESPACE@[224; 225)
PLUS@[225; 226)
WHITESPACE@[226; 227)
L_PAREN@[227; 228)
QUESTION@[228; 229)
PATH_TYPE@[229; 234)
PATH@[229; 234)
PATH_SEGMENT@[229; 234)
NAME_REF@[229; 234)
IDENT@[229; 234) "Sized"
R_PAREN@[234; 235)
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[235; 237)
ERROR@[235; 236)
R_ANGLE@[235; 236)
SEMI@[236; 237)
WHITESPACE@[237; 238)
R_CURLY@[238; 239)
WHITESPACE@[239; 240)

View file

@ -79,117 +79,184 @@ ROOT@[0; 350)
IDENT@[134; 139) "macro"
err: `expected SEMI`
WHITESPACE@[139; 140)
EXPR_STMT@[140; 203)
CALL_EXPR@[140; 203)
EXPR_STMT@[140; 154)
CALL_EXPR@[140; 154)
PATH_EXPR@[140; 150)
PATH@[140; 150)
PATH_SEGMENT@[140; 150)
NAME_REF@[140; 150)
IDENT@[140; 150) "test_merge"
ARG_LIST@[150; 203)
ARG_LIST@[150; 154)
L_PAREN@[150; 151)
ARRAY_EXPR@[151; 202)
ARRAY_EXPR@[151; 154)
L_BRACK@[151; 152)
err: `expected expression`
ERROR@[152; 153)
DOLLAR@[152; 153)
err: `expected COMMA`
TUPLE_EXPR@[153; 166)
PAREN_EXPR@[153; 154)
L_PAREN@[153; 154)
err: `expected expression`
err: `expected R_PAREN`
err: `expected COMMA`
err: `expected expression`
err: `expected R_BRACK`
err: `expected COMMA`
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[154; 155)
ERROR@[154; 155)
DOLLAR@[154; 155)
err: `expected COMMA`
err: `expected SEMI`
EXPR_STMT@[155; 160)
PATH_EXPR@[155; 160)
PATH@[155; 160)
PATH_SEGMENT@[155; 160)
NAME_REF@[155; 160)
IDENT@[155; 160) "input"
err: `expected COMMA`
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[160; 161)
ERROR@[160; 161)
COLON@[160; 161)
err: `expected COMMA`
err: `expected SEMI`
EXPR_STMT@[161; 165)
PATH_EXPR@[161; 165)
PATH@[161; 165)
PATH_SEGMENT@[161; 165)
NAME_REF@[161; 165)
IDENT@[161; 165) "expr"
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[165; 166)
ERROR@[165; 166)
R_PAREN@[165; 166)
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[166; 167)
ERROR@[166; 167)
COMMA@[166; 167)
err: `expected SEMI`
EXPR_STMT@[167; 170)
PREFIX_EXPR@[167; 170)
STAR@[167; 168)
WHITESPACE@[168; 169)
err: `expected expression`
ERROR@[169; 170)
DOLLAR@[169; 170)
err: `expected COMMA`
BIN_EXPR@[170; 175)
PAREN_EXPR@[170; 173)
err: `expected SEMI`
EXPR_STMT@[170; 171)
PAREN_EXPR@[170; 171)
L_PAREN@[170; 171)
err: `expected expression`
err: `expected R_PAREN`
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[171; 172)
ERROR@[171; 172)
COMMA@[171; 172)
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[172; 173)
ERROR@[172; 173)
R_PAREN@[172; 173)
err: `expected SEMI`
EXPR_STMT@[173; 175)
PREFIX_EXPR@[173; 175)
STAR@[173; 174)
err: `expected expression`
ERROR@[174; 175)
R_BRACK@[174; 175)
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[175; 176)
ERROR@[175; 176)
COMMA@[175; 176)
err: `expected SEMI`
WHITESPACE@[176; 177)
ARRAY_EXPR@[177; 202)
EXPR_STMT@[177; 180)
ARRAY_EXPR@[177; 180)
L_BRACK@[177; 178)
err: `expected expression`
ERROR@[178; 179)
DOLLAR@[178; 179)
err: `expected COMMA`
TUPLE_EXPR@[179; 193)
PAREN_EXPR@[179; 180)
L_PAREN@[179; 180)
err: `expected expression`
err: `expected R_PAREN`
err: `expected COMMA`
err: `expected expression`
err: `expected R_BRACK`
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[180; 181)
ERROR@[180; 181)
DOLLAR@[180; 181)
err: `expected COMMA`
err: `expected SEMI`
EXPR_STMT@[181; 187)
PATH_EXPR@[181; 187)
PATH@[181; 187)
PATH_SEGMENT@[181; 187)
NAME_REF@[181; 187)
IDENT@[181; 187) "output"
err: `expected COMMA`
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[187; 188)
ERROR@[187; 188)
COLON@[187; 188)
err: `expected COMMA`
err: `expected SEMI`
EXPR_STMT@[188; 192)
PATH_EXPR@[188; 192)
PATH@[188; 192)
PATH_SEGMENT@[188; 192)
NAME_REF@[188; 192)
IDENT@[188; 192) "expr"
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[192; 193)
ERROR@[192; 193)
R_PAREN@[192; 193)
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[193; 194)
ERROR@[193; 194)
COMMA@[193; 194)
err: `expected SEMI`
EXPR_STMT@[194; 197)
PREFIX_EXPR@[194; 197)
STAR@[194; 195)
WHITESPACE@[195; 196)
err: `expected expression`
ERROR@[196; 197)
DOLLAR@[196; 197)
err: `expected COMMA`
BIN_EXPR@[197; 202)
PAREN_EXPR@[197; 200)
err: `expected SEMI`
EXPR_STMT@[197; 198)
PAREN_EXPR@[197; 198)
L_PAREN@[197; 198)
err: `expected expression`
err: `expected R_PAREN`
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[198; 199)
ERROR@[198; 199)
COMMA@[198; 199)
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[199; 200)
ERROR@[199; 200)
R_PAREN@[199; 200)
err: `expected SEMI`
EXPR_STMT@[200; 202)
PREFIX_EXPR@[200; 202)
STAR@[200; 201)
err: `expected expression`
ERROR@[201; 202)
R_BRACK@[201; 202)
err: `expected COMMA`
err: `expected SEMI`
err: `expected expression`
err: `expected R_BRACK`
err: `expected COMMA`
err: `expected expression`
err: `expected R_BRACK`
EXPR_STMT@[202; 203)
ERROR@[202; 203)
R_PAREN@[202; 203)
err: `expected SEMI`
WHITESPACE@[203; 204)