Skip to content

Relaxed bounds in associated type bounds don't get rejected #135229

Description

@fmease

The following code gets erroneously accepted:

fn f<T>() where T: Trait<Ty: ?Sized> {}
//                           ^^^^^^ not good

trait Trait { type Ty/*: ?Sized*/; }

Relaxed1 bounds are only meant to be put on type parameters and associated types "declared in the immediate vicinity" which isn't the case here. This is supported by the fact that Trait<Ty:> (sic!) doesn't elaborate to Trait<Ty: Sized>.

Compare this to the snippet below which gets rightfully rejected:

fn f<T>() where T: Trait, T::Ty: ?Sized {}
//                               ^^^^^^
//~^^ ERROR `?Trait` bounds are only permitted at the point where a type parameter is declared
trait Trait { type Ty/*: ?Sized*/; }

Obviously a fix would be a breaking change. However I doubt anyone is writing such code (unless macro generated). In any case, we should run crater on the future PR.

Footnotes

  1. Also known as unbounds (an ancient name for them), maybe-bounds (colloquially) or "question mark bounds" (very colloquially).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: This is a bug.F-associated_type_bounds`#![feature(associated_type_bounds)]`T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions