Auto merge of #116417 - ouz-a:trait_type_detective, r=compiler-errors
Remove is global hack In attempt to fix https://github.com/rust-lang/rust/issues/114057 we found several issues with how compiler computes layouts, this change removes `is_global` from `and` to stop impl from being shadowed. In depth conversation can be read here https://rust-lang.zulipchat.com/#narrow/stream/146212-t-compiler.2Fconst-eval/topic/Getting.20different.20types.20from.20almost.20same.20inputs This is a fix candidate opened for performance run. r? `@lcnr`
This commit is contained in:
commit
cae0791da4
@ -1752,30 +1752,9 @@ pub fn without_caller_bounds(self) -> Self {
|
|||||||
Self::new(List::empty(), self.reveal())
|
Self::new(List::empty(), self.reveal())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a suitable environment in which to perform trait
|
/// Creates a pair of param-env and value for use in queries.
|
||||||
/// queries on the given value. When type-checking, this is simply
|
|
||||||
/// the pair of the environment plus value. But when reveal is set to
|
|
||||||
/// All, then if `value` does not reference any type parameters, we will
|
|
||||||
/// pair it with the empty environment. This improves caching and is generally
|
|
||||||
/// invisible.
|
|
||||||
///
|
|
||||||
/// N.B., we preserve the environment when type-checking because it
|
|
||||||
/// is possible for the user to have wacky where-clauses like
|
|
||||||
/// `where Box<u32>: Copy`, which are clearly never
|
|
||||||
/// satisfiable. We generally want to behave as if they were true,
|
|
||||||
/// although the surrounding function is never reachable.
|
|
||||||
pub fn and<T: TypeVisitable<TyCtxt<'tcx>>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
|
pub fn and<T: TypeVisitable<TyCtxt<'tcx>>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
|
||||||
match self.reveal() {
|
ParamEnvAnd { param_env: self, value }
|
||||||
Reveal::UserFacing => ParamEnvAnd { param_env: self, value },
|
|
||||||
|
|
||||||
Reveal::All => {
|
|
||||||
if value.is_global() {
|
|
||||||
ParamEnvAnd { param_env: self.without_caller_bounds(), value }
|
|
||||||
} else {
|
|
||||||
ParamEnvAnd { param_env: self, value }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
21
tests/ui/traits/associated_type_bound/impl-is-shadowed.rs
Normal file
21
tests/ui/traits/associated_type_bound/impl-is-shadowed.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
// check-pass
|
||||||
|
trait Bar<'a> {
|
||||||
|
type Assoc: 'static;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Bar<'a> for () {
|
||||||
|
type Assoc = ();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ImplsStatic<CG: Bar<'static>> {
|
||||||
|
d: &'static <CG as Bar<'static>>::Assoc,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn caller(b: ImplsStatic<()>)
|
||||||
|
where
|
||||||
|
for<'a> (): Bar<'a>
|
||||||
|
{
|
||||||
|
let _: &<() as Bar<'static>>::Assoc = b.d;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Reference in New Issue
Block a user