rust/tests/ui/associated-type-bounds
bors 21d94a3d2c Auto merge of #122055 - compiler-errors:stabilize-atb, r=oli-obk
Stabilize associated type bounds (RFC 2289)

This PR stabilizes associated type bounds, which were laid out in [RFC 2289]. This gives us a shorthand to express nested type bounds that would otherwise need to be expressed with nested `impl Trait` or broken into several `where` clauses.

### What are we stabilizing?

We're stabilizing the associated item bounds syntax, which allows us to put bounds in associated type position within other bounds, i.e. `T: Trait<Assoc: Bounds...>`. See [RFC 2289] for motivation.

In all position, the associated type bound syntax expands into a set of two (or more) bounds, and never anything else (see "How does this differ[...]" section for more info).

Associated type bounds are stabilized in four positions:
* **`where` clauses (and APIT)** - This is equivalent to breaking up the bound into two (or more) `where` clauses. For example, `where T: Trait<Assoc: Bound>` is equivalent to `where T: Trait, <T as Trait>::Assoc: Bound`.
* **Supertraits** - Similar to above, `trait CopyIterator: Iterator<Item: Copy> {}`. This is almost equivalent to breaking up the bound into two (or more) `where` clauses; however, the bound on the associated item is implied whenever the trait is used. See #112573/#112629.
* **Associated type item bounds** - This allows constraining the *nested* rigid projections that are associated with a trait's associated types. e.g. `trait Trait { type Assoc: Trait2<Assoc2: Copy>; }`.
* **opaque item bounds (RPIT, TAIT)** - This allows constraining associated types that are associated with the opaque without having to *name* the opaque. For example, `impl Iterator<Item: Copy>` defines an iterator whose item is `Copy` without having to actually name that item bound.

The latter three are not expressible in surface Rust (though for associated type item bounds, this will change in #120752, which I don't believe should block this PR), so this does represent a slight expansion of what can be expressed in trait bounds.

### How does this differ from the RFC?

Compared to the RFC, the current implementation *always* desugars associated type bounds to sets of `ty::Clause`s internally. Specifically, it does *not* introduce a position-dependent desugaring as laid out in [RFC 2289], and in particular:
* It does *not* desugar to anonymous associated items in associated type item bounds.
* It does *not* desugar to nested RPITs in RPIT bounds, nor nested TAITs in TAIT bounds.

This position-dependent desugaring laid out in the RFC existed simply to side-step limitations of the trait solver, which have mostly been fixed in #120584. The desugaring laid out in the RFC also added unnecessary complication to the design of the feature, and introduces its own limitations to, for example:
* Conditionally lowering to nested `impl Trait` in certain positions such as RPIT and TAIT means that we inherit the limitations of RPIT/TAIT, namely lack of support for higher-ranked opaque inference. See this code example: https://github.com/rust-lang/rust/pull/120752#issuecomment-1979412531.
* Introducing anonymous associated types makes traits no longer object safe, since anonymous associated types are not nameable, and all associated types must be named in `dyn` types.

This last point motivates why this PR is *not* stabilizing support for associated type bounds in `dyn` types, e.g, `dyn Assoc<Item: Bound>`. Why? Because `dyn` types need to have *concrete* types for all associated items, this would necessitate a distinct lowering for associated type bounds, which seems both complicated and unnecessary compared to just requiring the user to write `impl Trait` themselves. See #120719.

### Implementation history:

Limited to the significant behavioral changes and fixes and relevant PRs, ping me if I left something out--
* #57428
* #108063
* #110512
* #112629
* #120719
* #120584

Closes #52662

[RFC 2289]: https://rust-lang.github.io/rfcs/2289-associated-type-bounds.html
2024-03-19 00:04:09 +00:00
..
auxiliary Move /src/test to /tests 2023-01-11 09:32:08 +00:00
return-type-notation Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
ambiguous-associated-type.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
ambiguous-associated-type2.rs added links as a note 2023-07-18 09:27:35 -04:00
ambiguous-associated-type2.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
assoc-type-bound-through-where-clause.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
assoc-type-eq-with-dyn-atb-fail.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
assoc-type-eq-with-dyn-atb-fail.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
associated-item-through-where-clause.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
bad-bounds-on-assoc-in-trait.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
bad-universal-in-dyn-in-where-clause.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
bad-universal-in-dyn-in-where-clause.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
bad-universal-in-impl-sig.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
bad-universal-in-impl-sig.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
binder-on-bound.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
binder-on-bound.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
bounds-on-assoc-in-trait.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
const-projection-err.gce.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
const-projection-err.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
const-projection-err.stock.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
consts.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
consts.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
dedup-normalized-1.rs eagerly instantiate binders to avoid relying on sub 2024-03-14 17:19:40 +01:00
dedup-normalized-2-higher-ranked.rs eagerly instantiate binders to avoid relying on sub 2024-03-14 17:19:40 +01:00
dedup-normalized-2-higher-ranked.stderr eagerly instantiate binders to avoid relying on sub 2024-03-14 17:19:40 +01:00
do-not-look-at-parent-item-in-suggestion-for-type-param-of-current-assoc-item.rs Restrict param constraint suggestion 2023-10-26 18:33:03 +00:00
do-not-look-at-parent-item-in-suggestion-for-type-param-of-current-assoc-item.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
duplicate.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
duplicate.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
elision.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
elision.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
entails-sized-object-safety.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
enum-bounds.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
fn-apit.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
fn-aux.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
fn-inline.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
fn-where.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
fn-wrap-apit.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
handle-predicates-that-can-define-assoc-type.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
higher-ranked.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
hrtb.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
implied-bounds-cycle.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
implied-bounds-cycle.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
implied-in-supertrait.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
implied-region-constraints.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
implied-region-constraints.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
inside-adt.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
inside-adt.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
issue-61752.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
issue-70292.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
issue-71443-1.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
issue-71443-1.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
issue-71443-2.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
issue-73818.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
issue-79949.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
issue-81193.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
issue-83017.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
issue-99828.rs Resolve assoc item bindings by namespace 2023-12-07 22:33:56 +01:00
issue-99828.stderr Bless tests 2024-01-13 12:46:58 -05:00
issue-102335-ty.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
issue-102335-ty.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-104916.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
issue-104916.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
missing-trait-bound-for-assoc-fails.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
missing-trait-bound-for-assoc-fails.stderr Move /src/test to /tests 2023-01-11 09:32:08 +00:00
nested-bounds-dont-eliminate-alias-bounds.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
no-gat-position.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
no-gat-position.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
order-dependent-bounds-issue-54121.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
overlaping-bound-suggestion.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
overlaping-bound-suggestion.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
rpit.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
rpit.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
struct-bounds.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
suggest-contraining-assoc-type-because-of-assoc-const.fixed [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
suggest-contraining-assoc-type-because-of-assoc-const.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
suggest-contraining-assoc-type-because-of-assoc-const.stderr Update tests 2024-02-07 10:42:01 +08:00
suggest-removing-impl.rs suggest removing impl in generic trait bound position 2023-08-29 20:27:38 +02:00
suggest-removing-impl.stderr suggest removing impl in generic trait bound position 2023-08-29 20:27:38 +02:00
supertrait-defines-ty.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
supertrait-referencing-self.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
supertrait-referencing.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
supertrait-where-referencing-self.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
trait-alias-impl-trait.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
trait-params.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
traits-assoc-anonymized.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
traits-assoc-type-macros.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
type-alias.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
type-alias.stderr Stabilize associated type bounds 2024-03-08 20:56:25 +00:00
union-bounds.rs Stabilize associated type bounds 2024-03-08 20:56:25 +00:00