about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-05-15 06:40:20 +0000
committerbors <bors@rust-lang.org>2015-05-15 06:40:20 +0000
commit072cba9a536013534352bceddbb417b3df41e8da (patch)
tree43124edbaedf632428d5ef03ed0a4fac1263a038
parent0077ffe547a17ca05835c10a178bb9091e509820 (diff)
parent190de695f58e9cb71d9b799b13570b33f4422363 (diff)
downloadrust-072cba9a536013534352bceddbb417b3df41e8da.tar.gz
rust-072cba9a536013534352bceddbb417b3df41e8da.zip
Auto merge of #25422 - cactorium:unsafe_errors, r=huonw
For https://github.com/rust-lang/rust/issues/24407
-rw-r--r--src/librustc_typeck/diagnostics.rs74
1 files changed, 70 insertions, 4 deletions
diff --git a/src/librustc_typeck/diagnostics.rs b/src/librustc_typeck/diagnostics.rs
index 2e5b389c285..58d09632741 100644
--- a/src/librustc_typeck/diagnostics.rs
+++ b/src/librustc_typeck/diagnostics.rs
@@ -364,6 +364,76 @@ it has been disabled for now.
 [iss20126]: https://github.com/rust-lang/rust/issues/20126
 "##,
 
+E0197: r##"
+Inherent implementations (one that do not implement a trait but provide
+methods associated with a type) are always safe because they are not
+implementing an unsafe trait. Removing the `unsafe` keyword from the inherent
+implementation will resolve this error.
+
+```
+struct Foo;
+
+// this will cause this error
+unsafe impl Foo { }
+// converting it to this will fix it
+impl Foo { }
+```
+
+"##,
+
+E0198: r##"
+A negative implementation is one that excludes a type from implementing a
+particular trait. Not being able to use a trait is always a safe operation,
+so negative implementations are always safe and never need to be marked as
+unsafe.
+
+```
+struct Foo;
+
+// unsafe is unnecessary
+unsafe impl !Clone for Foo { }
+// this will compile
+impl !Clone for Foo { }
+```
+
+"##,
+
+E0199: r##"
+Safe traits should not have unsafe implementations, therefore marking an
+implementation for a safe trait unsafe will cause a compiler error. Removing the
+unsafe marker on the trait noted in the error will resolve this problem.
+
+```
+struct Foo;
+
+trait Bar { }
+
+// this won't compile because Bar is safe
+unsafe impl Bar for Foo { }
+// this will compile
+impl Bar for Foo { }
+```
+
+"##,
+
+E0200: r##"
+Unsafe traits must have unsafe implementations. This error occurs when an
+implementation for an unsafe trait isn't marked as unsafe. This may be resolved
+by marking the unsafe implementation as unsafe.
+
+```
+struct Foo;
+
+unsafe trait Bar { }
+
+// this won't compile because Bar is unsafe and impl isn't unsafe
+impl Bar for Foo { }
+// this will compile
+unsafe impl Bar for Foo { }
+```
+
+"##,
+
 E0201: r##"
 It is an error to define a method--a trait method or an inherent method--more
 than once.
@@ -648,10 +718,6 @@ register_diagnostics! {
     E0194,
     E0195, // lifetime parameters or bounds on method do not match the trait declaration
     E0196, // cannot determine a type for this closure
-    E0197, // inherent impls cannot be declared as unsafe
-    E0198, // negative implementations are not unsafe
-    E0199, // implementing trait is not unsafe
-    E0200, // trait requires an `unsafe impl` declaration
     E0202, // associated items are not allowed in inherent impls
     E0203, // type parameter has more than one relaxed default bound,
            // and only one is supported