Fixes #21033 with accompanying test.
This commit is contained in:
@@ -3256,39 +3256,48 @@ impl<'a> Parser<'a> {
|
||||
break;
|
||||
}
|
||||
|
||||
let bind_type = if self.eat_keyword(keywords::Mut) {
|
||||
BindByValue(MutMutable)
|
||||
} else if self.eat_keyword(keywords::Ref) {
|
||||
BindByRef(self.parse_mutability())
|
||||
} else {
|
||||
BindByValue(MutImmutable)
|
||||
};
|
||||
|
||||
let fieldname = self.parse_ident();
|
||||
|
||||
let (subpat, is_shorthand) = if self.check(&token::Colon) {
|
||||
match bind_type {
|
||||
BindByRef(..) | BindByValue(MutMutable) => {
|
||||
let token_str = self.this_token_to_string();
|
||||
self.fatal(&format!("unexpected `{}`",
|
||||
token_str)[])
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
// Check if a colon exists one ahead. This means we're parsing a fieldname.
|
||||
let (subpat, fieldname, is_shorthand) = if self.look_ahead(1, |t| t == &token::Colon) {
|
||||
// Parsing a pattern of the form "fieldname: pat"
|
||||
let fieldname = self.parse_ident();
|
||||
self.bump();
|
||||
let pat = self.parse_pat();
|
||||
hi = pat.span.hi;
|
||||
(pat, false)
|
||||
(pat, fieldname, false)
|
||||
} else {
|
||||
// Parsing a pattern of the form "(box) (ref) (mut) fieldname"
|
||||
let is_box = self.eat_keyword(keywords::Box);
|
||||
let boxed_span_lo = self.span.lo;
|
||||
let is_ref = self.eat_keyword(keywords::Ref);
|
||||
let is_mut = self.eat_keyword(keywords::Mut);
|
||||
let fieldname = self.parse_ident();
|
||||
hi = self.last_span.hi;
|
||||
let fieldpath = codemap::Spanned{span:self.last_span, node: fieldname};
|
||||
(P(ast::Pat {
|
||||
|
||||
let bind_type = match (is_ref, is_mut) {
|
||||
(true, true) => BindByRef(MutMutable),
|
||||
(true, false) => BindByRef(MutImmutable),
|
||||
(false, true) => BindByValue(MutMutable),
|
||||
(false, false) => BindByValue(MutImmutable),
|
||||
};
|
||||
let fieldpath = codemap::Spanned{span:self.last_span, node:fieldname};
|
||||
let fieldpat = P(ast::Pat{
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
node: PatIdent(bind_type, fieldpath, None),
|
||||
span: self.last_span
|
||||
}), true)
|
||||
span: mk_sp(boxed_span_lo, hi),
|
||||
});
|
||||
|
||||
let subpat = if is_box {
|
||||
P(ast::Pat{
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
node: PatBox(fieldpat),
|
||||
span: mk_sp(lo, hi),
|
||||
})
|
||||
} else {
|
||||
fieldpat
|
||||
};
|
||||
(subpat, fieldname, true)
|
||||
};
|
||||
|
||||
fields.push(codemap::Spanned { span: mk_sp(lo, hi),
|
||||
node: ast::FieldPat { ident: fieldname,
|
||||
pat: subpat,
|
||||
|
||||
Reference in New Issue
Block a user