---
title: "Weak type aliases for Edition 2024"
tags: T-types, 2023-meetup-BRU, minutes
date: 2023-10-11
url: https://hackmd.io/hnJkp_ZdT6aVUu-7piUdsQ
---
# Weak type aliases for Edition 2024
https://github.com/rust-lang/rust/issues/112792
## Implied vs explicit where clauses
Currently [`type Alias<'a, T> = &'a T;`](https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=fbff6a9b543d6149006e322609a5ae96) errors with `feature(lazy_type_alias)`.
```rust
// implied `T: 'a` bound
// everybody likes that you don't need `where T: 'a`
type Alias<'a, T> = &'a T;
// should this imply `T: Clone`?
//
// lcnr says no!
// errs agrees!!!!
// jackh726 does not
struct NeedsClone<T: Clone>(T);
type Alias<T> = NeedsClone<T>;
```
Analogy
* a where-clause is required "iff" the field would be required for a struct field
* `type Foo<..> = Bar`
* `struct Foo<..> { b: Bar }`
Question Niko can't remember
```rust
trait Foo<U> { }
impl<'a, T> Foo<&'a T> for T
{
//. ----- why *don't* we add a default `T: 'a` here
type Bar = &'a T;
}
```
### If we require `T: Clone`...
* Reversal where everything that is linting *against* `T: Clone`
* now you have to ADD bounds in Rust 2024
* But in future, maybe they become redundant again
* If we make it implied *today*, doesn't preclude us from making it required again
### Otherwise
If we *wanted* `type Alias<T> = NeedsClone<T>` to work, how would we implement it?
* In the `predicates_of(def_id)` query, we populate it with the WF requirements from the right-hand side of the type alias
* WF without normalizing
fun side-effect: adding additional trait bounds to the environment can break stuff, might want to be more clever :)
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=a82011eb51dee31831068b14bd279916
```rust
#![feature(lazy_type_alias)]
trait Trait<'a> {}
struct Foo<'a, 'b, T: Trait<'a>, U: Trait<'b>>(&'a (), &'b (), T, U);
type AliasOk<'a, 'b, T> = Foo<'a, 'b, T, T>
where
for<'c> T: Trait<'c>;
type AliasErr<'a, 'b, T> = Foo<'a, 'b, T, T>
where
T: Trait<'a>,
T: Trait<'b>;
```
## variance
fmease is working on computing the variance of a weak type alias by computing it from the rhs.