1
Fork 0

Repair zero-variant tags

The parser no longer parsed them.
This commit is contained in:
Marijn Haverbeke 2012-01-25 14:10:33 +01:00
parent 2f0f6c782a
commit 8420f8c52e

View file

@ -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 {