about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/codegen/simd-intrinsic/simd-intrinsic-float-pow.rs87
-rw-r--r--tests/codegen/simd-intrinsic/simd-intrinsic-float-powi.rs87
-rw-r--r--tests/run-make/include-all-symbols-linking/lib.rs3
-rw-r--r--tests/run-make/include-all-symbols-linking/rmake.rs15
-rw-r--r--tests/rustdoc-gui/code-example-buttons.goml2
-rw-r--r--tests/rustdoc-gui/copy-path.goml9
-rw-r--r--tests/rustdoc/inline_local/staged-inline.rs28
-rw-r--r--tests/ui/attributes/auxiliary/used_pre_main_constructor.rs32
-rw-r--r--tests/ui/attributes/used_with_archive.rs16
-rw-r--r--tests/ui/attributes/used_with_archive.run.stdout2
-rw-r--r--tests/ui/did_you_mean/recursion_limit_deref.stderr6
-rw-r--r--tests/ui/drop/lint-if-let-rescope-false-positives.rs33
-rw-r--r--tests/ui/drop/lint-if-let-rescope.fixed6
-rw-r--r--tests/ui/drop/lint-if-let-rescope.rs6
-rw-r--r--tests/ui/drop/lint-if-let-rescope.stderr23
-rw-r--r--tests/ui/force-inlining/gate.rs4
-rw-r--r--tests/ui/force-inlining/gate.stderr4
-rw-r--r--tests/ui/invalid/issue-114435-layout-type-err.rs7
-rw-r--r--tests/ui/invalid/issue-114435-layout-type-err.stderr4
-rw-r--r--tests/ui/proc-macro/derive-cfg-nested-tokens.rs23
-rw-r--r--tests/ui/proc-macro/derive-cfg-nested-tokens.stdout149
-rw-r--r--tests/ui/simd/intrinsic/float-math-pass.rs25
-rw-r--r--tests/ui/simd/intrinsic/generic-arithmetic-pass.rs2
-rw-r--r--tests/ui/simd/intrinsic/generic-cast-pass.rs2
-rw-r--r--tests/ui/simd/intrinsic/generic-comparison-pass.rs18
-rw-r--r--tests/ui/simd/intrinsic/generic-elements-pass.rs2
-rw-r--r--tests/ui/simd/issue-32947.rs5
-rw-r--r--tests/ui/simd/issue-39720.rs1
-rw-r--r--tests/ui/traits/solver-cycles/129541-recursive-struct.multiple.stderr6
-rw-r--r--tests/ui/traits/solver-cycles/129541-recursive-struct.rs2
-rw-r--r--tests/ui/traits/solver-cycles/129541-recursive-struct.unique.stderr6
-rw-r--r--tests/ui/traits/trivial_impl_sized.rs24
-rw-r--r--tests/ui/traits/trivial_impl_sized.stderr24
-rw-r--r--tests/ui/typeck/auxiliary/derive-demo-issue-136343.rs7
-rw-r--r--tests/ui/typeck/invalid-sugg-for-derive-macro-issue-136343.rs9
-rw-r--r--tests/ui/typeck/invalid-sugg-for-derive-macro-issue-136343.stderr19
36 files changed, 451 insertions, 247 deletions
diff --git a/tests/codegen/simd-intrinsic/simd-intrinsic-float-pow.rs b/tests/codegen/simd-intrinsic/simd-intrinsic-float-pow.rs
deleted file mode 100644
index 3527f71c00b..00000000000
--- a/tests/codegen/simd-intrinsic/simd-intrinsic-float-pow.rs
+++ /dev/null
@@ -1,87 +0,0 @@
-//@ compile-flags: -C no-prepopulate-passes
-
-#![crate_type = "lib"]
-
-#![feature(repr_simd, intrinsics)]
-#![allow(non_camel_case_types)]
-
-#[repr(simd)]
-#[derive(Copy, Clone, PartialEq, Debug)]
-pub struct f32x2(pub [f32; 2]);
-
-#[repr(simd)]
-#[derive(Copy, Clone, PartialEq, Debug)]
-pub struct f32x4(pub [f32; 4]);
-
-#[repr(simd)]
-#[derive(Copy, Clone, PartialEq, Debug)]
-pub struct f32x8(pub [f32; 8]);
-
-#[repr(simd)]
-#[derive(Copy, Clone, PartialEq, Debug)]
-pub struct f32x16(pub [f32; 16]);
-
-extern "rust-intrinsic" {
-    fn simd_fpow<T>(x: T, b: T) -> T;
-}
-
-// CHECK-LABEL: @fpow_32x2
-#[no_mangle]
-pub unsafe fn fpow_32x2(a: f32x2, b: f32x2) -> f32x2 {
-    // CHECK: call <2 x float> @llvm.pow.v2f32
-    simd_fpow(a, b)
-}
-
-// CHECK-LABEL: @fpow_32x4
-#[no_mangle]
-pub unsafe fn fpow_32x4(a: f32x4, b: f32x4) -> f32x4 {
-    // CHECK: call <4 x float> @llvm.pow.v4f32
-    simd_fpow(a, b)
-}
-
-// CHECK-LABEL: @fpow_32x8
-#[no_mangle]
-pub unsafe fn fpow_32x8(a: f32x8, b: f32x8) -> f32x8 {
-    // CHECK: call <8 x float> @llvm.pow.v8f32
-    simd_fpow(a, b)
-}
-
-// CHECK-LABEL: @fpow_32x16
-#[no_mangle]
-pub unsafe fn fpow_32x16(a: f32x16, b: f32x16) -> f32x16 {
-    // CHECK: call <16 x float> @llvm.pow.v16f32
-    simd_fpow(a, b)
-}
-
-#[repr(simd)]
-#[derive(Copy, Clone, PartialEq, Debug)]
-pub struct f64x2(pub [f64; 2]);
-
-#[repr(simd)]
-#[derive(Copy, Clone, PartialEq, Debug)]
-pub struct f64x4(pub [f64; 4]);
-
-#[repr(simd)]
-#[derive(Copy, Clone, PartialEq, Debug)]
-pub struct f64x8(pub [f64; 8]);
-
-// CHECK-LABEL: @fpow_64x4
-#[no_mangle]
-pub unsafe fn fpow_64x4(a: f64x4, b: f64x4) -> f64x4 {
-    // CHECK: call <4 x double> @llvm.pow.v4f64
-    simd_fpow(a, b)
-}
-
-// CHECK-LABEL: @fpow_64x2
-#[no_mangle]
-pub unsafe fn fpow_64x2(a: f64x2, b: f64x2) -> f64x2 {
-    // CHECK: call <2 x double> @llvm.pow.v2f64
-    simd_fpow(a, b)
-}
-
-// CHECK-LABEL: @fpow_64x8
-#[no_mangle]
-pub unsafe fn fpow_64x8(a: f64x8, b: f64x8) -> f64x8 {
-    // CHECK: call <8 x double> @llvm.pow.v8f64
-    simd_fpow(a, b)
-}
diff --git a/tests/codegen/simd-intrinsic/simd-intrinsic-float-powi.rs b/tests/codegen/simd-intrinsic/simd-intrinsic-float-powi.rs
deleted file mode 100644
index 4f0b5e4e01a..00000000000
--- a/tests/codegen/simd-intrinsic/simd-intrinsic-float-powi.rs
+++ /dev/null
@@ -1,87 +0,0 @@
-//@ compile-flags: -C no-prepopulate-passes
-
-#![crate_type = "lib"]
-
-#![feature(repr_simd, intrinsics)]
-#![allow(non_camel_case_types)]
-
-#[repr(simd)]
-#[derive(Copy, Clone, PartialEq, Debug)]
-pub struct f32x2(pub [f32; 2]);
-
-#[repr(simd)]
-#[derive(Copy, Clone, PartialEq, Debug)]
-pub struct f32x4(pub [f32; 4]);
-
-#[repr(simd)]
-#[derive(Copy, Clone, PartialEq, Debug)]
-pub struct f32x8(pub [f32; 8]);
-
-#[repr(simd)]
-#[derive(Copy, Clone, PartialEq, Debug)]
-pub struct f32x16(pub [f32; 16]);
-
-extern "rust-intrinsic" {
-    fn simd_fpowi<T>(x: T, b: i32) -> T;
-}
-
-// CHECK-LABEL: @fpowi_32x2
-#[no_mangle]
-pub unsafe fn fpowi_32x2(a: f32x2, b: i32) -> f32x2 {
-    // CHECK: call <2 x float> @llvm.powi.v2f32
-    simd_fpowi(a, b)
-}
-
-// CHECK-LABEL: @fpowi_32x4
-#[no_mangle]
-pub unsafe fn fpowi_32x4(a: f32x4, b: i32) -> f32x4 {
-    // CHECK: call <4 x float> @llvm.powi.v4f32
-    simd_fpowi(a, b)
-}
-
-// CHECK-LABEL: @fpowi_32x8
-#[no_mangle]
-pub unsafe fn fpowi_32x8(a: f32x8, b: i32) -> f32x8 {
-    // CHECK: call <8 x float> @llvm.powi.v8f32
-    simd_fpowi(a, b)
-}
-
-// CHECK-LABEL: @fpowi_32x16
-#[no_mangle]
-pub unsafe fn fpowi_32x16(a: f32x16, b: i32) -> f32x16 {
-    // CHECK: call <16 x float> @llvm.powi.v16f32
-    simd_fpowi(a, b)
-}
-
-#[repr(simd)]
-#[derive(Copy, Clone, PartialEq, Debug)]
-pub struct f64x2(pub [f64; 2]);
-
-#[repr(simd)]
-#[derive(Copy, Clone, PartialEq, Debug)]
-pub struct f64x4(pub [f64; 4]);
-
-#[repr(simd)]
-#[derive(Copy, Clone, PartialEq, Debug)]
-pub struct f64x8(pub [f64; 8]);
-
-// CHECK-LABEL: @fpowi_64x4
-#[no_mangle]
-pub unsafe fn fpowi_64x4(a: f64x4, b: i32) -> f64x4 {
-    // CHECK: call <4 x double> @llvm.powi.v4f64
-    simd_fpowi(a, b)
-}
-
-// CHECK-LABEL: @fpowi_64x2
-#[no_mangle]
-pub unsafe fn fpowi_64x2(a: f64x2, b: i32) -> f64x2 {
-    // CHECK: call <2 x double> @llvm.powi.v2f64
-    simd_fpowi(a, b)
-}
-
-// CHECK-LABEL: @fpowi_64x8
-#[no_mangle]
-pub unsafe fn fpowi_64x8(a: f64x8, b: i32) -> f64x8 {
-    // CHECK: call <8 x double> @llvm.powi.v8f64
-    simd_fpowi(a, b)
-}
diff --git a/tests/run-make/include-all-symbols-linking/lib.rs b/tests/run-make/include-all-symbols-linking/lib.rs
index 99508bcdaf3..73186ee99e3 100644
--- a/tests/run-make/include-all-symbols-linking/lib.rs
+++ b/tests/run-make/include-all-symbols-linking/lib.rs
@@ -1,5 +1,6 @@
 mod foo {
-    #[link_section = ".rodata.STATIC"]
+    #[cfg_attr(target_os = "linux", link_section = ".rodata.STATIC")]
+    #[cfg_attr(target_vendor = "apple", link_section = "__DATA,STATIC")]
     #[used]
     static STATIC: [u32; 10] = [1; 10];
 }
diff --git a/tests/run-make/include-all-symbols-linking/rmake.rs b/tests/run-make/include-all-symbols-linking/rmake.rs
index 77fd71ab20d..bab510fb5be 100644
--- a/tests/run-make/include-all-symbols-linking/rmake.rs
+++ b/tests/run-make/include-all-symbols-linking/rmake.rs
@@ -7,15 +7,20 @@
 // See https://github.com/rust-lang/rust/pull/95604
 // See https://github.com/rust-lang/rust/issues/47384
 
-//@ only-linux
-// Reason: differences in object file formats on OSX and Windows
-// causes errors in the llvm_objdump step
+//@ ignore-wasm differences in object file formats causes errors in the llvm_objdump step.
+//@ ignore-windows differences in object file formats causes errors in the llvm_objdump step.
 
-use run_make_support::{dynamic_lib_name, llvm_objdump, llvm_readobj, rustc};
+use run_make_support::{dynamic_lib_name, llvm_objdump, llvm_readobj, rustc, target};
 
 fn main() {
     rustc().crate_type("lib").input("lib.rs").run();
-    rustc().crate_type("cdylib").link_args("-Tlinker.ld").input("main.rs").run();
+    let mut main = rustc();
+    main.crate_type("cdylib");
+    if target().contains("linux") {
+        main.link_args("-Tlinker.ld");
+    }
+    main.input("main.rs").run();
+
     // Ensure `#[used]` and `KEEP`-ed section is there
     llvm_objdump()
         .arg("--full-contents")
diff --git a/tests/rustdoc-gui/code-example-buttons.goml b/tests/rustdoc-gui/code-example-buttons.goml
index c62683b45da..b96f6ddcc37 100644
--- a/tests/rustdoc-gui/code-example-buttons.goml
+++ b/tests/rustdoc-gui/code-example-buttons.goml
@@ -26,6 +26,8 @@ click: ".example-wrap .copy-button"
 move-cursor-to: ".search-input"
 assert-count: (".example-wrap:not(:hover) .button-holder.keep-visible", 0)
 assert-css: (".example-wrap .copy-button", { "visibility": "hidden" })
+// Since we clicked on the copy button, the clipboard content should have been updated.
+assert-clipboard: 'println!("nothing fancy");\nprintln!("but with two lines!");'
 
 define-function: (
     "check-buttons",
diff --git a/tests/rustdoc-gui/copy-path.goml b/tests/rustdoc-gui/copy-path.goml
index dc05b96f7ae..e8766688f8d 100644
--- a/tests/rustdoc-gui/copy-path.goml
+++ b/tests/rustdoc-gui/copy-path.goml
@@ -1,12 +1,17 @@
 // Checks that the "copy path" button is not triggering JS error and its display
-// isn't broken.
-go-to: "file://" + |DOC_PATH| + "/test_docs/fn.foo.html"
+// isn't broken and the copied path is as expected.
+go-to: "file://" + |DOC_PATH| + "/test_docs/foreign_impl_order/trait.Foo.html"
+
+// We ensure that the clipboard is empty.
+assert-clipboard: ""
 
 // First we store the size of the button before we click on it.
 store-size: ("#copy-path", {"width": width, "height": height})
 click: "#copy-path"
 // We wait for the new text to appear.
 wait-for: "#copy-path.clicked"
+// We check that the clipboard value is the expected one.
+assert-clipboard: "test_docs::foreign_impl_order::Foo"
 // We check that the size didn't change.
 assert-size: ("#copy-path.clicked", {"width": |width|, "height": |height|})
 // We wait for the button to turn back to its original state.
diff --git a/tests/rustdoc/inline_local/staged-inline.rs b/tests/rustdoc/inline_local/staged-inline.rs
index f2131ad5f94..d0dc3f9eea7 100644
--- a/tests/rustdoc/inline_local/staged-inline.rs
+++ b/tests/rustdoc/inline_local/staged-inline.rs
@@ -16,3 +16,31 @@ pub mod ffi {
 //@ has "foo/struct.CStr.html" "//span[@class='sub-heading']/span[@class='since']" "1.0.0"
 //@ !has - "//span[@class='sub-heading']/span[@class='since']" "1.99.0"
 pub use ffi::CStr;
+
+// https://github.com/rust-lang/rust/issues/137141
+#[stable(feature = "futures_api", since = "1.36.0")]
+//@ has "foo/task/index.html" "//span[@class='sub-heading']/span[@class='since']" "1.36.0"
+//@ !has - "//span[@class='sub-heading']/span[@class='since']" "1.0.0"
+pub mod task {
+
+    #[doc(inline)]
+    #[stable(feature = "futures_api", since = "1.36.0")]
+    //@ has "foo/task/index.html" "//span[@class='sub-heading']/span[@class='since']" "1.36.0"
+    //@ has "foo/task/ready/index.html" "//span[@class='sub-heading']/span[@class='since']" "1.64.0"
+    pub use core::task::*;
+}
+
+#[stable(feature = "futures_api", since = "1.36.0")]
+//@ has "foo/core/index.html" "//span[@class='sub-heading']/span[@class='since']" "1.36.0"
+//@ !has - "//span[@class='sub-heading']/span[@class='since']" "1.0.0"
+pub mod core {
+    #[stable(feature = "futures_api", since = "1.36.0")]
+    //@ has "foo/core/task/index.html" "//span[@class='sub-heading']/span[@class='since']" "1.36.0"
+    pub mod task {
+
+        #[stable(feature = "ready_macro", since = "1.64.0")]
+        //@ has "foo/core/task/ready/index.html" "//span[@class='sub-heading']/span[@class='since']" "1.64.0"
+        pub mod ready {
+        }
+    }
+}
diff --git a/tests/ui/attributes/auxiliary/used_pre_main_constructor.rs b/tests/ui/attributes/auxiliary/used_pre_main_constructor.rs
new file mode 100644
index 00000000000..686dcb277f8
--- /dev/null
+++ b/tests/ui/attributes/auxiliary/used_pre_main_constructor.rs
@@ -0,0 +1,32 @@
+//! Add a constructor that runs pre-main, similar to what the `ctor` crate does.
+//!
+//! #[ctor]
+//! fn constructor() {
+//!     println!("constructor");
+//! }
+
+//@ no-prefer-dynamic explicitly test with crates that are built as an archive
+#![crate_type = "rlib"]
+
+#[cfg_attr(
+    any(
+        target_os = "linux",
+        target_os = "android",
+        target_os = "freebsd",
+        target_os = "netbsd",
+        target_os = "openbsd",
+        target_os = "dragonfly",
+        target_os = "illumos",
+        target_os = "haiku"
+    ),
+    link_section = ".init_array"
+)]
+#[cfg_attr(target_vendor = "apple", link_section = "__DATA,__mod_init_func,mod_init_funcs")]
+#[cfg_attr(target_os = "windows", link_section = ".CRT$XCU")]
+#[used]
+static CONSTRUCTOR: extern "C" fn() = constructor;
+
+#[cfg_attr(any(target_os = "linux", target_os = "android"), link_section = ".text.startup")]
+extern "C" fn constructor() {
+    println!("constructor");
+}
diff --git a/tests/ui/attributes/used_with_archive.rs b/tests/ui/attributes/used_with_archive.rs
new file mode 100644
index 00000000000..ff29456b87d
--- /dev/null
+++ b/tests/ui/attributes/used_with_archive.rs
@@ -0,0 +1,16 @@
+//! Ensure that `#[used]` in archives are correctly registered.
+//!
+//! Regression test for https://github.com/rust-lang/rust/issues/133491.
+
+//@ run-pass
+//@ check-run-results
+//@ aux-build: used_pre_main_constructor.rs
+
+//@ ignore-wasm ctor doesn't work on WASM
+
+// Make sure `rustc` links the archive, but intentionally do not import/use any items.
+extern crate used_pre_main_constructor as _;
+
+fn main() {
+    println!("main");
+}
diff --git a/tests/ui/attributes/used_with_archive.run.stdout b/tests/ui/attributes/used_with_archive.run.stdout
new file mode 100644
index 00000000000..212372b3e57
--- /dev/null
+++ b/tests/ui/attributes/used_with_archive.run.stdout
@@ -0,0 +1,2 @@
+constructor
+main
diff --git a/tests/ui/did_you_mean/recursion_limit_deref.stderr b/tests/ui/did_you_mean/recursion_limit_deref.stderr
index b0c493faf1e..23341ec6bdc 100644
--- a/tests/ui/did_you_mean/recursion_limit_deref.stderr
+++ b/tests/ui/did_you_mean/recursion_limit_deref.stderr
@@ -1,3 +1,7 @@
+error: reached the recursion limit finding the struct tail for `K`
+   |
+   = help: consider increasing the recursion limit by adding a `#![recursion_limit = "20"]`
+
 error: reached the recursion limit finding the struct tail for `Bottom`
    |
    = help: consider increasing the recursion limit by adding a `#![recursion_limit = "20"]`
@@ -21,7 +25,7 @@ LL |     let x: &Bottom = &t;
    = note: expected reference `&Bottom`
               found reference `&Top`
 
-error: aborting due to 3 previous errors
+error: aborting due to 4 previous errors
 
 Some errors have detailed explanations: E0055, E0308.
 For more information about an error, try `rustc --explain E0055`.
diff --git a/tests/ui/drop/lint-if-let-rescope-false-positives.rs b/tests/ui/drop/lint-if-let-rescope-false-positives.rs
new file mode 100644
index 00000000000..77b7df4bc3b
--- /dev/null
+++ b/tests/ui/drop/lint-if-let-rescope-false-positives.rs
@@ -0,0 +1,33 @@
+//@ edition: 2021
+//@ check-pass
+
+#![deny(if_let_rescope)]
+
+struct Drop;
+impl std::ops::Drop for Drop {
+    fn drop(&mut self) {
+        println!("drop")
+    }
+}
+
+impl Drop {
+    fn as_ref(&self) -> Option<i32> {
+        Some(1)
+    }
+}
+
+fn consume(_: impl Sized) -> Option<i32> { Some(1) }
+
+fn main() {
+    let drop = Drop;
+
+    // Make sure we don't drop if we don't actually make a temporary.
+    if let None = drop.as_ref() {} else {}
+
+    // Make sure we don't lint if we consume the droppy value.
+    if let None = consume(Drop) {} else {}
+
+    // Make sure we don't lint on field exprs of place exprs.
+    let tup_place = (Drop, ());
+    if let None = consume(tup_place.1) {} else {}
+}
diff --git a/tests/ui/drop/lint-if-let-rescope.fixed b/tests/ui/drop/lint-if-let-rescope.fixed
index 182190aa323..79858e6f225 100644
--- a/tests/ui/drop/lint-if-let-rescope.fixed
+++ b/tests/ui/drop/lint-if-let-rescope.fixed
@@ -94,6 +94,12 @@ fn main() {
         //~| HELP: a `match` with a single arm can preserve the drop order up to Edition 2021
     }
 
+    match Some((droppy(), ()).1) { Some(_value) => {} _ => {}}
+    //~^ ERROR: `if let` assigns a shorter lifetime since Edition 2024
+    //~| WARN: this changes meaning in Rust 2024
+    //~| HELP: the value is now dropped here in Edition 2024
+    //~| HELP: a `match` with a single arm can preserve the drop order up to Edition 2021
+
     // We want to keep the `if let`s below as direct descendents of match arms,
     // so the formatting is suppressed.
     #[rustfmt::skip]
diff --git a/tests/ui/drop/lint-if-let-rescope.rs b/tests/ui/drop/lint-if-let-rescope.rs
index e1b38be0a0f..9d873c65426 100644
--- a/tests/ui/drop/lint-if-let-rescope.rs
+++ b/tests/ui/drop/lint-if-let-rescope.rs
@@ -94,6 +94,12 @@ fn main() {
         //~| HELP: a `match` with a single arm can preserve the drop order up to Edition 2021
     }
 
+    if let Some(_value) = Some((droppy(), ()).1) {} else {}
+    //~^ ERROR: `if let` assigns a shorter lifetime since Edition 2024
+    //~| WARN: this changes meaning in Rust 2024
+    //~| HELP: the value is now dropped here in Edition 2024
+    //~| HELP: a `match` with a single arm can preserve the drop order up to Edition 2021
+
     // We want to keep the `if let`s below as direct descendents of match arms,
     // so the formatting is suppressed.
     #[rustfmt::skip]
diff --git a/tests/ui/drop/lint-if-let-rescope.stderr b/tests/ui/drop/lint-if-let-rescope.stderr
index 2b0fcb7a938..b17239976cc 100644
--- a/tests/ui/drop/lint-if-let-rescope.stderr
+++ b/tests/ui/drop/lint-if-let-rescope.stderr
@@ -175,5 +175,26 @@ LL -     while (if let Some(_value) = droppy().get() { false } else { true }) {
 LL +     while (match droppy().get() { Some(_value) => { false } _ => { true }}) {
    |
 
-error: aborting due to 7 previous errors
+error: `if let` assigns a shorter lifetime since Edition 2024
+  --> $DIR/lint-if-let-rescope.rs:97:8
+   |
+LL |     if let Some(_value) = Some((droppy(), ()).1) {} else {}
+   |        ^^^^^^^^^^^^^^^^^^^^^^^^--------------^^^
+   |                                |
+   |                                this value has a significant drop implementation which may observe a major change in drop order and requires your discretion
+   |
+   = warning: this changes meaning in Rust 2024
+   = note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2024/temporary-if-let-scope.html>
+help: the value is now dropped here in Edition 2024
+  --> $DIR/lint-if-let-rescope.rs:97:51
+   |
+LL |     if let Some(_value) = Some((droppy(), ()).1) {} else {}
+   |                                                   ^
+help: a `match` with a single arm can preserve the drop order up to Edition 2021
+   |
+LL -     if let Some(_value) = Some((droppy(), ()).1) {} else {}
+LL +     match Some((droppy(), ()).1) { Some(_value) => {} _ => {}}
+   |
+
+error: aborting due to 8 previous errors
 
diff --git a/tests/ui/force-inlining/gate.rs b/tests/ui/force-inlining/gate.rs
index d6a01a74a44..cea094c14f2 100644
--- a/tests/ui/force-inlining/gate.rs
+++ b/tests/ui/force-inlining/gate.rs
@@ -2,11 +2,11 @@
 #![allow(internal_features)]
 
 #[rustc_force_inline]
-//~^ ERROR #![rustc_force_inline] forces a free function to be inlined
+//~^ ERROR #[rustc_force_inline] forces a free function to be inlined
 pub fn bare() {
 }
 
 #[rustc_force_inline = "the test requires it"]
-//~^ ERROR #![rustc_force_inline] forces a free function to be inlined
+//~^ ERROR #[rustc_force_inline] forces a free function to be inlined
 pub fn justified() {
 }
diff --git a/tests/ui/force-inlining/gate.stderr b/tests/ui/force-inlining/gate.stderr
index e3973a08c23..964d43fa18f 100644
--- a/tests/ui/force-inlining/gate.stderr
+++ b/tests/ui/force-inlining/gate.stderr
@@ -1,4 +1,4 @@
-error[E0658]: #![rustc_force_inline] forces a free function to be inlined
+error[E0658]: #[rustc_force_inline] forces a free function to be inlined
   --> $DIR/gate.rs:4:1
    |
 LL | #[rustc_force_inline]
@@ -7,7 +7,7 @@ LL | #[rustc_force_inline]
    = help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
    = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
 
-error[E0658]: #![rustc_force_inline] forces a free function to be inlined
+error[E0658]: #[rustc_force_inline] forces a free function to be inlined
   --> $DIR/gate.rs:9:1
    |
 LL | #[rustc_force_inline = "the test requires it"]
diff --git a/tests/ui/invalid/issue-114435-layout-type-err.rs b/tests/ui/invalid/issue-114435-layout-type-err.rs
index f68744a13c1..2a86839e416 100644
--- a/tests/ui/invalid/issue-114435-layout-type-err.rs
+++ b/tests/ui/invalid/issue-114435-layout-type-err.rs
@@ -1,6 +1,6 @@
-//@ build-fail
+//@ check-fail
 //@ compile-flags: --crate-type lib -Cdebuginfo=2
-//@ error-pattern: the type has an unknown layout
+//@ error-pattern: recursion limit
 
 #![recursion_limit = "10"]
 macro_rules! link {
@@ -28,7 +28,6 @@ impl Bottom {
     }
 }
 
-
 link!(A, B);
 link!(B, C);
 link!(C, D);
@@ -41,4 +40,4 @@ link!(I, J);
 link!(J, K);
 link!(K, Bottom);
 
-fn main() { }
+fn main() {}
diff --git a/tests/ui/invalid/issue-114435-layout-type-err.stderr b/tests/ui/invalid/issue-114435-layout-type-err.stderr
index a2db74ff8bd..2fddc62f004 100644
--- a/tests/ui/invalid/issue-114435-layout-type-err.stderr
+++ b/tests/ui/invalid/issue-114435-layout-type-err.stderr
@@ -2,7 +2,5 @@ error: reached the recursion limit finding the struct tail for `Bottom`
    |
    = help: consider increasing the recursion limit by adding a `#![recursion_limit = "20"]`
 
-error: the type has an unknown layout
-
-error: aborting due to 2 previous errors
+error: aborting due to 1 previous error
 
diff --git a/tests/ui/proc-macro/derive-cfg-nested-tokens.rs b/tests/ui/proc-macro/derive-cfg-nested-tokens.rs
new file mode 100644
index 00000000000..7d4e8d8373d
--- /dev/null
+++ b/tests/ui/proc-macro/derive-cfg-nested-tokens.rs
@@ -0,0 +1,23 @@
+// A regression test for issue #81099.
+
+//@ check-pass
+//@ proc-macro:test-macros.rs
+
+#![feature(stmt_expr_attributes)]
+#![feature(proc_macro_hygiene)]
+
+#[macro_use]
+extern crate test_macros;
+
+#[derive(Clone, Copy)]
+struct S {
+    // `print_args` runs twice
+    // - on eagerly configured `S` (from `impl Copy`), only 11 should be printed
+    // - on non-configured `S` (from `struct S`), both 10 and 11 should be printed
+    field: [u8; #[print_attr] {
+        #[cfg(FALSE)] { 10 }
+        #[cfg(not(FALSE))]  { 11 }
+    }],
+}
+
+fn main() {}
diff --git a/tests/ui/proc-macro/derive-cfg-nested-tokens.stdout b/tests/ui/proc-macro/derive-cfg-nested-tokens.stdout
new file mode 100644
index 00000000000..05bf21ee8f9
--- /dev/null
+++ b/tests/ui/proc-macro/derive-cfg-nested-tokens.stdout
@@ -0,0 +1,149 @@
+PRINT-ATTR INPUT (DISPLAY): { #[cfg(not(FALSE))] { 11 } }
+PRINT-ATTR INPUT (DEBUG): TokenStream [
+    Group {
+        delimiter: Brace,
+        stream: TokenStream [
+            Punct {
+                ch: '#',
+                spacing: Alone,
+                span: #0 bytes(491..492),
+            },
+            Group {
+                delimiter: Bracket,
+                stream: TokenStream [
+                    Ident {
+                        ident: "cfg",
+                        span: #0 bytes(493..496),
+                    },
+                    Group {
+                        delimiter: Parenthesis,
+                        stream: TokenStream [
+                            Ident {
+                                ident: "not",
+                                span: #0 bytes(497..500),
+                            },
+                            Group {
+                                delimiter: Parenthesis,
+                                stream: TokenStream [
+                                    Ident {
+                                        ident: "FALSE",
+                                        span: #0 bytes(501..506),
+                                    },
+                                ],
+                                span: #0 bytes(500..507),
+                            },
+                        ],
+                        span: #0 bytes(496..508),
+                    },
+                ],
+                span: #0 bytes(492..509),
+            },
+            Group {
+                delimiter: Brace,
+                stream: TokenStream [
+                    Literal {
+                        kind: Integer,
+                        symbol: "11",
+                        suffix: None,
+                        span: #0 bytes(513..515),
+                    },
+                ],
+                span: #0 bytes(511..517),
+            },
+        ],
+        span: #0 bytes(452..523),
+    },
+]
+PRINT-ATTR INPUT (DISPLAY): { #[cfg(FALSE)] { 10 } #[cfg(not(FALSE))] { 11 } }
+PRINT-ATTR INPUT (DEBUG): TokenStream [
+    Group {
+        delimiter: Brace,
+        stream: TokenStream [
+            Punct {
+                ch: '#',
+                spacing: Alone,
+                span: #0 bytes(462..463),
+            },
+            Group {
+                delimiter: Bracket,
+                stream: TokenStream [
+                    Ident {
+                        ident: "cfg",
+                        span: #0 bytes(464..467),
+                    },
+                    Group {
+                        delimiter: Parenthesis,
+                        stream: TokenStream [
+                            Ident {
+                                ident: "FALSE",
+                                span: #0 bytes(468..473),
+                            },
+                        ],
+                        span: #0 bytes(467..474),
+                    },
+                ],
+                span: #0 bytes(463..475),
+            },
+            Group {
+                delimiter: Brace,
+                stream: TokenStream [
+                    Literal {
+                        kind: Integer,
+                        symbol: "10",
+                        suffix: None,
+                        span: #0 bytes(478..480),
+                    },
+                ],
+                span: #0 bytes(476..482),
+            },
+            Punct {
+                ch: '#',
+                spacing: Alone,
+                span: #0 bytes(491..492),
+            },
+            Group {
+                delimiter: Bracket,
+                stream: TokenStream [
+                    Ident {
+                        ident: "cfg",
+                        span: #0 bytes(493..496),
+                    },
+                    Group {
+                        delimiter: Parenthesis,
+                        stream: TokenStream [
+                            Ident {
+                                ident: "not",
+                                span: #0 bytes(497..500),
+                            },
+                            Group {
+                                delimiter: Parenthesis,
+                                stream: TokenStream [
+                                    Ident {
+                                        ident: "FALSE",
+                                        span: #0 bytes(501..506),
+                                    },
+                                ],
+                                span: #0 bytes(500..507),
+                            },
+                        ],
+                        span: #0 bytes(496..508),
+                    },
+                ],
+                span: #0 bytes(492..509),
+            },
+            Group {
+                delimiter: Brace,
+                stream: TokenStream [
+                    Literal {
+                        kind: Integer,
+                        symbol: "11",
+                        suffix: None,
+                        span: #0 bytes(513..515),
+                    },
+                ],
+                span: #0 bytes(511..517),
+            },
+        ],
+        span: #0 bytes(452..523),
+    },
+]
diff --git a/tests/ui/simd/intrinsic/float-math-pass.rs b/tests/ui/simd/intrinsic/float-math-pass.rs
index 74cb51a0606..91059f353fd 100644
--- a/tests/ui/simd/intrinsic/float-math-pass.rs
+++ b/tests/ui/simd/intrinsic/float-math-pass.rs
@@ -48,13 +48,6 @@ unsafe fn simd_flog10<T>(x: T) -> T;
 #[rustc_intrinsic]
 unsafe fn simd_flog2<T>(x: T) -> T;
 
-#[rustc_intrinsic]
-unsafe fn simd_fpow<T>(x: T, y: T) -> T;
-
-#[rustc_intrinsic]
-unsafe fn simd_fpowi<T>(x: T, y: i32) -> T;
-
-
 // rounding functions
 #[rustc_intrinsic]
 unsafe fn simd_ceil<T>(x: T) -> T;
@@ -68,23 +61,21 @@ unsafe fn simd_round<T>(x: T) -> T;
 #[rustc_intrinsic]
 unsafe fn simd_trunc<T>(x: T) -> T;
 
-
 macro_rules! assert_approx_eq_f32 {
-    ($a:expr, $b:expr) => ({
+    ($a:expr, $b:expr) => {{
         let (a, b) = (&$a, &$b);
-        assert!((*a - *b).abs() < 1.0e-6,
-                "{} is not approximately equal to {}", *a, *b);
-    })
+        assert!((*a - *b).abs() < 1.0e-6, "{} is not approximately equal to {}", *a, *b);
+    }};
 }
 macro_rules! assert_approx_eq {
-    ($a:expr, $b:expr) => ({
+    ($a:expr, $b:expr) => {{
         let a = $a;
         let b = $b;
         assert_approx_eq_f32!(a.0[0], b.0[0]);
         assert_approx_eq_f32!(a.0[1], b.0[1]);
         assert_approx_eq_f32!(a.0[2], b.0[2]);
         assert_approx_eq_f32!(a.0[3], b.0[3]);
-    })
+    }};
 }
 
 fn main() {
@@ -125,12 +116,6 @@ fn main() {
         let r = simd_flog10(x);
         assert_approx_eq!(z, r);
 
-        let r = simd_fpow(h, x);
-        assert_approx_eq!(h, r);
-
-        let r = simd_fpowi(h, 1);
-        assert_approx_eq!(h, r);
-
         let r = simd_fsin(z);
         assert_approx_eq!(z, r);
 
diff --git a/tests/ui/simd/intrinsic/generic-arithmetic-pass.rs b/tests/ui/simd/intrinsic/generic-arithmetic-pass.rs
index 4a18c0164e4..29d82255d4e 100644
--- a/tests/ui/simd/intrinsic/generic-arithmetic-pass.rs
+++ b/tests/ui/simd/intrinsic/generic-arithmetic-pass.rs
@@ -1,6 +1,5 @@
 //@ run-pass
 #![allow(non_camel_case_types)]
-//@ ignore-emscripten FIXME(#45351) hits an LLVM assert
 #![feature(repr_simd, intrinsics)]
 
 #[repr(simd)]
@@ -53,7 +52,6 @@ unsafe fn simd_or<T>(x: T, y: T) -> T;
 #[rustc_intrinsic]
 unsafe fn simd_xor<T>(x: T, y: T) -> T;
 
-
 #[rustc_intrinsic]
 unsafe fn simd_neg<T>(x: T) -> T;
 
diff --git a/tests/ui/simd/intrinsic/generic-cast-pass.rs b/tests/ui/simd/intrinsic/generic-cast-pass.rs
index 2155d845864..aab7347d1de 100644
--- a/tests/ui/simd/intrinsic/generic-cast-pass.rs
+++ b/tests/ui/simd/intrinsic/generic-cast-pass.rs
@@ -1,9 +1,7 @@
 //@ run-pass
-//@ ignore-emscripten FIXME(#45351) hits an LLVM assert
 
 #![feature(repr_simd, intrinsics)]
 
-
 #[rustc_intrinsic]
 unsafe fn simd_cast<T, U>(x: T) -> U;
 
diff --git a/tests/ui/simd/intrinsic/generic-comparison-pass.rs b/tests/ui/simd/intrinsic/generic-comparison-pass.rs
index 68f98372e1d..d0ec2503602 100644
--- a/tests/ui/simd/intrinsic/generic-comparison-pass.rs
+++ b/tests/ui/simd/intrinsic/generic-comparison-pass.rs
@@ -1,5 +1,4 @@
 //@ run-pass
-//@ ignore-emscripten FIXME(#45351) hits an LLVM assert
 
 #![feature(repr_simd, intrinsics, concat_idents)]
 #![allow(non_camel_case_types)]
@@ -14,7 +13,6 @@ struct u32x4(pub [u32; 4]);
 #[derive(Copy, Clone)]
 struct f32x4(pub [f32; 4]);
 
-
 #[rustc_intrinsic]
 unsafe fn simd_eq<T, U>(x: T, y: T) -> U;
 
@@ -39,11 +37,11 @@ macro_rules! cmp {
         let rhs = $rhs;
         let e: u32x4 = concat_idents!(simd_, $method)($lhs, $rhs);
         // assume the scalar version is correct/the behaviour we want.
-        assert!((e.0[0] != 0) == lhs.0[0] .$method(&rhs.0[0]));
-        assert!((e.0[1] != 0) == lhs.0[1] .$method(&rhs.0[1]));
-        assert!((e.0[2] != 0) == lhs.0[2] .$method(&rhs.0[2]));
-        assert!((e.0[3] != 0) == lhs.0[3] .$method(&rhs.0[3]));
-    }}
+        assert!((e.0[0] != 0) == lhs.0[0].$method(&rhs.0[0]));
+        assert!((e.0[1] != 0) == lhs.0[1].$method(&rhs.0[1]));
+        assert!((e.0[2] != 0) == lhs.0[2].$method(&rhs.0[2]));
+        assert!((e.0[3] != 0) == lhs.0[3].$method(&rhs.0[3]));
+    }};
 }
 macro_rules! tests {
     ($($lhs: ident, $rhs: ident;)*) => {{
@@ -75,9 +73,9 @@ fn main() {
     let i2 = i32x4([5, -5, 20, -100]);
     let i3 = i32x4([10, -11, 20, -100]);
 
-    let u1 = u32x4([10, !11+1, 12, 13]);
-    let u2 = u32x4([5, !5+1, 20, !100+1]);
-    let u3 = u32x4([10, !11+1, 20, !100+1]);
+    let u1 = u32x4([10, !11 + 1, 12, 13]);
+    let u2 = u32x4([5, !5 + 1, 20, !100 + 1]);
+    let u3 = u32x4([10, !11 + 1, 20, !100 + 1]);
 
     let f1 = f32x4([10.0, -11.0, 12.0, 13.0]);
     let f2 = f32x4([5.0, -5.0, 20.0, -100.0]);
diff --git a/tests/ui/simd/intrinsic/generic-elements-pass.rs b/tests/ui/simd/intrinsic/generic-elements-pass.rs
index 8cb600bc9e4..b8d872c5cb7 100644
--- a/tests/ui/simd/intrinsic/generic-elements-pass.rs
+++ b/tests/ui/simd/intrinsic/generic-elements-pass.rs
@@ -1,5 +1,4 @@
 //@ run-pass
-//@ ignore-emscripten FIXME(#45351) hits an LLVM assert
 
 #![feature(repr_simd, intrinsics)]
 
@@ -22,7 +21,6 @@ unsafe fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;
 #[rustc_intrinsic]
 unsafe fn simd_extract<T, E>(x: T, idx: u32) -> E;
 
-
 #[rustc_intrinsic]
 unsafe fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U;
 
diff --git a/tests/ui/simd/issue-32947.rs b/tests/ui/simd/issue-32947.rs
index dc5e7a4ec91..b34484b2d3b 100644
--- a/tests/ui/simd/issue-32947.rs
+++ b/tests/ui/simd/issue-32947.rs
@@ -1,5 +1,4 @@
 //@ run-pass
-//@ ignore-emscripten FIXME(#45351)
 
 #![feature(repr_simd, test)]
 
@@ -15,9 +14,7 @@ fn main() {
     // non-optimized builds
     unsafe {
         let memory = &mut [0u64; 8] as *mut _ as *mut u8;
-        let misaligned_ptr: &mut [u8; 32] = {
-            std::mem::transmute(memory.offset(1))
-        };
+        let misaligned_ptr: &mut [u8; 32] = { std::mem::transmute(memory.offset(1)) };
         *misaligned_ptr = std::mem::transmute(Mu64([1, 1, 1, 1]));
         test::black_box(memory);
     }
diff --git a/tests/ui/simd/issue-39720.rs b/tests/ui/simd/issue-39720.rs
index 8d7666faaf9..c3c4750d6de 100644
--- a/tests/ui/simd/issue-39720.rs
+++ b/tests/ui/simd/issue-39720.rs
@@ -1,5 +1,4 @@
 //@ run-pass
-//@ ignore-emscripten FIXME(#45351)
 
 #![feature(repr_simd, intrinsics)]
 
diff --git a/tests/ui/traits/solver-cycles/129541-recursive-struct.multiple.stderr b/tests/ui/traits/solver-cycles/129541-recursive-struct.multiple.stderr
new file mode 100644
index 00000000000..93b064cdce2
--- /dev/null
+++ b/tests/ui/traits/solver-cycles/129541-recursive-struct.multiple.stderr
@@ -0,0 +1,6 @@
+error: reached the recursion limit finding the struct tail for `<[Hello] as Normalize>::Assoc`
+   |
+   = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]`
+
+error: aborting due to 1 previous error
+
diff --git a/tests/ui/traits/solver-cycles/129541-recursive-struct.rs b/tests/ui/traits/solver-cycles/129541-recursive-struct.rs
index 4fbcbefec91..729771e560e 100644
--- a/tests/ui/traits/solver-cycles/129541-recursive-struct.rs
+++ b/tests/ui/traits/solver-cycles/129541-recursive-struct.rs
@@ -1,7 +1,7 @@
 // Regression test for #129541
 
 //@ revisions: unique multiple
-//@ check-pass
+//@ error-pattern: reached the recursion limit finding the struct tail for `<[Hello] as Normalize>::Assoc`
 
 trait Bound {}
 trait Normalize {
diff --git a/tests/ui/traits/solver-cycles/129541-recursive-struct.unique.stderr b/tests/ui/traits/solver-cycles/129541-recursive-struct.unique.stderr
new file mode 100644
index 00000000000..93b064cdce2
--- /dev/null
+++ b/tests/ui/traits/solver-cycles/129541-recursive-struct.unique.stderr
@@ -0,0 +1,6 @@
+error: reached the recursion limit finding the struct tail for `<[Hello] as Normalize>::Assoc`
+   |
+   = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]`
+
+error: aborting due to 1 previous error
+
diff --git a/tests/ui/traits/trivial_impl_sized.rs b/tests/ui/traits/trivial_impl_sized.rs
index 501a3405090..59cc079c268 100644
--- a/tests/ui/traits/trivial_impl_sized.rs
+++ b/tests/ui/traits/trivial_impl_sized.rs
@@ -1,5 +1,5 @@
-//! This test checks that we currently need to implement
-//! members, even if their where bounds don't hold for the impl type.
+//! This test checks that we do not need to implement
+//! members, whose `where Self: Sized` bounds don't hold for the impl type.
 
 trait Foo {
     fn foo()
@@ -15,12 +15,28 @@ impl Foo for () {
 impl Foo for i32 {}
 //~^ ERROR: not all trait items implemented, missing: `foo`
 
-// Should be allowed
 impl Foo for dyn std::fmt::Debug {}
-//~^ ERROR: not all trait items implemented, missing: `foo`
 
+#[deny(dead_code)]
 impl Foo for dyn std::fmt::Display {
     fn foo() {}
+    //~^ ERROR this item cannot be used as its where bounds are not satisfied
+}
+
+struct Struct {
+    i: i32,
+    tail: [u8],
 }
 
+impl Foo for Struct {}
+
+// Ensure we only allow known-unsized types to be skipped
+trait Trait {
+    fn foo(self)
+    where
+        Self: Sized;
+}
+impl<T: ?Sized> Trait for T {}
+//~^ ERROR: not all trait items implemented, missing: `foo`
+
 fn main() {}
diff --git a/tests/ui/traits/trivial_impl_sized.stderr b/tests/ui/traits/trivial_impl_sized.stderr
index ebf6dfc9dd2..95cab337182 100644
--- a/tests/ui/traits/trivial_impl_sized.stderr
+++ b/tests/ui/traits/trivial_impl_sized.stderr
@@ -9,17 +9,29 @@ LL | |         Self: Sized;
 LL |   impl Foo for i32 {}
    |   ^^^^^^^^^^^^^^^^ missing `foo` in implementation
 
+error: this item cannot be used as its where bounds are not satisfied for the `Self` type
+  --> $DIR/trivial_impl_sized.rs:22:5
+   |
+LL |     fn foo() {}
+   |     ^^^^^^^^
+   |
+note: the lint level is defined here
+  --> $DIR/trivial_impl_sized.rs:20:8
+   |
+LL | #[deny(dead_code)]
+   |        ^^^^^^^^^
+
 error[E0046]: not all trait items implemented, missing: `foo`
-  --> $DIR/trivial_impl_sized.rs:19:1
+  --> $DIR/trivial_impl_sized.rs:39:1
    |
-LL | /     fn foo()
+LL | /     fn foo(self)
 LL | |     where
 LL | |         Self: Sized;
    | |____________________- `foo` from trait
-...
-LL |   impl Foo for dyn std::fmt::Debug {}
-   |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `foo` in implementation
+LL |   }
+LL |   impl<T: ?Sized> Trait for T {}
+   |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `foo` in implementation
 
-error: aborting due to 2 previous errors
+error: aborting due to 3 previous errors
 
 For more information about this error, try `rustc --explain E0046`.
diff --git a/tests/ui/typeck/auxiliary/derive-demo-issue-136343.rs b/tests/ui/typeck/auxiliary/derive-demo-issue-136343.rs
new file mode 100644
index 00000000000..65be439b49a
--- /dev/null
+++ b/tests/ui/typeck/auxiliary/derive-demo-issue-136343.rs
@@ -0,0 +1,7 @@
+extern crate proc_macro;
+use proc_macro::TokenStream;
+
+#[proc_macro_derive(Sample)]
+pub fn sample(_: TokenStream) -> TokenStream {
+    "fn bad<T: Into<U>, U>(a: T) -> U { a }".parse().unwrap()
+}
diff --git a/tests/ui/typeck/invalid-sugg-for-derive-macro-issue-136343.rs b/tests/ui/typeck/invalid-sugg-for-derive-macro-issue-136343.rs
new file mode 100644
index 00000000000..c08030fc5c1
--- /dev/null
+++ b/tests/ui/typeck/invalid-sugg-for-derive-macro-issue-136343.rs
@@ -0,0 +1,9 @@
+//@ proc-macro: derive-demo-issue-136343.rs
+
+#[macro_use]
+extern crate derive_demo_issue_136343;
+
+#[derive(Sample)] //~ ERROR mismatched types
+struct Test;
+
+fn main() {}
diff --git a/tests/ui/typeck/invalid-sugg-for-derive-macro-issue-136343.stderr b/tests/ui/typeck/invalid-sugg-for-derive-macro-issue-136343.stderr
new file mode 100644
index 00000000000..0b9c1d9123a
--- /dev/null
+++ b/tests/ui/typeck/invalid-sugg-for-derive-macro-issue-136343.stderr
@@ -0,0 +1,19 @@
+error[E0308]: mismatched types
+  --> $DIR/invalid-sugg-for-derive-macro-issue-136343.rs:6:10
+   |
+LL | #[derive(Sample)]
+   |          ^^^^^^
+   |          |
+   |          expected type parameter `U`, found type parameter `T`
+   |          expected `U` because of return type
+   |
+   = note: expected type parameter `U`
+              found type parameter `T`
+   = note: a type parameter was expected, but a different one was found; you might be missing a type parameter or trait bound
+   = note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters
+   = note: the caller chooses a type for `U` which can be different from `T`
+   = note: this error originates in the derive macro `Sample` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0308`.