For a somewhat artificial example:
-```compile_fail
+```compile_fail,ignore
#![recursion_limit="2"]
struct Foo;
"##,
E0102: r##"
-You hit this error because the compiler lacks information to
-determine a type for this variable. Erroneous code example:
+You hit this error because the compiler lacks the information to
+determine the type of this variable. Erroneous code example:
```compile_fail
-fn demo(devil: fn () -> !) {
- let x: &_ = devil();
- // error: cannot determine a type for this local variable
-}
-
-fn oh_no() -> ! { panic!("the devil is in the details") }
-
fn main() {
- demo(oh_no);
+ // could be an array of anything
+ let x = []; // error: cannot determine a type for this local variable
}
```
To solve this situation, constrain the type of the variable.
Examples:
-```no_run
+```
#![allow(unused_variables)]
-fn some_func(x: &u32) {
- // some code
-}
-
-fn demo(devil: fn () -> !) {
- let x: &u32 = devil();
- // Here we defined the type at the variable creation
-
- let x: &_ = devil();
- some_func(x);
- // Here, the type is determined by the function argument type
-}
-
-fn oh_no() -> ! { panic!("the devil is in the details") }
-
fn main() {
- demo(oh_no);
+ let x: [u8; 0] = [];
}
```
"##,
```compile_fail
fn main() {
- let _: Box<std::io::Read+std::io::Write>;
+ let _: Box<std::io::Read + std::io::Write>;
}
```
```
fn main() {
- let _: Box<std::io::Read+Copy+Sync>;
+ let _: Box<std::io::Read + Send + Sync>;
}
```
"##,
```
"##,
+E0520: r##"
+A non-default implementation was already made on this type so it cannot be
+specialized further. Erroneous code example:
+
+```compile_fail
+#![feature(specialization)]
+
+trait SpaceLlama {
+ fn fly(&self);
+}
+
+// applies to all T
+impl<T> SpaceLlama for T {
+ default fn fly(&self) {}
+}
+
+// non-default impl
+// applies to all `Clone` T and overrides the previous impl
+impl<T: Clone> SpaceLlama for T {
+ fn fly(&self) {}
+}
+
+// since `i32` is clone, this conflicts with the previous implementation
+impl SpaceLlama for i32 {
+ default fn fly(&self) {}
+ // error: item `fly` is provided by an `impl` that specializes
+ // another, but the item in the parent `impl` is not marked
+ // `default` and so it cannot be specialized.
+}
+```
+
+Specialization only allows you to override `default` functions in
+implementations.
+
+To fix this error, you need to mark all the parent implementations as default.
+Example:
+
+```
+#![feature(specialization)]
+
+trait SpaceLlama {
+ fn fly(&self);
+}
+
+// applies to all T
+impl<T> SpaceLlama for T {
+ default fn fly(&self) {} // This is a parent implementation.
+}
+
+// applies to all `Clone` T; overrides the previous impl
+impl<T: Clone> SpaceLlama for T {
+ 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 SpaceLlama for i32 {
+ fn fly(&self) {} // And now that's ok!
+}
+```
+"##,
+
}
register_diagnostics! {
// type `{}` was overridden
E0436, // functional record update requires a struct
E0513, // no type for local variable ..
- E0520, // cannot specialize non-default item
E0521 // redundant default implementations of trait
}