Repair zero-variant tags
The parser no longer parsed them.
This commit is contained in:
parent
2f0f6c782a
commit
8420f8c52e
1 changed files with 24 additions and 51 deletions
|
@ -2047,64 +2047,37 @@ fn parse_item_tag(p: parser, attrs: [ast::attribute]) -> @ast::item {
|
||||||
ast::item_tag([variant], ty_params), attrs);
|
ast::item_tag([variant], ty_params), attrs);
|
||||||
}
|
}
|
||||||
expect(p, token::LBRACE);
|
expect(p, token::LBRACE);
|
||||||
let all_nullary = true;
|
let all_nullary = true, have_disr = false;
|
||||||
let have_disr = false;
|
|
||||||
let done = false;
|
|
||||||
while !done {
|
|
||||||
let tok = p.token;
|
|
||||||
alt tok {
|
|
||||||
token::IDENT(name, _) {
|
|
||||||
check_bad_word(p);
|
|
||||||
let vlo = p.span.lo;
|
|
||||||
p.bump();
|
|
||||||
let args: [ast::variant_arg] = [];
|
|
||||||
let vhi = p.span.hi;
|
|
||||||
let disr_expr = none;
|
|
||||||
alt p.token {
|
|
||||||
token::LPAREN {
|
|
||||||
all_nullary = false;
|
|
||||||
let arg_tys = parse_seq(token::LPAREN, token::RPAREN,
|
|
||||||
seq_sep(token::COMMA),
|
|
||||||
{|p| parse_ty(p, false)}, p);
|
|
||||||
for ty: @ast::ty in arg_tys.node {
|
|
||||||
args += [{ty: ty, id: p.get_id()}];
|
|
||||||
}
|
|
||||||
vhi = arg_tys.span.hi;
|
|
||||||
}
|
|
||||||
token::EQ {
|
|
||||||
have_disr = true;
|
|
||||||
p.bump();
|
|
||||||
disr_expr = some(parse_expr(p));
|
|
||||||
}
|
|
||||||
_ {/* empty */ }
|
|
||||||
}
|
|
||||||
|
|
||||||
alt p.token {
|
while p.token != token::RBRACE {
|
||||||
token::COMMA {
|
let vlo = p.span.lo;
|
||||||
p.bump();
|
let ident = parse_value_ident(p);
|
||||||
if p.token == token::RBRACE { done = true; }
|
let args = [], disr_expr = none;
|
||||||
}
|
if p.token == token::LPAREN {
|
||||||
token::RBRACE { done = true; }
|
all_nullary = false;
|
||||||
_ { /* fall through */ }
|
let arg_tys = parse_seq(token::LPAREN, token::RPAREN,
|
||||||
|
seq_sep(token::COMMA),
|
||||||
|
{|p| parse_ty(p, false)}, p);
|
||||||
|
for ty in arg_tys.node {
|
||||||
|
args += [{ty: ty, id: p.get_id()}];
|
||||||
}
|
}
|
||||||
|
} else if eat(p, token::EQ) {
|
||||||
p.get_id();
|
have_disr = true;
|
||||||
let vr = {name: p.get_str(name), args: args, id: p.get_id(),
|
disr_expr = some(parse_expr(p));
|
||||||
disr_expr: disr_expr};
|
|
||||||
variants += [spanned(vlo, vhi, vr)];
|
|
||||||
}
|
|
||||||
_ {
|
|
||||||
p.fatal("expected name of variant or '}' but found '" +
|
|
||||||
token::to_str(p.reader, tok) + "'");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let vr = {name: ident, args: args, id: p.get_id(),
|
||||||
|
disr_expr: disr_expr};
|
||||||
|
variants += [spanned(vlo, p.last_span.hi, vr)];
|
||||||
|
|
||||||
|
if !eat(p, token::COMMA) { break; }
|
||||||
}
|
}
|
||||||
let hi = p.span.hi;
|
expect(p, token::RBRACE);
|
||||||
if (have_disr && !all_nullary) {
|
if (have_disr && !all_nullary) {
|
||||||
p.fatal("discriminator values can only be used with a c-like enum");
|
p.fatal("discriminator values can only be used with a c-like enum");
|
||||||
}
|
}
|
||||||
p.bump();
|
ret mk_item(p, lo, p.last_span.hi, id,
|
||||||
ret mk_item(p, lo, hi, id, ast::item_tag(variants, ty_params), attrs);
|
ast::item_tag(variants, ty_params), attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_fn_ty_proto(p: parser) -> ast::proto {
|
fn parse_fn_ty_proto(p: parser) -> ast::proto {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue