blob: 8e255985a205daf5735ed706498149b439b27b33 [file] [log] [blame]
use super::*;
// test const_item
// const C: u32 = 92;
pub(super) fn konst(p: &mut Parser<'_>, m: Marker) {
p.bump(T![const]);
const_or_static(p, m, true);
}
pub(super) fn static_(p: &mut Parser<'_>, m: Marker) {
p.bump(T![static]);
const_or_static(p, m, false);
}
fn const_or_static(p: &mut Parser<'_>, m: Marker, is_const: bool) {
p.eat(T![mut]);
if is_const && p.eat(T![_]) {
// test anonymous_const
// const _: u32 = 0;
} else {
// test_err anonymous_static
// static _: i32 = 5;
name(p);
}
// FIXME: Recover on statics with generic params/where clause.
if is_const {
// test generic_const
// const C<i32>: u32 = 0;
// impl Foo {
// const C<'a>: &'a () = &();
// }
generic_params::opt_generic_param_list(p);
}
// test_err generic_static
// static C<i32>: u32 = 0;
if p.at(T![:]) {
types::ascription(p);
} else {
p.error("missing type for `const` or `static`");
}
if p.eat(T![=]) {
expressions::expr(p);
}
if is_const {
// test const_where_clause
// const C<i32>: u32 = 0
// where i32: Copy;
// trait Foo {
// const C: i32 where i32: Copy;
// }
generic_params::opt_where_clause(p);
}
// test_err static_where_clause
// static C: u32 = 0
// where i32: Copy;
p.expect(T![;]);
m.complete(p, if is_const { CONST } else { STATIC });
}