Skip to content
Prev Previous commit
Next Next commit
Fix a future-compat warning
```
warning[E0506]: cannot assign to `self.input.cached_token` because it is borrowed
   --> src/parser.rs:591:17
    |
566 |     pub fn next_including_whitespace_and_comments(&mut self) -> Result<&Token<'i>, BasicParseError<'i>> {
    |                                                   - let's call the lifetime of this reference `'1`
...
579 |             Some(ref cached_token)
    |                  ---------------- borrow of `self.input.cached_token` occurs here
...
591 |                 self.input.cached_token = Some(CachedToken {
    |                 ^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.input.cached_token` occurs here
...
603 |         Ok(token)
    |         --------- returning this value requires that `self.input.cached_token.0` is borrowed for `'1`
    |
    = warning: this error has been downgraded to a warning for backwards compatibility with previous releases
    = warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
```
  • Loading branch information
SimonSapin committed Apr 24, 2019
commit 3c98d22c5de3b696bf1fde2b6c90069812312aa6
50 changes: 27 additions & 23 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -587,30 +587,34 @@ impl<'i: 't, 't> Parser<'i, 't> {
}

let token_start_position = self.input.tokenizer.position();
let token;
match self.input.cached_token {
Some(ref cached_token) if cached_token.start_position == token_start_position => {
self.input.tokenizer.reset(&cached_token.end_state);
match cached_token.token {
Token::Function(ref name) => self.input.tokenizer.see_function(name),
_ => {}
}
token = &cached_token.token
}
_ => {
let new_token = self
.input
.tokenizer
.next()
.map_err(|()| self.new_basic_error(BasicParseErrorKind::EndOfInput))?;
self.input.cached_token = Some(CachedToken {
token: new_token,
start_position: token_start_position,
end_state: self.input.tokenizer.state(),
});
token = self.input.cached_token_ref()
let using_cached_token = self
.input
.cached_token
.as_ref()
.map_or(false, |cached_token| {
cached_token.start_position == token_start_position
});
let token = if using_cached_token {
let cached_token = self.input.cached_token.as_ref().unwrap();
self.input.tokenizer.reset(&cached_token.end_state);
match cached_token.token {
Token::Function(ref name) => self.input.tokenizer.see_function(name),
_ => {}
}
}
&cached_token.token
} else {
let new_token = self
.input
.tokenizer
.next()
.map_err(|()| self.new_basic_error(BasicParseErrorKind::EndOfInput))?;
self.input.cached_token = Some(CachedToken {
token: new_token,
start_position: token_start_position,
end_state: self.input.tokenizer.state(),
});
self.input.cached_token_ref()
};

if let Some(block_type) = BlockType::opening(token) {
self.at_start_of = Some(block_type);
Expand Down