diff --git a/crates/libsyntax2/src/grammar/items/mod.rs b/crates/libsyntax2/src/grammar/items/mod.rs index 5466146b488..57742ecb928 100644 --- a/crates/libsyntax2/src/grammar/items/mod.rs +++ b/crates/libsyntax2/src/grammar/items/mod.rs @@ -355,7 +355,12 @@ pub(super) fn token_tree(p: &mut Parser) { while !p.at(EOF) && !p.at(closing_paren_kind) { match p.current() { L_CURLY | L_PAREN | L_BRACK => token_tree(p), - R_CURLY | R_PAREN | R_BRACK => p.err_and_bump("unmatched brace"), + R_CURLY => { + p.error("unmatched `}`"); + m.complete(p, TOKEN_TREE); + return; + } + R_PAREN | R_BRACK => p.err_and_bump("unmatched brace"), _ => p.bump() } }; diff --git a/crates/libsyntax2/tests/data/parser/err/0023_mismatched_paren.rs b/crates/libsyntax2/tests/data/parser/err/0023_mismatched_paren.rs new file mode 100644 index 00000000000..0206d563ea7 --- /dev/null +++ b/crates/libsyntax2/tests/data/parser/err/0023_mismatched_paren.rs @@ -0,0 +1,5 @@ +fn main() { + foo! ( + bar, "baz", 1, 2.0 + } //~ ERROR incorrect close delimiter +} diff --git a/crates/libsyntax2/tests/data/parser/err/0023_mismatched_paren.txt b/crates/libsyntax2/tests/data/parser/err/0023_mismatched_paren.txt new file mode 100644 index 00000000000..2df81b12b44 --- /dev/null +++ b/crates/libsyntax2/tests/data/parser/err/0023_mismatched_paren.txt @@ -0,0 +1,43 @@ +ROOT@[0; 94) + FN_DEF@[0; 55) + FN_KW@[0; 2) + WHITESPACE@[2; 3) + NAME@[3; 7) + IDENT@[3; 7) "main" + PARAM_LIST@[7; 9) + L_PAREN@[7; 8) + R_PAREN@[8; 9) + WHITESPACE@[9; 10) + BLOCK@[10; 55) + L_CURLY@[10; 11) + WHITESPACE@[11; 16) + MACRO_CALL@[16; 49) + PATH@[16; 19) + PATH_SEGMENT@[16; 19) + NAME_REF@[16; 19) + IDENT@[16; 19) "foo" + EXCL@[19; 20) + WHITESPACE@[20; 21) + TOKEN_TREE@[21; 49) + L_PAREN@[21; 22) + WHITESPACE@[22; 31) + IDENT@[31; 34) "bar" + COMMA@[34; 35) + WHITESPACE@[35; 36) + STRING@[36; 41) + COMMA@[41; 42) + WHITESPACE@[42; 43) + INT_NUMBER@[43; 44) "1" + COMMA@[44; 45) + WHITESPACE@[45; 46) + FLOAT_NUMBER@[46; 49) "2.0" + err: `unmatched `}`` + WHITESPACE@[49; 54) + R_CURLY@[54; 55) + WHITESPACE@[55; 56) + COMMENT@[56; 91) + WHITESPACE@[91; 92) + err: `unmatched `}`` + ERROR@[92; 93) + R_CURLY@[92; 93) + WHITESPACE@[93; 94)