| 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); | 
 |     } else if p.at(T![<]) { | 
 |         p.error("`static` may not have generic parameters"); | 
 |     } | 
 |     // test_err generic_static | 
 |     // static C<i32>: u32 = 0; | 
 |  | 
 |     if p.at(T![:]) { | 
 |         types::ascription(p); | 
 |     } else if is_const { | 
 |         // test_err missing_const_type | 
 |         // const C = 0; | 
 |         p.error("missing type for `const`"); | 
 |     } else if !p.at(T![<]) { | 
 |         // test_err missing_static_type | 
 |         // static C = 0; | 
 |         p.error("missing type for `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 }); | 
 | } |