Skip to content

bounds on trait impls are used in implied bounds  #109628

@aliemjay

Description

The following compiles although it shouldn't:

trait Trait {
    type Assoc;
}

impl<T: 'static> Trait for Box<T> {
    type Assoc = ();
}

struct MyTy<U>(U)
where
    U: Trait,
    U::Assoc: Sized, // any predicate naming U::Assoc
;

fn fn_test<T>(_: MyTy<Box<T>>) {}

fn_test should fail with an error requiring an explicit T: 'static bound.

This is a compiler bug for the following reasons:

  • It certainly does not follow from the rules of RFC 1214 and RFC 2089. The implied bounds from a trait reference (Box<T>: Trait) includes only the where-clauses of the trait itself, not the trait impl.
  • It breaks stability guarantees in the sense that relaxing region constraints on trait impls is now a breaking change. Removing the useless bound U::Assoc: Sized is also a breaking change.
  • It requires remote reasoning when dealing with implied bounds.
  • It is a surprising behavior: why does the trivial bound U::Assoc: Sized make any meaningful difference?

Metadata

Assignees

No one assigned

    Labels

    A-implied-boundsArea: Implied bounds / inferred outlives-boundsC-bugCategory: This is a bug.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-typesRelevant to the types 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