summaryrefslogtreecommitdiffstats
path: root/tests/ui/derives
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/derives')
-rw-r--r--tests/ui/derives/auxiliary/derive-marker-tricky.rs15
-rw-r--r--tests/ui/derives/clone-debug-dead-code-in-the-same-struct.rs12
-rw-r--r--tests/ui/derives/clone-debug-dead-code-in-the-same-struct.stderr24
-rw-r--r--tests/ui/derives/clone-debug-dead-code.rs45
-rw-r--r--tests/ui/derives/clone-debug-dead-code.stderr54
-rw-r--r--tests/ui/derives/derive-Debug-use-ufcs-struct.rs40
-rw-r--r--tests/ui/derives/derive-Debug-use-ufcs-tuple.rs32
-rw-r--r--tests/ui/derives/derive-assoc-type-not-impl.rs19
-rw-r--r--tests/ui/derives/derive-assoc-type-not-impl.stderr31
-rw-r--r--tests/ui/derives/derive-deadlock.rs6
-rw-r--r--tests/ui/derives/derive-deadlock.stderr10
-rw-r--r--tests/ui/derives/derive-hygiene.rs121
-rw-r--r--tests/ui/derives/derive-macro-const-default.rs11
-rw-r--r--tests/ui/derives/derive-marker-tricky.rs16
-rw-r--r--tests/ui/derives/derive-multiple-with-packed.rs10
-rw-r--r--tests/ui/derives/derive-on-trait-item-or-impl-item.rs15
-rw-r--r--tests/ui/derives/derive-on-trait-item-or-impl-item.stderr21
-rw-r--r--tests/ui/derives/derive-partial-ord.rs60
-rw-r--r--tests/ui/derives/derive-renamed.rs11
-rw-r--r--tests/ui/derives/derives-span-Clone-enum-struct-variant.rs13
-rw-r--r--tests/ui/derives/derives-span-Clone-enum-struct-variant.stderr18
-rw-r--r--tests/ui/derives/derives-span-Clone-enum.rs13
-rw-r--r--tests/ui/derives/derives-span-Clone-enum.stderr18
-rw-r--r--tests/ui/derives/derives-span-Clone-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-Clone-struct.stderr18
-rw-r--r--tests/ui/derives/derives-span-Clone-tuple-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-Clone-tuple-struct.stderr18
-rw-r--r--tests/ui/derives/derives-span-Debug-enum-struct-variant.rs13
-rw-r--r--tests/ui/derives/derives-span-Debug-enum-struct-variant.stderr20
-rw-r--r--tests/ui/derives/derives-span-Debug-enum.rs13
-rw-r--r--tests/ui/derives/derives-span-Debug-enum.stderr20
-rw-r--r--tests/ui/derives/derives-span-Debug-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-Debug-struct.stderr20
-rw-r--r--tests/ui/derives/derives-span-Debug-tuple-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-Debug-tuple-struct.stderr20
-rw-r--r--tests/ui/derives/derives-span-Default-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-Default-struct.stderr18
-rw-r--r--tests/ui/derives/derives-span-Default-tuple-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-Default-tuple-struct.stderr18
-rw-r--r--tests/ui/derives/derives-span-Eq-enum-struct-variant.rs13
-rw-r--r--tests/ui/derives/derives-span-Eq-enum-struct-variant.stderr20
-rw-r--r--tests/ui/derives/derives-span-Eq-enum.rs13
-rw-r--r--tests/ui/derives/derives-span-Eq-enum.stderr20
-rw-r--r--tests/ui/derives/derives-span-Eq-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-Eq-struct.stderr20
-rw-r--r--tests/ui/derives/derives-span-Eq-tuple-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-Eq-tuple-struct.stderr20
-rw-r--r--tests/ui/derives/derives-span-Hash-enum-struct-variant.rs13
-rw-r--r--tests/ui/derives/derives-span-Hash-enum-struct-variant.stderr18
-rw-r--r--tests/ui/derives/derives-span-Hash-enum.rs12
-rw-r--r--tests/ui/derives/derives-span-Hash-enum.stderr18
-rw-r--r--tests/ui/derives/derives-span-Hash-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-Hash-struct.stderr18
-rw-r--r--tests/ui/derives/derives-span-Hash-tuple-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-Hash-tuple-struct.stderr18
-rw-r--r--tests/ui/derives/derives-span-Ord-enum-struct-variant.rs13
-rw-r--r--tests/ui/derives/derives-span-Ord-enum-struct-variant.stderr18
-rw-r--r--tests/ui/derives/derives-span-Ord-enum.rs13
-rw-r--r--tests/ui/derives/derives-span-Ord-enum.stderr18
-rw-r--r--tests/ui/derives/derives-span-Ord-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-Ord-struct.stderr18
-rw-r--r--tests/ui/derives/derives-span-Ord-tuple-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-Ord-tuple-struct.stderr18
-rw-r--r--tests/ui/derives/derives-span-PartialEq-enum-struct-variant.rs13
-rw-r--r--tests/ui/derives/derives-span-PartialEq-enum-struct-variant.stderr23
-rw-r--r--tests/ui/derives/derives-span-PartialEq-enum.rs13
-rw-r--r--tests/ui/derives/derives-span-PartialEq-enum.stderr23
-rw-r--r--tests/ui/derives/derives-span-PartialEq-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-PartialEq-struct.stderr23
-rw-r--r--tests/ui/derives/derives-span-PartialEq-tuple-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-PartialEq-tuple-struct.stderr23
-rw-r--r--tests/ui/derives/derives-span-PartialOrd-enum-struct-variant.rs13
-rw-r--r--tests/ui/derives/derives-span-PartialOrd-enum-struct-variant.stderr19
-rw-r--r--tests/ui/derives/derives-span-PartialOrd-enum.rs13
-rw-r--r--tests/ui/derives/derives-span-PartialOrd-enum.stderr19
-rw-r--r--tests/ui/derives/derives-span-PartialOrd-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-PartialOrd-struct.stderr19
-rw-r--r--tests/ui/derives/derives-span-PartialOrd-tuple-struct.rs11
-rw-r--r--tests/ui/derives/derives-span-PartialOrd-tuple-struct.stderr19
-rw-r--r--tests/ui/derives/deriving-bounds.rs11
-rw-r--r--tests/ui/derives/deriving-bounds.stderr50
-rw-r--r--tests/ui/derives/deriving-copyclone.rs37
-rw-r--r--tests/ui/derives/deriving-copyclone.stderr75
-rw-r--r--tests/ui/derives/deriving-meta-empty-trait-list.rs8
-rw-r--r--tests/ui/derives/deriving-meta-unknown-trait.rs6
-rw-r--r--tests/ui/derives/deriving-meta-unknown-trait.stderr20
-rw-r--r--tests/ui/derives/deriving-no-inner-impl-error-message.rs14
-rw-r--r--tests/ui/derives/deriving-no-inner-impl-error-message.stderr39
-rw-r--r--tests/ui/derives/deriving-non-type.rs30
-rw-r--r--tests/ui/derives/deriving-non-type.stderr75
-rw-r--r--tests/ui/derives/deriving-primitive.rs5
-rw-r--r--tests/ui/derives/deriving-primitive.stderr14
-rw-r--r--tests/ui/derives/deriving-with-repr-packed.rs45
-rw-r--r--tests/ui/derives/deriving-with-repr-packed.stderr111
-rw-r--r--tests/ui/derives/issue-36617.rs16
-rw-r--r--tests/ui/derives/issue-36617.stderr97
-rw-r--r--tests/ui/derives/issue-43023.rs20
-rw-r--r--tests/ui/derives/issue-43023.stderr29
-rw-r--r--tests/ui/derives/issue-91492.rs25
-rw-r--r--tests/ui/derives/issue-91492.stderr59
-rw-r--r--tests/ui/derives/issue-91550.rs29
-rw-r--r--tests/ui/derives/issue-91550.stderr131
-rw-r--r--tests/ui/derives/issue-97343.rs8
-rw-r--r--tests/ui/derives/issue-97343.stderr21
104 files changed, 2465 insertions, 0 deletions
diff --git a/tests/ui/derives/auxiliary/derive-marker-tricky.rs b/tests/ui/derives/auxiliary/derive-marker-tricky.rs
new file mode 100644
index 000000000..70345351b
--- /dev/null
+++ b/tests/ui/derives/auxiliary/derive-marker-tricky.rs
@@ -0,0 +1,15 @@
+// force-host
+// no-prefer-dynamic
+
+#![crate_type = "proc-macro"]
+
+extern crate proc_macro;
+use proc_macro::*;
+
+#[proc_macro_derive(NoMarker)]
+pub fn f(input: TokenStream) -> TokenStream {
+ if input.to_string().contains("rustc_copy_clone_marker") {
+ panic!("found `#[rustc_copy_clone_marker]`");
+ }
+ TokenStream::new()
+}
diff --git a/tests/ui/derives/clone-debug-dead-code-in-the-same-struct.rs b/tests/ui/derives/clone-debug-dead-code-in-the-same-struct.rs
new file mode 100644
index 000000000..6ab1fb7b0
--- /dev/null
+++ b/tests/ui/derives/clone-debug-dead-code-in-the-same-struct.rs
@@ -0,0 +1,12 @@
+#![forbid(dead_code)]
+
+#[derive(Debug)]
+pub struct Whatever {
+ pub field0: (),
+ field1: (), //~ ERROR fields `field1`, `field2`, `field3`, and `field4` are never read
+ field2: (),
+ field3: (),
+ field4: (),
+}
+
+fn main() {}
diff --git a/tests/ui/derives/clone-debug-dead-code-in-the-same-struct.stderr b/tests/ui/derives/clone-debug-dead-code-in-the-same-struct.stderr
new file mode 100644
index 000000000..7f4f78ceb
--- /dev/null
+++ b/tests/ui/derives/clone-debug-dead-code-in-the-same-struct.stderr
@@ -0,0 +1,24 @@
+error: fields `field1`, `field2`, `field3`, and `field4` are never read
+ --> $DIR/clone-debug-dead-code-in-the-same-struct.rs:6:5
+ |
+LL | pub struct Whatever {
+ | -------- fields in this struct
+LL | pub field0: (),
+LL | field1: (),
+ | ^^^^^^
+LL | field2: (),
+ | ^^^^^^
+LL | field3: (),
+ | ^^^^^^
+LL | field4: (),
+ | ^^^^^^
+ |
+ = note: `Whatever` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
+note: the lint level is defined here
+ --> $DIR/clone-debug-dead-code-in-the-same-struct.rs:1:11
+ |
+LL | #![forbid(dead_code)]
+ | ^^^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/tests/ui/derives/clone-debug-dead-code.rs b/tests/ui/derives/clone-debug-dead-code.rs
new file mode 100644
index 000000000..ab49260c0
--- /dev/null
+++ b/tests/ui/derives/clone-debug-dead-code.rs
@@ -0,0 +1,45 @@
+// Checks that derived implementations of Clone and Debug do not
+// contribute to dead code analysis (issue #84647).
+
+#![forbid(dead_code)]
+
+struct A { f: () }
+//~^ ERROR: field `f` is never read
+
+#[derive(Clone)]
+struct B { f: () }
+//~^ ERROR: field `f` is never read
+
+#[derive(Debug)]
+struct C { f: () }
+//~^ ERROR: field `f` is never read
+
+#[derive(Debug,Clone)]
+struct D { f: () }
+//~^ ERROR: field `f` is never read
+
+struct E { f: () }
+//~^ ERROR: field `f` is never read
+// Custom impl, still doesn't read f
+impl Clone for E {
+ fn clone(&self) -> Self {
+ Self { f: () }
+ }
+}
+
+struct F { f: () }
+// Custom impl that actually reads f
+impl Clone for F {
+ fn clone(&self) -> Self {
+ Self { f: self.f }
+ }
+}
+
+fn main() {
+ let _ = A { f: () };
+ let _ = B { f: () };
+ let _ = C { f: () };
+ let _ = D { f: () };
+ let _ = E { f: () };
+ let _ = F { f: () };
+}
diff --git a/tests/ui/derives/clone-debug-dead-code.stderr b/tests/ui/derives/clone-debug-dead-code.stderr
new file mode 100644
index 000000000..38be486e3
--- /dev/null
+++ b/tests/ui/derives/clone-debug-dead-code.stderr
@@ -0,0 +1,54 @@
+error: field `f` is never read
+ --> $DIR/clone-debug-dead-code.rs:6:12
+ |
+LL | struct A { f: () }
+ | - ^
+ | |
+ | field in this struct
+ |
+note: the lint level is defined here
+ --> $DIR/clone-debug-dead-code.rs:4:11
+ |
+LL | #![forbid(dead_code)]
+ | ^^^^^^^^^
+
+error: field `f` is never read
+ --> $DIR/clone-debug-dead-code.rs:10:12
+ |
+LL | struct B { f: () }
+ | - ^
+ | |
+ | field in this struct
+ |
+ = note: `B` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
+
+error: field `f` is never read
+ --> $DIR/clone-debug-dead-code.rs:14:12
+ |
+LL | struct C { f: () }
+ | - ^
+ | |
+ | field in this struct
+ |
+ = note: `C` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
+
+error: field `f` is never read
+ --> $DIR/clone-debug-dead-code.rs:18:12
+ |
+LL | struct D { f: () }
+ | - ^
+ | |
+ | field in this struct
+ |
+ = note: `D` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
+
+error: field `f` is never read
+ --> $DIR/clone-debug-dead-code.rs:21:12
+ |
+LL | struct E { f: () }
+ | - ^
+ | |
+ | field in this struct
+
+error: aborting due to 5 previous errors
+
diff --git a/tests/ui/derives/derive-Debug-use-ufcs-struct.rs b/tests/ui/derives/derive-Debug-use-ufcs-struct.rs
new file mode 100644
index 000000000..cb9dda841
--- /dev/null
+++ b/tests/ui/derives/derive-Debug-use-ufcs-struct.rs
@@ -0,0 +1,40 @@
+// run-pass
+#![allow(warnings)]
+
+#[derive(Debug)]
+pub struct Bar { pub t: () }
+
+impl<T> Access for T {}
+pub trait Access {
+ fn field(&self, _: impl Sized, _: impl Sized) {
+ panic!("got into Access::field");
+ }
+
+ fn finish(&self) -> Result<(), std::fmt::Error> {
+ panic!("got into Access::finish");
+ }
+
+ fn debug_struct(&self, _: impl Sized, _: impl Sized) {
+ panic!("got into Access::debug_struct");
+ }
+}
+
+impl<T> MutAccess for T {}
+pub trait MutAccess {
+ fn field(&mut self, _: impl Sized, _: impl Sized) {
+ panic!("got into MutAccess::field");
+ }
+
+ fn finish(&mut self) -> Result<(), std::fmt::Error> {
+ panic!("got into MutAccess::finish");
+ }
+
+ fn debug_struct(&mut self, _: impl Sized, _: impl Sized) {
+ panic!("got into MutAccess::debug_struct");
+ }
+}
+
+fn main() {
+ let bar = Bar { t: () };
+ assert_eq!("Bar { t: () }", format!("{:?}", bar));
+}
diff --git a/tests/ui/derives/derive-Debug-use-ufcs-tuple.rs b/tests/ui/derives/derive-Debug-use-ufcs-tuple.rs
new file mode 100644
index 000000000..5f786769f
--- /dev/null
+++ b/tests/ui/derives/derive-Debug-use-ufcs-tuple.rs
@@ -0,0 +1,32 @@
+// run-pass
+#![allow(warnings)]
+
+#[derive(Debug)]
+pub struct Foo<T>(pub T);
+
+use std::fmt;
+
+impl<T> Field for T {}
+impl<T> Finish for T {}
+impl Dt for &mut fmt::Formatter<'_> {}
+
+pub trait Field {
+ fn field(&self, _: impl Sized) {
+ panic!("got into field");
+ }
+}
+pub trait Finish {
+ fn finish(&self) -> Result<(), std::fmt::Error> {
+ panic!("got into finish");
+ }
+}
+pub trait Dt {
+ fn debug_tuple(&self, _: &str) {
+ panic!("got into debug_tuple");
+ }
+}
+
+fn main() {
+ let foo = Foo(());
+ assert_eq!("Foo(())", format!("{:?}", foo));
+}
diff --git a/tests/ui/derives/derive-assoc-type-not-impl.rs b/tests/ui/derives/derive-assoc-type-not-impl.rs
new file mode 100644
index 000000000..0f642d63a
--- /dev/null
+++ b/tests/ui/derives/derive-assoc-type-not-impl.rs
@@ -0,0 +1,19 @@
+trait Foo {
+ type X;
+ fn method(&self) {}
+}
+
+#[derive(Clone)]
+struct Bar<T: Foo> {
+ x: T::X,
+}
+
+struct NotClone;
+
+impl Foo for NotClone {
+ type X = i8;
+}
+
+fn main() {
+ Bar::<NotClone> { x: 1 }.clone(); //~ ERROR
+}
diff --git a/tests/ui/derives/derive-assoc-type-not-impl.stderr b/tests/ui/derives/derive-assoc-type-not-impl.stderr
new file mode 100644
index 000000000..91b334b41
--- /dev/null
+++ b/tests/ui/derives/derive-assoc-type-not-impl.stderr
@@ -0,0 +1,31 @@
+error[E0599]: the method `clone` exists for struct `Bar<NotClone>`, but its trait bounds were not satisfied
+ --> $DIR/derive-assoc-type-not-impl.rs:18:30
+ |
+LL | struct Bar<T: Foo> {
+ | ------------------
+ | |
+ | method `clone` not found for this struct
+ | doesn't satisfy `Bar<NotClone>: Clone`
+...
+LL | struct NotClone;
+ | --------------- doesn't satisfy `NotClone: Clone`
+...
+LL | Bar::<NotClone> { x: 1 }.clone();
+ | ^^^^^ method cannot be called on `Bar<NotClone>` due to unsatisfied trait bounds
+ |
+note: trait bound `NotClone: Clone` was not satisfied
+ --> $DIR/derive-assoc-type-not-impl.rs:6:10
+ |
+LL | #[derive(Clone)]
+ | ^^^^^ unsatisfied trait bound introduced in this `derive` macro
+ = help: items from traits can only be used if the trait is implemented and in scope
+ = note: the following trait defines an item `clone`, perhaps you need to implement it:
+ candidate #1: `Clone`
+help: consider annotating `NotClone` with `#[derive(Clone)]`
+ |
+LL | #[derive(Clone)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0599`.
diff --git a/tests/ui/derives/derive-deadlock.rs b/tests/ui/derives/derive-deadlock.rs
new file mode 100644
index 000000000..0137b1e5b
--- /dev/null
+++ b/tests/ui/derives/derive-deadlock.rs
@@ -0,0 +1,6 @@
+use std as derive;
+
+#[derive(Default)] //~ ERROR cannot determine resolution for the attribute macro `derive`
+struct S;
+
+fn main() {}
diff --git a/tests/ui/derives/derive-deadlock.stderr b/tests/ui/derives/derive-deadlock.stderr
new file mode 100644
index 000000000..8d062491c
--- /dev/null
+++ b/tests/ui/derives/derive-deadlock.stderr
@@ -0,0 +1,10 @@
+error: cannot determine resolution for the attribute macro `derive`
+ --> $DIR/derive-deadlock.rs:3:3
+ |
+LL | #[derive(Default)]
+ | ^^^^^^
+ |
+ = note: import resolution is stuck, try simplifying macro imports
+
+error: aborting due to previous error
+
diff --git a/tests/ui/derives/derive-hygiene.rs b/tests/ui/derives/derive-hygiene.rs
new file mode 100644
index 000000000..4fa83c490
--- /dev/null
+++ b/tests/ui/derives/derive-hygiene.rs
@@ -0,0 +1,121 @@
+// Make sure that built-in derives don't rely on the user not declaring certain
+// names to work properly.
+
+// check-pass
+
+#![allow(nonstandard_style)]
+#![feature(decl_macro)]
+
+use std::prelude::v1::test as inline;
+
+static f: () = ();
+static cmp: () = ();
+static other: () = ();
+static state: () = ();
+static __self_0_0: () = ();
+static __self_1_0: () = ();
+static __self_vi: () = ();
+static __arg_1_0: () = ();
+static debug_trait_builder: () = ();
+
+struct isize;
+trait i16 {}
+
+trait MethodsInDerives: Sized {
+ fn debug_tuple(self) {}
+ fn debug_struct(self) {}
+ fn field(self) {}
+ fn finish(self) {}
+ fn clone(self) {}
+ fn cmp(self) {}
+ fn partial_cmp(self) {}
+ fn eq(self) {}
+ fn ne(self) {}
+ fn le(self) {}
+ fn lt(self) {}
+ fn ge(self) {}
+ fn gt(self) {}
+ fn hash(self) {}
+}
+
+trait GenericAny<T, U> {}
+impl<S, T, U> GenericAny<T, U> for S {}
+
+#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
+enum __H { V(i32), }
+
+#[repr(i16)]
+#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
+enum W { A, B }
+
+#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Default, Hash)]
+struct X<A: GenericAny<A, self::X<i32>>> {
+ A: A,
+}
+
+#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Default, Hash)]
+struct Y<B>(B)
+where
+ B: From<B>;
+
+#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
+enum Z<C> {
+ C(C),
+ B { C: C },
+}
+
+// Make sure that we aren't using `self::` in paths, since it doesn't work in
+// non-module scopes.
+const NON_MODULE: () = {
+ #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
+ enum __H { V(i32), }
+
+ #[repr(i16)]
+ #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
+ enum W { A, B }
+
+ #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Default, Hash)]
+ struct X<A: Fn(A) -> self::X<i32>> {
+ A: A,
+ }
+
+ #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Default, Hash)]
+ struct Y<B>(B)
+ where
+ B: From<B>;
+
+ #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
+ enum Z<C> {
+ C(C),
+ B { C: C },
+ }
+};
+
+macro m() {
+ #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
+ enum __H { V(i32), }
+
+ #[repr(i16)]
+ #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
+ enum W { A, B }
+
+ #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Default, Hash)]
+ struct X<A: GenericAny<A, self::X<i32>>> {
+ A: A,
+ }
+
+ #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Default, Hash)]
+ struct Y<B>(B)
+ where
+ B: From<B>;
+
+ #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
+ enum Z<C> {
+ C(C),
+ B { C: C },
+ }
+}
+
+m!();
+
+fn main() {}
diff --git a/tests/ui/derives/derive-macro-const-default.rs b/tests/ui/derives/derive-macro-const-default.rs
new file mode 100644
index 000000000..ce80271d2
--- /dev/null
+++ b/tests/ui/derives/derive-macro-const-default.rs
@@ -0,0 +1,11 @@
+// check-pass
+#[derive(Clone, PartialEq, Debug)]
+struct Example<T, const N: usize = 1usize>([T; N]);
+
+fn main() {
+ let a = Example([(); 16]);
+ let b = a.clone();
+ if a != b {
+ let _c = format!("{:?}", a);
+ }
+}
diff --git a/tests/ui/derives/derive-marker-tricky.rs b/tests/ui/derives/derive-marker-tricky.rs
new file mode 100644
index 000000000..730ea4714
--- /dev/null
+++ b/tests/ui/derives/derive-marker-tricky.rs
@@ -0,0 +1,16 @@
+// Test that `#[rustc_copy_clone_marker]` is not injected when a user-defined derive shadows
+// a built-in derive in non-trivial scope (e.g. in a nested module).
+
+// check-pass
+// aux-build:derive-marker-tricky.rs
+
+extern crate derive_marker_tricky;
+
+mod m {
+ use derive_marker_tricky::NoMarker as Copy;
+
+ #[derive(Copy)]
+ struct S;
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derive-multiple-with-packed.rs b/tests/ui/derives/derive-multiple-with-packed.rs
new file mode 100644
index 000000000..e762ee357
--- /dev/null
+++ b/tests/ui/derives/derive-multiple-with-packed.rs
@@ -0,0 +1,10 @@
+// check-pass
+
+#[derive(Clone, Copy)]
+#[derive(Debug)] // OK, even if `Copy` is in the different `#[derive]`
+#[repr(packed)]
+struct CacheRecordHeader {
+ field: u64,
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derive-on-trait-item-or-impl-item.rs b/tests/ui/derives/derive-on-trait-item-or-impl-item.rs
new file mode 100644
index 000000000..7e579ec22
--- /dev/null
+++ b/tests/ui/derives/derive-on-trait-item-or-impl-item.rs
@@ -0,0 +1,15 @@
+trait Foo {
+ #[derive(Clone)]
+ //~^ ERROR `derive` may only be applied to `struct`s, `enum`s and `union`s
+ type Bar;
+}
+
+struct Bar;
+
+impl Bar {
+ #[derive(Clone)]
+ //~^ ERROR `derive` may only be applied to `struct`s, `enum`s and `union`s
+ fn bar(&self) {}
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derive-on-trait-item-or-impl-item.stderr b/tests/ui/derives/derive-on-trait-item-or-impl-item.stderr
new file mode 100644
index 000000000..1fd97bdd5
--- /dev/null
+++ b/tests/ui/derives/derive-on-trait-item-or-impl-item.stderr
@@ -0,0 +1,21 @@
+error[E0774]: `derive` may only be applied to `struct`s, `enum`s and `union`s
+ --> $DIR/derive-on-trait-item-or-impl-item.rs:2:5
+ |
+LL | #[derive(Clone)]
+ | ^^^^^^^^^^^^^^^^ not applicable here
+LL |
+LL | type Bar;
+ | --------- not a `struct`, `enum` or `union`
+
+error[E0774]: `derive` may only be applied to `struct`s, `enum`s and `union`s
+ --> $DIR/derive-on-trait-item-or-impl-item.rs:10:5
+ |
+LL | #[derive(Clone)]
+ | ^^^^^^^^^^^^^^^^ not applicable here
+LL |
+LL | fn bar(&self) {}
+ | ---------------- not a `struct`, `enum` or `union`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0774`.
diff --git a/tests/ui/derives/derive-partial-ord.rs b/tests/ui/derives/derive-partial-ord.rs
new file mode 100644
index 000000000..9078a7ffa
--- /dev/null
+++ b/tests/ui/derives/derive-partial-ord.rs
@@ -0,0 +1,60 @@
+// Checks that in a derived implementation of PartialOrd the lt, le, ge, gt methods are consistent
+// with partial_cmp. Also verifies that implementation is consistent with that for tuples.
+//
+// run-pass
+
+#[derive(PartialEq, PartialOrd)]
+struct P(f64, f64);
+
+fn main() {
+ let values: &[f64] = &[1.0, 2.0, f64::NAN];
+ for a in values {
+ for b in values {
+ for c in values {
+ for d in values {
+ // Check impl for a tuple.
+ check(&(*a, *b), &(*c, *d));
+
+ // Check derived impl.
+ check(&P(*a, *b), &P(*c, *d));
+
+ // Check that impls agree with each other.
+ assert_eq!(
+ PartialOrd::partial_cmp(&(*a, *b), &(*c, *d)),
+ PartialOrd::partial_cmp(&P(*a, *b), &P(*c, *d)),
+ );
+ }
+ }
+ }
+ }
+}
+
+fn check<T: PartialOrd>(a: &T, b: &T) {
+ use std::cmp::Ordering::*;
+ match PartialOrd::partial_cmp(a, b) {
+ None => {
+ assert!(!(a < b));
+ assert!(!(a <= b));
+ assert!(!(a > b));
+ assert!(!(a >= b));
+ }
+ Some(Equal) => {
+ assert!(!(a < b));
+ assert!(a <= b);
+ assert!(!(a > b));
+ assert!(a >= b);
+ }
+ Some(Less) => {
+ assert!(a < b);
+ assert!(a <= b);
+ assert!(!(a > b));
+ assert!(!(a >= b));
+ }
+ Some(Greater) => {
+ assert!(!(a < b));
+ assert!(!(a <= b));
+ assert!(a > b);
+ assert!(a >= b);
+ }
+ }
+}
diff --git a/tests/ui/derives/derive-renamed.rs b/tests/ui/derives/derive-renamed.rs
new file mode 100644
index 000000000..d310e5806
--- /dev/null
+++ b/tests/ui/derives/derive-renamed.rs
@@ -0,0 +1,11 @@
+// check-pass
+// edition:2018
+
+use derive as my_derive;
+
+#[my_derive(Debug)]
+struct S;
+
+fn main() {
+ println!("{:?}", S); // OK
+}
diff --git a/tests/ui/derives/derives-span-Clone-enum-struct-variant.rs b/tests/ui/derives/derives-span-Clone-enum-struct-variant.rs
new file mode 100644
index 000000000..b556d4424
--- /dev/null
+++ b/tests/ui/derives/derives-span-Clone-enum-struct-variant.rs
@@ -0,0 +1,13 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(Clone)]
+enum Enum {
+ A {
+ x: Error //~ ERROR
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Clone-enum-struct-variant.stderr b/tests/ui/derives/derives-span-Clone-enum-struct-variant.stderr
new file mode 100644
index 000000000..7326324b0
--- /dev/null
+++ b/tests/ui/derives/derives-span-Clone-enum-struct-variant.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `Error: Clone` is not satisfied
+ --> $DIR/derives-span-Clone-enum-struct-variant.rs:9:6
+ |
+LL | #[derive(Clone)]
+ | ----- in this derive macro expansion
+...
+LL | x: Error
+ | ^^^^^^^^ the trait `Clone` is not implemented for `Error`
+ |
+ = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Clone)]`
+ |
+LL | #[derive(Clone)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Clone-enum.rs b/tests/ui/derives/derives-span-Clone-enum.rs
new file mode 100644
index 000000000..9bb4f486c
--- /dev/null
+++ b/tests/ui/derives/derives-span-Clone-enum.rs
@@ -0,0 +1,13 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(Clone)]
+enum Enum {
+ A(
+ Error //~ ERROR
+ )
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Clone-enum.stderr b/tests/ui/derives/derives-span-Clone-enum.stderr
new file mode 100644
index 000000000..229a4f7d9
--- /dev/null
+++ b/tests/ui/derives/derives-span-Clone-enum.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `Error: Clone` is not satisfied
+ --> $DIR/derives-span-Clone-enum.rs:9:6
+ |
+LL | #[derive(Clone)]
+ | ----- in this derive macro expansion
+...
+LL | Error
+ | ^^^^^ the trait `Clone` is not implemented for `Error`
+ |
+ = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Clone)]`
+ |
+LL | #[derive(Clone)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Clone-struct.rs b/tests/ui/derives/derives-span-Clone-struct.rs
new file mode 100644
index 000000000..f151636f8
--- /dev/null
+++ b/tests/ui/derives/derives-span-Clone-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(Clone)]
+struct Struct {
+ x: Error //~ ERROR
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Clone-struct.stderr b/tests/ui/derives/derives-span-Clone-struct.stderr
new file mode 100644
index 000000000..96bad9eda
--- /dev/null
+++ b/tests/ui/derives/derives-span-Clone-struct.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `Error: Clone` is not satisfied
+ --> $DIR/derives-span-Clone-struct.rs:8:5
+ |
+LL | #[derive(Clone)]
+ | ----- in this derive macro expansion
+LL | struct Struct {
+LL | x: Error
+ | ^^^^^^^^ the trait `Clone` is not implemented for `Error`
+ |
+ = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Clone)]`
+ |
+LL | #[derive(Clone)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Clone-tuple-struct.rs b/tests/ui/derives/derives-span-Clone-tuple-struct.rs
new file mode 100644
index 000000000..7a6288532
--- /dev/null
+++ b/tests/ui/derives/derives-span-Clone-tuple-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(Clone)]
+struct Struct(
+ Error //~ ERROR
+);
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Clone-tuple-struct.stderr b/tests/ui/derives/derives-span-Clone-tuple-struct.stderr
new file mode 100644
index 000000000..b61341e57
--- /dev/null
+++ b/tests/ui/derives/derives-span-Clone-tuple-struct.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `Error: Clone` is not satisfied
+ --> $DIR/derives-span-Clone-tuple-struct.rs:8:5
+ |
+LL | #[derive(Clone)]
+ | ----- in this derive macro expansion
+LL | struct Struct(
+LL | Error
+ | ^^^^^ the trait `Clone` is not implemented for `Error`
+ |
+ = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Clone)]`
+ |
+LL | #[derive(Clone)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Debug-enum-struct-variant.rs b/tests/ui/derives/derives-span-Debug-enum-struct-variant.rs
new file mode 100644
index 000000000..949597bc8
--- /dev/null
+++ b/tests/ui/derives/derives-span-Debug-enum-struct-variant.rs
@@ -0,0 +1,13 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(Debug)]
+enum Enum {
+ A {
+ x: Error //~ ERROR
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Debug-enum-struct-variant.stderr b/tests/ui/derives/derives-span-Debug-enum-struct-variant.stderr
new file mode 100644
index 000000000..58a64a4f5
--- /dev/null
+++ b/tests/ui/derives/derives-span-Debug-enum-struct-variant.stderr
@@ -0,0 +1,20 @@
+error[E0277]: `Error` doesn't implement `Debug`
+ --> $DIR/derives-span-Debug-enum-struct-variant.rs:9:6
+ |
+LL | #[derive(Debug)]
+ | ----- in this derive macro expansion
+...
+LL | x: Error
+ | ^^^^^^^^ `Error` cannot be formatted using `{:?}`
+ |
+ = help: the trait `Debug` is not implemented for `Error`
+ = note: add `#[derive(Debug)]` to `Error` or manually `impl Debug for Error`
+ = note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Debug)]`
+ |
+LL | #[derive(Debug)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Debug-enum.rs b/tests/ui/derives/derives-span-Debug-enum.rs
new file mode 100644
index 000000000..b2a39708c
--- /dev/null
+++ b/tests/ui/derives/derives-span-Debug-enum.rs
@@ -0,0 +1,13 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(Debug)]
+enum Enum {
+ A(
+ Error //~ ERROR
+ )
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Debug-enum.stderr b/tests/ui/derives/derives-span-Debug-enum.stderr
new file mode 100644
index 000000000..e9bb5f960
--- /dev/null
+++ b/tests/ui/derives/derives-span-Debug-enum.stderr
@@ -0,0 +1,20 @@
+error[E0277]: `Error` doesn't implement `Debug`
+ --> $DIR/derives-span-Debug-enum.rs:9:6
+ |
+LL | #[derive(Debug)]
+ | ----- in this derive macro expansion
+...
+LL | Error
+ | ^^^^^ `Error` cannot be formatted using `{:?}`
+ |
+ = help: the trait `Debug` is not implemented for `Error`
+ = note: add `#[derive(Debug)]` to `Error` or manually `impl Debug for Error`
+ = note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Debug)]`
+ |
+LL | #[derive(Debug)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Debug-struct.rs b/tests/ui/derives/derives-span-Debug-struct.rs
new file mode 100644
index 000000000..cf91c9436
--- /dev/null
+++ b/tests/ui/derives/derives-span-Debug-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(Debug)]
+struct Struct {
+ x: Error //~ ERROR
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Debug-struct.stderr b/tests/ui/derives/derives-span-Debug-struct.stderr
new file mode 100644
index 000000000..0a117c060
--- /dev/null
+++ b/tests/ui/derives/derives-span-Debug-struct.stderr
@@ -0,0 +1,20 @@
+error[E0277]: `Error` doesn't implement `Debug`
+ --> $DIR/derives-span-Debug-struct.rs:8:5
+ |
+LL | #[derive(Debug)]
+ | ----- in this derive macro expansion
+LL | struct Struct {
+LL | x: Error
+ | ^^^^^^^^ `Error` cannot be formatted using `{:?}`
+ |
+ = help: the trait `Debug` is not implemented for `Error`
+ = note: add `#[derive(Debug)]` to `Error` or manually `impl Debug for Error`
+ = note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Debug)]`
+ |
+LL | #[derive(Debug)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Debug-tuple-struct.rs b/tests/ui/derives/derives-span-Debug-tuple-struct.rs
new file mode 100644
index 000000000..cea973c91
--- /dev/null
+++ b/tests/ui/derives/derives-span-Debug-tuple-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(Debug)]
+struct Struct(
+ Error //~ ERROR
+);
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Debug-tuple-struct.stderr b/tests/ui/derives/derives-span-Debug-tuple-struct.stderr
new file mode 100644
index 000000000..f2e90a418
--- /dev/null
+++ b/tests/ui/derives/derives-span-Debug-tuple-struct.stderr
@@ -0,0 +1,20 @@
+error[E0277]: `Error` doesn't implement `Debug`
+ --> $DIR/derives-span-Debug-tuple-struct.rs:8:5
+ |
+LL | #[derive(Debug)]
+ | ----- in this derive macro expansion
+LL | struct Struct(
+LL | Error
+ | ^^^^^ `Error` cannot be formatted using `{:?}`
+ |
+ = help: the trait `Debug` is not implemented for `Error`
+ = note: add `#[derive(Debug)]` to `Error` or manually `impl Debug for Error`
+ = note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Debug)]`
+ |
+LL | #[derive(Debug)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Default-struct.rs b/tests/ui/derives/derives-span-Default-struct.rs
new file mode 100644
index 000000000..71fd5829e
--- /dev/null
+++ b/tests/ui/derives/derives-span-Default-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(Default)]
+struct Struct {
+ x: Error //~ ERROR
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Default-struct.stderr b/tests/ui/derives/derives-span-Default-struct.stderr
new file mode 100644
index 000000000..d4affd535
--- /dev/null
+++ b/tests/ui/derives/derives-span-Default-struct.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `Error: Default` is not satisfied
+ --> $DIR/derives-span-Default-struct.rs:8:5
+ |
+LL | #[derive(Default)]
+ | ------- in this derive macro expansion
+LL | struct Struct {
+LL | x: Error
+ | ^^^^^^^^ the trait `Default` is not implemented for `Error`
+ |
+ = note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Default)]`
+ |
+LL | #[derive(Default)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Default-tuple-struct.rs b/tests/ui/derives/derives-span-Default-tuple-struct.rs
new file mode 100644
index 000000000..463f7d230
--- /dev/null
+++ b/tests/ui/derives/derives-span-Default-tuple-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(Default)]
+struct Struct(
+ Error //~ ERROR
+);
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Default-tuple-struct.stderr b/tests/ui/derives/derives-span-Default-tuple-struct.stderr
new file mode 100644
index 000000000..129351f59
--- /dev/null
+++ b/tests/ui/derives/derives-span-Default-tuple-struct.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `Error: Default` is not satisfied
+ --> $DIR/derives-span-Default-tuple-struct.rs:8:5
+ |
+LL | #[derive(Default)]
+ | ------- in this derive macro expansion
+LL | struct Struct(
+LL | Error
+ | ^^^^^ the trait `Default` is not implemented for `Error`
+ |
+ = note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Default)]`
+ |
+LL | #[derive(Default)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Eq-enum-struct-variant.rs b/tests/ui/derives/derives-span-Eq-enum-struct-variant.rs
new file mode 100644
index 000000000..d2dab8687
--- /dev/null
+++ b/tests/ui/derives/derives-span-Eq-enum-struct-variant.rs
@@ -0,0 +1,13 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+#[derive(PartialEq)]
+struct Error;
+
+#[derive(Eq,PartialEq)]
+enum Enum {
+ A {
+ x: Error //~ ERROR
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Eq-enum-struct-variant.stderr b/tests/ui/derives/derives-span-Eq-enum-struct-variant.stderr
new file mode 100644
index 000000000..2be69a30b
--- /dev/null
+++ b/tests/ui/derives/derives-span-Eq-enum-struct-variant.stderr
@@ -0,0 +1,20 @@
+error[E0277]: the trait bound `Error: Eq` is not satisfied
+ --> $DIR/derives-span-Eq-enum-struct-variant.rs:9:6
+ |
+LL | #[derive(Eq,PartialEq)]
+ | -- in this derive macro expansion
+...
+LL | x: Error
+ | ^^^^^^^^ the trait `Eq` is not implemented for `Error`
+ |
+note: required by a bound in `AssertParamIsEq`
+ --> $SRC_DIR/core/src/cmp.rs:LL:COL
+ = note: this error originates in the derive macro `Eq` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Eq)]`
+ |
+LL | #[derive(Eq)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Eq-enum.rs b/tests/ui/derives/derives-span-Eq-enum.rs
new file mode 100644
index 000000000..c6c0d4321
--- /dev/null
+++ b/tests/ui/derives/derives-span-Eq-enum.rs
@@ -0,0 +1,13 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+#[derive(PartialEq)]
+struct Error;
+
+#[derive(Eq,PartialEq)]
+enum Enum {
+ A(
+ Error //~ ERROR
+ )
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Eq-enum.stderr b/tests/ui/derives/derives-span-Eq-enum.stderr
new file mode 100644
index 000000000..4f4f821cc
--- /dev/null
+++ b/tests/ui/derives/derives-span-Eq-enum.stderr
@@ -0,0 +1,20 @@
+error[E0277]: the trait bound `Error: Eq` is not satisfied
+ --> $DIR/derives-span-Eq-enum.rs:9:6
+ |
+LL | #[derive(Eq,PartialEq)]
+ | -- in this derive macro expansion
+...
+LL | Error
+ | ^^^^^ the trait `Eq` is not implemented for `Error`
+ |
+note: required by a bound in `AssertParamIsEq`
+ --> $SRC_DIR/core/src/cmp.rs:LL:COL
+ = note: this error originates in the derive macro `Eq` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Eq)]`
+ |
+LL | #[derive(Eq)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Eq-struct.rs b/tests/ui/derives/derives-span-Eq-struct.rs
new file mode 100644
index 000000000..df3100398
--- /dev/null
+++ b/tests/ui/derives/derives-span-Eq-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+#[derive(PartialEq)]
+struct Error;
+
+#[derive(Eq,PartialEq)]
+struct Struct {
+ x: Error //~ ERROR
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Eq-struct.stderr b/tests/ui/derives/derives-span-Eq-struct.stderr
new file mode 100644
index 000000000..f15659c3e
--- /dev/null
+++ b/tests/ui/derives/derives-span-Eq-struct.stderr
@@ -0,0 +1,20 @@
+error[E0277]: the trait bound `Error: Eq` is not satisfied
+ --> $DIR/derives-span-Eq-struct.rs:8:5
+ |
+LL | #[derive(Eq,PartialEq)]
+ | -- in this derive macro expansion
+LL | struct Struct {
+LL | x: Error
+ | ^^^^^^^^ the trait `Eq` is not implemented for `Error`
+ |
+note: required by a bound in `AssertParamIsEq`
+ --> $SRC_DIR/core/src/cmp.rs:LL:COL
+ = note: this error originates in the derive macro `Eq` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Eq)]`
+ |
+LL | #[derive(Eq)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Eq-tuple-struct.rs b/tests/ui/derives/derives-span-Eq-tuple-struct.rs
new file mode 100644
index 000000000..abf6526b9
--- /dev/null
+++ b/tests/ui/derives/derives-span-Eq-tuple-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+#[derive(PartialEq)]
+struct Error;
+
+#[derive(Eq,PartialEq)]
+struct Struct(
+ Error //~ ERROR
+);
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Eq-tuple-struct.stderr b/tests/ui/derives/derives-span-Eq-tuple-struct.stderr
new file mode 100644
index 000000000..4e5659b35
--- /dev/null
+++ b/tests/ui/derives/derives-span-Eq-tuple-struct.stderr
@@ -0,0 +1,20 @@
+error[E0277]: the trait bound `Error: Eq` is not satisfied
+ --> $DIR/derives-span-Eq-tuple-struct.rs:8:5
+ |
+LL | #[derive(Eq,PartialEq)]
+ | -- in this derive macro expansion
+LL | struct Struct(
+LL | Error
+ | ^^^^^ the trait `Eq` is not implemented for `Error`
+ |
+note: required by a bound in `AssertParamIsEq`
+ --> $SRC_DIR/core/src/cmp.rs:LL:COL
+ = note: this error originates in the derive macro `Eq` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Eq)]`
+ |
+LL | #[derive(Eq)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Hash-enum-struct-variant.rs b/tests/ui/derives/derives-span-Hash-enum-struct-variant.rs
new file mode 100644
index 000000000..3018a7b6d
--- /dev/null
+++ b/tests/ui/derives/derives-span-Hash-enum-struct-variant.rs
@@ -0,0 +1,13 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(Hash)]
+enum Enum {
+ A {
+ x: Error //~ ERROR
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Hash-enum-struct-variant.stderr b/tests/ui/derives/derives-span-Hash-enum-struct-variant.stderr
new file mode 100644
index 000000000..fe5e0e96a
--- /dev/null
+++ b/tests/ui/derives/derives-span-Hash-enum-struct-variant.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `Error: Hash` is not satisfied
+ --> $DIR/derives-span-Hash-enum-struct-variant.rs:9:6
+ |
+LL | #[derive(Hash)]
+ | ---- in this derive macro expansion
+...
+LL | x: Error
+ | ^^^^^^^^ the trait `Hash` is not implemented for `Error`
+ |
+ = note: this error originates in the derive macro `Hash` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Hash)]`
+ |
+LL | #[derive(Hash)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Hash-enum.rs b/tests/ui/derives/derives-span-Hash-enum.rs
new file mode 100644
index 000000000..8ce7df18f
--- /dev/null
+++ b/tests/ui/derives/derives-span-Hash-enum.rs
@@ -0,0 +1,12 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+struct Error;
+
+#[derive(Hash)]
+enum Enum {
+ A(
+ Error //~ ERROR
+ )
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Hash-enum.stderr b/tests/ui/derives/derives-span-Hash-enum.stderr
new file mode 100644
index 000000000..99785b87c
--- /dev/null
+++ b/tests/ui/derives/derives-span-Hash-enum.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `Error: Hash` is not satisfied
+ --> $DIR/derives-span-Hash-enum.rs:8:6
+ |
+LL | #[derive(Hash)]
+ | ---- in this derive macro expansion
+...
+LL | Error
+ | ^^^^^ the trait `Hash` is not implemented for `Error`
+ |
+ = note: this error originates in the derive macro `Hash` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Hash)]`
+ |
+LL | #[derive(Hash)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Hash-struct.rs b/tests/ui/derives/derives-span-Hash-struct.rs
new file mode 100644
index 000000000..fa5e2af6b
--- /dev/null
+++ b/tests/ui/derives/derives-span-Hash-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(Hash)]
+struct Struct {
+ x: Error //~ ERROR
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Hash-struct.stderr b/tests/ui/derives/derives-span-Hash-struct.stderr
new file mode 100644
index 000000000..4db83dd13
--- /dev/null
+++ b/tests/ui/derives/derives-span-Hash-struct.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `Error: Hash` is not satisfied
+ --> $DIR/derives-span-Hash-struct.rs:8:5
+ |
+LL | #[derive(Hash)]
+ | ---- in this derive macro expansion
+LL | struct Struct {
+LL | x: Error
+ | ^^^^^^^^ the trait `Hash` is not implemented for `Error`
+ |
+ = note: this error originates in the derive macro `Hash` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Hash)]`
+ |
+LL | #[derive(Hash)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Hash-tuple-struct.rs b/tests/ui/derives/derives-span-Hash-tuple-struct.rs
new file mode 100644
index 000000000..3822bce14
--- /dev/null
+++ b/tests/ui/derives/derives-span-Hash-tuple-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(Hash)]
+struct Struct(
+ Error //~ ERROR
+);
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Hash-tuple-struct.stderr b/tests/ui/derives/derives-span-Hash-tuple-struct.stderr
new file mode 100644
index 000000000..8660c97e6
--- /dev/null
+++ b/tests/ui/derives/derives-span-Hash-tuple-struct.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `Error: Hash` is not satisfied
+ --> $DIR/derives-span-Hash-tuple-struct.rs:8:5
+ |
+LL | #[derive(Hash)]
+ | ---- in this derive macro expansion
+LL | struct Struct(
+LL | Error
+ | ^^^^^ the trait `Hash` is not implemented for `Error`
+ |
+ = note: this error originates in the derive macro `Hash` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Hash)]`
+ |
+LL | #[derive(Hash)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Ord-enum-struct-variant.rs b/tests/ui/derives/derives-span-Ord-enum-struct-variant.rs
new file mode 100644
index 000000000..62355cc2d
--- /dev/null
+++ b/tests/ui/derives/derives-span-Ord-enum-struct-variant.rs
@@ -0,0 +1,13 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+#[derive(Eq,PartialOrd,PartialEq)]
+struct Error;
+
+#[derive(Ord,Eq,PartialOrd,PartialEq)]
+enum Enum {
+ A {
+ x: Error //~ ERROR
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Ord-enum-struct-variant.stderr b/tests/ui/derives/derives-span-Ord-enum-struct-variant.stderr
new file mode 100644
index 000000000..6e48332c2
--- /dev/null
+++ b/tests/ui/derives/derives-span-Ord-enum-struct-variant.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `Error: Ord` is not satisfied
+ --> $DIR/derives-span-Ord-enum-struct-variant.rs:9:6
+ |
+LL | #[derive(Ord,Eq,PartialOrd,PartialEq)]
+ | --- in this derive macro expansion
+...
+LL | x: Error
+ | ^^^^^^^^ the trait `Ord` is not implemented for `Error`
+ |
+ = note: this error originates in the derive macro `Ord` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Ord)]`
+ |
+LL | #[derive(Ord)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Ord-enum.rs b/tests/ui/derives/derives-span-Ord-enum.rs
new file mode 100644
index 000000000..72738931d
--- /dev/null
+++ b/tests/ui/derives/derives-span-Ord-enum.rs
@@ -0,0 +1,13 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+#[derive(Eq,PartialOrd,PartialEq)]
+struct Error;
+
+#[derive(Ord,Eq,PartialOrd,PartialEq)]
+enum Enum {
+ A(
+ Error //~ ERROR
+ )
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Ord-enum.stderr b/tests/ui/derives/derives-span-Ord-enum.stderr
new file mode 100644
index 000000000..b05cf0a05
--- /dev/null
+++ b/tests/ui/derives/derives-span-Ord-enum.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `Error: Ord` is not satisfied
+ --> $DIR/derives-span-Ord-enum.rs:9:6
+ |
+LL | #[derive(Ord,Eq,PartialOrd,PartialEq)]
+ | --- in this derive macro expansion
+...
+LL | Error
+ | ^^^^^ the trait `Ord` is not implemented for `Error`
+ |
+ = note: this error originates in the derive macro `Ord` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Ord)]`
+ |
+LL | #[derive(Ord)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Ord-struct.rs b/tests/ui/derives/derives-span-Ord-struct.rs
new file mode 100644
index 000000000..53d4c2c22
--- /dev/null
+++ b/tests/ui/derives/derives-span-Ord-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+#[derive(Eq,PartialOrd,PartialEq)]
+struct Error;
+
+#[derive(Ord,Eq,PartialOrd,PartialEq)]
+struct Struct {
+ x: Error //~ ERROR
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Ord-struct.stderr b/tests/ui/derives/derives-span-Ord-struct.stderr
new file mode 100644
index 000000000..c4def34a8
--- /dev/null
+++ b/tests/ui/derives/derives-span-Ord-struct.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `Error: Ord` is not satisfied
+ --> $DIR/derives-span-Ord-struct.rs:8:5
+ |
+LL | #[derive(Ord,Eq,PartialOrd,PartialEq)]
+ | --- in this derive macro expansion
+LL | struct Struct {
+LL | x: Error
+ | ^^^^^^^^ the trait `Ord` is not implemented for `Error`
+ |
+ = note: this error originates in the derive macro `Ord` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Ord)]`
+ |
+LL | #[derive(Ord)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-Ord-tuple-struct.rs b/tests/ui/derives/derives-span-Ord-tuple-struct.rs
new file mode 100644
index 000000000..4e09c2709
--- /dev/null
+++ b/tests/ui/derives/derives-span-Ord-tuple-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+#[derive(Eq,PartialOrd,PartialEq)]
+struct Error;
+
+#[derive(Ord,Eq,PartialOrd,PartialEq)]
+struct Struct(
+ Error //~ ERROR
+);
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-Ord-tuple-struct.stderr b/tests/ui/derives/derives-span-Ord-tuple-struct.stderr
new file mode 100644
index 000000000..a3b288d0f
--- /dev/null
+++ b/tests/ui/derives/derives-span-Ord-tuple-struct.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `Error: Ord` is not satisfied
+ --> $DIR/derives-span-Ord-tuple-struct.rs:8:5
+ |
+LL | #[derive(Ord,Eq,PartialOrd,PartialEq)]
+ | --- in this derive macro expansion
+LL | struct Struct(
+LL | Error
+ | ^^^^^ the trait `Ord` is not implemented for `Error`
+ |
+ = note: this error originates in the derive macro `Ord` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(Ord)]`
+ |
+LL | #[derive(Ord)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-PartialEq-enum-struct-variant.rs b/tests/ui/derives/derives-span-PartialEq-enum-struct-variant.rs
new file mode 100644
index 000000000..67a27729d
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialEq-enum-struct-variant.rs
@@ -0,0 +1,13 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(PartialEq)]
+enum Enum {
+ A {
+ x: Error //~ ERROR
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-PartialEq-enum-struct-variant.stderr b/tests/ui/derives/derives-span-PartialEq-enum-struct-variant.stderr
new file mode 100644
index 000000000..9953154fd
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialEq-enum-struct-variant.stderr
@@ -0,0 +1,23 @@
+error[E0369]: binary operation `==` cannot be applied to type `Error`
+ --> $DIR/derives-span-PartialEq-enum-struct-variant.rs:9:6
+ |
+LL | #[derive(PartialEq)]
+ | --------- in this derive macro expansion
+...
+LL | x: Error
+ | ^^^^^^^^
+ |
+note: an implementation of `PartialEq<_>` might be missing for `Error`
+ --> $DIR/derives-span-PartialEq-enum-struct-variant.rs:4:1
+ |
+LL | struct Error;
+ | ^^^^^^^^^^^^ must implement `PartialEq<_>`
+ = note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(PartialEq)]`
+ |
+LL | #[derive(PartialEq)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0369`.
diff --git a/tests/ui/derives/derives-span-PartialEq-enum.rs b/tests/ui/derives/derives-span-PartialEq-enum.rs
new file mode 100644
index 000000000..0becc7e0d
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialEq-enum.rs
@@ -0,0 +1,13 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(PartialEq)]
+enum Enum {
+ A(
+ Error //~ ERROR
+ )
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-PartialEq-enum.stderr b/tests/ui/derives/derives-span-PartialEq-enum.stderr
new file mode 100644
index 000000000..7c1304523
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialEq-enum.stderr
@@ -0,0 +1,23 @@
+error[E0369]: binary operation `==` cannot be applied to type `Error`
+ --> $DIR/derives-span-PartialEq-enum.rs:9:6
+ |
+LL | #[derive(PartialEq)]
+ | --------- in this derive macro expansion
+...
+LL | Error
+ | ^^^^^
+ |
+note: an implementation of `PartialEq<_>` might be missing for `Error`
+ --> $DIR/derives-span-PartialEq-enum.rs:4:1
+ |
+LL | struct Error;
+ | ^^^^^^^^^^^^ must implement `PartialEq<_>`
+ = note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(PartialEq)]`
+ |
+LL | #[derive(PartialEq)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0369`.
diff --git a/tests/ui/derives/derives-span-PartialEq-struct.rs b/tests/ui/derives/derives-span-PartialEq-struct.rs
new file mode 100644
index 000000000..c92ef5fad
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialEq-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(PartialEq)]
+struct Struct {
+ x: Error //~ ERROR
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-PartialEq-struct.stderr b/tests/ui/derives/derives-span-PartialEq-struct.stderr
new file mode 100644
index 000000000..ba3d6ced3
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialEq-struct.stderr
@@ -0,0 +1,23 @@
+error[E0369]: binary operation `==` cannot be applied to type `Error`
+ --> $DIR/derives-span-PartialEq-struct.rs:8:5
+ |
+LL | #[derive(PartialEq)]
+ | --------- in this derive macro expansion
+LL | struct Struct {
+LL | x: Error
+ | ^^^^^^^^
+ |
+note: an implementation of `PartialEq<_>` might be missing for `Error`
+ --> $DIR/derives-span-PartialEq-struct.rs:4:1
+ |
+LL | struct Error;
+ | ^^^^^^^^^^^^ must implement `PartialEq<_>`
+ = note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(PartialEq)]`
+ |
+LL | #[derive(PartialEq)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0369`.
diff --git a/tests/ui/derives/derives-span-PartialEq-tuple-struct.rs b/tests/ui/derives/derives-span-PartialEq-tuple-struct.rs
new file mode 100644
index 000000000..10ac347aa
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialEq-tuple-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+
+struct Error;
+
+#[derive(PartialEq)]
+struct Struct(
+ Error //~ ERROR
+);
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-PartialEq-tuple-struct.stderr b/tests/ui/derives/derives-span-PartialEq-tuple-struct.stderr
new file mode 100644
index 000000000..ab0b56a9e
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialEq-tuple-struct.stderr
@@ -0,0 +1,23 @@
+error[E0369]: binary operation `==` cannot be applied to type `Error`
+ --> $DIR/derives-span-PartialEq-tuple-struct.rs:8:5
+ |
+LL | #[derive(PartialEq)]
+ | --------- in this derive macro expansion
+LL | struct Struct(
+LL | Error
+ | ^^^^^
+ |
+note: an implementation of `PartialEq<_>` might be missing for `Error`
+ --> $DIR/derives-span-PartialEq-tuple-struct.rs:4:1
+ |
+LL | struct Error;
+ | ^^^^^^^^^^^^ must implement `PartialEq<_>`
+ = note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(PartialEq)]`
+ |
+LL | #[derive(PartialEq)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0369`.
diff --git a/tests/ui/derives/derives-span-PartialOrd-enum-struct-variant.rs b/tests/ui/derives/derives-span-PartialOrd-enum-struct-variant.rs
new file mode 100644
index 000000000..a769c1376
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialOrd-enum-struct-variant.rs
@@ -0,0 +1,13 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+#[derive(PartialEq)]
+struct Error;
+
+#[derive(PartialOrd,PartialEq)]
+enum Enum {
+ A {
+ x: Error //~ ERROR can't compare `Error` with `Error`
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-PartialOrd-enum-struct-variant.stderr b/tests/ui/derives/derives-span-PartialOrd-enum-struct-variant.stderr
new file mode 100644
index 000000000..2d19aaf68
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialOrd-enum-struct-variant.stderr
@@ -0,0 +1,19 @@
+error[E0277]: can't compare `Error` with `Error`
+ --> $DIR/derives-span-PartialOrd-enum-struct-variant.rs:9:6
+ |
+LL | #[derive(PartialOrd,PartialEq)]
+ | ---------- in this derive macro expansion
+...
+LL | x: Error
+ | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error`
+ |
+ = help: the trait `PartialOrd` is not implemented for `Error`
+ = note: this error originates in the derive macro `PartialOrd` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(PartialOrd)]`
+ |
+LL | #[derive(PartialOrd)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-PartialOrd-enum.rs b/tests/ui/derives/derives-span-PartialOrd-enum.rs
new file mode 100644
index 000000000..4f0d794e4
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialOrd-enum.rs
@@ -0,0 +1,13 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+#[derive(PartialEq)]
+struct Error;
+
+#[derive(PartialOrd,PartialEq)]
+enum Enum {
+ A(
+ Error //~ ERROR can't compare `Error` with `Error`
+ )
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-PartialOrd-enum.stderr b/tests/ui/derives/derives-span-PartialOrd-enum.stderr
new file mode 100644
index 000000000..dfbb8060f
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialOrd-enum.stderr
@@ -0,0 +1,19 @@
+error[E0277]: can't compare `Error` with `Error`
+ --> $DIR/derives-span-PartialOrd-enum.rs:9:6
+ |
+LL | #[derive(PartialOrd,PartialEq)]
+ | ---------- in this derive macro expansion
+...
+LL | Error
+ | ^^^^^ no implementation for `Error < Error` and `Error > Error`
+ |
+ = help: the trait `PartialOrd` is not implemented for `Error`
+ = note: this error originates in the derive macro `PartialOrd` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(PartialOrd)]`
+ |
+LL | #[derive(PartialOrd)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-PartialOrd-struct.rs b/tests/ui/derives/derives-span-PartialOrd-struct.rs
new file mode 100644
index 000000000..da857c674
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialOrd-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+#[derive(PartialEq)]
+struct Error;
+
+#[derive(PartialOrd,PartialEq)]
+struct Struct {
+ x: Error //~ ERROR can't compare `Error` with `Error`
+}
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-PartialOrd-struct.stderr b/tests/ui/derives/derives-span-PartialOrd-struct.stderr
new file mode 100644
index 000000000..ba63d86e8
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialOrd-struct.stderr
@@ -0,0 +1,19 @@
+error[E0277]: can't compare `Error` with `Error`
+ --> $DIR/derives-span-PartialOrd-struct.rs:8:5
+ |
+LL | #[derive(PartialOrd,PartialEq)]
+ | ---------- in this derive macro expansion
+LL | struct Struct {
+LL | x: Error
+ | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error`
+ |
+ = help: the trait `PartialOrd` is not implemented for `Error`
+ = note: this error originates in the derive macro `PartialOrd` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(PartialOrd)]`
+ |
+LL | #[derive(PartialOrd)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/derives-span-PartialOrd-tuple-struct.rs b/tests/ui/derives/derives-span-PartialOrd-tuple-struct.rs
new file mode 100644
index 000000000..61d507670
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialOrd-tuple-struct.rs
@@ -0,0 +1,11 @@
+// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
+
+#[derive(PartialEq)]
+struct Error;
+
+#[derive(PartialOrd,PartialEq)]
+struct Struct(
+ Error //~ ERROR can't compare `Error` with `Error`
+);
+
+fn main() {}
diff --git a/tests/ui/derives/derives-span-PartialOrd-tuple-struct.stderr b/tests/ui/derives/derives-span-PartialOrd-tuple-struct.stderr
new file mode 100644
index 000000000..7686ed806
--- /dev/null
+++ b/tests/ui/derives/derives-span-PartialOrd-tuple-struct.stderr
@@ -0,0 +1,19 @@
+error[E0277]: can't compare `Error` with `Error`
+ --> $DIR/derives-span-PartialOrd-tuple-struct.rs:8:5
+ |
+LL | #[derive(PartialOrd,PartialEq)]
+ | ---------- in this derive macro expansion
+LL | struct Struct(
+LL | Error
+ | ^^^^^ no implementation for `Error < Error` and `Error > Error`
+ |
+ = help: the trait `PartialOrd` is not implemented for `Error`
+ = note: this error originates in the derive macro `PartialOrd` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `Error` with `#[derive(PartialOrd)]`
+ |
+LL | #[derive(PartialOrd)]
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/deriving-bounds.rs b/tests/ui/derives/deriving-bounds.rs
new file mode 100644
index 000000000..95d440420
--- /dev/null
+++ b/tests/ui/derives/deriving-bounds.rs
@@ -0,0 +1,11 @@
+#[derive(Send)]
+//~^ ERROR cannot find derive macro `Send` in this scope
+//~| ERROR cannot find derive macro `Send` in this scope
+struct Test;
+
+#[derive(Sync)]
+//~^ ERROR cannot find derive macro `Sync` in this scope
+//~| ERROR cannot find derive macro `Sync` in this scope
+struct Test1;
+
+pub fn main() {}
diff --git a/tests/ui/derives/deriving-bounds.stderr b/tests/ui/derives/deriving-bounds.stderr
new file mode 100644
index 000000000..74ca37287
--- /dev/null
+++ b/tests/ui/derives/deriving-bounds.stderr
@@ -0,0 +1,50 @@
+error: cannot find derive macro `Sync` in this scope
+ --> $DIR/deriving-bounds.rs:6:10
+ |
+LL | #[derive(Sync)]
+ | ^^^^
+ |
+note: unsafe traits like `Sync` should be implemented explicitly
+ --> $DIR/deriving-bounds.rs:6:10
+ |
+LL | #[derive(Sync)]
+ | ^^^^
+
+error: cannot find derive macro `Sync` in this scope
+ --> $DIR/deriving-bounds.rs:6:10
+ |
+LL | #[derive(Sync)]
+ | ^^^^
+ |
+note: unsafe traits like `Sync` should be implemented explicitly
+ --> $DIR/deriving-bounds.rs:6:10
+ |
+LL | #[derive(Sync)]
+ | ^^^^
+
+error: cannot find derive macro `Send` in this scope
+ --> $DIR/deriving-bounds.rs:1:10
+ |
+LL | #[derive(Send)]
+ | ^^^^
+ |
+note: unsafe traits like `Send` should be implemented explicitly
+ --> $DIR/deriving-bounds.rs:1:10
+ |
+LL | #[derive(Send)]
+ | ^^^^
+
+error: cannot find derive macro `Send` in this scope
+ --> $DIR/deriving-bounds.rs:1:10
+ |
+LL | #[derive(Send)]
+ | ^^^^
+ |
+note: unsafe traits like `Send` should be implemented explicitly
+ --> $DIR/deriving-bounds.rs:1:10
+ |
+LL | #[derive(Send)]
+ | ^^^^
+
+error: aborting due to 4 previous errors
+
diff --git a/tests/ui/derives/deriving-copyclone.rs b/tests/ui/derives/deriving-copyclone.rs
new file mode 100644
index 000000000..06b3157a7
--- /dev/null
+++ b/tests/ui/derives/deriving-copyclone.rs
@@ -0,0 +1,37 @@
+// this will get a no-op Clone impl
+#[derive(Copy, Clone)]
+struct A {
+ a: i32,
+ b: i64
+}
+
+// this will get a deep Clone impl
+#[derive(Copy, Clone)]
+struct B<T> {
+ a: i32,
+ b: T
+}
+
+struct C; // not Copy or Clone
+#[derive(Clone)] struct D; // Clone but not Copy
+
+fn is_copy<T: Copy>(_: T) {}
+fn is_clone<T: Clone>(_: T) {}
+
+fn main() {
+ // A can be copied and cloned
+ is_copy(A { a: 1, b: 2 });
+ is_clone(A { a: 1, b: 2 });
+
+ // B<i32> can be copied and cloned
+ is_copy(B { a: 1, b: 2 });
+ is_clone(B { a: 1, b: 2 });
+
+ // B<C> cannot be copied or cloned
+ is_copy(B { a: 1, b: C }); //~ ERROR Copy
+ is_clone(B { a: 1, b: C }); //~ ERROR Clone
+
+ // B<D> can be cloned but not copied
+ is_copy(B { a: 1, b: D }); //~ ERROR Copy
+ is_clone(B { a: 1, b: D });
+}
diff --git a/tests/ui/derives/deriving-copyclone.stderr b/tests/ui/derives/deriving-copyclone.stderr
new file mode 100644
index 000000000..9c4ca01ff
--- /dev/null
+++ b/tests/ui/derives/deriving-copyclone.stderr
@@ -0,0 +1,75 @@
+error[E0277]: the trait bound `B<C>: Copy` is not satisfied
+ --> $DIR/deriving-copyclone.rs:31:13
+ |
+LL | is_copy(B { a: 1, b: C });
+ | ------- ^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `B<C>`
+ | |
+ | required by a bound introduced by this call
+ |
+note: required for `B<C>` to implement `Copy`
+ --> $DIR/deriving-copyclone.rs:9:10
+ |
+LL | #[derive(Copy, Clone)]
+ | ^^^^ unsatisfied trait bound introduced in this `derive` macro
+note: required by a bound in `is_copy`
+ --> $DIR/deriving-copyclone.rs:18:15
+ |
+LL | fn is_copy<T: Copy>(_: T) {}
+ | ^^^^ required by this bound in `is_copy`
+ = note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider borrowing here
+ |
+LL | is_copy(&B { a: 1, b: C });
+ | +
+
+error[E0277]: the trait bound `B<C>: Clone` is not satisfied
+ --> $DIR/deriving-copyclone.rs:32:14
+ |
+LL | is_clone(B { a: 1, b: C });
+ | -------- ^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `B<C>`
+ | |
+ | required by a bound introduced by this call
+ |
+note: required for `B<C>` to implement `Clone`
+ --> $DIR/deriving-copyclone.rs:9:16
+ |
+LL | #[derive(Copy, Clone)]
+ | ^^^^^ unsatisfied trait bound introduced in this `derive` macro
+note: required by a bound in `is_clone`
+ --> $DIR/deriving-copyclone.rs:19:16
+ |
+LL | fn is_clone<T: Clone>(_: T) {}
+ | ^^^^^ required by this bound in `is_clone`
+ = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider borrowing here
+ |
+LL | is_clone(&B { a: 1, b: C });
+ | +
+
+error[E0277]: the trait bound `B<D>: Copy` is not satisfied
+ --> $DIR/deriving-copyclone.rs:35:13
+ |
+LL | is_copy(B { a: 1, b: D });
+ | ------- ^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `B<D>`
+ | |
+ | required by a bound introduced by this call
+ |
+note: required for `B<D>` to implement `Copy`
+ --> $DIR/deriving-copyclone.rs:9:10
+ |
+LL | #[derive(Copy, Clone)]
+ | ^^^^ unsatisfied trait bound introduced in this `derive` macro
+note: required by a bound in `is_copy`
+ --> $DIR/deriving-copyclone.rs:18:15
+ |
+LL | fn is_copy<T: Copy>(_: T) {}
+ | ^^^^ required by this bound in `is_copy`
+ = note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider borrowing here
+ |
+LL | is_copy(&B { a: 1, b: D });
+ | +
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/deriving-meta-empty-trait-list.rs b/tests/ui/derives/deriving-meta-empty-trait-list.rs
new file mode 100644
index 000000000..0306ce717
--- /dev/null
+++ b/tests/ui/derives/deriving-meta-empty-trait-list.rs
@@ -0,0 +1,8 @@
+// check-pass
+
+#![deny(unused)]
+
+#[derive()] // OK
+struct _Bar;
+
+pub fn main() {}
diff --git a/tests/ui/derives/deriving-meta-unknown-trait.rs b/tests/ui/derives/deriving-meta-unknown-trait.rs
new file mode 100644
index 000000000..6463a7664
--- /dev/null
+++ b/tests/ui/derives/deriving-meta-unknown-trait.rs
@@ -0,0 +1,6 @@
+#[derive(Eqr)]
+//~^ ERROR cannot find derive macro `Eqr` in this scope
+//~| ERROR cannot find derive macro `Eqr` in this scope
+struct Foo;
+
+pub fn main() {}
diff --git a/tests/ui/derives/deriving-meta-unknown-trait.stderr b/tests/ui/derives/deriving-meta-unknown-trait.stderr
new file mode 100644
index 000000000..053d34f68
--- /dev/null
+++ b/tests/ui/derives/deriving-meta-unknown-trait.stderr
@@ -0,0 +1,20 @@
+error: cannot find derive macro `Eqr` in this scope
+ --> $DIR/deriving-meta-unknown-trait.rs:1:10
+ |
+LL | #[derive(Eqr)]
+ | ^^^ help: a derive macro with a similar name exists: `Eq`
+ --> $SRC_DIR/core/src/cmp.rs:LL:COL
+ |
+ = note: similarly named derive macro `Eq` defined here
+
+error: cannot find derive macro `Eqr` in this scope
+ --> $DIR/deriving-meta-unknown-trait.rs:1:10
+ |
+LL | #[derive(Eqr)]
+ | ^^^ help: a derive macro with a similar name exists: `Eq`
+ --> $SRC_DIR/core/src/cmp.rs:LL:COL
+ |
+ = note: similarly named derive macro `Eq` defined here
+
+error: aborting due to 2 previous errors
+
diff --git a/tests/ui/derives/deriving-no-inner-impl-error-message.rs b/tests/ui/derives/deriving-no-inner-impl-error-message.rs
new file mode 100644
index 000000000..b3ce31bf0
--- /dev/null
+++ b/tests/ui/derives/deriving-no-inner-impl-error-message.rs
@@ -0,0 +1,14 @@
+struct NoCloneOrEq;
+
+#[derive(PartialEq)]
+struct E {
+ x: NoCloneOrEq //~ ERROR binary operation `==` cannot be applied to type `NoCloneOrEq`
+}
+#[derive(Clone)]
+struct C {
+ x: NoCloneOrEq
+ //~^ ERROR `NoCloneOrEq: Clone` is not satisfied
+}
+
+
+fn main() {}
diff --git a/tests/ui/derives/deriving-no-inner-impl-error-message.stderr b/tests/ui/derives/deriving-no-inner-impl-error-message.stderr
new file mode 100644
index 000000000..ef8c44caa
--- /dev/null
+++ b/tests/ui/derives/deriving-no-inner-impl-error-message.stderr
@@ -0,0 +1,39 @@
+error[E0369]: binary operation `==` cannot be applied to type `NoCloneOrEq`
+ --> $DIR/deriving-no-inner-impl-error-message.rs:5:5
+ |
+LL | #[derive(PartialEq)]
+ | --------- in this derive macro expansion
+LL | struct E {
+LL | x: NoCloneOrEq
+ | ^^^^^^^^^^^^^^
+ |
+note: an implementation of `PartialEq<_>` might be missing for `NoCloneOrEq`
+ --> $DIR/deriving-no-inner-impl-error-message.rs:1:1
+ |
+LL | struct NoCloneOrEq;
+ | ^^^^^^^^^^^^^^^^^^ must implement `PartialEq<_>`
+ = note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `NoCloneOrEq` with `#[derive(PartialEq)]`
+ |
+LL | #[derive(PartialEq)]
+ |
+
+error[E0277]: the trait bound `NoCloneOrEq: Clone` is not satisfied
+ --> $DIR/deriving-no-inner-impl-error-message.rs:9:5
+ |
+LL | #[derive(Clone)]
+ | ----- in this derive macro expansion
+LL | struct C {
+LL | x: NoCloneOrEq
+ | ^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `NoCloneOrEq`
+ |
+ = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider annotating `NoCloneOrEq` with `#[derive(Clone)]`
+ |
+LL | #[derive(Clone)]
+ |
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0277, E0369.
+For more information about an error, try `rustc --explain E0277`.
diff --git a/tests/ui/derives/deriving-non-type.rs b/tests/ui/derives/deriving-non-type.rs
new file mode 100644
index 000000000..9afffa900
--- /dev/null
+++ b/tests/ui/derives/deriving-non-type.rs
@@ -0,0 +1,30 @@
+#![allow(dead_code)]
+
+struct S;
+
+#[derive(PartialEq)] //~ ERROR: `derive` may only be applied to `struct`s, `enum`s and `union`s
+trait T { }
+
+#[derive(PartialEq)] //~ ERROR: `derive` may only be applied to `struct`s, `enum`s and `union`s
+impl S { }
+
+#[derive(PartialEq)] //~ ERROR: `derive` may only be applied to `struct`s, `enum`s and `union`s
+impl T for S { }
+
+#[derive(PartialEq)] //~ ERROR: `derive` may only be applied to `struct`s, `enum`s and `union`s
+static s: usize = 0;
+
+#[derive(PartialEq)] //~ ERROR: `derive` may only be applied to `struct`s, `enum`s and `union`s
+const c: usize = 0;
+
+#[derive(PartialEq)] //~ ERROR: `derive` may only be applied to `struct`s, `enum`s and `union`s
+mod m { }
+
+#[derive(PartialEq)] //~ ERROR: `derive` may only be applied to `struct`s, `enum`s and `union`s
+extern "C" { }
+
+#[derive(PartialEq)] //~ ERROR: `derive` may only be applied to `struct`s, `enum`s and `union`s
+type A = usize;
+
+#[derive(PartialEq)] //~ ERROR: `derive` may only be applied to `struct`s, `enum`s and `union`s
+fn main() { }
diff --git a/tests/ui/derives/deriving-non-type.stderr b/tests/ui/derives/deriving-non-type.stderr
new file mode 100644
index 000000000..ef7ef54d1
--- /dev/null
+++ b/tests/ui/derives/deriving-non-type.stderr
@@ -0,0 +1,75 @@
+error[E0774]: `derive` may only be applied to `struct`s, `enum`s and `union`s
+ --> $DIR/deriving-non-type.rs:5:1
+ |
+LL | #[derive(PartialEq)]
+ | ^^^^^^^^^^^^^^^^^^^^ not applicable here
+LL | trait T { }
+ | ----------- not a `struct`, `enum` or `union`
+
+error[E0774]: `derive` may only be applied to `struct`s, `enum`s and `union`s
+ --> $DIR/deriving-non-type.rs:8:1
+ |
+LL | #[derive(PartialEq)]
+ | ^^^^^^^^^^^^^^^^^^^^ not applicable here
+LL | impl S { }
+ | ---------- not a `struct`, `enum` or `union`
+
+error[E0774]: `derive` may only be applied to `struct`s, `enum`s and `union`s
+ --> $DIR/deriving-non-type.rs:11:1
+ |
+LL | #[derive(PartialEq)]
+ | ^^^^^^^^^^^^^^^^^^^^ not applicable here
+LL | impl T for S { }
+ | ---------------- not a `struct`, `enum` or `union`
+
+error[E0774]: `derive` may only be applied to `struct`s, `enum`s and `union`s
+ --> $DIR/deriving-non-type.rs:14:1
+ |
+LL | #[derive(PartialEq)]
+ | ^^^^^^^^^^^^^^^^^^^^ not applicable here
+LL | static s: usize = 0;
+ | -------------------- not a `struct`, `enum` or `union`
+
+error[E0774]: `derive` may only be applied to `struct`s, `enum`s and `union`s
+ --> $DIR/deriving-non-type.rs:17:1
+ |
+LL | #[derive(PartialEq)]
+ | ^^^^^^^^^^^^^^^^^^^^ not applicable here
+LL | const c: usize = 0;
+ | ------------------- not a `struct`, `enum` or `union`
+
+error[E0774]: `derive` may only be applied to `struct`s, `enum`s and `union`s
+ --> $DIR/deriving-non-type.rs:20:1
+ |
+LL | #[derive(PartialEq)]
+ | ^^^^^^^^^^^^^^^^^^^^ not applicable here
+LL | mod m { }
+ | --------- not a `struct`, `enum` or `union`
+
+error[E0774]: `derive` may only be applied to `struct`s, `enum`s and `union`s
+ --> $DIR/deriving-non-type.rs:23:1
+ |
+LL | #[derive(PartialEq)]
+ | ^^^^^^^^^^^^^^^^^^^^ not applicable here
+LL | extern "C" { }
+ | -------------- not a `struct`, `enum` or `union`
+
+error[E0774]: `derive` may only be applied to `struct`s, `enum`s and `union`s
+ --> $DIR/deriving-non-type.rs:26:1
+ |
+LL | #[derive(PartialEq)]
+ | ^^^^^^^^^^^^^^^^^^^^ not applicable here
+LL | type A = usize;
+ | --------------- not a `struct`, `enum` or `union`
+
+error[E0774]: `derive` may only be applied to `struct`s, `enum`s and `union`s
+ --> $DIR/deriving-non-type.rs:29:1
+ |
+LL | #[derive(PartialEq)]
+ | ^^^^^^^^^^^^^^^^^^^^ not applicable here
+LL | fn main() { }
+ | ------------- not a `struct`, `enum` or `union`
+
+error: aborting due to 9 previous errors
+
+For more information about this error, try `rustc --explain E0774`.
diff --git a/tests/ui/derives/deriving-primitive.rs b/tests/ui/derives/deriving-primitive.rs
new file mode 100644
index 000000000..1173eca64
--- /dev/null
+++ b/tests/ui/derives/deriving-primitive.rs
@@ -0,0 +1,5 @@
+#[derive(FromPrimitive)] //~ ERROR cannot find derive macro `FromPrimitive` in this scope
+ //~| ERROR cannot find derive macro `FromPrimitive` in this scope
+enum Foo {}
+
+fn main() {}
diff --git a/tests/ui/derives/deriving-primitive.stderr b/tests/ui/derives/deriving-primitive.stderr
new file mode 100644
index 000000000..ca64c9ee7
--- /dev/null
+++ b/tests/ui/derives/deriving-primitive.stderr
@@ -0,0 +1,14 @@
+error: cannot find derive macro `FromPrimitive` in this scope
+ --> $DIR/deriving-primitive.rs:1:10
+ |
+LL | #[derive(FromPrimitive)]
+ | ^^^^^^^^^^^^^
+
+error: cannot find derive macro `FromPrimitive` in this scope
+ --> $DIR/deriving-primitive.rs:1:10
+ |
+LL | #[derive(FromPrimitive)]
+ | ^^^^^^^^^^^^^
+
+error: aborting due to 2 previous errors
+
diff --git a/tests/ui/derives/deriving-with-repr-packed.rs b/tests/ui/derives/deriving-with-repr-packed.rs
new file mode 100644
index 000000000..3884e3977
--- /dev/null
+++ b/tests/ui/derives/deriving-with-repr-packed.rs
@@ -0,0 +1,45 @@
+#![deny(unaligned_references)]
+
+// Check that deriving certain builtin traits on certain packed structs cause
+// errors. This happens when the derived trait would need to use a potentially
+// misaligned reference. But there are two cases that are allowed:
+// - If all the fields within the struct meet the required alignment: 1 for
+// `repr(packed)`, or `N` for `repr(packed(N))`.
+// - If `Default` is the only trait derived, because it doesn't involve any
+// references.
+
+#[derive(Copy, Clone, Default, PartialEq, Eq)]
+//~^ ERROR `Clone` can't be derived on this `#[repr(packed)]` struct with type or const parameters
+//~| hard error
+//~^^^ ERROR `PartialEq` can't be derived on this `#[repr(packed)]` struct with type or const parameters
+//~| hard error
+#[repr(packed)]
+pub struct Foo<T>(T, T, T);
+
+#[derive(Default, Hash)]
+//~^ ERROR `Hash` can't be derived on this `#[repr(packed)]` struct that does not derive `Copy`
+//~| hard error
+#[repr(packed)]
+pub struct Bar(u32, u32, u32);
+
+// This one is fine because the field alignment is 1.
+#[derive(Default, Hash)]
+#[repr(packed)]
+pub struct Bar2(u8, i8, bool);
+
+// This one is fine because the field alignment is 2, matching `packed(2)`.
+#[derive(Default, Hash)]
+#[repr(packed(2))]
+pub struct Bar3(u16, i16, bool);
+
+// This one is fine because it's not packed.
+#[derive(Debug, Default)]
+struct Y(usize);
+
+#[derive(Debug, Default)]
+//~^ ERROR `Debug` can't be derived on this `#[repr(packed)]` struct that does not derive `Copy`
+//~| hard error
+#[repr(packed)]
+struct X(Y);
+
+fn main() {}
diff --git a/tests/ui/derives/deriving-with-repr-packed.stderr b/tests/ui/derives/deriving-with-repr-packed.stderr
new file mode 100644
index 000000000..0ad800c39
--- /dev/null
+++ b/tests/ui/derives/deriving-with-repr-packed.stderr
@@ -0,0 +1,111 @@
+error: `Clone` can't be derived on this `#[repr(packed)]` struct with type or const parameters
+ --> $DIR/deriving-with-repr-packed.rs:11:16
+ |
+LL | #[derive(Copy, Clone, Default, PartialEq, Eq)]
+ | ^^^^^
+ |
+ = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ = note: for more information, see issue #82523 <https://github.com/rust-lang/rust/issues/82523>
+note: the lint level is defined here
+ --> $DIR/deriving-with-repr-packed.rs:1:9
+ |
+LL | #![deny(unaligned_references)]
+ | ^^^^^^^^^^^^^^^^^^^^
+ = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: `PartialEq` can't be derived on this `#[repr(packed)]` struct with type or const parameters
+ --> $DIR/deriving-with-repr-packed.rs:11:32
+ |
+LL | #[derive(Copy, Clone, Default, PartialEq, Eq)]
+ | ^^^^^^^^^
+ |
+ = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ = note: for more information, see issue #82523 <https://github.com/rust-lang/rust/issues/82523>
+ = note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: `Hash` can't be derived on this `#[repr(packed)]` struct that does not derive `Copy`
+ --> $DIR/deriving-with-repr-packed.rs:19:19
+ |
+LL | #[derive(Default, Hash)]
+ | ^^^^
+ |
+ = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ = note: for more information, see issue #82523 <https://github.com/rust-lang/rust/issues/82523>
+ = note: this error originates in the derive macro `Hash` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: `Debug` can't be derived on this `#[repr(packed)]` struct that does not derive `Copy`
+ --> $DIR/deriving-with-repr-packed.rs:39:10
+ |
+LL | #[derive(Debug, Default)]
+ | ^^^^^
+ |
+ = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ = note: for more information, see issue #82523 <https://github.com/rust-lang/rust/issues/82523>
+ = note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to 4 previous errors
+
+Future incompatibility report: Future breakage diagnostic:
+error: `Clone` can't be derived on this `#[repr(packed)]` struct with type or const parameters
+ --> $DIR/deriving-with-repr-packed.rs:11:16
+ |
+LL | #[derive(Copy, Clone, Default, PartialEq, Eq)]
+ | ^^^^^
+ |
+ = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ = note: for more information, see issue #82523 <https://github.com/rust-lang/rust/issues/82523>
+note: the lint level is defined here
+ --> $DIR/deriving-with-repr-packed.rs:1:9
+ |
+LL | #![deny(unaligned_references)]
+ | ^^^^^^^^^^^^^^^^^^^^
+ = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+Future breakage diagnostic:
+error: `PartialEq` can't be derived on this `#[repr(packed)]` struct with type or const parameters
+ --> $DIR/deriving-with-repr-packed.rs:11:32
+ |
+LL | #[derive(Copy, Clone, Default, PartialEq, Eq)]
+ | ^^^^^^^^^
+ |
+ = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ = note: for more information, see issue #82523 <https://github.com/rust-lang/rust/issues/82523>
+note: the lint level is defined here
+ --> $DIR/deriving-with-repr-packed.rs:1:9
+ |
+LL | #![deny(unaligned_references)]
+ | ^^^^^^^^^^^^^^^^^^^^
+ = note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+Future breakage diagnostic:
+error: `Hash` can't be derived on this `#[repr(packed)]` struct that does not derive `Copy`
+ --> $DIR/deriving-with-repr-packed.rs:19:19
+ |
+LL | #[derive(Default, Hash)]
+ | ^^^^
+ |
+ = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ = note: for more information, see issue #82523 <https://github.com/rust-lang/rust/issues/82523>
+note: the lint level is defined here
+ --> $DIR/deriving-with-repr-packed.rs:1:9
+ |
+LL | #![deny(unaligned_references)]
+ | ^^^^^^^^^^^^^^^^^^^^
+ = note: this error originates in the derive macro `Hash` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+Future breakage diagnostic:
+error: `Debug` can't be derived on this `#[repr(packed)]` struct that does not derive `Copy`
+ --> $DIR/deriving-with-repr-packed.rs:39:10
+ |
+LL | #[derive(Debug, Default)]
+ | ^^^^^
+ |
+ = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ = note: for more information, see issue #82523 <https://github.com/rust-lang/rust/issues/82523>
+note: the lint level is defined here
+ --> $DIR/deriving-with-repr-packed.rs:1:9
+ |
+LL | #![deny(unaligned_references)]
+ | ^^^^^^^^^^^^^^^^^^^^
+ = note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
+
diff --git a/tests/ui/derives/issue-36617.rs b/tests/ui/derives/issue-36617.rs
new file mode 100644
index 000000000..08f293d2e
--- /dev/null
+++ b/tests/ui/derives/issue-36617.rs
@@ -0,0 +1,16 @@
+#![derive(Copy)] //~ ERROR cannot determine resolution for the attribute macro `derive`
+//~^ ERROR `derive` attribute cannot be used at crate level
+
+#![test]//~ ERROR cannot determine resolution for the attribute macro `test`
+//~^ ERROR `test` attribute cannot be used at crate level
+
+#![test_case]//~ ERROR cannot determine resolution for the attribute macro `test_case`
+//~^ ERROR `test_case` attribute cannot be used at crate level
+
+#![bench]//~ ERROR cannot determine resolution for the attribute macro `bench`
+//~^ ERROR `bench` attribute cannot be used at crate level
+
+#![global_allocator]//~ ERROR cannot determine resolution for the attribute macro `global_allocator`
+//~^ ERROR `global_allocator` attribute cannot be used at crate level
+
+fn main() {}
diff --git a/tests/ui/derives/issue-36617.stderr b/tests/ui/derives/issue-36617.stderr
new file mode 100644
index 000000000..9cc0a29b0
--- /dev/null
+++ b/tests/ui/derives/issue-36617.stderr
@@ -0,0 +1,97 @@
+error: cannot determine resolution for the attribute macro `derive`
+ --> $DIR/issue-36617.rs:1:4
+ |
+LL | #![derive(Copy)]
+ | ^^^^^^
+ |
+ = note: import resolution is stuck, try simplifying macro imports
+
+error: cannot determine resolution for the attribute macro `test`
+ --> $DIR/issue-36617.rs:4:4
+ |
+LL | #![test]
+ | ^^^^
+ |
+ = note: import resolution is stuck, try simplifying macro imports
+
+error: cannot determine resolution for the attribute macro `test_case`
+ --> $DIR/issue-36617.rs:7:4
+ |
+LL | #![test_case]
+ | ^^^^^^^^^
+ |
+ = note: import resolution is stuck, try simplifying macro imports
+
+error: cannot determine resolution for the attribute macro `bench`
+ --> $DIR/issue-36617.rs:10:4
+ |
+LL | #![bench]
+ | ^^^^^
+ |
+ = note: import resolution is stuck, try simplifying macro imports
+
+error: cannot determine resolution for the attribute macro `global_allocator`
+ --> $DIR/issue-36617.rs:13:4
+ |
+LL | #![global_allocator]
+ | ^^^^^^^^^^^^^^^^
+ |
+ = note: import resolution is stuck, try simplifying macro imports
+
+error: `derive` attribute cannot be used at crate level
+ --> $DIR/issue-36617.rs:1:1
+ |
+LL | #![derive(Copy)]
+ | ^^^^^^^^^^^^^^^^
+ |
+help: perhaps you meant to use an outer attribute
+ |
+LL | #[derive(Copy)]
+ | ~~~~~~~~~~~~~~~
+
+error: `test` attribute cannot be used at crate level
+ --> $DIR/issue-36617.rs:4:1
+ |
+LL | #![test]
+ | ^^^^^^^^
+ |
+help: perhaps you meant to use an outer attribute
+ |
+LL | #[test]
+ | ~~~~~~~
+
+error: `test_case` attribute cannot be used at crate level
+ --> $DIR/issue-36617.rs:7:1
+ |
+LL | #![test_case]
+ | ^^^^^^^^^^^^^
+ |
+help: perhaps you meant to use an outer attribute
+ |
+LL | #[test_case]
+ | ~~~~~~~~~~~~
+
+error: `bench` attribute cannot be used at crate level
+ --> $DIR/issue-36617.rs:10:1
+ |
+LL | #![bench]
+ | ^^^^^^^^^
+ |
+help: perhaps you meant to use an outer attribute
+ |
+LL | #[bench]
+ | ~~~~~~~~
+
+error: `global_allocator` attribute cannot be used at crate level
+ --> $DIR/issue-36617.rs:13:1
+ |
+LL | #![global_allocator]
+ | ^^^^^^^^^^^^^^^^^^^^
+ |
+help: perhaps you meant to use an outer attribute
+ |
+LL | #[global_allocator]
+ | ~~~~~~~~~~~~~~~~~~~
+
+error: aborting due to 10 previous errors
+
diff --git a/tests/ui/derives/issue-43023.rs b/tests/ui/derives/issue-43023.rs
new file mode 100644
index 000000000..c0208e680
--- /dev/null
+++ b/tests/ui/derives/issue-43023.rs
@@ -0,0 +1,20 @@
+struct S;
+
+impl S {
+ #[derive(Debug)] //~ ERROR `derive` may only be applied to `struct`s, `enum`s and `union`s
+ fn f() {
+ file!();
+ }
+}
+
+trait Tr1 {
+ #[derive(Debug)] //~ ERROR `derive` may only be applied to `struct`s, `enum`s and `union`s
+ fn f();
+}
+
+trait Tr2 {
+ #[derive(Debug)] //~ ERROR `derive` may only be applied to `struct`s, `enum`s and `union`s
+ type F;
+}
+
+fn main() {}
diff --git a/tests/ui/derives/issue-43023.stderr b/tests/ui/derives/issue-43023.stderr
new file mode 100644
index 000000000..007eb2595
--- /dev/null
+++ b/tests/ui/derives/issue-43023.stderr
@@ -0,0 +1,29 @@
+error[E0774]: `derive` may only be applied to `struct`s, `enum`s and `union`s
+ --> $DIR/issue-43023.rs:4:5
+ |
+LL | #[derive(Debug)]
+ | ^^^^^^^^^^^^^^^^ not applicable here
+LL | / fn f() {
+LL | | file!();
+LL | | }
+ | |_____- not a `struct`, `enum` or `union`
+
+error[E0774]: `derive` may only be applied to `struct`s, `enum`s and `union`s
+ --> $DIR/issue-43023.rs:11:5
+ |
+LL | #[derive(Debug)]
+ | ^^^^^^^^^^^^^^^^ not applicable here
+LL | fn f();
+ | ------- not a `struct`, `enum` or `union`
+
+error[E0774]: `derive` may only be applied to `struct`s, `enum`s and `union`s
+ --> $DIR/issue-43023.rs:16:5
+ |
+LL | #[derive(Debug)]
+ | ^^^^^^^^^^^^^^^^ not applicable here
+LL | type F;
+ | ------- not a `struct`, `enum` or `union`
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0774`.
diff --git a/tests/ui/derives/issue-91492.rs b/tests/ui/derives/issue-91492.rs
new file mode 100644
index 000000000..df792f118
--- /dev/null
+++ b/tests/ui/derives/issue-91492.rs
@@ -0,0 +1,25 @@
+// Reproduce the issue with vec
+pub struct NoDerives;
+fn fun1(foo: &mut Vec<NoDerives>, bar: &[NoDerives]) {
+ foo.extend_from_slice(bar); //~ ERROR
+}
+
+// Reproduce the issue with vec
+// and demonstrate that other derives are ignored in the suggested output
+#[derive(Default, PartialEq)]
+pub struct SomeDerives;
+fn fun2(foo: &mut Vec<SomeDerives>, bar: &[SomeDerives]) {
+ foo.extend_from_slice(bar); //~ ERROR
+}
+
+// Try and fail to reproduce the issue without vec.
+// No idea why it doesnt reproduce the issue but its still a useful test case.
+struct Object<T, A>(T, A);
+impl<T: Clone, A: Default> Object<T, A> {
+ fn use_clone(&self) {}
+}
+fn fun3(foo: Object<NoDerives, SomeDerives>) {
+ foo.use_clone(); //~ ERROR
+}
+
+fn main() {}
diff --git a/tests/ui/derives/issue-91492.stderr b/tests/ui/derives/issue-91492.stderr
new file mode 100644
index 000000000..cee30ac50
--- /dev/null
+++ b/tests/ui/derives/issue-91492.stderr
@@ -0,0 +1,59 @@
+error[E0599]: the method `extend_from_slice` exists for mutable reference `&mut Vec<NoDerives>`, but its trait bounds were not satisfied
+ --> $DIR/issue-91492.rs:4:9
+ |
+LL | pub struct NoDerives;
+ | -------------------- doesn't satisfy `NoDerives: Clone`
+LL | fn fun1(foo: &mut Vec<NoDerives>, bar: &[NoDerives]) {
+LL | foo.extend_from_slice(bar);
+ | ^^^^^^^^^^^^^^^^^
+ |
+ = note: the following trait bounds were not satisfied:
+ `NoDerives: Clone`
+help: consider annotating `NoDerives` with `#[derive(Clone)]`
+ |
+LL | #[derive(Clone)]
+ |
+
+error[E0599]: the method `extend_from_slice` exists for mutable reference `&mut Vec<SomeDerives>`, but its trait bounds were not satisfied
+ --> $DIR/issue-91492.rs:12:9
+ |
+LL | pub struct SomeDerives;
+ | ---------------------- doesn't satisfy `SomeDerives: Clone`
+LL | fn fun2(foo: &mut Vec<SomeDerives>, bar: &[SomeDerives]) {
+LL | foo.extend_from_slice(bar);
+ | ^^^^^^^^^^^^^^^^^
+ |
+ = note: the following trait bounds were not satisfied:
+ `SomeDerives: Clone`
+help: consider annotating `SomeDerives` with `#[derive(Clone)]`
+ |
+LL | #[derive(Clone)]
+ |
+
+error[E0599]: the method `use_clone` exists for struct `Object<NoDerives, SomeDerives>`, but its trait bounds were not satisfied
+ --> $DIR/issue-91492.rs:22:9
+ |
+LL | pub struct NoDerives;
+ | -------------------- doesn't satisfy `NoDerives: Clone`
+...
+LL | struct Object<T, A>(T, A);
+ | ------------------- method `use_clone` not found for this struct
+...
+LL | foo.use_clone();
+ | ^^^^^^^^^ method cannot be called on `Object<NoDerives, SomeDerives>` due to unsatisfied trait bounds
+ |
+note: trait bound `NoDerives: Clone` was not satisfied
+ --> $DIR/issue-91492.rs:18:9
+ |
+LL | impl<T: Clone, A: Default> Object<T, A> {
+ | ^^^^^ ------------
+ | |
+ | unsatisfied trait bound introduced here
+help: consider annotating `NoDerives` with `#[derive(Clone)]`
+ |
+LL | #[derive(Clone)]
+ |
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0599`.
diff --git a/tests/ui/derives/issue-91550.rs b/tests/ui/derives/issue-91550.rs
new file mode 100644
index 000000000..56fd5ffa8
--- /dev/null
+++ b/tests/ui/derives/issue-91550.rs
@@ -0,0 +1,29 @@
+use std::collections::HashSet;
+
+/// natural case from the issue
+struct Value(u32);
+
+fn main() {
+ let hs = HashSet::<Value>::new();
+ hs.insert(Value(0)); //~ ERROR
+}
+
+/// synthetic cases
+pub struct NoDerives;
+
+struct Object<T>(T);
+impl<T: Eq> Object<T> {
+ fn use_eq(&self) {}
+}
+impl<T: Ord> Object<T> {
+ fn use_ord(&self) {}
+}
+impl<T: Ord + PartialOrd> Object<T> {
+ fn use_ord_and_partial_ord(&self) {}
+}
+
+fn function(foo: Object<NoDerives>) {
+ foo.use_eq(); //~ ERROR
+ foo.use_ord(); //~ ERROR
+ foo.use_ord_and_partial_ord(); //~ ERROR
+}
diff --git a/tests/ui/derives/issue-91550.stderr b/tests/ui/derives/issue-91550.stderr
new file mode 100644
index 000000000..af03f0e5e
--- /dev/null
+++ b/tests/ui/derives/issue-91550.stderr
@@ -0,0 +1,131 @@
+error[E0599]: the method `insert` exists for struct `HashSet<Value>`, but its trait bounds were not satisfied
+ --> $DIR/issue-91550.rs:8:8
+ |
+LL | struct Value(u32);
+ | ------------
+ | |
+ | doesn't satisfy `Value: Eq`
+ | doesn't satisfy `Value: Hash`
+ | doesn't satisfy `Value: PartialEq`
+...
+LL | hs.insert(Value(0));
+ | ^^^^^^
+ |
+ = note: the following trait bounds were not satisfied:
+ `Value: Eq`
+ `Value: PartialEq`
+ which is required by `Value: Eq`
+ `Value: Hash`
+help: consider annotating `Value` with `#[derive(Eq, Hash, PartialEq)]`
+ |
+LL | #[derive(Eq, Hash, PartialEq)]
+ |
+
+error[E0599]: the method `use_eq` exists for struct `Object<NoDerives>`, but its trait bounds were not satisfied
+ --> $DIR/issue-91550.rs:26:9
+ |
+LL | pub struct NoDerives;
+ | --------------------
+ | |
+ | doesn't satisfy `NoDerives: Eq`
+ | doesn't satisfy `NoDerives: PartialEq`
+LL |
+LL | struct Object<T>(T);
+ | ---------------- method `use_eq` not found for this struct
+...
+LL | foo.use_eq();
+ | ^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds
+ |
+note: trait bound `NoDerives: Eq` was not satisfied
+ --> $DIR/issue-91550.rs:15:9
+ |
+LL | impl<T: Eq> Object<T> {
+ | ^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
+ = note: the following trait bounds were not satisfied:
+ `NoDerives: PartialEq`
+ which is required by `NoDerives: Eq`
+help: consider annotating `NoDerives` with `#[derive(Eq, PartialEq)]`
+ |
+LL | #[derive(Eq, PartialEq)]
+ |
+
+error[E0599]: the method `use_ord` exists for struct `Object<NoDerives>`, but its trait bounds were not satisfied
+ --> $DIR/issue-91550.rs:27:9
+ |
+LL | pub struct NoDerives;
+ | --------------------
+ | |
+ | doesn't satisfy `NoDerives: Eq`
+ | doesn't satisfy `NoDerives: Ord`
+ | doesn't satisfy `NoDerives: PartialEq`
+ | doesn't satisfy `NoDerives: PartialOrd`
+LL |
+LL | struct Object<T>(T);
+ | ---------------- method `use_ord` not found for this struct
+...
+LL | foo.use_ord();
+ | ^^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds
+ |
+note: trait bound `NoDerives: Ord` was not satisfied
+ --> $DIR/issue-91550.rs:18:9
+ |
+LL | impl<T: Ord> Object<T> {
+ | ^^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
+ = note: the following trait bounds were not satisfied:
+ `NoDerives: PartialOrd`
+ which is required by `NoDerives: Ord`
+ `NoDerives: PartialEq`
+ which is required by `NoDerives: Ord`
+ `NoDerives: Eq`
+ which is required by `NoDerives: Ord`
+help: consider annotating `NoDerives` with `#[derive(Eq, Ord, PartialEq, PartialOrd)]`
+ |
+LL | #[derive(Eq, Ord, PartialEq, PartialOrd)]
+ |
+
+error[E0599]: the method `use_ord_and_partial_ord` exists for struct `Object<NoDerives>`, but its trait bounds were not satisfied
+ --> $DIR/issue-91550.rs:28:9
+ |
+LL | pub struct NoDerives;
+ | --------------------
+ | |
+ | doesn't satisfy `NoDerives: Eq`
+ | doesn't satisfy `NoDerives: Ord`
+ | doesn't satisfy `NoDerives: PartialEq`
+ | doesn't satisfy `NoDerives: PartialOrd`
+LL |
+LL | struct Object<T>(T);
+ | ---------------- method `use_ord_and_partial_ord` not found for this struct
+...
+LL | foo.use_ord_and_partial_ord();
+ | ^^^^^^^^^^^^^^^^^^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds
+ |
+note: the following trait bounds were not satisfied:
+ `NoDerives: Ord`
+ `NoDerives: PartialOrd`
+ --> $DIR/issue-91550.rs:21:9
+ |
+LL | impl<T: Ord + PartialOrd> Object<T> {
+ | ^^^ ^^^^^^^^^^ ---------
+ | | |
+ | | unsatisfied trait bound introduced here
+ | unsatisfied trait bound introduced here
+ = note: the following trait bounds were not satisfied:
+ `NoDerives: PartialEq`
+ which is required by `NoDerives: Ord`
+ `NoDerives: Eq`
+ which is required by `NoDerives: Ord`
+ `NoDerives: PartialEq`
+ which is required by `NoDerives: PartialOrd`
+help: consider annotating `NoDerives` with `#[derive(Eq, Ord, PartialEq, PartialOrd)]`
+ |
+LL | #[derive(Eq, Ord, PartialEq, PartialOrd)]
+ |
+
+error: aborting due to 4 previous errors
+
+For more information about this error, try `rustc --explain E0599`.
diff --git a/tests/ui/derives/issue-97343.rs b/tests/ui/derives/issue-97343.rs
new file mode 100644
index 000000000..6f0e4d55a
--- /dev/null
+++ b/tests/ui/derives/issue-97343.rs
@@ -0,0 +1,8 @@
+use std::fmt::Debug;
+
+#[derive(Debug)]
+pub struct Irrelevant<Irrelevant> { //~ ERROR type arguments are not allowed on type parameter
+ irrelevant: Irrelevant,
+}
+
+fn main() {}
diff --git a/tests/ui/derives/issue-97343.stderr b/tests/ui/derives/issue-97343.stderr
new file mode 100644
index 000000000..e83bbb5b6
--- /dev/null
+++ b/tests/ui/derives/issue-97343.stderr
@@ -0,0 +1,21 @@
+error[E0109]: type arguments are not allowed on type parameter `Irrelevant`
+ --> $DIR/issue-97343.rs:4:23
+ |
+LL | #[derive(Debug)]
+ | -----
+ | |
+ | not allowed on type parameter `Irrelevant`
+ | in this derive macro expansion
+LL | pub struct Irrelevant<Irrelevant> {
+ | ^^^^^^^^^^ type argument not allowed
+ |
+note: type parameter `Irrelevant` defined here
+ --> $DIR/issue-97343.rs:4:23
+ |
+LL | pub struct Irrelevant<Irrelevant> {
+ | ^^^^^^^^^^
+ = note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0109`.