Skip to content

Commit 8420f8c

Browse files
committed
Repair zero-variant tags
The parser no longer parsed them.
1 parent 2f0f6c7 commit 8420f8c

File tree

1 file changed

+24
-51
lines changed

1 file changed

+24
-51
lines changed

src/comp/syntax/parse/parser.rs

Lines changed: 24 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2047,64 +2047,37 @@ fn parse_item_tag(p: parser, attrs: [ast::attribute]) -> @ast::item {
20472047
ast::item_tag([variant], ty_params), attrs);
20482048
}
20492049
expect(p, token::LBRACE);
2050-
let all_nullary = true;
2051-
let have_disr = false;
2052-
let done = false;
2053-
while !done {
2054-
let tok = p.token;
2055-
alt tok {
2056-
token::IDENT(name, _) {
2057-
check_bad_word(p);
2058-
let vlo = p.span.lo;
2059-
p.bump();
2060-
let args: [ast::variant_arg] = [];
2061-
let vhi = p.span.hi;
2062-
let disr_expr = none;
2063-
alt p.token {
2064-
token::LPAREN {
2065-
all_nullary = false;
2066-
let arg_tys = parse_seq(token::LPAREN, token::RPAREN,
2067-
seq_sep(token::COMMA),
2068-
{|p| parse_ty(p, false)}, p);
2069-
for ty: @ast::ty in arg_tys.node {
2070-
args += [{ty: ty, id: p.get_id()}];
2071-
}
2072-
vhi = arg_tys.span.hi;
2073-
}
2074-
token::EQ {
2075-
have_disr = true;
2076-
p.bump();
2077-
disr_expr = some(parse_expr(p));
2078-
}
2079-
_ {/* empty */ }
2080-
}
2050+
let all_nullary = true, have_disr = false;
20812051

2082-
alt p.token {
2083-
token::COMMA {
2084-
p.bump();
2085-
if p.token == token::RBRACE { done = true; }
2086-
}
2087-
token::RBRACE { done = true; }
2088-
_ { /* fall through */ }
2052+
while p.token != token::RBRACE {
2053+
let vlo = p.span.lo;
2054+
let ident = parse_value_ident(p);
2055+
let args = [], disr_expr = none;
2056+
if p.token == token::LPAREN {
2057+
all_nullary = false;
2058+
let arg_tys = parse_seq(token::LPAREN, token::RPAREN,
2059+
seq_sep(token::COMMA),
2060+
{|p| parse_ty(p, false)}, p);
2061+
for ty in arg_tys.node {
2062+
args += [{ty: ty, id: p.get_id()}];
20892063
}
2090-
2091-
p.get_id();
2092-
let vr = {name: p.get_str(name), args: args, id: p.get_id(),
2093-
disr_expr: disr_expr};
2094-
variants += [spanned(vlo, vhi, vr)];
2095-
}
2096-
_ {
2097-
p.fatal("expected name of variant or '}' but found '" +
2098-
token::to_str(p.reader, tok) + "'");
2099-
}
2064+
} else if eat(p, token::EQ) {
2065+
have_disr = true;
2066+
disr_expr = some(parse_expr(p));
21002067
}
2068+
2069+
let vr = {name: ident, args: args, id: p.get_id(),
2070+
disr_expr: disr_expr};
2071+
variants += [spanned(vlo, p.last_span.hi, vr)];
2072+
2073+
if !eat(p, token::COMMA) { break; }
21012074
}
2102-
let hi = p.span.hi;
2075+
expect(p, token::RBRACE);
21032076
if (have_disr && !all_nullary) {
21042077
p.fatal("discriminator values can only be used with a c-like enum");
21052078
}
2106-
p.bump();
2107-
ret mk_item(p, lo, hi, id, ast::item_tag(variants, ty_params), attrs);
2079+
ret mk_item(p, lo, p.last_span.hi, id,
2080+
ast::item_tag(variants, ty_params), attrs);
21082081
}
21092082

21102083
fn parse_fn_ty_proto(p: parser) -> ast::proto {

0 commit comments

Comments
 (0)