]> git.lizzy.rs Git - rust.git/blob - tests/ui/coherence/const-generics-orphan-check-ok.rs
Auto merge of #107843 - bjorn3:sync_cg_clif-2023-02-09, r=bjorn3
[rust.git] / tests / ui / coherence / const-generics-orphan-check-ok.rs
1 // check-pass
2 // aux-build:trait-with-const-param.rs
3 extern crate trait_with_const_param;
4 use trait_with_const_param::*;
5
6 // Trivial case, const param after local type.
7 struct Local1;
8 impl<const N: usize, T> Trait<N, T> for Local1 {}
9
10 // Concrete consts behave the same as foreign types,
11 // so this also trivially works.
12 impl Trait<3, Local1> for i32 {}
13
14 // This case isn't as trivial as we would forbid type
15 // parameters here, we do allow const parameters though.
16 //
17 // The reason that type parameters are forbidden for
18 // `impl<T> Trait<T, LocalInA> for i32 {}` is that another
19 // downstream crate can add `impl<T> Trait<LocalInB, T> for i32`.
20 // As these two impls would overlap we forbid any impls which
21 // have a type parameter in front of a local type.
22 //
23 // With const parameters this issue does not exist as there are no
24 // constants local to another downstream crate.
25 struct Local2;
26 impl<const N: usize> Trait<N, Local2> for i32 {}
27
28 fn main() {}