diff --git a/src/protocol/parser/token_parsing.rs b/src/protocol/parser/token_parsing.rs index 86176ef6bf8a7a5d9982069c185d4feb5a0aa2f0..3e265270f8f0375198d1a606c0cdf7c51fe4bcce 100644 --- a/src/protocol/parser/token_parsing.rs +++ b/src/protocol/parser/token_parsing.rs @@ -156,7 +156,8 @@ pub(crate) fn consume_token(source: &InputSource, iter: &mut TokenIter, expected Ok(span) } -/// Consumes a comma separated list until the closing delimiter is encountered +/// Consumes a comma separated list until the closing delimiter is encountered. +/// The closing delimiter is consumed as well. pub(crate) fn consume_comma_separated_until( close_delim: TokenKind, source: &InputSource, iter: &mut TokenIter, ctx: &mut PassCtx, mut consumer_fn: F, target: &mut E, item_name_and_article: &'static str, @@ -356,19 +357,20 @@ pub(crate) fn consume_character_literal( )); } + debug_assert!(char_text.len() >= 2); // always includes the bounding "'" match char_text.len() { - 0 => return Err(ParseError::new_error_str_at_span(source, span, "too little characters in character literal")), - 1 => { + 2 => return Err(ParseError::new_error_str_at_span(source, span, "too little characters in character literal")), + 3 => { // We already know the text is ascii, so just throw an error if we have the escape // character. - if char_text[0] == b'\\' { + if char_text[1] == b'\\' { return Err(ParseError::new_error_str_at_span(source, span, "escape character without subsequent character")); } - return Ok((char_text[0] as char, span)); + return Ok((char_text[1] as char, span)); }, - 2 => { - if char_text[0] == b'\\' { - let result = parse_escaped_character(source, span, char_text[1])?; + 4 => { + if char_text[1] == b'\\' { + let result = parse_escaped_character(source, span, char_text[2])?; return Ok((result, span)) } },