| //@ check-pass |
| //@ aux-build:trait-with-const-param.rs |
| extern crate trait_with_const_param; |
| use trait_with_const_param::*; |
| |
| // Trivial case, const param after local type. |
| struct Local1; |
| impl<const N: usize, T> Trait<N, T> for Local1 {} |
| |
| // Concrete consts behave the same as foreign types, |
| // so this also trivially works. |
| impl Trait<3, Local1> for i32 {} |
| |
| // This case isn't as trivial as we would forbid type |
| // parameters here, we do allow const parameters though. |
| // |
| // The reason that type parameters are forbidden for |
| // `impl<T> Trait<T, LocalInA> for i32 {}` is that another |
| // downstream crate can add `impl<T> Trait<LocalInB, T> for i32`. |
| // As these two impls would overlap we forbid any impls which |
| // have a type parameter in front of a local type. |
| // |
| // With const parameters this issue does not exist as there are no |
| // constants local to another downstream crate. |
| struct Local2; |
| impl<const N: usize> Trait<N, Local2> for i32 {} |
| |
| fn main() {} |