-
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.
Activity
tolerate region vars in implied bounds
RePlaceholder(Placeholder { bound: BoundRegion { kind: BrNamed})
to a region vid #112250Auto merge of rust-lang#112422 - aliemjay:implied-bounds-placeholders…
jackh726 commentedon Nov 29, 2023
Just for reference: This is a stable-to-stable regression, first passing in 1.29.0.
🤷♀️ on adding the label
-Zno-implied-bounds-compat
#119956Auto merge of rust-lang#118553 - jackh726:lint-implied-bounds, r=lcnr
lcnr commentedon Jan 19, 2024
this still applies to
bevy
and during MIR typeck due to #119956, reopening.