-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Open
Labels
A-implied-boundsArea: Implied bounds / inferred outlives-boundsArea: Implied bounds / inferred outlives-boundsC-bugCategory: This is a bug.Category: This is a bug.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant 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.Relevant to the types team, which will review and decide on the PR/issue.
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
Metadata
Assignees
Labels
A-implied-boundsArea: Implied bounds / inferred outlives-boundsArea: Implied bounds / inferred outlives-boundsC-bugCategory: This is a bug.Category: This is a bug.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant 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.Relevant to the types team, which will review and decide on the PR/issue.