about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2016-04-11 15:23:35 +0530
committerManish Goregaokar <manishsmail@gmail.com>2016-04-11 15:23:35 +0530
commit4805e1291af490b6c76f49ee241ac9f0bc0ceba4 (patch)
treedfa20886fc9ebebd89774dac49a412b1069b943c /src
parent49be3dd3807e9386bb38e4299773bbc1ce15993e (diff)
downloadrust-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.rs28
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!
 }
 ```
 "##,