about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJonathan Birk <jona@jbirk.de>2024-08-11 10:13:50 +0000
committerJonathan Birk <jona@jbirk.de>2024-08-11 10:50:07 +0000
commitca94dd5beac8252f03047a1eeb6a7c456b467c03 (patch)
tree1ad6e7bed9de0f6626da471da98b316d219a2ec0
parent86a9959466dd996bd9bc926bd79289fdf7f1790d (diff)
downloadrust-ca94dd5beac8252f03047a1eeb6a7c456b467c03.tar.gz
rust-ca94dd5beac8252f03047a1eeb6a7c456b467c03.zip
Add more information link to orphan impls
-rw-r--r--compiler/rustc_hir_analysis/messages.ftl4
-rw-r--r--compiler/rustc_hir_analysis/src/errors.rs3
-rw-r--r--tests/ui/coherence/coherence-cow.re_a.stderr3
-rw-r--r--tests/ui/coherence/coherence-cow.re_b.stderr3
-rw-r--r--tests/ui/coherence/coherence-cow.re_c.stderr3
-rw-r--r--tests/ui/coherence/coherence-fundamental-trait-objects.stderr3
-rw-r--r--tests/ui/coherence/coherence-impl-trait-for-marker-trait-negative.stderr3
-rw-r--r--tests/ui/coherence/coherence-impl-trait-for-marker-trait-positive.stderr3
-rw-r--r--tests/ui/coherence/coherence-impls-copy.stderr12
-rw-r--r--tests/ui/coherence/coherence-impls-send.stderr9
-rw-r--r--tests/ui/coherence/coherence-impls-sized.stderr9
-rw-r--r--tests/ui/coherence/coherence-negative-impls-copy-bad.stderr9
-rw-r--r--tests/ui/coherence/coherence-orphan.stderr6
-rw-r--r--tests/ui/coherence/coherence-overlapping-pairs.stderr3
-rw-r--r--tests/ui/coherence/coherence-pair-covered-uncovered-1.stderr3
-rw-r--r--tests/ui/coherence/coherence-pair-covered-uncovered.stderr3
-rw-r--r--tests/ui/coherence/coherence-vec-local-2.stderr3
-rw-r--r--tests/ui/coherence/coherence-vec-local.stderr3
-rw-r--r--tests/ui/coherence/coherence_local_err_struct.stderr3
-rw-r--r--tests/ui/coherence/coherence_local_err_tuple.stderr3
-rw-r--r--tests/ui/coherence/impl-foreign-for-foreign.stderr3
-rw-r--r--tests/ui/coherence/impl-foreign-for-foreign[foreign].stderr9
-rw-r--r--tests/ui/coherence/impl-foreign-for-fundamental[foreign].stderr6
-rw-r--r--tests/ui/coherence/impl-foreign[foreign]-for-foreign.stderr3
-rw-r--r--tests/ui/coherence/impl-foreign[fundemental[foreign]]-for-foreign.stderr9
-rw-r--r--tests/ui/coherence/impl[t]-foreign-for-foreign[t].stderr6
-rw-r--r--tests/ui/dropck/drop-on-non-struct.stderr3
-rw-r--r--tests/ui/error-codes/E0117.stderr3
-rw-r--r--tests/ui/error-codes/e0119/complex-impl.stderr3
-rw-r--r--tests/ui/errors/issue-99572-impl-trait-on-pointer.rs6
-rw-r--r--tests/ui/errors/issue-99572-impl-trait-on-pointer.stderr8
-rw-r--r--tests/ui/issues/issue-67535.stderr9
-rw-r--r--tests/ui/rfcs/rfc-2632-const-trait-impl/const-and-non-const-impl.stderr3
-rw-r--r--tests/ui/type-alias-impl-trait/coherence.classic.stderr3
-rw-r--r--tests/ui/type-alias-impl-trait/coherence.next.stderr3
-rw-r--r--tests/ui/type/pattern_types/range_patterns_trait_impls2.stderr3
-rw-r--r--tests/ui/typeck/typeck-default-trait-impl-cross-crate-coherence.stderr9
37 files changed, 121 insertions, 59 deletions
diff --git a/compiler/rustc_hir_analysis/messages.ftl b/compiler/rustc_hir_analysis/messages.ftl
index 33bda77e335..c81f1c62be9 100644
--- a/compiler/rustc_hir_analysis/messages.ftl
+++ b/compiler/rustc_hir_analysis/messages.ftl
@@ -351,7 +351,9 @@ hir_analysis_only_current_traits_arbitrary = only traits defined in the current
 
 hir_analysis_only_current_traits_foreign = this is not defined in the current crate because this is a foreign trait
 
-hir_analysis_only_current_traits_label = impl doesn't use any uncovered types from inside the current crate
+hir_analysis_only_current_traits_label = impl doesn't have any local type before any uncovered type parameters
+
+hir_analysis_only_current_traits_label_more_info = for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
 
 hir_analysis_only_current_traits_name = this is not defined in the current crate because {$name} are always foreign
 
diff --git a/compiler/rustc_hir_analysis/src/errors.rs b/compiler/rustc_hir_analysis/src/errors.rs
index b1ac973ef2e..9488f2f86cb 100644
--- a/compiler/rustc_hir_analysis/src/errors.rs
+++ b/compiler/rustc_hir_analysis/src/errors.rs
@@ -1441,6 +1441,7 @@ pub enum OnlyCurrentTraits {
     Outside {
         #[primary_span]
         #[label(hir_analysis_only_current_traits_label)]
+        #[label(hir_analysis_only_current_traits_label_more_info)]
         span: Span,
         #[note(hir_analysis_only_current_traits_note)]
         note: (),
@@ -1449,6 +1450,7 @@ pub enum OnlyCurrentTraits {
     Primitive {
         #[primary_span]
         #[label(hir_analysis_only_current_traits_label)]
+        #[label(hir_analysis_only_current_traits_label_more_info)]
         span: Span,
         #[note(hir_analysis_only_current_traits_note)]
         note: (),
@@ -1457,6 +1459,7 @@ pub enum OnlyCurrentTraits {
     Arbitrary {
         #[primary_span]
         #[label(hir_analysis_only_current_traits_label)]
+        #[label(hir_analysis_only_current_traits_label_more_info)]
         span: Span,
         #[note(hir_analysis_only_current_traits_note)]
         note: (),
diff --git a/tests/ui/coherence/coherence-cow.re_a.stderr b/tests/ui/coherence/coherence-cow.re_a.stderr
index 3e929d4fb33..b4331fc475b 100644
--- a/tests/ui/coherence/coherence-cow.re_a.stderr
+++ b/tests/ui/coherence/coherence-cow.re_a.stderr
@@ -5,7 +5,8 @@ LL | impl<T> Remote for Pair<T,Cover<T>> { }
    | ^^^^^^^^^^^^^^^^^^^----------------
    | |                  |
    | |                  `Pair` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-cow.re_b.stderr b/tests/ui/coherence/coherence-cow.re_b.stderr
index d267f859aea..b401d964598 100644
--- a/tests/ui/coherence/coherence-cow.re_b.stderr
+++ b/tests/ui/coherence/coherence-cow.re_b.stderr
@@ -5,7 +5,8 @@ LL | impl<T> Remote for Pair<Cover<T>,T> { }
    | ^^^^^^^^^^^^^^^^^^^----------------
    | |                  |
    | |                  `Pair` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-cow.re_c.stderr b/tests/ui/coherence/coherence-cow.re_c.stderr
index e2671cc3dd1..d95beee8139 100644
--- a/tests/ui/coherence/coherence-cow.re_c.stderr
+++ b/tests/ui/coherence/coherence-cow.re_c.stderr
@@ -5,7 +5,8 @@ LL | impl<T,U> Remote for Pair<Cover<T>,U> { }
    | ^^^^^^^^^^^^^^^^^^^^^----------------
    | |                    |
    | |                    `Pair` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-fundamental-trait-objects.stderr b/tests/ui/coherence/coherence-fundamental-trait-objects.stderr
index a0bf8f23f2c..4933fb155f7 100644
--- a/tests/ui/coherence/coherence-fundamental-trait-objects.stderr
+++ b/tests/ui/coherence/coherence-fundamental-trait-objects.stderr
@@ -5,7 +5,8 @@ LL | impl Misc for dyn Fundamental<Local> {}
    | ^^^^^^^^^^^^^^----------------------
    | |             |
    | |             `dyn Fundamental<Local>` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-impl-trait-for-marker-trait-negative.stderr b/tests/ui/coherence/coherence-impl-trait-for-marker-trait-negative.stderr
index abe752cb65e..c8b215037b9 100644
--- a/tests/ui/coherence/coherence-impl-trait-for-marker-trait-negative.stderr
+++ b/tests/ui/coherence/coherence-impl-trait-for-marker-trait-negative.stderr
@@ -41,7 +41,8 @@ LL | impl !Send for dyn Marker2 {}
    | ^^^^^^^^^^^^^^^-----------
    | |              |
    | |              `dyn Marker2` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-impl-trait-for-marker-trait-positive.stderr b/tests/ui/coherence/coherence-impl-trait-for-marker-trait-positive.stderr
index 99a32f1bf93..02107453a9f 100644
--- a/tests/ui/coherence/coherence-impl-trait-for-marker-trait-positive.stderr
+++ b/tests/ui/coherence/coherence-impl-trait-for-marker-trait-positive.stderr
@@ -41,7 +41,8 @@ LL | unsafe impl Send for dyn Marker2 {}
    | ^^^^^^^^^^^^^^^^^^^^^-----------
    | |                    |
    | |                    `dyn Marker2` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-impls-copy.stderr b/tests/ui/coherence/coherence-impls-copy.stderr
index e8db69fa983..2de854ed584 100644
--- a/tests/ui/coherence/coherence-impls-copy.stderr
+++ b/tests/ui/coherence/coherence-impls-copy.stderr
@@ -15,7 +15,8 @@ LL | impl Copy for &'static [NotSync] {}
    | ^^^^^^^^^^^^^^------------------
    | |             |
    | |             this is not defined in the current crate because slices are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -26,7 +27,8 @@ LL | impl Copy for i32 {}
    | ^^^^^^^^^^^^^^---
    | |             |
    | |             `i32` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -43,7 +45,8 @@ LL | impl Copy for (MyType, MyType) {}
    | ^^^^^^^^^^^^^^----------------
    | |             |
    | |             this is not defined in the current crate because tuples are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -60,7 +63,8 @@ LL | impl Copy for [MyType] {}
    | ^^^^^^^^^^^^^^--------
    | |             |
    | |             this is not defined in the current crate because slices are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-impls-send.stderr b/tests/ui/coherence/coherence-impls-send.stderr
index 2432e6f22d1..a41e9d620e0 100644
--- a/tests/ui/coherence/coherence-impls-send.stderr
+++ b/tests/ui/coherence/coherence-impls-send.stderr
@@ -5,7 +5,8 @@ LL | unsafe impl Send for &'static [NotSync] {}
    | ^^^^^^^^^^^^^^^^^^^^^------------------
    | |                    |
    | |                    this is not defined in the current crate because slices are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -16,7 +17,8 @@ LL | unsafe impl Send for (MyType, MyType) {}
    | ^^^^^^^^^^^^^^^^^^^^^----------------
    | |                    |
    | |                    this is not defined in the current crate because tuples are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -33,7 +35,8 @@ LL | unsafe impl Send for [MyType] {}
    | ^^^^^^^^^^^^^^^^^^^^^--------
    | |                    |
    | |                    this is not defined in the current crate because slices are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-impls-sized.stderr b/tests/ui/coherence/coherence-impls-sized.stderr
index 5069f752f74..080d19e075b 100644
--- a/tests/ui/coherence/coherence-impls-sized.stderr
+++ b/tests/ui/coherence/coherence-impls-sized.stderr
@@ -23,7 +23,8 @@ LL | impl Sized for (MyType, MyType) {}
    | ^^^^^^^^^^^^^^^----------------
    | |              |
    | |              this is not defined in the current crate because tuples are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -46,7 +47,8 @@ LL | impl Sized for [MyType] {}
    | ^^^^^^^^^^^^^^^--------
    | |              |
    | |              this is not defined in the current crate because slices are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -63,7 +65,8 @@ LL | impl Sized for &'static [NotSync] {}
    | ^^^^^^^^^^^^^^^------------------
    | |              |
    | |              this is not defined in the current crate because slices are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-negative-impls-copy-bad.stderr b/tests/ui/coherence/coherence-negative-impls-copy-bad.stderr
index 2994d1ce0e5..85937c5f02a 100644
--- a/tests/ui/coherence/coherence-negative-impls-copy-bad.stderr
+++ b/tests/ui/coherence/coherence-negative-impls-copy-bad.stderr
@@ -5,7 +5,8 @@ LL | impl !Copy for str {}
    | ^^^^^^^^^^^^^^^---
    | |              |
    | |              `str` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -16,7 +17,8 @@ LL | impl !Copy for fn() {}
    | ^^^^^^^^^^^^^^^----
    | |              |
    | |              `fn()` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -27,7 +29,8 @@ LL | impl !Copy for () {}
    | ^^^^^^^^^^^^^^^--
    | |              |
    | |              this is not defined in the current crate because tuples are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-orphan.stderr b/tests/ui/coherence/coherence-orphan.stderr
index 11b90d8bf2a..c10ed013ef2 100644
--- a/tests/ui/coherence/coherence-orphan.stderr
+++ b/tests/ui/coherence/coherence-orphan.stderr
@@ -6,7 +6,8 @@ LL | impl TheTrait<usize> for isize {}
    | |    |                   |
    | |    |                   `isize` is not defined in the current crate
    | |    `usize` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -17,7 +18,8 @@ LL | impl !Send for Vec<isize> {}
    | ^^^^^^^^^^^^^^^----------
    | |              |
    | |              `Vec` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-overlapping-pairs.stderr b/tests/ui/coherence/coherence-overlapping-pairs.stderr
index 17bb8dc314d..448e7b9d5ef 100644
--- a/tests/ui/coherence/coherence-overlapping-pairs.stderr
+++ b/tests/ui/coherence/coherence-overlapping-pairs.stderr
@@ -5,7 +5,8 @@ LL | impl<T> Remote for lib::Pair<T,Foo> { }
    | ^^^^^^^^^^^^^^^^^^^----------------
    | |                  |
    | |                  `Pair` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-pair-covered-uncovered-1.stderr b/tests/ui/coherence/coherence-pair-covered-uncovered-1.stderr
index f2a3ec4daae..2e616fefe0e 100644
--- a/tests/ui/coherence/coherence-pair-covered-uncovered-1.stderr
+++ b/tests/ui/coherence/coherence-pair-covered-uncovered-1.stderr
@@ -6,7 +6,8 @@ LL | impl<T, U> Remote1<Pair<T, Local<U>>> for i32 { }
    | |          |                              |
    | |          |                              `i32` is not defined in the current crate
    | |          `Pair` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-pair-covered-uncovered.stderr b/tests/ui/coherence/coherence-pair-covered-uncovered.stderr
index e3f85c32153..71a1e4c7ac3 100644
--- a/tests/ui/coherence/coherence-pair-covered-uncovered.stderr
+++ b/tests/ui/coherence/coherence-pair-covered-uncovered.stderr
@@ -5,7 +5,8 @@ LL | impl<T,U> Remote for Pair<T,Local<U>> { }
    | ^^^^^^^^^^^^^^^^^^^^^----------------
    | |                    |
    | |                    `Pair` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-vec-local-2.stderr b/tests/ui/coherence/coherence-vec-local-2.stderr
index 1998dedbbc8..50788e4a990 100644
--- a/tests/ui/coherence/coherence-vec-local-2.stderr
+++ b/tests/ui/coherence/coherence-vec-local-2.stderr
@@ -5,7 +5,8 @@ LL | impl<T> Remote for Vec<Local<T>> { }
    | ^^^^^^^^^^^^^^^^^^^-------------
    | |                  |
    | |                  `Vec` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence-vec-local.stderr b/tests/ui/coherence/coherence-vec-local.stderr
index 6e95eb7251f..cd102fa1c6d 100644
--- a/tests/ui/coherence/coherence-vec-local.stderr
+++ b/tests/ui/coherence/coherence-vec-local.stderr
@@ -5,7 +5,8 @@ LL | impl Remote for Vec<Local> { }
    | ^^^^^^^^^^^^^^^^----------
    | |               |
    | |               `Vec` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence_local_err_struct.stderr b/tests/ui/coherence/coherence_local_err_struct.stderr
index bbf968d5d13..97a26b54a1b 100644
--- a/tests/ui/coherence/coherence_local_err_struct.stderr
+++ b/tests/ui/coherence/coherence_local_err_struct.stderr
@@ -5,7 +5,8 @@ LL | impl lib::MyCopy for lib::MyStruct<MyType> { }
    | ^^^^^^^^^^^^^^^^^^^^^---------------------
    | |                    |
    | |                    `MyStruct` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/coherence_local_err_tuple.stderr b/tests/ui/coherence/coherence_local_err_tuple.stderr
index c988e738af4..cdd73be86bf 100644
--- a/tests/ui/coherence/coherence_local_err_tuple.stderr
+++ b/tests/ui/coherence/coherence_local_err_tuple.stderr
@@ -5,7 +5,8 @@ LL | impl lib::MyCopy for (MyType,) { }
    | ^^^^^^^^^^^^^^^^^^^^^---------
    | |                    |
    | |                    this is not defined in the current crate because tuples are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/impl-foreign-for-foreign.stderr b/tests/ui/coherence/impl-foreign-for-foreign.stderr
index 81ae36c6a53..0f8af5ef028 100644
--- a/tests/ui/coherence/impl-foreign-for-foreign.stderr
+++ b/tests/ui/coherence/impl-foreign-for-foreign.stderr
@@ -5,7 +5,8 @@ LL | impl Remote for i32 {
    | ^^^^^^^^^^^^^^^^---
    | |               |
    | |               `i32` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/impl-foreign-for-foreign[foreign].stderr b/tests/ui/coherence/impl-foreign-for-foreign[foreign].stderr
index 9ac7aeff461..ae1807f6dd0 100644
--- a/tests/ui/coherence/impl-foreign-for-foreign[foreign].stderr
+++ b/tests/ui/coherence/impl-foreign-for-foreign[foreign].stderr
@@ -6,7 +6,8 @@ LL | impl Remote1<Rc<i32>> for i32 {
    | |    |                    |
    | |    |                    `i32` is not defined in the current crate
    | |    `Rc` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -18,7 +19,8 @@ LL | impl Remote1<Rc<Local>> for f64 {
    | |    |                      |
    | |    |                      `f64` is not defined in the current crate
    | |    `Rc` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -30,7 +32,8 @@ LL | impl<T> Remote1<Rc<T>> for f32 {
    | |       |                  |
    | |       |                  `f32` is not defined in the current crate
    | |       `Rc` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/impl-foreign-for-fundamental[foreign].stderr b/tests/ui/coherence/impl-foreign-for-fundamental[foreign].stderr
index fff6a6b511e..a3522a75c86 100644
--- a/tests/ui/coherence/impl-foreign-for-fundamental[foreign].stderr
+++ b/tests/ui/coherence/impl-foreign-for-fundamental[foreign].stderr
@@ -6,7 +6,8 @@ LL | impl Remote for Box<i32> {
    | |    |          |
    | |    |          `i32` is not defined in the current crate
    | |    `std::alloc::Global` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -18,7 +19,8 @@ LL | impl<T> Remote for Box<Rc<T>> {
    | |       |          |
    | |       |          `Rc` is not defined in the current crate
    | |       `std::alloc::Global` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/impl-foreign[foreign]-for-foreign.stderr b/tests/ui/coherence/impl-foreign[foreign]-for-foreign.stderr
index ca850639862..bf22e73dd09 100644
--- a/tests/ui/coherence/impl-foreign[foreign]-for-foreign.stderr
+++ b/tests/ui/coherence/impl-foreign[foreign]-for-foreign.stderr
@@ -6,7 +6,8 @@ LL | impl Remote1<u32> for f64 {
    | |    |                |
    | |    |                `f64` is not defined in the current crate
    | |    `u32` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/impl-foreign[fundemental[foreign]]-for-foreign.stderr b/tests/ui/coherence/impl-foreign[fundemental[foreign]]-for-foreign.stderr
index cc0882095e2..2ab5cca7983 100644
--- a/tests/ui/coherence/impl-foreign[fundemental[foreign]]-for-foreign.stderr
+++ b/tests/ui/coherence/impl-foreign[fundemental[foreign]]-for-foreign.stderr
@@ -7,7 +7,8 @@ LL | impl Remote1<Box<String>> for i32 {
    | |    |                        `i32` is not defined in the current crate
    | |    `String` is not defined in the current crate
    | |    `std::alloc::Global` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -20,7 +21,8 @@ LL | impl Remote1<Box<Rc<i32>>> for f64 {
    | |    |                         `f64` is not defined in the current crate
    | |    `Rc` is not defined in the current crate
    | |    `std::alloc::Global` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -33,7 +35,8 @@ LL | impl<T> Remote1<Box<Rc<T>>> for f32 {
    | |       |                       `f32` is not defined in the current crate
    | |       `Rc` is not defined in the current crate
    | |       `std::alloc::Global` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/coherence/impl[t]-foreign-for-foreign[t].stderr b/tests/ui/coherence/impl[t]-foreign-for-foreign[t].stderr
index 11260b7d64a..ca9a7d5cd93 100644
--- a/tests/ui/coherence/impl[t]-foreign-for-foreign[t].stderr
+++ b/tests/ui/coherence/impl[t]-foreign-for-foreign[t].stderr
@@ -5,7 +5,8 @@ LL | impl Remote for Rc<Local> {
    | ^^^^^^^^^^^^^^^^---------
    | |               |
    | |               `Rc` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -16,7 +17,8 @@ LL | impl<T> Remote for Arc<T> {
    | ^^^^^^^^^^^^^^^^^^^------
    | |                  |
    | |                  `Arc` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/dropck/drop-on-non-struct.stderr b/tests/ui/dropck/drop-on-non-struct.stderr
index ec0b2e0d0b6..78b7212b6d9 100644
--- a/tests/ui/dropck/drop-on-non-struct.stderr
+++ b/tests/ui/dropck/drop-on-non-struct.stderr
@@ -11,7 +11,8 @@ LL | impl<'a> Drop for &'a mut isize {
    | ^^^^^^^^^^^^^^^^^^-------------
    | |                 |
    | |                 `isize` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/error-codes/E0117.stderr b/tests/ui/error-codes/E0117.stderr
index 86328e8131a..2bfa78d1954 100644
--- a/tests/ui/error-codes/E0117.stderr
+++ b/tests/ui/error-codes/E0117.stderr
@@ -5,7 +5,8 @@ LL | impl Drop for u32 {}
    | ^^^^^^^^^^^^^^---
    | |             |
    | |             `u32` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/error-codes/e0119/complex-impl.stderr b/tests/ui/error-codes/e0119/complex-impl.stderr
index 6562593adfa..36618cee0e8 100644
--- a/tests/ui/error-codes/e0119/complex-impl.stderr
+++ b/tests/ui/error-codes/e0119/complex-impl.stderr
@@ -5,7 +5,8 @@ LL | impl<R> External for (Q, R) {}
    | ^^^^^^^^^^^^^^^^^^^^^------
    | |                    |
    | |                    this is not defined in the current crate because tuples are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/errors/issue-99572-impl-trait-on-pointer.rs b/tests/ui/errors/issue-99572-impl-trait-on-pointer.rs
index ae2329ec9c8..61f11a88c61 100644
--- a/tests/ui/errors/issue-99572-impl-trait-on-pointer.rs
+++ b/tests/ui/errors/issue-99572-impl-trait-on-pointer.rs
@@ -6,7 +6,8 @@ struct LocalType;
 
 impl fmt::Display for *mut LocalType {
     //~^ ERROR only traits defined in the current crate can be implemented for arbitrary types
-    //~| NOTE impl doesn't use any uncovered types from inside the current crate
+    //~| NOTE impl doesn't have any local type before any uncovered type parameters
+    //~| NOTE for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
     //~| NOTE `*mut LocalType` is not defined in the current crate because raw pointers are always foreign
     //~| NOTE define and implement a trait or new type instead
     //~| HELP consider introducing a new wrapper type
@@ -17,7 +18,8 @@ impl fmt::Display for *mut LocalType {
 
 impl<T> marker::Copy for *mut T {
     //~^ ERROR only traits defined in the current crate can be implemented for arbitrary types
-    //~| NOTE impl doesn't use any uncovered types from inside the current crate
+    //~| NOTE impl doesn't have any local type before any uncovered type parameters
+    //~| NOTE for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
     //~| NOTE `*mut T` is not defined in the current crate because raw pointers are always foreign
     //~| NOTE define and implement a trait or new type instead
 }
diff --git a/tests/ui/errors/issue-99572-impl-trait-on-pointer.stderr b/tests/ui/errors/issue-99572-impl-trait-on-pointer.stderr
index 5809387e917..214618d6636 100644
--- a/tests/ui/errors/issue-99572-impl-trait-on-pointer.stderr
+++ b/tests/ui/errors/issue-99572-impl-trait-on-pointer.stderr
@@ -5,7 +5,8 @@ LL | impl fmt::Display for *mut LocalType {
    | ^^^^^^^^^^^^^^^^^^^^^^--------------
    | |                     |
    | |                     `*mut LocalType` is not defined in the current crate because raw pointers are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 help: consider introducing a new wrapper type
@@ -16,13 +17,14 @@ LL ~ impl fmt::Display for WrapperType {
    |
 
 error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
-  --> $DIR/issue-99572-impl-trait-on-pointer.rs:18:1
+  --> $DIR/issue-99572-impl-trait-on-pointer.rs:19:1
    |
 LL | impl<T> marker::Copy for *mut T {
    | ^^^^^^^^^^^^^^^^^^^^^^^^^------
    | |                        |
    | |                        `*mut T` is not defined in the current crate because raw pointers are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/issues/issue-67535.stderr b/tests/ui/issues/issue-67535.stderr
index 4bfbf1bffdb..a953a915214 100644
--- a/tests/ui/issues/issue-67535.stderr
+++ b/tests/ui/issues/issue-67535.stderr
@@ -6,7 +6,8 @@ LL | impl std::ops::AddAssign for () {
    | |    |                       |
    | |    |                       this is not defined in the current crate because tuples are always foreign
    | |    this is not defined in the current crate because this is a foreign trait
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -18,7 +19,8 @@ LL | impl std::ops::AddAssign for [(); 1] {
    | |    |                       |
    | |    |                       this is not defined in the current crate because arrays are always foreign
    | |    this is not defined in the current crate because this is a foreign trait
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -30,7 +32,8 @@ LL | impl std::ops::AddAssign for &[u8] {
    | |    |                       |
    | |    |                       this is not defined in the current crate because slices are always foreign
    | |    this is not defined in the current crate because this is a foreign trait
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/rfcs/rfc-2632-const-trait-impl/const-and-non-const-impl.stderr b/tests/ui/rfcs/rfc-2632-const-trait-impl/const-and-non-const-impl.stderr
index 056cd76075e..4dff35c46e8 100644
--- a/tests/ui/rfcs/rfc-2632-const-trait-impl/const-and-non-const-impl.stderr
+++ b/tests/ui/rfcs/rfc-2632-const-trait-impl/const-and-non-const-impl.stderr
@@ -33,7 +33,8 @@ LL | impl const std::ops::Add for i32 {
    | |          |                 |
    | |          |                 `i32` is not defined in the current crate
    | |          `i32` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/type-alias-impl-trait/coherence.classic.stderr b/tests/ui/type-alias-impl-trait/coherence.classic.stderr
index 3930a7513d8..4cd87253b30 100644
--- a/tests/ui/type-alias-impl-trait/coherence.classic.stderr
+++ b/tests/ui/type-alias-impl-trait/coherence.classic.stderr
@@ -5,7 +5,8 @@ LL | impl foreign_crate::ForeignTrait for AliasOfForeignType<()> {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^----------------------
    | |                                    |
    | |                                    type alias impl trait is treated as if it were foreign, because its hidden type could be from a foreign crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/type-alias-impl-trait/coherence.next.stderr b/tests/ui/type-alias-impl-trait/coherence.next.stderr
index bbda9868188..886b667b8c8 100644
--- a/tests/ui/type-alias-impl-trait/coherence.next.stderr
+++ b/tests/ui/type-alias-impl-trait/coherence.next.stderr
@@ -5,7 +5,8 @@ LL | impl foreign_crate::ForeignTrait for AliasOfForeignType<()> {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^----------------------
    | |                                    |
    | |                                    `AliasOfForeignType<()>` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/type/pattern_types/range_patterns_trait_impls2.stderr b/tests/ui/type/pattern_types/range_patterns_trait_impls2.stderr
index 5403b4fd2dc..2d3f8403315 100644
--- a/tests/ui/type/pattern_types/range_patterns_trait_impls2.stderr
+++ b/tests/ui/type/pattern_types/range_patterns_trait_impls2.stderr
@@ -5,7 +5,8 @@ LL | impl Eq for Y {}
    | ^^^^^^^^^^^^-
    | |           |
    | |           `(u32) is 1..=` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
diff --git a/tests/ui/typeck/typeck-default-trait-impl-cross-crate-coherence.stderr b/tests/ui/typeck/typeck-default-trait-impl-cross-crate-coherence.stderr
index 65202c13691..8ee6846eac2 100644
--- a/tests/ui/typeck/typeck-default-trait-impl-cross-crate-coherence.stderr
+++ b/tests/ui/typeck/typeck-default-trait-impl-cross-crate-coherence.stderr
@@ -5,7 +5,8 @@ LL | impl DefaultedTrait for (A,) {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^----
    | |                       |
    | |                       this is not defined in the current crate because tuples are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -16,7 +17,8 @@ LL | impl !DefaultedTrait for (B,) {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^^----
    | |                        |
    | |                        this is not defined in the current crate because tuples are always foreign
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead
 
@@ -33,7 +35,8 @@ LL | impl DefaultedTrait for lib::Something<C> {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^-----------------
    | |                       |
    | |                       `Something` is not defined in the current crate
-   | impl doesn't use any uncovered types from inside the current crate
+   | impl doesn't have any local type before any uncovered type parameters
+   | for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
    |
    = note: define and implement a trait or new type instead