29 lines
958 B
Rust
29 lines
958 B
Rust
|
//@ 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() {}
|