about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/rustdoc/footnote-reference-ids.rs23
-rw-r--r--tests/rustdoc/footnote-reference-in-footnote-def.rs2
-rw-r--r--tests/ui/attributes/auxiliary/derive_macro_with_helper.rs8
-rw-r--r--tests/ui/attributes/helper-attr-interpolated-non-lit-arg.rs20
-rw-r--r--tests/ui/attributes/malformed-attrs.stderr37
-rw-r--r--tests/ui/consts/const-eval/union-const-eval-field.rs1
-rw-r--r--tests/ui/consts/const-eval/union-const-eval-field.stderr8
-rw-r--r--tests/ui/hygiene/arguments.stderr3
-rw-r--r--tests/ui/hygiene/cross-crate-name-hiding-2.stderr5
-rw-r--r--tests/ui/hygiene/globs.stderr14
-rw-r--r--tests/ui/imports/issue-109148.rs3
-rw-r--r--tests/ui/imports/issue-109148.stderr40
-rw-r--r--tests/ui/intrinsics/intrinsic-raw_eq-const-bad.rs1
-rw-r--r--tests/ui/intrinsics/intrinsic-raw_eq-const-bad.stderr8
-rw-r--r--tests/ui/linkage-attr/linkage3.rs2
-rw-r--r--tests/ui/linkage-attr/linkage3.stderr27
-rw-r--r--tests/ui/macros/cfg_select.rs36
-rw-r--r--tests/ui/macros/cfg_select.stderr14
-rw-r--r--tests/ui/macros/issue-78325-inconsistent-resolution.rs5
-rw-r--r--tests/ui/macros/issue-78325-inconsistent-resolution.stderr42
-rw-r--r--tests/ui/or-patterns/issue-64879-trailing-before-guard.fixed18
-rw-r--r--tests/ui/or-patterns/issue-64879-trailing-before-guard.rs5
-rw-r--r--tests/ui/or-patterns/issue-64879-trailing-before-guard.stderr22
-rw-r--r--tests/ui/or-patterns/remove-leading-vert.fixed26
-rw-r--r--tests/ui/or-patterns/remove-leading-vert.rs2
-rw-r--r--tests/ui/or-patterns/remove-leading-vert.stderr85
-rw-r--r--tests/ui/proc-macro/proc-macro-attributes.stderr8
-rw-r--r--tests/ui/resolve/extern-prelude-speculative.rs10
-rw-r--r--tests/ui/resolve/visibility-indeterminate.rs2
-rw-r--r--tests/ui/resolve/visibility-indeterminate.stderr8
-rw-r--r--tests/ui/rfcs/rfc-0000-never_patterns/ICE-130779-never-arm-no-oatherwise-block.stderr6
-rw-r--r--tests/ui/rust-2018/uniform-paths/deadlock.rs2
-rw-r--r--tests/ui/rust-2018/uniform-paths/deadlock.stderr8
-rw-r--r--tests/ui/target-feature/gate.rs6
-rw-r--r--tests/ui/target-feature/gate.stderr2
-rw-r--r--tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.rs26
-rw-r--r--tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.stderr21
37 files changed, 363 insertions, 193 deletions
diff --git a/tests/rustdoc/footnote-reference-ids.rs b/tests/rustdoc/footnote-reference-ids.rs
new file mode 100644
index 00000000000..ffa04e1d767
--- /dev/null
+++ b/tests/rustdoc/footnote-reference-ids.rs
@@ -0,0 +1,23 @@
+// This test ensures that multiple references to a single footnote and
+// corresponding back links work as expected.
+
+#![crate_name = "foo"]
+
+//@ has 'foo/index.html'
+//@ has - '//*[@class="docblock"]/p/sup[@id="fnref1"]/a[@href="#fn1"]' '1'
+//@ has - '//*[@class="docblock"]/p/sup[@id="fnref2"]/a[@href="#fn2"]' '2'
+//@ has - '//*[@class="docblock"]/p/sup[@id="fnref2-2"]/a[@href="#fn2"]' '2'
+//@ has - '//li[@id="fn1"]/p' 'meow'
+//@ has - '//li[@id="fn1"]/p/a[@href="#fnref1"]' '↩'
+//@ has - '//li[@id="fn2"]/p' 'uwu'
+//@ has - '//li[@id="fn2"]/p/a[@href="#fnref2"]/sup' '1'
+//@ has - '//li[@id="fn2"]/p/sup/a[@href="#fnref2-2"]' '2'
+
+//! # Footnote, references and back links
+//!
+//! Single: [^a].
+//!
+//! Double: [^b] [^b].
+//!
+//! [^a]: meow
+//! [^b]: uwu
diff --git a/tests/rustdoc/footnote-reference-in-footnote-def.rs b/tests/rustdoc/footnote-reference-in-footnote-def.rs
index db3f9a59ef8..504d0bdb8f7 100644
--- a/tests/rustdoc/footnote-reference-in-footnote-def.rs
+++ b/tests/rustdoc/footnote-reference-in-footnote-def.rs
@@ -9,7 +9,7 @@
 //@ has - '//li[@id="fn1"]/p/sup[@id="fnref2"]/a[@href="#fn2"]' '2'
 //@ has - '//li[@id="fn1"]//a[@href="#fn2"]' '2'
 //@ has - '//li[@id="fn2"]/p' 'uwu'
-//@ has - '//li[@id="fn2"]/p/sup[@id="fnref1"]/a[@href="#fn1"]' '1'
+//@ has - '//li[@id="fn2"]/p/sup[@id="fnref1-2"]/a[@href="#fn1"]' '1'
 //@ has - '//li[@id="fn2"]//a[@href="#fn1"]' '1'
 
 //! # footnote-hell
diff --git a/tests/ui/attributes/auxiliary/derive_macro_with_helper.rs b/tests/ui/attributes/auxiliary/derive_macro_with_helper.rs
new file mode 100644
index 00000000000..128af50ce36
--- /dev/null
+++ b/tests/ui/attributes/auxiliary/derive_macro_with_helper.rs
@@ -0,0 +1,8 @@
+extern crate proc_macro;
+
+use proc_macro::TokenStream;
+
+#[proc_macro_derive(Derive, attributes(arg))]
+pub fn derive(_: TokenStream) -> TokenStream {
+    TokenStream::new()
+}
diff --git a/tests/ui/attributes/helper-attr-interpolated-non-lit-arg.rs b/tests/ui/attributes/helper-attr-interpolated-non-lit-arg.rs
new file mode 100644
index 00000000000..17c9ad1bd48
--- /dev/null
+++ b/tests/ui/attributes/helper-attr-interpolated-non-lit-arg.rs
@@ -0,0 +1,20 @@
+// Regression test for <https://github.com/rust-lang/rust/issues/140612>.
+//@ proc-macro: derive_macro_with_helper.rs
+//@ edition: 2018
+//@ check-pass
+
+macro_rules! expand {
+    ($text:expr) => {
+        #[derive(derive_macro_with_helper::Derive)]
+        // This inert attr is completely valid because it follows the grammar
+        // `#` `[` SimplePath DelimitedTokenStream `]`.
+        // However, we used to incorrectly delay a bug here and ICE when trying to parse `$text` as
+        // the inside of a "meta item list" which may only begin with literals or paths.
+        #[arg($text)]
+        pub struct Foo;
+    };
+}
+
+expand!(1 + 1);
+
+fn main() {}
diff --git a/tests/ui/attributes/malformed-attrs.stderr b/tests/ui/attributes/malformed-attrs.stderr
index 705050e9a7d..aa4891459aa 100644
--- a/tests/ui/attributes/malformed-attrs.stderr
+++ b/tests/ui/attributes/malformed-attrs.stderr
@@ -90,25 +90,6 @@ error: malformed `cfi_encoding` attribute input
 LL | #[cfi_encoding]
    | ^^^^^^^^^^^^^^^ help: must be of the form: `#[cfi_encoding = "encoding"]`
 
-error: malformed `linkage` attribute input
-  --> $DIR/malformed-attrs.rs:170:5
-   |
-LL |     #[linkage]
-   |     ^^^^^^^^^^
-   |
-   = note: for more information, visit <https://doc.rust-lang.org/reference/linkage.html>
-help: the following are the possible correct uses
-   |
-LL |     #[linkage = "available_externally"]
-   |               ++++++++++++++++++++++++
-LL |     #[linkage = "common"]
-   |               ++++++++++
-LL |     #[linkage = "extern_weak"]
-   |               +++++++++++++++
-LL |     #[linkage = "external"]
-   |               ++++++++++++
-   = and 5 other candidates
-
 error: malformed `allow` attribute input
   --> $DIR/malformed-attrs.rs:175:1
    |
@@ -659,6 +640,24 @@ LL |     #[unsafe(ffi_const = 1)]
    |     |                  didn't expect any arguments here
    |     help: must be of the form: `#[ffi_const]`
 
+error[E0539]: malformed `linkage` attribute input
+  --> $DIR/malformed-attrs.rs:170:5
+   |
+LL |     #[linkage]
+   |     ^^^^^^^^^^ expected this to be of the form `linkage = "..."`
+   |
+help: try changing it to one of the following valid forms of the attribute
+   |
+LL |     #[linkage = "available_externally"]
+   |               ++++++++++++++++++++++++
+LL |     #[linkage = "common"]
+   |               ++++++++++
+LL |     #[linkage = "extern_weak"]
+   |               +++++++++++++++
+LL |     #[linkage = "external"]
+   |               ++++++++++++
+   = and 5 other candidates
+
 error[E0565]: malformed `automatically_derived` attribute input
   --> $DIR/malformed-attrs.rs:188:1
    |
diff --git a/tests/ui/consts/const-eval/union-const-eval-field.rs b/tests/ui/consts/const-eval/union-const-eval-field.rs
index 719e59b007c..2c9061a7a50 100644
--- a/tests/ui/consts/const-eval/union-const-eval-field.rs
+++ b/tests/ui/consts/const-eval/union-const-eval-field.rs
@@ -1,5 +1,6 @@
 //@ dont-require-annotations: NOTE
 //@ normalize-stderr: "(the raw bytes of the constant) \(size: [0-9]*, align: [0-9]*\)" -> "$1 (size: $$SIZE, align: $$ALIGN)"
+//@ normalize-stderr: "([[:xdigit:]]{2}\s){4}(__\s){4}\s+│\s+([?|\.]){4}\W{4}" -> "HEX_DUMP"
 
 type Field1 = i32;
 type Field2 = f32;
diff --git a/tests/ui/consts/const-eval/union-const-eval-field.stderr b/tests/ui/consts/const-eval/union-const-eval-field.stderr
index 1843ce273ac..3b7e5508d56 100644
--- a/tests/ui/consts/const-eval/union-const-eval-field.stderr
+++ b/tests/ui/consts/const-eval/union-const-eval-field.stderr
@@ -1,21 +1,21 @@
 error[E0080]: reading memory at ALLOC0[0x0..0x8], but memory is uninitialized at [0x4..0x8], and this operation requires initialized memory
-  --> $DIR/union-const-eval-field.rs:29:37
+  --> $DIR/union-const-eval-field.rs:30:37
    |
 LL |     const FIELD3: Field3 = unsafe { UNION.field3 };
    |                                     ^^^^^^^^^^^^ evaluation of `read_field3::FIELD3` failed here
    |
    = note: the raw bytes of the constant (size: $SIZE, align: $ALIGN) {
-               00 00 80 3f __ __ __ __                         │ ...?░░░░
+               HEX_DUMP
            }
 
 note: erroneous constant encountered
-  --> $DIR/union-const-eval-field.rs:31:5
+  --> $DIR/union-const-eval-field.rs:32:5
    |
 LL |     FIELD3
    |     ^^^^^^
 
 note: erroneous constant encountered
-  --> $DIR/union-const-eval-field.rs:31:5
+  --> $DIR/union-const-eval-field.rs:32:5
    |
 LL |     FIELD3
    |     ^^^^^^
diff --git a/tests/ui/hygiene/arguments.stderr b/tests/ui/hygiene/arguments.stderr
index 0d8d652b6f3..fe92daf6437 100644
--- a/tests/ui/hygiene/arguments.stderr
+++ b/tests/ui/hygiene/arguments.stderr
@@ -1,6 +1,9 @@
 error[E0412]: cannot find type `S` in this scope
   --> $DIR/arguments.rs:14:8
    |
+LL |         struct S;
+   |                - you might have meant to refer to this struct
+...
 LL |     m!(S, S);
    |        ^ not found in this scope
 
diff --git a/tests/ui/hygiene/cross-crate-name-hiding-2.stderr b/tests/ui/hygiene/cross-crate-name-hiding-2.stderr
index a5d509fab99..fe3a12e93a7 100644
--- a/tests/ui/hygiene/cross-crate-name-hiding-2.stderr
+++ b/tests/ui/hygiene/cross-crate-name-hiding-2.stderr
@@ -3,6 +3,11 @@ error[E0422]: cannot find struct, variant or union type `MyStruct` in this scope
    |
 LL |     let x = MyStruct {};
    |             ^^^^^^^^ not found in this scope
+   |
+  ::: $DIR/auxiliary/use_by_macro.rs:15:1
+   |
+LL | x!(my_struct);
+   | ------------- you might have meant to refer to this struct
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/hygiene/globs.stderr b/tests/ui/hygiene/globs.stderr
index 31f25b182f1..85946bf34bc 100644
--- a/tests/ui/hygiene/globs.stderr
+++ b/tests/ui/hygiene/globs.stderr
@@ -48,7 +48,10 @@ error[E0425]: cannot find function `f` in this scope
   --> $DIR/globs.rs:61:12
    |
 LL | n!(f);
-   | ----- in this macro invocation
+   | -----
+   | |  |
+   | |  you might have meant to refer to this function
+   | in this macro invocation
 ...
 LL |                     $j();
    |                     -- due to this macro variable
@@ -56,15 +59,16 @@ LL |                     $j();
 LL |         n!(f);
    |            ^ not found in this scope
    |
-   = help: consider importing this function:
-           foo::f
    = note: this error originates in the macro `n` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error[E0425]: cannot find function `f` in this scope
   --> $DIR/globs.rs:65:17
    |
 LL | n!(f);
-   | ----- in this macro invocation
+   | -----
+   | |  |
+   | |  you might have meant to refer to this function
+   | in this macro invocation
 ...
 LL |                     $j();
    |                     -- due to this macro variable
@@ -72,8 +76,6 @@ LL |                     $j();
 LL |                 f
    |                 ^ not found in this scope
    |
-   = help: consider importing this function:
-           foo::f
    = note: this error originates in the macro `n` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: aborting due to 4 previous errors
diff --git a/tests/ui/imports/issue-109148.rs b/tests/ui/imports/issue-109148.rs
index 9d657a87381..49fc2fe0f5b 100644
--- a/tests/ui/imports/issue-109148.rs
+++ b/tests/ui/imports/issue-109148.rs
@@ -10,6 +10,7 @@ macro_rules! m {
 
 m!();
 
-use std::mem;
+use std::mem; //~ ERROR `std` is ambiguous
+use ::std::mem as _; //~ ERROR `std` is ambiguous
 
 fn main() {}
diff --git a/tests/ui/imports/issue-109148.stderr b/tests/ui/imports/issue-109148.stderr
index b7f1f69dc8f..ee047385ae3 100644
--- a/tests/ui/imports/issue-109148.stderr
+++ b/tests/ui/imports/issue-109148.stderr
@@ -9,5 +9,43 @@ LL | m!();
    |
    = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
 
-error: aborting due to 1 previous error
+error[E0659]: `std` is ambiguous
+  --> $DIR/issue-109148.rs:13:5
+   |
+LL | use std::mem;
+   |     ^^^ ambiguous name
+   |
+   = note: ambiguous because of a conflict between a macro-expanded name and a less macro-expanded name from outer scope during import or macro resolution
+   = note: `std` could refer to a built-in crate
+note: `std` could also refer to the crate imported here
+  --> $DIR/issue-109148.rs:6:9
+   |
+LL |         extern crate core as std;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
+...
+LL | m!();
+   | ---- in this macro invocation
+   = help: use `crate::std` to refer to this crate unambiguously
+   = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0659]: `std` is ambiguous
+  --> $DIR/issue-109148.rs:14:7
+   |
+LL | use ::std::mem as _;
+   |       ^^^ ambiguous name
+   |
+   = note: ambiguous because of a conflict between a macro-expanded name and a less macro-expanded name from outer scope during import or macro resolution
+   = note: `std` could refer to a built-in crate
+note: `std` could also refer to the crate imported here
+  --> $DIR/issue-109148.rs:6:9
+   |
+LL |         extern crate core as std;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
+...
+LL | m!();
+   | ---- in this macro invocation
+   = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to 3 previous errors
 
+For more information about this error, try `rustc --explain E0659`.
diff --git a/tests/ui/intrinsics/intrinsic-raw_eq-const-bad.rs b/tests/ui/intrinsics/intrinsic-raw_eq-const-bad.rs
index 15f4a9a778e..ed15f5bba96 100644
--- a/tests/ui/intrinsics/intrinsic-raw_eq-const-bad.rs
+++ b/tests/ui/intrinsics/intrinsic-raw_eq-const-bad.rs
@@ -1,3 +1,4 @@
+//@ normalize-stderr: "[[:xdigit:]]{2} __ ([[:xdigit:]]{2}\s){2}" -> "HEX_DUMP"
 #![feature(core_intrinsics)]
 
 const RAW_EQ_PADDING: bool = unsafe {
diff --git a/tests/ui/intrinsics/intrinsic-raw_eq-const-bad.stderr b/tests/ui/intrinsics/intrinsic-raw_eq-const-bad.stderr
index 5f4ef14d586..329da35297e 100644
--- a/tests/ui/intrinsics/intrinsic-raw_eq-const-bad.stderr
+++ b/tests/ui/intrinsics/intrinsic-raw_eq-const-bad.stderr
@@ -1,15 +1,15 @@
 error[E0080]: reading memory at ALLOC0[0x0..0x4], but memory is uninitialized at [0x1..0x2], and this operation requires initialized memory
-  --> $DIR/intrinsic-raw_eq-const-bad.rs:4:5
+  --> $DIR/intrinsic-raw_eq-const-bad.rs:5:5
    |
 LL |     std::intrinsics::raw_eq(&(1_u8, 2_u16), &(1_u8, 2_u16))
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `RAW_EQ_PADDING` failed here
    |
    = note: the raw bytes of the constant (size: 4, align: 2) {
-               01 __ 02 00                                     │ .░..
+               HEX_DUMP                                    │ .░..
            }
 
 error[E0080]: unable to turn pointer into integer
-  --> $DIR/intrinsic-raw_eq-const-bad.rs:9:5
+  --> $DIR/intrinsic-raw_eq-const-bad.rs:10:5
    |
 LL |     std::intrinsics::raw_eq(&(&0), &(&1))
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `RAW_EQ_PTR` failed here
@@ -18,7 +18,7 @@ LL |     std::intrinsics::raw_eq(&(&0), &(&1))
    = help: the absolute address of a pointer is not known at compile-time, so such operations are not supported
 
 error[E0080]: accessing memory with alignment 1, but alignment 4 is required
-  --> $DIR/intrinsic-raw_eq-const-bad.rs:16:5
+  --> $DIR/intrinsic-raw_eq-const-bad.rs:17:5
    |
 LL |     std::intrinsics::raw_eq(aref, aref)
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `RAW_EQ_NOT_ALIGNED` failed here
diff --git a/tests/ui/linkage-attr/linkage3.rs b/tests/ui/linkage-attr/linkage3.rs
index f95e5eecc48..74a6fd6600b 100644
--- a/tests/ui/linkage-attr/linkage3.rs
+++ b/tests/ui/linkage-attr/linkage3.rs
@@ -5,7 +5,7 @@
 extern "C" {
     #[linkage = "foo"]
     static foo: *const i32;
-//~^ ERROR: invalid linkage specified
+//~^^ ERROR: malformed `linkage` attribute input [E0539]
 }
 
 fn main() {
diff --git a/tests/ui/linkage-attr/linkage3.stderr b/tests/ui/linkage-attr/linkage3.stderr
index 5f7b7ef227c..f1215f09aea 100644
--- a/tests/ui/linkage-attr/linkage3.stderr
+++ b/tests/ui/linkage-attr/linkage3.stderr
@@ -1,8 +1,27 @@
-error: invalid linkage specified
-  --> $DIR/linkage3.rs:7:5
+error[E0539]: malformed `linkage` attribute input
+  --> $DIR/linkage3.rs:6:5
    |
-LL |     static foo: *const i32;
-   |     ^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[linkage = "foo"]
+   |     ^^^^^^^^^^^^-----^
+   |                 |
+   |                 valid arguments are `available_externally`, `common`, `extern_weak`, `external`, `internal`, `linkonce`, `linkonce_odr`, `weak` or `weak_odr`
+   |
+help: try changing it to one of the following valid forms of the attribute
+   |
+LL -     #[linkage = "foo"]
+LL +     #[linkage = "available_externally"]
+   |
+LL -     #[linkage = "foo"]
+LL +     #[linkage = "common"]
+   |
+LL -     #[linkage = "foo"]
+LL +     #[linkage = "extern_weak"]
+   |
+LL -     #[linkage = "foo"]
+LL +     #[linkage = "external"]
+   |
+   = and 5 other candidates
 
 error: aborting due to 1 previous error
 
+For more information about this error, try `rustc --explain E0539`.
diff --git a/tests/ui/macros/cfg_select.rs b/tests/ui/macros/cfg_select.rs
index 461d2e0e8c1..9241141ef9a 100644
--- a/tests/ui/macros/cfg_select.rs
+++ b/tests/ui/macros/cfg_select.rs
@@ -8,10 +8,42 @@ fn print() {
     });
 }
 
-fn arm_rhs_must_be_in_braces() -> i32 {
+fn print_2() {
+    println!(cfg_select! {
+        unix => "unix",
+        _ => "not unix",
+    });
+}
+
+fn arm_rhs_expr_1() -> i32 {
     cfg_select! {
         true => 1
-        //~^ ERROR: expected `{`, found `1`
+    }
+}
+
+fn arm_rhs_expr_2() -> i32 {
+    cfg_select! {
+        true => 1,
+        false => 2
+    }
+}
+
+fn arm_rhs_expr_3() -> i32 {
+    cfg_select! {
+        true => 1,
+        false => 2,
+        true => { 42 }
+        false => -1 as i32,
+        true => 2 + 2,
+        false => "",
+        true => if true { 42 } else { 84 }
+        false => if true { 42 } else { 84 },
+        true => return 42,
+        false => loop {}
+        true => (1, 2),
+        false => (1, 2,),
+        true => todo!(),
+        false => println!("hello"),
     }
 }
 
diff --git a/tests/ui/macros/cfg_select.stderr b/tests/ui/macros/cfg_select.stderr
index 6c18a7c189d..7280f35c16f 100644
--- a/tests/ui/macros/cfg_select.stderr
+++ b/tests/ui/macros/cfg_select.stderr
@@ -1,11 +1,5 @@
-error: expected `{`, found `1`
-  --> $DIR/cfg_select.rs:13:17
-   |
-LL |         true => 1
-   |                 ^ expected `{`
-
 warning: unreachable predicate
-  --> $DIR/cfg_select.rs:20:5
+  --> $DIR/cfg_select.rs:52:5
    |
 LL |     _ => {}
    |     - always matches
@@ -13,7 +7,7 @@ LL |     true => {}
    |     ^^^^ this predicate is never reached
 
 error: none of the predicates in this `cfg_select` evaluated to true
-  --> $DIR/cfg_select.rs:24:1
+  --> $DIR/cfg_select.rs:56:1
    |
 LL | / cfg_select! {
 LL | |
@@ -22,10 +16,10 @@ LL | | }
    | |_^
 
 error: none of the predicates in this `cfg_select` evaluated to true
-  --> $DIR/cfg_select.rs:29:1
+  --> $DIR/cfg_select.rs:61:1
    |
 LL | cfg_select! {}
    | ^^^^^^^^^^^^^^
 
-error: aborting due to 3 previous errors; 1 warning emitted
+error: aborting due to 2 previous errors; 1 warning emitted
 
diff --git a/tests/ui/macros/issue-78325-inconsistent-resolution.rs b/tests/ui/macros/issue-78325-inconsistent-resolution.rs
index 919eca4f9bf..021ba599d12 100644
--- a/tests/ui/macros/issue-78325-inconsistent-resolution.rs
+++ b/tests/ui/macros/issue-78325-inconsistent-resolution.rs
@@ -1,3 +1,5 @@
+//@ edition: 2018
+
 macro_rules! define_other_core {
     ( ) => {
         extern crate std as core;
@@ -6,7 +8,8 @@ macro_rules! define_other_core {
 }
 
 fn main() {
-    core::panic!();
+    core::panic!(); //~ ERROR `core` is ambiguous
+    ::core::panic!(); //~ ERROR `core` is ambiguous
 }
 
 define_other_core!();
diff --git a/tests/ui/macros/issue-78325-inconsistent-resolution.stderr b/tests/ui/macros/issue-78325-inconsistent-resolution.stderr
index b75e4a9c9e0..7c745040640 100644
--- a/tests/ui/macros/issue-78325-inconsistent-resolution.stderr
+++ b/tests/ui/macros/issue-78325-inconsistent-resolution.stderr
@@ -1,5 +1,5 @@
 error: macro-expanded `extern crate` items cannot shadow names passed with `--extern`
-  --> $DIR/issue-78325-inconsistent-resolution.rs:3:9
+  --> $DIR/issue-78325-inconsistent-resolution.rs:5:9
    |
 LL |         extern crate std as core;
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -9,5 +9,43 @@ LL | define_other_core!();
    |
    = note: this error originates in the macro `define_other_core` (in Nightly builds, run with -Z macro-backtrace for more info)
 
-error: aborting due to 1 previous error
+error[E0659]: `core` is ambiguous
+  --> $DIR/issue-78325-inconsistent-resolution.rs:11:5
+   |
+LL |     core::panic!();
+   |     ^^^^ ambiguous name
+   |
+   = note: ambiguous because of a conflict between a macro-expanded name and a less macro-expanded name from outer scope during import or macro resolution
+   = note: `core` could refer to a built-in crate
+note: `core` could also refer to the crate imported here
+  --> $DIR/issue-78325-inconsistent-resolution.rs:5:9
+   |
+LL |         extern crate std as core;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
+...
+LL | define_other_core!();
+   | -------------------- in this macro invocation
+   = help: use `crate::core` to refer to this crate unambiguously
+   = note: this error originates in the macro `define_other_core` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0659]: `core` is ambiguous
+  --> $DIR/issue-78325-inconsistent-resolution.rs:12:7
+   |
+LL |     ::core::panic!();
+   |       ^^^^ ambiguous name
+   |
+   = note: ambiguous because of a conflict between a macro-expanded name and a less macro-expanded name from outer scope during import or macro resolution
+   = note: `core` could refer to a built-in crate
+note: `core` could also refer to the crate imported here
+  --> $DIR/issue-78325-inconsistent-resolution.rs:5:9
+   |
+LL |         extern crate std as core;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
+...
+LL | define_other_core!();
+   | -------------------- in this macro invocation
+   = note: this error originates in the macro `define_other_core` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to 3 previous errors
 
+For more information about this error, try `rustc --explain E0659`.
diff --git a/tests/ui/or-patterns/issue-64879-trailing-before-guard.fixed b/tests/ui/or-patterns/issue-64879-trailing-before-guard.fixed
new file mode 100644
index 00000000000..0c65f709d66
--- /dev/null
+++ b/tests/ui/or-patterns/issue-64879-trailing-before-guard.fixed
@@ -0,0 +1,18 @@
+// In this regression test we check that a trailing `|` in an or-pattern just
+// before the `if` token of a `match` guard will receive parser recovery with
+// an appropriate error message.
+//@ run-rustfix
+#![allow(dead_code)]
+
+enum E { A, B }
+
+fn main() {
+    match E::A {
+        E::A |
+        E::B //~ ERROR a trailing `|` is not allowed in an or-pattern
+        if true => {
+            let _recovery_witness: i32 = 0i32; //~ ERROR mismatched types
+        }
+        _ => {}
+    }
+}
diff --git a/tests/ui/or-patterns/issue-64879-trailing-before-guard.rs b/tests/ui/or-patterns/issue-64879-trailing-before-guard.rs
index 181c770096a..d7da564c2e1 100644
--- a/tests/ui/or-patterns/issue-64879-trailing-before-guard.rs
+++ b/tests/ui/or-patterns/issue-64879-trailing-before-guard.rs
@@ -1,6 +1,8 @@
 // In this regression test we check that a trailing `|` in an or-pattern just
 // before the `if` token of a `match` guard will receive parser recovery with
 // an appropriate error message.
+//@ run-rustfix
+#![allow(dead_code)]
 
 enum E { A, B }
 
@@ -9,7 +11,8 @@ fn main() {
         E::A |
         E::B | //~ ERROR a trailing `|` is not allowed in an or-pattern
         if true => {
-            let recovery_witness: bool = 0; //~ ERROR mismatched types
+            let _recovery_witness: i32 = 0u32; //~ ERROR mismatched types
         }
+        _ => {}
     }
 }
diff --git a/tests/ui/or-patterns/issue-64879-trailing-before-guard.stderr b/tests/ui/or-patterns/issue-64879-trailing-before-guard.stderr
index 91db3d049f6..238c76080dc 100644
--- a/tests/ui/or-patterns/issue-64879-trailing-before-guard.stderr
+++ b/tests/ui/or-patterns/issue-64879-trailing-before-guard.stderr
@@ -1,24 +1,24 @@
 error: a trailing `|` is not allowed in an or-pattern
-  --> $DIR/issue-64879-trailing-before-guard.rs:10:14
+  --> $DIR/issue-64879-trailing-before-guard.rs:12:14
    |
 LL |         E::A |
    |         ---- while parsing this or-pattern starting here
 LL |         E::B |
    |              ^
+
+error[E0308]: mismatched types
+  --> $DIR/issue-64879-trailing-before-guard.rs:14:42
    |
-help: remove the `|`
+LL |             let _recovery_witness: i32 = 0u32;
+   |                                    ---   ^^^^ expected `i32`, found `u32`
+   |                                    |
+   |                                    expected due to this
    |
-LL -         E::B |
-LL +         E::B
+help: change the type of the numeric literal from `u32` to `i32`
    |
-
-error[E0308]: mismatched types
-  --> $DIR/issue-64879-trailing-before-guard.rs:12:42
+LL -             let _recovery_witness: i32 = 0u32;
+LL +             let _recovery_witness: i32 = 0i32;
    |
-LL |             let recovery_witness: bool = 0;
-   |                                   ----   ^ expected `bool`, found integer
-   |                                   |
-   |                                   expected due to this
 
 error: aborting due to 2 previous errors
 
diff --git a/tests/ui/or-patterns/remove-leading-vert.fixed b/tests/ui/or-patterns/remove-leading-vert.fixed
index 2851b8f18c5..aa7975dc508 100644
--- a/tests/ui/or-patterns/remove-leading-vert.fixed
+++ b/tests/ui/or-patterns/remove-leading-vert.fixed
@@ -23,26 +23,26 @@ fn leading() {
 
 #[cfg(false)]
 fn trailing() {
-    let ( A  ): E; //~ ERROR a trailing `|` is not allowed in an or-pattern
-    let (a ,): (E,); //~ ERROR a trailing `|` is not allowed in an or-pattern
-    let ( A | B  ): E; //~ ERROR a trailing `|` is not allowed in an or-pattern
-    let [ A | B  ]: [E; 1]; //~ ERROR a trailing `|` is not allowed in an or-pattern
-    let S { f: B  }; //~ ERROR a trailing `|` is not allowed in an or-pattern
-    let ( A | B  ): E; //~ ERROR unexpected token `||` in pattern
+    let ( A ): E; //~ ERROR a trailing `|` is not allowed in an or-pattern
+    let (a,): (E,); //~ ERROR a trailing `|` is not allowed in an or-pattern
+    let ( A | B ): E; //~ ERROR a trailing `|` is not allowed in an or-pattern
+    let [ A | B ]: [E; 1]; //~ ERROR a trailing `|` is not allowed in an or-pattern
+    let S { f: B }; //~ ERROR a trailing `|` is not allowed in an or-pattern
+    let ( A | B ): E; //~ ERROR unexpected token `||` in pattern
     //~^ ERROR a trailing `|` is not allowed in an or-pattern
     match A {
-        A  => {} //~ ERROR a trailing `|` is not allowed in an or-pattern
-        A  => {} //~ ERROR a trailing `|` is not allowed in an or-pattern
-        A | B  => {} //~ ERROR unexpected token `||` in pattern
+        A => {} //~ ERROR a trailing `|` is not allowed in an or-pattern
+        A => {} //~ ERROR a trailing `||` is not allowed in an or-pattern
+        A | B => {} //~ ERROR unexpected token `||` in pattern
         //~^ ERROR a trailing `|` is not allowed in an or-pattern
-        | A | B  => {}
+        | A | B => {}
         //~^ ERROR a trailing `|` is not allowed in an or-pattern
     }
 
     // These test trailing-vert in `let` bindings, but they also test that we don't emit a
     // duplicate suggestion that would confuse rustfix.
 
-    let a  : u8 = 0; //~ ERROR a trailing `|` is not allowed in an or-pattern
-    let a  = 0; //~ ERROR a trailing `|` is not allowed in an or-pattern
-    let a  ; //~ ERROR a trailing `|` is not allowed in an or-pattern
+    let a : u8 = 0; //~ ERROR a trailing `|` is not allowed in an or-pattern
+    let a = 0; //~ ERROR a trailing `|` is not allowed in an or-pattern
+    let a ; //~ ERROR a trailing `|` is not allowed in an or-pattern
 }
diff --git a/tests/ui/or-patterns/remove-leading-vert.rs b/tests/ui/or-patterns/remove-leading-vert.rs
index 1e1dbfbc6e6..1b4eb669fbb 100644
--- a/tests/ui/or-patterns/remove-leading-vert.rs
+++ b/tests/ui/or-patterns/remove-leading-vert.rs
@@ -32,7 +32,7 @@ fn trailing() {
     //~^ ERROR a trailing `|` is not allowed in an or-pattern
     match A {
         A | => {} //~ ERROR a trailing `|` is not allowed in an or-pattern
-        A || => {} //~ ERROR a trailing `|` is not allowed in an or-pattern
+        A || => {} //~ ERROR a trailing `||` is not allowed in an or-pattern
         A || B | => {} //~ ERROR unexpected token `||` in pattern
         //~^ ERROR a trailing `|` is not allowed in an or-pattern
         | A | B | => {}
diff --git a/tests/ui/or-patterns/remove-leading-vert.stderr b/tests/ui/or-patterns/remove-leading-vert.stderr
index 0323c64f042..29450153ba4 100644
--- a/tests/ui/or-patterns/remove-leading-vert.stderr
+++ b/tests/ui/or-patterns/remove-leading-vert.stderr
@@ -3,12 +3,6 @@ error: function parameters require top-level or-patterns in parentheses
    |
 LL |     fn fun1( | A: E) {}
    |              ^^^
-   |
-help: remove the `|`
-   |
-LL -     fn fun1( | A: E) {}
-LL +     fn fun1(  A: E) {}
-   |
 
 error: unexpected `||` before function parameter
   --> $DIR/remove-leading-vert.rs:12:14
@@ -78,12 +72,6 @@ LL |     let ( A | ): E;
    |           - ^
    |           |
    |           while parsing this or-pattern starting here
-   |
-help: remove the `|`
-   |
-LL -     let ( A | ): E;
-LL +     let ( A  ): E;
-   |
 
 error: a trailing `|` is not allowed in an or-pattern
   --> $DIR/remove-leading-vert.rs:27:12
@@ -92,12 +80,6 @@ LL |     let (a |,): (E,);
    |          - ^
    |          |
    |          while parsing this or-pattern starting here
-   |
-help: remove the `|`
-   |
-LL -     let (a |,): (E,);
-LL +     let (a ,): (E,);
-   |
 
 error: a trailing `|` is not allowed in an or-pattern
   --> $DIR/remove-leading-vert.rs:28:17
@@ -106,12 +88,6 @@ LL |     let ( A | B | ): E;
    |           -     ^
    |           |
    |           while parsing this or-pattern starting here
-   |
-help: remove the `|`
-   |
-LL -     let ( A | B | ): E;
-LL +     let ( A | B  ): E;
-   |
 
 error: a trailing `|` is not allowed in an or-pattern
   --> $DIR/remove-leading-vert.rs:29:17
@@ -120,12 +96,6 @@ LL |     let [ A | B | ]: [E; 1];
    |           -     ^
    |           |
    |           while parsing this or-pattern starting here
-   |
-help: remove the `|`
-   |
-LL -     let [ A | B | ]: [E; 1];
-LL +     let [ A | B  ]: [E; 1];
-   |
 
 error: a trailing `|` is not allowed in an or-pattern
   --> $DIR/remove-leading-vert.rs:30:18
@@ -134,12 +104,6 @@ LL |     let S { f: B | };
    |                - ^
    |                |
    |                while parsing this or-pattern starting here
-   |
-help: remove the `|`
-   |
-LL -     let S { f: B | };
-LL +     let S { f: B  };
-   |
 
 error: unexpected token `||` in pattern
   --> $DIR/remove-leading-vert.rs:31:13
@@ -162,12 +126,6 @@ LL |     let ( A || B | ): E;
    |           -      ^
    |           |
    |           while parsing this or-pattern starting here
-   |
-help: remove the `|`
-   |
-LL -     let ( A || B | ): E;
-LL +     let ( A || B  ): E;
-   |
 
 error: a trailing `|` is not allowed in an or-pattern
   --> $DIR/remove-leading-vert.rs:34:11
@@ -176,14 +134,8 @@ LL |         A | => {}
    |         - ^
    |         |
    |         while parsing this or-pattern starting here
-   |
-help: remove the `|`
-   |
-LL -         A | => {}
-LL +         A  => {}
-   |
 
-error: a trailing `|` is not allowed in an or-pattern
+error: a trailing `||` is not allowed in an or-pattern
   --> $DIR/remove-leading-vert.rs:35:11
    |
 LL |         A || => {}
@@ -192,11 +144,6 @@ LL |         A || => {}
    |         while parsing this or-pattern starting here
    |
    = note: alternatives in or-patterns are separated with `|`, not `||`
-help: remove the `||`
-   |
-LL -         A || => {}
-LL +         A  => {}
-   |
 
 error: unexpected token `||` in pattern
   --> $DIR/remove-leading-vert.rs:36:11
@@ -219,12 +166,6 @@ LL |         A || B | => {}
    |         -      ^
    |         |
    |         while parsing this or-pattern starting here
-   |
-help: remove the `|`
-   |
-LL -         A || B | => {}
-LL +         A || B  => {}
-   |
 
 error: a trailing `|` is not allowed in an or-pattern
   --> $DIR/remove-leading-vert.rs:38:17
@@ -233,12 +174,6 @@ LL |         | A | B | => {}
    |         -       ^
    |         |
    |         while parsing this or-pattern starting here
-   |
-help: remove the `|`
-   |
-LL -         | A | B | => {}
-LL +         | A | B  => {}
-   |
 
 error: a trailing `|` is not allowed in an or-pattern
   --> $DIR/remove-leading-vert.rs:45:11
@@ -247,12 +182,6 @@ LL |     let a | : u8 = 0;
    |         - ^
    |         |
    |         while parsing this or-pattern starting here
-   |
-help: remove the `|`
-   |
-LL -     let a | : u8 = 0;
-LL +     let a  : u8 = 0;
-   |
 
 error: a trailing `|` is not allowed in an or-pattern
   --> $DIR/remove-leading-vert.rs:46:11
@@ -261,12 +190,6 @@ LL |     let a | = 0;
    |         - ^
    |         |
    |         while parsing this or-pattern starting here
-   |
-help: remove the `|`
-   |
-LL -     let a | = 0;
-LL +     let a  = 0;
-   |
 
 error: a trailing `|` is not allowed in an or-pattern
   --> $DIR/remove-leading-vert.rs:47:11
@@ -275,12 +198,6 @@ LL |     let a | ;
    |         - ^
    |         |
    |         while parsing this or-pattern starting here
-   |
-help: remove the `|`
-   |
-LL -     let a | ;
-LL +     let a  ;
-   |
 
 error: aborting due to 21 previous errors
 
diff --git a/tests/ui/proc-macro/proc-macro-attributes.stderr b/tests/ui/proc-macro/proc-macro-attributes.stderr
index 2cc57383eb3..892728901fb 100644
--- a/tests/ui/proc-macro/proc-macro-attributes.stderr
+++ b/tests/ui/proc-macro/proc-macro-attributes.stderr
@@ -2,7 +2,13 @@ error: cannot find attribute `C` in this scope
   --> $DIR/proc-macro-attributes.rs:9:3
    |
 LL | #[C]
-   |   ^ help: a derive helper attribute with a similar name exists: `B`
+   |   ^
+   |
+help: the derive macro `B` accepts the similarly named `B` attribute
+   |
+LL - #[C]
+LL + #[B]
+   |
 
 error[E0659]: `B` is ambiguous
   --> $DIR/proc-macro-attributes.rs:6:3
diff --git a/tests/ui/resolve/extern-prelude-speculative.rs b/tests/ui/resolve/extern-prelude-speculative.rs
new file mode 100644
index 00000000000..afbc32d22ac
--- /dev/null
+++ b/tests/ui/resolve/extern-prelude-speculative.rs
@@ -0,0 +1,10 @@
+// Non-existent path in `--extern` doesn't result in an error if it's shadowed by `extern crate`.
+
+//@ check-pass
+//@ compile-flags: --extern something=/path/to/nowhere
+
+extern crate std as something;
+
+fn main() {
+    something::println!();
+}
diff --git a/tests/ui/resolve/visibility-indeterminate.rs b/tests/ui/resolve/visibility-indeterminate.rs
index 17e5fec4701..181bb290774 100644
--- a/tests/ui/resolve/visibility-indeterminate.rs
+++ b/tests/ui/resolve/visibility-indeterminate.rs
@@ -2,6 +2,6 @@
 
 foo!(); //~ ERROR cannot find macro `foo` in this scope
 
-pub(in ::bar) struct Baz {} //~ ERROR cannot determine resolution for the visibility
+pub(in ::bar) struct Baz {} //~ ERROR failed to resolve: could not find `bar` in the list of imported crates
 
 fn main() {}
diff --git a/tests/ui/resolve/visibility-indeterminate.stderr b/tests/ui/resolve/visibility-indeterminate.stderr
index 84d82ce8522..bbe28747f7c 100644
--- a/tests/ui/resolve/visibility-indeterminate.stderr
+++ b/tests/ui/resolve/visibility-indeterminate.stderr
@@ -1,8 +1,8 @@
-error[E0578]: cannot determine resolution for the visibility
-  --> $DIR/visibility-indeterminate.rs:5:8
+error[E0433]: failed to resolve: could not find `bar` in the list of imported crates
+  --> $DIR/visibility-indeterminate.rs:5:10
    |
 LL | pub(in ::bar) struct Baz {}
-   |        ^^^^^
+   |          ^^^ could not find `bar` in the list of imported crates
 
 error: cannot find macro `foo` in this scope
   --> $DIR/visibility-indeterminate.rs:3:1
@@ -12,4 +12,4 @@ LL | foo!();
 
 error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0578`.
+For more information about this error, try `rustc --explain E0433`.
diff --git a/tests/ui/rfcs/rfc-0000-never_patterns/ICE-130779-never-arm-no-oatherwise-block.stderr b/tests/ui/rfcs/rfc-0000-never_patterns/ICE-130779-never-arm-no-oatherwise-block.stderr
index 26731e29ffc..5f4a5f31e34 100644
--- a/tests/ui/rfcs/rfc-0000-never_patterns/ICE-130779-never-arm-no-oatherwise-block.stderr
+++ b/tests/ui/rfcs/rfc-0000-never_patterns/ICE-130779-never-arm-no-oatherwise-block.stderr
@@ -5,12 +5,6 @@ LL |         ! |
    |         - ^
    |         |
    |         while parsing this or-pattern starting here
-   |
-help: remove the `|`
-   |
-LL -         ! |
-LL +         !
-   |
 
 error: a never pattern is always unreachable
   --> $DIR/ICE-130779-never-arm-no-oatherwise-block.rs:10:20
diff --git a/tests/ui/rust-2018/uniform-paths/deadlock.rs b/tests/ui/rust-2018/uniform-paths/deadlock.rs
index 4011ba3ee28..d2296c51bdd 100644
--- a/tests/ui/rust-2018/uniform-paths/deadlock.rs
+++ b/tests/ui/rust-2018/uniform-paths/deadlock.rs
@@ -2,7 +2,7 @@
 //@ compile-flags:--extern foo --extern bar
 
 use bar::foo; //~ ERROR can't find crate for `bar`
-use foo::bar; //~ ERROR can't find crate for `foo`
+use foo::bar;
 //~^^ ERROR unresolved imports `bar::foo`, `foo::bar`
 
 fn main() {}
diff --git a/tests/ui/rust-2018/uniform-paths/deadlock.stderr b/tests/ui/rust-2018/uniform-paths/deadlock.stderr
index 8b9863948bd..c50bc16ac55 100644
--- a/tests/ui/rust-2018/uniform-paths/deadlock.stderr
+++ b/tests/ui/rust-2018/uniform-paths/deadlock.stderr
@@ -4,12 +4,6 @@ error[E0463]: can't find crate for `bar`
 LL | use bar::foo;
    |     ^^^ can't find crate
 
-error[E0463]: can't find crate for `foo`
-  --> $DIR/deadlock.rs:5:5
-   |
-LL | use foo::bar;
-   |     ^^^ can't find crate
-
 error[E0432]: unresolved imports `bar::foo`, `foo::bar`
   --> $DIR/deadlock.rs:4:5
    |
@@ -18,7 +12,7 @@ LL | use bar::foo;
 LL | use foo::bar;
    |     ^^^^^^^^
 
-error: aborting due to 3 previous errors
+error: aborting due to 2 previous errors
 
 Some errors have detailed explanations: E0432, E0463.
 For more information about an error, try `rustc --explain E0432`.
diff --git a/tests/ui/target-feature/gate.rs b/tests/ui/target-feature/gate.rs
index 81ed8b3de76..fc3763820cb 100644
--- a/tests/ui/target-feature/gate.rs
+++ b/tests/ui/target-feature/gate.rs
@@ -1,18 +1,12 @@
 //@ only-x86_64
 //
-// gate-test-sse4a_target_feature
 // gate-test-powerpc_target_feature
-// gate-test-tbm_target_feature
 // gate-test-arm_target_feature
 // gate-test-hexagon_target_feature
 // gate-test-mips_target_feature
 // gate-test-nvptx_target_feature
 // gate-test-wasm_target_feature
-// gate-test-adx_target_feature
-// gate-test-cmpxchg16b_target_feature
-// gate-test-movbe_target_feature
 // gate-test-rtm_target_feature
-// gate-test-f16c_target_feature
 // gate-test-riscv_target_feature
 // gate-test-ermsb_target_feature
 // gate-test-bpf_target_feature
diff --git a/tests/ui/target-feature/gate.stderr b/tests/ui/target-feature/gate.stderr
index 3e9374be73d..345dc2006d0 100644
--- a/tests/ui/target-feature/gate.stderr
+++ b/tests/ui/target-feature/gate.stderr
@@ -1,5 +1,5 @@
 error[E0658]: the target feature `x87` is currently unstable
-  --> $DIR/gate.rs:30:18
+  --> $DIR/gate.rs:24:18
    |
 LL | #[target_feature(enable = "x87")]
    |                  ^^^^^^^^^^^^^^
diff --git a/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.rs b/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.rs
new file mode 100644
index 00000000000..cfe167cf88d
--- /dev/null
+++ b/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.rs
@@ -0,0 +1,26 @@
+// Suppress the suggestion that adding a wrapper.
+// When expected_ty and expr_ty are the same ADT,
+// we prefer to compare their internal generic params,
+// so when the current variant corresponds to an unresolved infer,
+// the suggestion is rejected.
+// e.g. `Ok(Some("hi"))` is type of `Result<Option<&str>, _>`,
+// where `E` is still an unresolved inference variable.
+
+fn foo() -> Result<Option<String>, ()> {
+    todo!()
+}
+
+#[derive(PartialEq, Debug)]
+enum Bar<T, E> {
+    A(T),
+    B(E),
+}
+
+fn bar() -> Bar<String, ()> {
+    todo!()
+}
+
+fn main() {
+    assert_eq!(Ok(Some("hi")), foo()); //~ ERROR mismatched types [E0308]
+    assert_eq!(Bar::A("hi"), bar()); //~ ERROR mismatched types [E0308]
+}
diff --git a/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.stderr b/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.stderr
new file mode 100644
index 00000000000..5e4ad132210
--- /dev/null
+++ b/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.stderr
@@ -0,0 +1,21 @@
+error[E0308]: mismatched types
+  --> $DIR/suggest-add-wrapper-issue-145294.rs:24:32
+   |
+LL |     assert_eq!(Ok(Some("hi")), foo());
+   |                                ^^^^^ expected `Result<Option<&str>, _>`, found `Result<Option<String>, ()>`
+   |
+   = note: expected enum `Result<Option<&str>, _>`
+              found enum `Result<Option<String>, ()>`
+
+error[E0308]: mismatched types
+  --> $DIR/suggest-add-wrapper-issue-145294.rs:25:30
+   |
+LL |     assert_eq!(Bar::A("hi"), bar());
+   |                              ^^^^^ expected `Bar<&str, _>`, found `Bar<String, ()>`
+   |
+   = note: expected enum `Bar<&str, _>`
+              found enum `Bar<String, ()>`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0308`.