macro_rules! construct_gc {
    (impl $typ: ident [$($acc: tt)*] [$($ptr: ident)*] @ $field: ident : $expr: expr, $($rest: tt)*) => { ... };
    (impl $typ: ident [$($acc: tt)*] [$($ptr: ident)*] @ $field: ident, $($rest: tt)*) => { ... };
    (impl $typ: ident [$($acc: tt)*] [$($ptr: ident)*] $field: ident $(: $expr: expr)?, $($rest: tt)*) => { ... };
    (impl $typ: ident [$($acc: tt)*] [$($ptr: ident)*] ) => { ... };
    ($typ: ident { $( $tt: tt )* } ) => { ... };
    ($typ: ident $(:: $variant: ident)? ( $( $tt: tt )* ) ) => { ... };
}