Auto merge of #116417 - ouz-a:trait_type_detective, r=compiler-errors · rust-lang/rust@cae0791 (original) (raw)

File tree

2 files changed

lines changed

2 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -1752,30 +1752,9 @@ impl<'tcx> ParamEnv<'tcx> {
1752 1752 Self::new(List::empty(), self.reveal())
1753 1753 }
1754 1754
1755 -/// Creates a suitable environment in which to perform trait
1756 - /// queries on the given value. When type-checking, this is simply
1757 - /// the pair of the environment plus value. But when reveal is set to
1758 - /// All, then if `value` does not reference any type parameters, we will
1759 - /// pair it with the empty environment. This improves caching and is generally
1760 - /// invisible.
1761 - ///
1762 - /// N.B., we preserve the environment when type-checking because it
1763 - /// is possible for the user to have wacky where-clauses like
1764 - /// `where Box: Copy`, which are clearly never
1765 - /// satisfiable. We generally want to behave as if they were true,
1766 - /// although the surrounding function is never reachable.
1755 +/// Creates a pair of param-env and value for use in queries.
1767 1756 pub fn and<T: TypeVisitable<TyCtxt<'tcx>>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
1768 -match self.reveal() {
1769 -Reveal::UserFacing => ParamEnvAnd { param_env: self, value },
1770 -
1771 -Reveal::All => {
1772 -if value.is_global() {
1773 -ParamEnvAnd { param_env: self.without_caller_bounds(), value }
1774 -} else {
1775 -ParamEnvAnd { param_env: self, value }
1776 -}
1777 -}
1778 -}
1757 +ParamEnvAnd { param_env: self, value }
1779 1758 }
1780 1759 }
1781 1760
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
1 +// check-pass
2 +trait Bar<'a> {
3 +type Assoc: 'static;
4 +}
5 +
6 +impl<'a> Bar<'a> for () {
7 +type Assoc = ();
8 +}
9 +
10 +struct ImplsStatic<CG: Bar<'static>> {
11 +d: &'static <CG as Bar<'static>>::Assoc,
12 +}
13 +
14 +fn caller(b: ImplsStatic<()>)
15 +where
16 +for<'a> (): Bar<'a>
17 +{
18 +let _: &<() as Bar<'static>>::Assoc = b.d;
19 +}
20 +
21 +fn main() {}