Consider well-formed predicates in min-specialization
This commit is contained in:
parent
4377ac3e2f
commit
39ee66ab82
4 changed files with 82 additions and 4 deletions
|
|
@ -0,0 +1,30 @@
|
|||
// Test that specializing on the well-formed predicates of the trait and
|
||||
// self-type of an impl is allowed.
|
||||
|
||||
// check-pass
|
||||
|
||||
#![feature(min_specialization)]
|
||||
|
||||
struct OrdOnly<T: Ord>(T);
|
||||
|
||||
trait SpecTrait<U> {
|
||||
fn f();
|
||||
}
|
||||
|
||||
impl<T, U> SpecTrait<U> for T {
|
||||
default fn f() {}
|
||||
}
|
||||
|
||||
impl<T: Ord> SpecTrait<()> for OrdOnly<T> {
|
||||
fn f() {}
|
||||
}
|
||||
|
||||
impl<T: Ord> SpecTrait<OrdOnly<T>> for () {
|
||||
fn f() {}
|
||||
}
|
||||
|
||||
impl<T: Ord, U: Ord, V: Ord> SpecTrait<(OrdOnly<T>, OrdOnly<U>)> for &[OrdOnly<V>] {
|
||||
fn f() {}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
// Test that supertraits can't be assumed in impls of
|
||||
// `rustc_specialization_trait`, as such impls would
|
||||
// allow specializing on the supertrait.
|
||||
|
||||
#![feature(min_specialization)]
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
#[rustc_specialization_trait]
|
||||
trait SpecMarker: Default {
|
||||
fn f();
|
||||
}
|
||||
|
||||
impl<T: Default> SpecMarker for T {
|
||||
//~^ ERROR cannot specialize
|
||||
fn f() {}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
error: cannot specialize on trait `std::default::Default`
|
||||
--> $DIR/specialization_super_trait.rs:13:1
|
||||
|
|
||||
LL | / impl<T: Default> SpecMarker for T {
|
||||
LL | |
|
||||
LL | | fn f() {}
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue