I'm not really worried about efficiency, I'm more worried about the correctness of keeping feature gating in sync with one another. I'd think it'd be something like:

```rust
struct feature_gate::Features {
    default_type_params_enabled: bool,
}

fn feature_gate::check_crate(krate: &Crate) -> Features { ... }
fn ty::mk_ctxt(features: feature_gate::Feature) -> ty::ctxt { ... }
```