File tree Expand file tree Collapse file tree 2 files changed +70
-0
lines changed
src/test/ui/specialization Expand file tree Collapse file tree 2 files changed +70
-0
lines changed Original file line number Diff line number Diff line change 1+ // compile-fail
2+
3+ #![ feature( specialization) ]
4+
5+ // Test that attempting to override a non-default method or one not in the
6+ // parent impl causes an error
7+
8+ trait Foo {
9+ fn foo ( & self ) -> bool { true }
10+ }
11+
12+ // Specialization tree for Foo:
13+ //
14+ // Box<T> Vec<T>
15+ // / \ / \
16+ // Box<i32> Box<i64> Vec<()> Vec<bool>
17+
18+ impl < T > Foo for Box < T > {
19+ fn foo ( & self ) -> bool { false }
20+ }
21+
22+ // Allowed
23+ impl Foo for Box < i32 > { }
24+
25+ // Can't override a non-`default` fn
26+ impl Foo for Box < i64 > {
27+ fn foo ( & self ) -> bool { true }
28+ //~^ error: `foo` specializes an item from a parent `impl`, but that item is not marked `default`
29+ }
30+
31+
32+ // Doesn't mention the method = provided body is used and the method is final
33+ impl < T > Foo for Vec < T > { }
34+
35+ // Allowed
36+ impl Foo for Vec < ( ) > { }
37+
38+ impl Foo for Vec < bool > {
39+ fn foo ( & self ) -> bool { true }
40+ //~^ error: `foo` specializes an item from a parent `impl`, but that item is not marked `default`
41+ }
42+
43+ fn main ( ) { }
Original file line number Diff line number Diff line change 1+ error[E0520]: `foo` specializes an item from a parent `impl`, but that item is not marked `default`
2+ --> $DIR/specialization-default-methods-fail.rs:27:5
3+ |
4+ LL | / impl<T> Foo for Box<T> {
5+ LL | | fn foo(&self) -> bool { false }
6+ LL | | }
7+ | |_- parent `impl` is here
8+ ...
9+ LL | fn foo(&self) -> bool { true }
10+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot specialize default item `foo`
11+ |
12+ = note: to specialize, `foo` in the parent `impl` must be marked `default`
13+
14+ error[E0520]: `foo` specializes an item from a parent `impl`, but that item is not marked `default`
15+ --> $DIR/specialization-default-methods-fail.rs:39:5
16+ |
17+ LL | impl<T> Foo for Vec<T> {}
18+ | ------------------------- parent `impl` is here
19+ ...
20+ LL | fn foo(&self) -> bool { true }
21+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot specialize default item `foo`
22+ |
23+ = note: to specialize, `foo` in the parent `impl` must be marked `default`
24+
25+ error: aborting due to 2 previous errors
26+
27+ For more information about this error, try `rustc --explain E0520`.
You can’t perform that action at this time.
0 commit comments