diff options
| author | Dylan DPC <dylan.dpc@gmail.com> | 2020-06-24 14:28:41 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-06-24 14:28:41 +0200 |
| commit | 45de677b1e2a95f14fd9bce030c8fc60bdf5642f (patch) | |
| tree | 7bddd6eaf567a0715f98917f6b7ac12cd2effe0e | |
| parent | 1d1c40032429d681fcd6bb0cf071ffecdaeeab02 (diff) | |
| parent | 814782b4c6bd773d47dfce5614d4bbea935f5d85 (diff) | |
| download | rust-45de677b1e2a95f14fd9bce030c8fc60bdf5642f.tar.gz rust-45de677b1e2a95f14fd9bce030c8fc60bdf5642f.zip | |
Rollup merge of #73646 - JohnTitor:add-tests, r=Dylan-DPC
Add some regression tests Closes #44861 Closes #51506 Closes #59435 Closes #69840
| -rw-r--r-- | src/test/ui/impl-trait/issue-69840.rs | 16 | ||||
| -rw-r--r-- | src/test/ui/never_type/issue-51506.rs | 41 | ||||
| -rw-r--r-- | src/test/ui/never_type/issue-51506.stderr | 14 | ||||
| -rw-r--r-- | src/test/ui/specialization/issue-44861.rs | 40 | ||||
| -rw-r--r-- | src/test/ui/specialization/issue-44861.stderr | 12 | ||||
| -rw-r--r-- | src/test/ui/specialization/issue-59435.rs | 17 | ||||
| -rw-r--r-- | src/test/ui/specialization/issue-59435.stderr | 12 |
7 files changed, 152 insertions, 0 deletions
diff --git a/src/test/ui/impl-trait/issue-69840.rs b/src/test/ui/impl-trait/issue-69840.rs new file mode 100644 index 00000000000..b270f88b688 --- /dev/null +++ b/src/test/ui/impl-trait/issue-69840.rs @@ -0,0 +1,16 @@ +// check-pass + +#![feature(impl_trait_in_bindings)] +#![allow(incomplete_features)] + +struct A<'a>(&'a ()); + +trait Trait<T> {} + +impl<T> Trait<T> for () {} + +pub fn foo<'a>() { + let _x: impl Trait<A<'a>> = (); +} + +fn main() {} diff --git a/src/test/ui/never_type/issue-51506.rs b/src/test/ui/never_type/issue-51506.rs new file mode 100644 index 00000000000..d0fe6a0f59a --- /dev/null +++ b/src/test/ui/never_type/issue-51506.rs @@ -0,0 +1,41 @@ +#![feature(never_type, specialization)] +#![allow(incomplete_features)] + +use std::iter::{self, Empty}; + +trait Trait { + type Out: Iterator<Item = u32>; + + fn f(&self) -> Option<Self::Out>; +} + +impl<T> Trait for T { + default type Out = !; //~ ERROR: `!` is not an iterator + + default fn f(&self) -> Option<Self::Out> { + None + } +} + +struct X; + +impl Trait for X { + type Out = Empty<u32>; + + fn f(&self) -> Option<Self::Out> { + Some(iter::empty()) + } +} + +fn f<T: Trait>(a: T) { + if let Some(iter) = a.f() { + println!("Some"); + for x in iter { + println!("x = {}", x); + } + } +} + +pub fn main() { + f(10); +} diff --git a/src/test/ui/never_type/issue-51506.stderr b/src/test/ui/never_type/issue-51506.stderr new file mode 100644 index 00000000000..73865a9b5a0 --- /dev/null +++ b/src/test/ui/never_type/issue-51506.stderr @@ -0,0 +1,14 @@ +error[E0277]: `!` is not an iterator + --> $DIR/issue-51506.rs:13:5 + | +LL | type Out: Iterator<Item = u32>; + | ------------------------------- required by `Trait::Out` +... +LL | default type Out = !; + | ^^^^^^^^^^^^^^^^^^^^^ `!` is not an iterator + | + = help: the trait `std::iter::Iterator` is not implemented for `!` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/specialization/issue-44861.rs b/src/test/ui/specialization/issue-44861.rs new file mode 100644 index 00000000000..c37a6273de3 --- /dev/null +++ b/src/test/ui/specialization/issue-44861.rs @@ -0,0 +1,40 @@ +#![crate_type = "lib"] +#![feature(specialization)] +#![feature(unsize, coerce_unsized)] +#![allow(incomplete_features)] + +use std::ops::CoerceUnsized; + +pub struct SmartassPtr<A: Smartass+?Sized>(A::Data); + +pub trait Smartass { + type Data; + type Data2: CoerceUnsized<*const [u8]>; +} + +pub trait MaybeObjectSafe {} + +impl MaybeObjectSafe for () {} + +impl<T> Smartass for T { + type Data = <Self as Smartass>::Data2; + default type Data2 = (); + //~^ ERROR: the trait bound `(): std::ops::CoerceUnsized<*const [u8]>` is not satisfied +} + +impl Smartass for () { + type Data2 = *const [u8; 1]; +} + +impl Smartass for dyn MaybeObjectSafe { + type Data = *const [u8]; + type Data2 = *const [u8; 0]; +} + +impl<U: Smartass+?Sized, T: Smartass+?Sized> CoerceUnsized<SmartassPtr<T>> for SmartassPtr<U> + where <U as Smartass>::Data: std::ops::CoerceUnsized<<T as Smartass>::Data> +{} + +pub fn conv(s: SmartassPtr<()>) -> SmartassPtr<dyn MaybeObjectSafe> { + s +} diff --git a/src/test/ui/specialization/issue-44861.stderr b/src/test/ui/specialization/issue-44861.stderr new file mode 100644 index 00000000000..b41b17e76a6 --- /dev/null +++ b/src/test/ui/specialization/issue-44861.stderr @@ -0,0 +1,12 @@ +error[E0277]: the trait bound `(): std::ops::CoerceUnsized<*const [u8]>` is not satisfied + --> $DIR/issue-44861.rs:21:5 + | +LL | type Data2: CoerceUnsized<*const [u8]>; + | --------------------------------------- required by `Smartass::Data2` +... +LL | default type Data2 = (); + | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::ops::CoerceUnsized<*const [u8]>` is not implemented for `()` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/specialization/issue-59435.rs b/src/test/ui/specialization/issue-59435.rs new file mode 100644 index 00000000000..47323d3096f --- /dev/null +++ b/src/test/ui/specialization/issue-59435.rs @@ -0,0 +1,17 @@ +#![feature(specialization)] +#![allow(incomplete_features)] + +struct MyStruct {} + +trait MyTrait { + type MyType: Default; +} + +impl MyTrait for i32 { + default type MyType = MyStruct; + //~^ ERROR: the trait bound `MyStruct: std::default::Default` is not satisfied +} + +fn main() { + let _x: <i32 as MyTrait>::MyType = <i32 as MyTrait>::MyType::default(); +} diff --git a/src/test/ui/specialization/issue-59435.stderr b/src/test/ui/specialization/issue-59435.stderr new file mode 100644 index 00000000000..fd512a539a3 --- /dev/null +++ b/src/test/ui/specialization/issue-59435.stderr @@ -0,0 +1,12 @@ +error[E0277]: the trait bound `MyStruct: std::default::Default` is not satisfied + --> $DIR/issue-59435.rs:11:5 + | +LL | type MyType: Default; + | --------------------- required by `MyTrait::MyType` +... +LL | default type MyType = MyStruct; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::default::Default` is not implemented for `MyStruct` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. |
