summaryrefslogtreecommitdiffstats
path: root/tests/ui/incoherent-inherent-impls
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:19:13 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:19:13 +0000
commit218caa410aa38c29984be31a5229b9fa717560ee (patch)
treec54bd55eeb6e4c508940a30e94c0032fbd45d677 /tests/ui/incoherent-inherent-impls
parentReleasing progress-linux version 1.67.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-218caa410aa38c29984be31a5229b9fa717560ee.tar.xz
rustc-218caa410aa38c29984be31a5229b9fa717560ee.zip
Merging upstream version 1.68.2+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/incoherent-inherent-impls')
-rw-r--r--tests/ui/incoherent-inherent-impls/auxiliary/extern-crate.rs9
-rw-r--r--tests/ui/incoherent-inherent-impls/needs-has-incoherent-impls.rs40
-rw-r--r--tests/ui/incoherent-inherent-impls/needs-has-incoherent-impls.stderr115
-rw-r--r--tests/ui/incoherent-inherent-impls/no-attr-empty-impl.rs18
-rw-r--r--tests/ui/incoherent-inherent-impls/no-attr-empty-impl.stderr44
5 files changed, 226 insertions, 0 deletions
diff --git a/tests/ui/incoherent-inherent-impls/auxiliary/extern-crate.rs b/tests/ui/incoherent-inherent-impls/auxiliary/extern-crate.rs
new file mode 100644
index 000000000..22f0d912c
--- /dev/null
+++ b/tests/ui/incoherent-inherent-impls/auxiliary/extern-crate.rs
@@ -0,0 +1,9 @@
+#![feature(rustc_attrs)]
+
+#[rustc_has_incoherent_inherent_impls]
+pub struct StructWithAttr;
+pub struct StructNoAttr;
+
+#[rustc_has_incoherent_inherent_impls]
+pub enum EnumWithAttr {}
+pub enum EnumNoAttr {}
diff --git a/tests/ui/incoherent-inherent-impls/needs-has-incoherent-impls.rs b/tests/ui/incoherent-inherent-impls/needs-has-incoherent-impls.rs
new file mode 100644
index 000000000..0f7282bec
--- /dev/null
+++ b/tests/ui/incoherent-inherent-impls/needs-has-incoherent-impls.rs
@@ -0,0 +1,40 @@
+// aux-build:extern-crate.rs
+#![feature(rustc_attrs)]
+extern crate extern_crate;
+
+impl extern_crate::StructWithAttr {
+ //~^ ERROR cannot define inherent `impl` for a type outside of the crate
+ fn foo() {}
+}
+impl extern_crate::StructWithAttr {
+ #[rustc_allow_incoherent_impl]
+ fn bar() {}
+}
+impl extern_crate::StructNoAttr {
+ //~^ ERROR cannot define inherent `impl` for a type outside of the crate
+ fn foo() {}
+}
+impl extern_crate::StructNoAttr {
+ //~^ ERROR cannot define inherent `impl` for a type outside of the crate
+ #[rustc_allow_incoherent_impl]
+ fn bar() {}
+}
+impl extern_crate::EnumWithAttr {
+ //~^ ERROR cannot define inherent `impl` for a type outside of the crate
+ fn foo() {}
+}
+impl extern_crate::EnumWithAttr {
+ #[rustc_allow_incoherent_impl]
+ fn bar() {}
+}
+impl extern_crate::EnumNoAttr {
+ //~^ ERROR cannot define inherent `impl` for a type outside of the crate
+ fn foo() {}
+}
+impl extern_crate::EnumNoAttr {
+ //~^ ERROR cannot define inherent `impl` for a type outside of the crate
+ #[rustc_allow_incoherent_impl]
+ fn bar() {}
+}
+
+fn main() {}
diff --git a/tests/ui/incoherent-inherent-impls/needs-has-incoherent-impls.stderr b/tests/ui/incoherent-inherent-impls/needs-has-incoherent-impls.stderr
new file mode 100644
index 000000000..8f7082511
--- /dev/null
+++ b/tests/ui/incoherent-inherent-impls/needs-has-incoherent-impls.stderr
@@ -0,0 +1,115 @@
+error[E0390]: cannot define inherent `impl` for a type outside of the crate where the type is defined
+ --> $DIR/needs-has-incoherent-impls.rs:5:1
+ |
+LL | / impl extern_crate::StructWithAttr {
+LL | |
+LL | | fn foo() {}
+LL | | }
+ | |_^
+ |
+ = help: consider moving this inherent impl into the crate defining the type if possible
+help: alternatively add `#[rustc_allow_incoherent_impl]` to the relevant impl items
+ --> $DIR/needs-has-incoherent-impls.rs:7:5
+ |
+LL | fn foo() {}
+ | ^^^^^^^^^^^
+
+error[E0390]: cannot define inherent `impl` for a type outside of the crate where the type is defined
+ --> $DIR/needs-has-incoherent-impls.rs:13:1
+ |
+LL | / impl extern_crate::StructNoAttr {
+LL | |
+LL | | fn foo() {}
+LL | | }
+ | |_^
+ |
+ = help: consider moving this inherent impl into the crate defining the type if possible
+help: alternatively add `#[rustc_has_incoherent_inherent_impls]` to the type and `#[rustc_allow_incoherent_impl]` to the relevant impl items
+ --> $DIR/needs-has-incoherent-impls.rs:13:1
+ |
+LL | / impl extern_crate::StructNoAttr {
+LL | |
+LL | | fn foo() {}
+LL | | }
+ | |_^
+
+error[E0390]: cannot define inherent `impl` for a type outside of the crate where the type is defined
+ --> $DIR/needs-has-incoherent-impls.rs:17:1
+ |
+LL | / impl extern_crate::StructNoAttr {
+LL | |
+LL | | #[rustc_allow_incoherent_impl]
+LL | | fn bar() {}
+LL | | }
+ | |_^
+ |
+ = help: consider moving this inherent impl into the crate defining the type if possible
+help: alternatively add `#[rustc_has_incoherent_inherent_impls]` to the type and `#[rustc_allow_incoherent_impl]` to the relevant impl items
+ --> $DIR/needs-has-incoherent-impls.rs:17:1
+ |
+LL | / impl extern_crate::StructNoAttr {
+LL | |
+LL | | #[rustc_allow_incoherent_impl]
+LL | | fn bar() {}
+LL | | }
+ | |_^
+
+error[E0390]: cannot define inherent `impl` for a type outside of the crate where the type is defined
+ --> $DIR/needs-has-incoherent-impls.rs:22:1
+ |
+LL | / impl extern_crate::EnumWithAttr {
+LL | |
+LL | | fn foo() {}
+LL | | }
+ | |_^
+ |
+ = help: consider moving this inherent impl into the crate defining the type if possible
+help: alternatively add `#[rustc_allow_incoherent_impl]` to the relevant impl items
+ --> $DIR/needs-has-incoherent-impls.rs:24:5
+ |
+LL | fn foo() {}
+ | ^^^^^^^^^^^
+
+error[E0390]: cannot define inherent `impl` for a type outside of the crate where the type is defined
+ --> $DIR/needs-has-incoherent-impls.rs:30:1
+ |
+LL | / impl extern_crate::EnumNoAttr {
+LL | |
+LL | | fn foo() {}
+LL | | }
+ | |_^
+ |
+ = help: consider moving this inherent impl into the crate defining the type if possible
+help: alternatively add `#[rustc_has_incoherent_inherent_impls]` to the type and `#[rustc_allow_incoherent_impl]` to the relevant impl items
+ --> $DIR/needs-has-incoherent-impls.rs:30:1
+ |
+LL | / impl extern_crate::EnumNoAttr {
+LL | |
+LL | | fn foo() {}
+LL | | }
+ | |_^
+
+error[E0390]: cannot define inherent `impl` for a type outside of the crate where the type is defined
+ --> $DIR/needs-has-incoherent-impls.rs:34:1
+ |
+LL | / impl extern_crate::EnumNoAttr {
+LL | |
+LL | | #[rustc_allow_incoherent_impl]
+LL | | fn bar() {}
+LL | | }
+ | |_^
+ |
+ = help: consider moving this inherent impl into the crate defining the type if possible
+help: alternatively add `#[rustc_has_incoherent_inherent_impls]` to the type and `#[rustc_allow_incoherent_impl]` to the relevant impl items
+ --> $DIR/needs-has-incoherent-impls.rs:34:1
+ |
+LL | / impl extern_crate::EnumNoAttr {
+LL | |
+LL | | #[rustc_allow_incoherent_impl]
+LL | | fn bar() {}
+LL | | }
+ | |_^
+
+error: aborting due to 6 previous errors
+
+For more information about this error, try `rustc --explain E0390`.
diff --git a/tests/ui/incoherent-inherent-impls/no-attr-empty-impl.rs b/tests/ui/incoherent-inherent-impls/no-attr-empty-impl.rs
new file mode 100644
index 000000000..62c249e58
--- /dev/null
+++ b/tests/ui/incoherent-inherent-impls/no-attr-empty-impl.rs
@@ -0,0 +1,18 @@
+// aux-build:extern-crate.rs
+extern crate extern_crate;
+
+impl extern_crate::StructWithAttr {}
+//~^ ERROR cannot define inherent `impl` for a type outside of the crate
+
+impl extern_crate::StructNoAttr {}
+//~^ ERROR cannot define inherent `impl` for a type outside of the crate
+
+impl extern_crate::EnumWithAttr {}
+//~^ ERROR cannot define inherent `impl` for a type outside of the crate
+
+impl extern_crate::EnumNoAttr {}
+//~^ ERROR cannot define inherent `impl` for a type outside of the crate
+
+impl f32 {} //~ ERROR cannot define inherent `impl` for primitive types
+
+fn main() {}
diff --git a/tests/ui/incoherent-inherent-impls/no-attr-empty-impl.stderr b/tests/ui/incoherent-inherent-impls/no-attr-empty-impl.stderr
new file mode 100644
index 000000000..b3f8b51d0
--- /dev/null
+++ b/tests/ui/incoherent-inherent-impls/no-attr-empty-impl.stderr
@@ -0,0 +1,44 @@
+error[E0116]: cannot define inherent `impl` for a type outside of the crate where the type is defined
+ --> $DIR/no-attr-empty-impl.rs:4:1
+ |
+LL | impl extern_crate::StructWithAttr {}
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl for type defined outside of crate.
+ |
+ = note: define and implement a trait or new type instead
+
+error[E0116]: cannot define inherent `impl` for a type outside of the crate where the type is defined
+ --> $DIR/no-attr-empty-impl.rs:7:1
+ |
+LL | impl extern_crate::StructNoAttr {}
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl for type defined outside of crate.
+ |
+ = note: define and implement a trait or new type instead
+
+error[E0116]: cannot define inherent `impl` for a type outside of the crate where the type is defined
+ --> $DIR/no-attr-empty-impl.rs:10:1
+ |
+LL | impl extern_crate::EnumWithAttr {}
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl for type defined outside of crate.
+ |
+ = note: define and implement a trait or new type instead
+
+error[E0116]: cannot define inherent `impl` for a type outside of the crate where the type is defined
+ --> $DIR/no-attr-empty-impl.rs:13:1
+ |
+LL | impl extern_crate::EnumNoAttr {}
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl for type defined outside of crate.
+ |
+ = note: define and implement a trait or new type instead
+
+error[E0390]: cannot define inherent `impl` for primitive types
+ --> $DIR/no-attr-empty-impl.rs:16:6
+ |
+LL | impl f32 {}
+ | ^^^
+ |
+ = help: consider using an extension trait instead
+
+error: aborting due to 5 previous errors
+
+Some errors have detailed explanations: E0116, E0390.
+For more information about an error, try `rustc --explain E0116`.