diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2016-04-11 15:23:35 +0530 |
|---|---|---|
| committer | Manish Goregaokar <manishsmail@gmail.com> | 2016-04-11 15:23:35 +0530 |
| commit | 4805e1291af490b6c76f49ee241ac9f0bc0ceba4 (patch) | |
| tree | dfa20886fc9ebebd89774dac49a412b1069b943c /src | |
| parent | 49be3dd3807e9386bb38e4299773bbc1ce15993e (diff) | |
| download | rust-4805e1291af490b6c76f49ee241ac9f0bc0ceba4.tar.gz rust-4805e1291af490b6c76f49ee241ac9f0bc0ceba4.zip | |
Review fixes for #32878 (which was accidentally merged)
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_typeck/diagnostics.rs | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/src/librustc_typeck/diagnostics.rs b/src/librustc_typeck/diagnostics.rs index 36a3082f830..cad1accfcb7 100644 --- a/src/librustc_typeck/diagnostics.rs +++ b/src/librustc_typeck/diagnostics.rs @@ -3645,9 +3645,8 @@ fn main() { "##, E0520: r##" -A non-default implementation was already made on this type -implementation so it cannot be specialized afterward. Erroneous -code example: +A non-default implementation was already made on this type so it cannot be +specialized further. Erroneous code example: ```compile_fail #![feature(specialization)] @@ -3656,14 +3655,18 @@ trait SpaceLama { fn fly(&self); } +// applies to all T impl<T> SpaceLama for T { default fn fly(&self) {} } +// non-default impl +// applies to all `Clone` T and overrides the previous impl impl<T: Clone> SpaceLama for T { fn fly(&self) {} } +// since `i32` is clone, this conflicts with the previous implementation impl SpaceLama for i32 { default fn fly(&self) {} // error: item `fly` is provided by an `impl` that specializes @@ -3672,28 +3675,33 @@ impl SpaceLama for i32 { } ``` -To fix this error, you need to specialize the implementation on the -parent(s) implementation first. Example: +Specialization only allows you to override `default` functions in +implementations. -```compile_fail +To fix this error, you need to mark all the parent implementations as default. +Example: + +``` #![feature(specialization)] trait SpaceLama { fn fly(&self); } +// applies to all T impl<T> SpaceLama for T { default fn fly(&self) {} // This is a parent implementation. } +// applies to all `Clone` T; overrides the previous impl impl<T: Clone> SpaceLama for T { - default fn fly(&self) {} // This is a parent implementation but not - // a default one so you need to add default - // keyword. + default fn fly(&self) {} // This is a parent implementation but was + // previously not a default one, causing the error } +// applies to i32, overrides the previous two impls impl SpaceLama for i32 { - default fn fly(&self) {} // And now that's ok! + fn fly(&self) {} // And now that's ok! } ``` "##, |
