summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_error_codes/src/error_codes/E0321.md
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_error_codes/src/error_codes/E0321.md')
-rw-r--r--compiler/rustc_error_codes/src/error_codes/E0321.md21
1 files changed, 21 insertions, 0 deletions
diff --git a/compiler/rustc_error_codes/src/error_codes/E0321.md b/compiler/rustc_error_codes/src/error_codes/E0321.md
new file mode 100644
index 000000000..bcfc12897
--- /dev/null
+++ b/compiler/rustc_error_codes/src/error_codes/E0321.md
@@ -0,0 +1,21 @@
+A cross-crate opt-out trait was implemented on something which wasn't a struct
+or enum type.
+
+Erroneous code example:
+
+```compile_fail,E0321
+#![feature(auto_traits)]
+
+struct Foo;
+
+impl !Sync for Foo {}
+
+unsafe impl Send for &'static Foo {}
+// error: cross-crate traits with a default impl, like `core::marker::Send`,
+// can only be implemented for a struct/enum type, not
+// `&'static Foo`
+```
+
+Only structs and enums are permitted to impl Send, Sync, and other opt-out
+trait, and the struct or enum must be local to the current crate. So, for
+example, `unsafe impl Send for Rc<Foo>` is not allowed.