From febbc9acdd0166530499b9b129ee703fcbfbe978 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 8 Sep 2018 10:35:05 +0300 Subject: Don't get stuck in tuple exprs --- crates/libsyntax2/src/grammar/expressions/atom.rs | 4 + .../tests/data/parser/err/0024_many_type_parens.rs | 7 + .../data/parser/err/0024_many_type_parens.txt | 310 +++++++++++++++++++++ .../tests/data/parser/ok/0034_macro_2.0.txt | 259 ++++++++++------- 4 files changed, 484 insertions(+), 96 deletions(-) create mode 100644 crates/libsyntax2/tests/data/parser/err/0024_many_type_parens.rs create mode 100644 crates/libsyntax2/tests/data/parser/err/0024_many_type_parens.txt (limited to 'crates/libsyntax2') diff --git a/crates/libsyntax2/src/grammar/expressions/atom.rs b/crates/libsyntax2/src/grammar/expressions/atom.rs index 2536bac80..1488e12a4 100644 --- a/crates/libsyntax2/src/grammar/expressions/atom.rs +++ b/crates/libsyntax2/src/grammar/expressions/atom.rs @@ -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; diff --git a/crates/libsyntax2/tests/data/parser/err/0024_many_type_parens.rs b/crates/libsyntax2/tests/data/parser/err/0024_many_type_parens.rs new file mode 100644 index 000000000..6c2e95c02 --- /dev/null +++ b/crates/libsyntax2/tests/data/parser/err/0024_many_type_parens.rs @@ -0,0 +1,7 @@ +fn f 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)>; +} diff --git a/crates/libsyntax2/tests/data/parser/err/0024_many_type_parens.txt b/crates/libsyntax2/tests/data/parser/err/0024_many_type_parens.txt new file mode 100644 index 000000000..195c12e08 --- /dev/null +++ b/crates/libsyntax2/tests/data/parser/err/0024_many_type_parens.txt @@ -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) diff --git a/crates/libsyntax2/tests/data/parser/ok/0034_macro_2.0.txt b/crates/libsyntax2/tests/data/parser/ok/0034_macro_2.0.txt index 1a8ca761d..74af9d71b 100644 --- a/crates/libsyntax2/tests/data/parser/ok/0034_macro_2.0.txt +++ b/crates/libsyntax2/tests/data/parser/ok/0034_macro_2.0.txt @@ -79,119 +79,186 @@ 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` - ERROR@[154; 155) - DOLLAR@[154; 155) - err: `expected COMMA` - PATH_EXPR@[155; 160) - PATH@[155; 160) - PATH_SEGMENT@[155; 160) - NAME_REF@[155; 160) - IDENT@[155; 160) "input" - err: `expected COMMA` - err: `expected expression` - ERROR@[160; 161) - COLON@[160; 161) - err: `expected COMMA` - PATH_EXPR@[161; 165) - PATH@[161; 165) - PATH_SEGMENT@[161; 165) - NAME_REF@[161; 165) - IDENT@[161; 165) "expr" - R_PAREN@[165; 166) - COMMA@[166; 167) - PREFIX_EXPR@[167; 170) - STAR@[167; 168) - WHITESPACE@[168; 169) + 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 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 SEMI` + err: `expected expression` + EXPR_STMT@[160; 161) + ERROR@[160; 161) + COLON@[160; 161) + 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` - ERROR@[169; 170) - DOLLAR@[169; 170) - err: `expected COMMA` - BIN_EXPR@[170; 175) - PAREN_EXPR@[170; 173) - L_PAREN@[170; 171) - err: `expected expression` - ERROR@[171; 172) - COMMA@[171; 172) - R_PAREN@[172; 173) - STAR@[173; 174) + 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 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) + EXPR_STMT@[177; 180) + ARRAY_EXPR@[177; 180) + L_BRACK@[177; 178) + err: `expected expression` + ERROR@[178; 179) + DOLLAR@[178; 179) + err: `expected COMMA` + 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 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 SEMI` err: `expected expression` - ERROR@[174; 175) - R_BRACK@[174; 175) - COMMA@[175; 176) - WHITESPACE@[176; 177) - ARRAY_EXPR@[177; 202) - L_BRACK@[177; 178) + EXPR_STMT@[187; 188) + ERROR@[187; 188) + COLON@[187; 188) + 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` - ERROR@[178; 179) - DOLLAR@[178; 179) - err: `expected COMMA` - TUPLE_EXPR@[179; 193) - L_PAREN@[179; 180) - err: `expected expression` - ERROR@[180; 181) - DOLLAR@[180; 181) - err: `expected COMMA` - PATH_EXPR@[181; 187) - PATH@[181; 187) - PATH_SEGMENT@[181; 187) - NAME_REF@[181; 187) - IDENT@[181; 187) "output" - err: `expected COMMA` - err: `expected expression` - ERROR@[187; 188) - COLON@[187; 188) - err: `expected COMMA` - PATH_EXPR@[188; 192) - PATH@[188; 192) - PATH_SEGMENT@[188; 192) - NAME_REF@[188; 192) - IDENT@[188; 192) "expr" - R_PAREN@[192; 193) - COMMA@[193; 194) - 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) - L_PAREN@[197; 198) - err: `expected expression` - ERROR@[198; 199) - COMMA@[198; 199) - R_PAREN@[199; 200) - STAR@[200; 201) - err: `expected expression` - ERROR@[201; 202) - R_BRACK@[201; 202) - err: `expected COMMA` - err: `expected expression` - err: `expected R_BRACK` - err: `expected COMMA` - err: `expected expression` - err: `expected R_BRACK` - R_PAREN@[202; 203) + 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 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 SEMI` + err: `expected expression` + EXPR_STMT@[202; 203) + ERROR@[202; 203) + R_PAREN@[202; 203) + err: `expected SEMI` WHITESPACE@[203; 204) BLOCK_EXPR@[204; 346) BLOCK@[204; 346) -- cgit v1.2.3