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
- compiler/rustc_middle/src/ty
- tests/ui/traits/associated_type_bound
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() {} |