diff options
| author | lcnr <rust@lcnr.de> | 2021-11-04 20:21:36 +0100 |
|---|---|---|
| committer | lcnr <rust@lcnr.de> | 2021-11-17 16:46:53 +0100 |
| commit | f1aeebfe935f0b08f3ecb0f106b0658dc4816e9d (patch) | |
| tree | 88a11bd7ec20737ae1f9c5bf1b87d7ad569a4adf /src | |
| parent | 41301c3b2371365b753c2ad6a74528a38f3815ce (diff) | |
| download | rust-f1aeebfe935f0b08f3ecb0f106b0658dc4816e9d.tar.gz rust-f1aeebfe935f0b08f3ecb0f106b0658dc4816e9d.zip | |
add const generics test
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/ui/const-generics/invariant.rs | 33 | ||||
| -rw-r--r-- | src/test/ui/const-generics/invariant.stderr | 26 |
2 files changed, 59 insertions, 0 deletions
diff --git a/src/test/ui/const-generics/invariant.rs b/src/test/ui/const-generics/invariant.rs new file mode 100644 index 00000000000..ee191b65c2c --- /dev/null +++ b/src/test/ui/const-generics/invariant.rs @@ -0,0 +1,33 @@ +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] +use std::marker::PhantomData; + +trait SadBee { + const ASSOC: usize; +} +// fn(&'static ())` is a supertype of `for<'a> fn(&'a ())` while +// we allow two different impls for these types, leading +// to different const eval results. +impl SadBee for for<'a> fn(&'a ()) { + const ASSOC: usize = 0; +} +impl SadBee for fn(&'static ()) { + //~^ WARNING conflicting implementations of trait + //~| WARNING this was previously accepted + const ASSOC: usize = 100; +} + +struct Foo<T: SadBee>([u8; <T as SadBee>::ASSOC], PhantomData<T>) +where + [(); <T as SadBee>::ASSOC]: ; + +fn covariant( + v: &'static Foo<for<'a> fn(&'a ())> +) -> &'static Foo<fn(&'static ())> { + v //~ ERROR mismatched types +} + +fn main() { + let y = covariant(&Foo([], PhantomData)); + println!("{:?}", y.0); +} diff --git a/src/test/ui/const-generics/invariant.stderr b/src/test/ui/const-generics/invariant.stderr new file mode 100644 index 00000000000..318c885e6a6 --- /dev/null +++ b/src/test/ui/const-generics/invariant.stderr @@ -0,0 +1,26 @@ +warning: conflicting implementations of trait `SadBee` for type `for<'a> fn(&'a ())` + --> $DIR/invariant.rs:14:1 + | +LL | impl SadBee for for<'a> fn(&'a ()) { + | ---------------------------------- first implementation here +... +LL | impl SadBee for fn(&'static ()) { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `for<'a> fn(&'a ())` + | + = note: `#[warn(coherence_leak_check)]` on by default + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #56105 <https://github.com/rust-lang/rust/issues/56105> + = note: this behavior recently changed as a result of a bug fix; see rust-lang/rust#56105 for details + +error[E0308]: mismatched types + --> $DIR/invariant.rs:27:5 + | +LL | v + | ^ one type is more general than the other + | + = note: expected reference `&'static Foo<fn(&'static ())>` + found reference `&'static Foo<for<'a> fn(&'a ())>` + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0308`. |
