From f706c3c8f75f8ff1cffea562ac4df6b8b5c9dcd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Sun, 15 Jan 2023 03:33:52 +0000 Subject: [PATCH 01/69] Include both md and yaml ICE ticket templates * Existing compilers link to the md version * The YAML version field for the backtrace *doesn't let us paste a full backtrace* * We will need the YAML version in order to be able to submit reports once we start storing the backtrace to disk --- .github/ISSUE_TEMPLATE/ice.md | 49 +++++++++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/ice.yaml | 6 ++-- 2 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/ice.md diff --git a/.github/ISSUE_TEMPLATE/ice.md b/.github/ISSUE_TEMPLATE/ice.md new file mode 100644 index 000000000000..2afcd210a6eb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/ice.md @@ -0,0 +1,49 @@ +--- +name: Internal Compiler Error +about: Create a report for an internal compiler error in rustc. +labels: C-bug, I-ICE, T-compiler +--- + + +### Code + +```Rust + +``` + + +### Meta + + +`rustc --version --verbose`: +``` + +``` + +### Error output + +``` + +``` + + +
Backtrace +

+ +``` + +``` + +

+
diff --git a/.github/ISSUE_TEMPLATE/ice.yaml b/.github/ISSUE_TEMPLATE/ice.yaml index 54136cc6d439..8d25bb41c080 100644 --- a/.github/ISSUE_TEMPLATE/ice.yaml +++ b/.github/ISSUE_TEMPLATE/ice.yaml @@ -1,5 +1,5 @@ -name: Internal Compiler Error -description: Create a report for an internal compiler error in `rustc` +name: Internal Compiler Error (Structured form) +description: For now, you'll want to use the other ICE template, as GitHub forms have strict limits on the size of fields so backtraces cannot be pasted directly. labels: ["C-bug", "I-ICE", "T-compiler"] title: "[ICE]: " body: @@ -79,4 +79,4 @@ body: label: Anything else? description: If you have more details you want to give us to reproduce this issue, please add it here validations: - required: false \ No newline at end of file + required: false From 9346eb649d13120b6b0e84fd441aa527376c4127 Mon Sep 17 00:00:00 2001 From: Ali MJ Al-Nasrawy Date: Sun, 22 Jan 2023 16:48:58 +0300 Subject: [PATCH 02/69] assume MIR types are fully normalized --- compiler/rustc_borrowck/src/type_check/canonical.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/compiler/rustc_borrowck/src/type_check/canonical.rs b/compiler/rustc_borrowck/src/type_check/canonical.rs index 11729e2c83f0..2b81a35052d7 100644 --- a/compiler/rustc_borrowck/src/type_check/canonical.rs +++ b/compiler/rustc_borrowck/src/type_check/canonical.rs @@ -181,9 +181,6 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { user_ty: ty::UserType<'tcx>, span: Span, ) { - // FIXME: Ideally MIR types are normalized, but this is not always true. - let mir_ty = self.normalize(mir_ty, Locations::All(span)); - self.fully_perform_op( Locations::All(span), ConstraintCategory::Boring, @@ -217,7 +214,9 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { return; } + // FIXME: Ideally MIR types are normalized, but this is not always true. let mir_ty = self.normalize(mir_ty, Locations::All(span)); + let cause = ObligationCause::dummy_with_span(span); let param_env = self.param_env; let op = |infcx: &'_ _| { From 3653254f91647df99b571d8cdf97be237077892b Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Tue, 24 Jan 2023 08:40:09 -0500 Subject: [PATCH 03/69] Set version placeholders to 1.68 --- compiler/rustc_feature/src/accepted.rs | 6 +++--- compiler/rustc_feature/src/active.rs | 2 +- library/alloc/src/collections/vec_deque/mod.rs | 2 +- library/alloc/src/string.rs | 2 +- library/core/src/convert/num.rs | 4 ++-- library/core/src/iter/sources/once_with.rs | 2 +- library/core/src/iter/sources/repeat_with.rs | 2 +- library/core/src/pin.rs | 2 +- library/std/src/path.rs | 4 ++-- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/compiler/rustc_feature/src/accepted.rs b/compiler/rustc_feature/src/accepted.rs index aab4b604fad4..e064e87a59a4 100644 --- a/compiler/rustc_feature/src/accepted.rs +++ b/compiler/rustc_feature/src/accepted.rs @@ -49,7 +49,7 @@ declare_features! ( /// Allows `#[target_feature(...)]` on aarch64 platforms (accepted, aarch64_target_feature, "1.61.0", Some(44839), None), /// Allows using the `efiapi` ABI. - (accepted, abi_efiapi, "CURRENT_RUSTC_VERSION", Some(65815), None), + (accepted, abi_efiapi, "1.68.0", Some(65815), None), /// Allows the sysV64 ABI to be specified on all platforms /// instead of just the platforms on which it is the C ABI. (accepted, abi_sysv64, "1.24.0", Some(36167), None), @@ -129,7 +129,7 @@ declare_features! ( /// Allows `crate` in paths. (accepted, crate_in_paths, "1.30.0", Some(45477), None), /// Allows rustc to inject a default alloc_error_handler - (accepted, default_alloc_error_handler, "CURRENT_RUSTC_VERSION", Some(66741), None), + (accepted, default_alloc_error_handler, "1.68.0", Some(66741), None), /// Allows using assigning a default type to type parameters in algebraic data type definitions. (accepted, default_type_params, "1.0.0", None, None), /// Allows `#[deprecated]` attribute. @@ -164,7 +164,7 @@ declare_features! ( /// Allows access to crate names passed via `--extern` through prelude. (accepted, extern_prelude, "1.30.0", Some(44660), None), /// Allows using F16C intrinsics from `core::arch::{x86, x86_64}`. - (accepted, f16c_target_feature, "CURRENT_RUSTC_VERSION", Some(44839), None), + (accepted, f16c_target_feature, "1.68.0", Some(44839), None), /// Allows field shorthands (`x` meaning `x: x`) in struct literal expressions. (accepted, field_init_shorthand, "1.17.0", Some(37340), None), /// Allows `#[must_use]` on functions, and introduces must-use operators (RFC 1940). diff --git a/compiler/rustc_feature/src/active.rs b/compiler/rustc_feature/src/active.rs index 196c31302a0d..b5256043e2df 100644 --- a/compiler/rustc_feature/src/active.rs +++ b/compiler/rustc_feature/src/active.rs @@ -340,7 +340,7 @@ declare_features! ( /// Allows `async {}` expressions in const contexts. (active, const_async_blocks, "1.53.0", Some(85368), None), /// Allows `const || {}` closures in const contexts. - (incomplete, const_closures, "CURRENT_RUSTC_VERSION", Some(106003), None), + (incomplete, const_closures, "1.68.0", Some(106003), None), /// Allows limiting the evaluation steps of const expressions (active, const_eval_limit, "1.43.0", Some(67217), None), /// Allows the definition of `const extern fn` and `const unsafe extern fn`. diff --git a/library/alloc/src/collections/vec_deque/mod.rs b/library/alloc/src/collections/vec_deque/mod.rs index 451e4936bc50..1573b3d77dc1 100644 --- a/library/alloc/src/collections/vec_deque/mod.rs +++ b/library/alloc/src/collections/vec_deque/mod.rs @@ -537,7 +537,7 @@ impl VecDeque { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_stable(feature = "const_vec_deque_new", since = "CURRENT_RUSTC_VERSION")] + #[rustc_const_stable(feature = "const_vec_deque_new", since = "1.68.0")] #[must_use] pub const fn new() -> VecDeque { // FIXME: This should just be `VecDeque::new_in(Global)` once that hits stable. diff --git a/library/alloc/src/string.rs b/library/alloc/src/string.rs index 3118c7189a5e..ca182c8109ec 100644 --- a/library/alloc/src/string.rs +++ b/library/alloc/src/string.rs @@ -2549,7 +2549,7 @@ impl ToString for char { } #[cfg(not(no_global_oom_handling))] -#[stable(feature = "bool_to_string_specialization", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "bool_to_string_specialization", since = "1.68.0")] impl ToString for bool { #[inline] fn to_string(&self) -> String { diff --git a/library/core/src/convert/num.rs b/library/core/src/convert/num.rs index 45e2f711c6c9..4da7c323492a 100644 --- a/library/core/src/convert/num.rs +++ b/library/core/src/convert/num.rs @@ -169,7 +169,7 @@ impl_from! { u32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0" impl_from! { f32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] } // bool -> Float -#[stable(feature = "float_from_bool", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "float_from_bool", since = "1.68.0")] #[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] impl const From for f32 { /// Converts `bool` to `f32` losslessly. @@ -178,7 +178,7 @@ impl const From for f32 { small as u8 as Self } } -#[stable(feature = "float_from_bool", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "float_from_bool", since = "1.68.0")] #[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] impl const From for f64 { /// Converts `bool` to `f64` losslessly. diff --git a/library/core/src/iter/sources/once_with.rs b/library/core/src/iter/sources/once_with.rs index 080ae27a30fc..9309a06c8cf2 100644 --- a/library/core/src/iter/sources/once_with.rs +++ b/library/core/src/iter/sources/once_with.rs @@ -73,7 +73,7 @@ pub struct OnceWith { gen: Option, } -#[stable(feature = "iter_once_with_debug", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "iter_once_with_debug", since = "1.68.0")] impl fmt::Debug for OnceWith { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if self.gen.is_some() { diff --git a/library/core/src/iter/sources/repeat_with.rs b/library/core/src/iter/sources/repeat_with.rs index 20420a3ad8e0..3f34105a3e07 100644 --- a/library/core/src/iter/sources/repeat_with.rs +++ b/library/core/src/iter/sources/repeat_with.rs @@ -78,7 +78,7 @@ pub struct RepeatWith { repeater: F, } -#[stable(feature = "iterator_repeat_with_debug", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "iterator_repeat_with_debug", since = "1.68.0")] impl fmt::Debug for RepeatWith { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("RepeatWith").finish_non_exhaustive() diff --git a/library/core/src/pin.rs b/library/core/src/pin.rs index ec0c9984841e..febe57dc90bc 100644 --- a/library/core/src/pin.rs +++ b/library/core/src/pin.rs @@ -1164,7 +1164,7 @@ impl DispatchFromDyn> for Pin

where P: DispatchFromDyn {} /// constructor. /// /// [`Box::pin`]: ../../std/boxed/struct.Box.html#method.pin -#[stable(feature = "pin_macro", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "pin_macro", since = "1.68.0")] #[rustc_macro_transparency = "semitransparent"] #[allow_internal_unstable(unsafe_pin_internals)] pub macro pin($value:expr $(,)?) { diff --git a/library/std/src/path.rs b/library/std/src/path.rs index 2f53cf839369..15308ac0e0d8 100644 --- a/library/std/src/path.rs +++ b/library/std/src/path.rs @@ -271,7 +271,7 @@ pub const MAIN_SEPARATOR: char = crate::sys::path::MAIN_SEP; /// The primary separator of path components for the current platform. /// /// For example, `/` on Unix and `\` on Windows. -#[stable(feature = "main_separator_str", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "main_separator_str", since = "1.68.0")] pub const MAIN_SEPARATOR_STR: &str = crate::sys::path::MAIN_SEP_STR; //////////////////////////////////////////////////////////////////////////////// @@ -1778,7 +1778,7 @@ impl ops::Deref for PathBuf { } } -#[stable(feature = "path_buf_deref_mut", since = "CURRENT_RUSTC_VERSION")] +#[stable(feature = "path_buf_deref_mut", since = "1.68.0")] impl ops::DerefMut for PathBuf { #[inline] fn deref_mut(&mut self) -> &mut Path { From 17887f7a723d8e897e4f05bb89cb2dffe2853e82 Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Wed, 25 Jan 2023 09:45:50 -0500 Subject: [PATCH 04/69] Bump stage0.json to 1.68 beta --- src/stage0.json | 688 ++++++++++++++++++++++++------------------------ 1 file changed, 344 insertions(+), 344 deletions(-) diff --git a/src/stage0.json b/src/stage0.json index 6a389a64406f..ee104b06f8a3 100644 --- a/src/stage0.json +++ b/src/stage0.json @@ -17,355 +17,355 @@ "tool is executed." ], "compiler": { - "date": "2022-12-27", + "date": "2023-01-25", "version": "beta" }, "rustfmt": { - "date": "2022-12-27", + "date": "2023-01-24", "version": "nightly" }, "checksums_sha256": { - "dist/2022-12-27/cargo-beta-aarch64-apple-darwin.tar.gz": "00b7df89de07931d150940536a1e6c980897ed0e9880bb6f24d5ebbad896c8f2", - "dist/2022-12-27/cargo-beta-aarch64-apple-darwin.tar.xz": "17e1e9cf2c4dad4fec7f420f43cea21923d76ba2d6f87ad67c90ea9c8e4a04f6", - "dist/2022-12-27/cargo-beta-aarch64-pc-windows-msvc.tar.gz": "783b7e2569490dffc953d4b24e659fec384739ceb8bad37e3a97df374945a91d", - "dist/2022-12-27/cargo-beta-aarch64-pc-windows-msvc.tar.xz": "a9402480620b03c010cb18dacca9a95c82e7b6078d2c1163543bc4292d7dd300", - "dist/2022-12-27/cargo-beta-aarch64-unknown-linux-gnu.tar.gz": "7fa9aa92c2b1268420f60af2826dffa50b61c9926a2a1cd1c8273fe5861cde11", - "dist/2022-12-27/cargo-beta-aarch64-unknown-linux-gnu.tar.xz": "97d583ed82db1fd5a03ce44a660f1163d0812b6f352adc6d78e61d7ae4fbfe23", - "dist/2022-12-27/cargo-beta-aarch64-unknown-linux-musl.tar.gz": "69236898b091d6ef31445eb1223acfc01adf21fb1aa277a7d441eaa300c0c9ad", - "dist/2022-12-27/cargo-beta-aarch64-unknown-linux-musl.tar.xz": "4a92788cdba1705b79ce9999d45a62d4631dbc59cc980437e1635dc908458b66", - "dist/2022-12-27/cargo-beta-arm-unknown-linux-gnueabi.tar.gz": "b35b72b16c59b38e38acddf2c06c2c819ca78f146bbf4f3ce9d7ff982b86655e", - "dist/2022-12-27/cargo-beta-arm-unknown-linux-gnueabi.tar.xz": "81d7fbe3f50cbad04c2ad0e118001976a880d23ad2a894ee49c6f6c10583d10d", - "dist/2022-12-27/cargo-beta-arm-unknown-linux-gnueabihf.tar.gz": "942f6860e2cf9da7c5399d308acad43f862750bf7d383444c2dd636b86553e14", - "dist/2022-12-27/cargo-beta-arm-unknown-linux-gnueabihf.tar.xz": "5f2f3c7186a2cb28f96bba8db7d404b0f3338bbe57edd631bb16fe4d2c8d493a", - "dist/2022-12-27/cargo-beta-armv7-unknown-linux-gnueabihf.tar.gz": "f15932518f114587c3639ed270cab3e4ef4eb28e0abb6b59b5f63138fa43e829", - "dist/2022-12-27/cargo-beta-armv7-unknown-linux-gnueabihf.tar.xz": "41116748ab087e0c7a5354508fb95e1a966212ef5cac40da59e363108077c3a9", - "dist/2022-12-27/cargo-beta-i686-pc-windows-gnu.tar.gz": "37bbf0a9dcc1b3fbc11a5f72de922fb0f5dc80a632d803fa0a892d72bdd457c1", - "dist/2022-12-27/cargo-beta-i686-pc-windows-gnu.tar.xz": "7a8afd8a69e1e25e47122096920217bbe765e82e831583420487702831241d5c", - "dist/2022-12-27/cargo-beta-i686-pc-windows-msvc.tar.gz": "c40ec16780156f6568bf8f1353a3bb367d4bec09dc6e98b03de44bd2ed301ae8", - "dist/2022-12-27/cargo-beta-i686-pc-windows-msvc.tar.xz": "94320949f071236d828fb1252159f0f2b1f18030303af1ae0b7ca06cd9567de0", - "dist/2022-12-27/cargo-beta-i686-unknown-linux-gnu.tar.gz": "1fb3fc33289ae716f950feca832196bb32cde0556e41e501d05c84116836d916", - "dist/2022-12-27/cargo-beta-i686-unknown-linux-gnu.tar.xz": "4f112ea5a91abbf63db484368090fdf8fbc6b7abc1a5d7c8353df15e7908c2e3", - "dist/2022-12-27/cargo-beta-mips-unknown-linux-gnu.tar.gz": "b90f3c17c73f4dd7b36e0ff56b17be8e1c90f82b33c9be28b7b813fc5c788e05", - "dist/2022-12-27/cargo-beta-mips-unknown-linux-gnu.tar.xz": "8754bb3f116b09a8b38ac0684014532a19ccb57e4e94d1097a8484e8d67e31ce", - "dist/2022-12-27/cargo-beta-mips64-unknown-linux-gnuabi64.tar.gz": "549733dbbc3ec23976d6975e78ec8b8a30396eb45e4a8f5eef6d4c846cf04da1", - "dist/2022-12-27/cargo-beta-mips64-unknown-linux-gnuabi64.tar.xz": "f5997ebe7c67969b7d14a2233897b6014ebd9b38010eee101d9e484d42b220c9", - "dist/2022-12-27/cargo-beta-mips64el-unknown-linux-gnuabi64.tar.gz": "3450c71c082bf84115fb035239453e39230afa0575dca0fc52586222b474a0c2", - "dist/2022-12-27/cargo-beta-mips64el-unknown-linux-gnuabi64.tar.xz": "a16c397c5e980a926e0122cff5f8d30c4b54c2dba7f48ef00b587c5cda8f500d", - "dist/2022-12-27/cargo-beta-mipsel-unknown-linux-gnu.tar.gz": "62e025463eca2dac0547275c7827e6ecd109d1b84d056526e647abd220b3e1fc", - "dist/2022-12-27/cargo-beta-mipsel-unknown-linux-gnu.tar.xz": "99c5f5511b23d93707df394c2ab90ddd98e7876c9ee74c861dc919cdd498399b", - "dist/2022-12-27/cargo-beta-powerpc-unknown-linux-gnu.tar.gz": "eee574420f365d02d52f5f4754563bc1fe4f0b07d02a554f6aa886bccbe4c092", - "dist/2022-12-27/cargo-beta-powerpc-unknown-linux-gnu.tar.xz": "64e53a591e2d4dee9935fca4a2df18fbbed1b00b74dd6631473ba2d5b257891b", - "dist/2022-12-27/cargo-beta-powerpc64-unknown-linux-gnu.tar.gz": "37d2a5f1c496c8ad8d2b5af5e89a4a325ddcef32ebd7087ef3cc9e653e5a8f4a", - "dist/2022-12-27/cargo-beta-powerpc64-unknown-linux-gnu.tar.xz": "8753d9bfdda6decdcc4f58d2391956609e0aeb75ce4368c7ed52c23ed3f28943", - "dist/2022-12-27/cargo-beta-powerpc64le-unknown-linux-gnu.tar.gz": "303c63a294f2112fceb70cee063f35cbee3296b93ca91e43300e72b064d80da7", - "dist/2022-12-27/cargo-beta-powerpc64le-unknown-linux-gnu.tar.xz": "96b752dd307d2709dbf2b91c687a55992f4e0e5a143223a8c2a267883b4a2832", - "dist/2022-12-27/cargo-beta-riscv64gc-unknown-linux-gnu.tar.gz": "e5c279922e9adb47e6ecaee191ad291bfc627aa05e4c026628664bc47e5ce254", - "dist/2022-12-27/cargo-beta-riscv64gc-unknown-linux-gnu.tar.xz": "7e0145fe22bfca7070dcace196e3229a86f9f5b31ab1cfc4fd7ff158db5b1388", - "dist/2022-12-27/cargo-beta-s390x-unknown-linux-gnu.tar.gz": "49df0b5774471ced53703942c6551c045ed56c92a3a224615f583511bc845a61", - "dist/2022-12-27/cargo-beta-s390x-unknown-linux-gnu.tar.xz": "955e67ac19fc7a2a882f759339343c466da9658b2cd95799dd78328c13d6527e", - "dist/2022-12-27/cargo-beta-x86_64-apple-darwin.tar.gz": "a0e01a9ded551ea1f411da70d4481627579e870c2ff7592efde1d8be83ca46d5", - "dist/2022-12-27/cargo-beta-x86_64-apple-darwin.tar.xz": "a9205d81dff07cbf2468fa6f6999fd0f1266ad4faf84f5688e3e5cb330bdce0f", - "dist/2022-12-27/cargo-beta-x86_64-pc-windows-gnu.tar.gz": "d6406b59361cdc97df606901beeafe6660a4cf557b9de4a313d4659c83f10255", - "dist/2022-12-27/cargo-beta-x86_64-pc-windows-gnu.tar.xz": "ae15fd38cfcd149de306280a48785fe269ea36b1a958de6815adc7a80792d798", - "dist/2022-12-27/cargo-beta-x86_64-pc-windows-msvc.tar.gz": "d75a793188af608b8bbd92907ff69294bc66b85b7ffe03882abcb661fd8c27f9", - "dist/2022-12-27/cargo-beta-x86_64-pc-windows-msvc.tar.xz": "26f4ed51fc227dccc67d4c68fcac78374fb1441093d3524ec157b1b6b6e90012", - "dist/2022-12-27/cargo-beta-x86_64-unknown-freebsd.tar.gz": "6503b65a5258b5517c5213f0fb858aeff7e00c453a3633749d1a72f7f645050b", - "dist/2022-12-27/cargo-beta-x86_64-unknown-freebsd.tar.xz": "75ba61fe1670d0e4cf9f9f35460c663701c75ceca95917ed25e98f20cc2f0ef5", - "dist/2022-12-27/cargo-beta-x86_64-unknown-illumos.tar.gz": "e003c3a1ed8b57546e6ecdcbbcb58a97896a8e511b6a8fdc31100c24b8dd5a17", - "dist/2022-12-27/cargo-beta-x86_64-unknown-illumos.tar.xz": "b377d76b8fae7ebc607f33400cc0b37974fbf02a4d29187b1f0f6f668c12ff01", - "dist/2022-12-27/cargo-beta-x86_64-unknown-linux-gnu.tar.gz": "0dcfb9c65b5ad5c6af905c78d6914f5d7f8a62def817e64192b29c957b848783", - "dist/2022-12-27/cargo-beta-x86_64-unknown-linux-gnu.tar.xz": "1ca64be7777194c3191350723e8a909cce93d8ac28ceafb5df641f3066c6a8b9", - "dist/2022-12-27/cargo-beta-x86_64-unknown-linux-musl.tar.gz": "9c24ff865929e88db27285fcb4a10adf97289a388f93ff5fa421211f35267047", - "dist/2022-12-27/cargo-beta-x86_64-unknown-linux-musl.tar.xz": "b794e0397ca0ec274e307468ed56b8116438c0b8a444f593eb56350d687e8137", - "dist/2022-12-27/cargo-beta-x86_64-unknown-netbsd.tar.gz": "0fc5f8716933c46509cc05492e5bf75f6d06575dd6f803882397929b95394e12", - "dist/2022-12-27/cargo-beta-x86_64-unknown-netbsd.tar.xz": "0cfe7415cb4c0a96019eefe0363c1d61934d76f3b5fb72a113b9de1401ecfad9", - "dist/2022-12-27/rust-std-beta-aarch64-apple-darwin.tar.gz": "777b016bebe68ea79bfb336eedb595174466bfd54321523b9913f5c2741d0135", - "dist/2022-12-27/rust-std-beta-aarch64-apple-darwin.tar.xz": "c4ab94494052bf3fb37a226e1313886546bde1ec4d7188049cb95dbf2963e1fa", - "dist/2022-12-27/rust-std-beta-aarch64-apple-ios-sim.tar.gz": "884004f47fea38414ed805abda4afce3adf5a83fcd072ddececfa888e55bdef4", - "dist/2022-12-27/rust-std-beta-aarch64-apple-ios-sim.tar.xz": "db0858bd63fa8609ceb6ee42cbddc31f31b2a0ce0c02e1fe1c2d32f0c8d607c6", - "dist/2022-12-27/rust-std-beta-aarch64-apple-ios.tar.gz": "996c8612a39bddb3047ce0f23f761deeca61d15b36f2ea270f5a220d14c1ed27", - "dist/2022-12-27/rust-std-beta-aarch64-apple-ios.tar.xz": "c06360094800d069261d363b709ca552d3899d50c12d39c23eb58d75015c980a", - "dist/2022-12-27/rust-std-beta-aarch64-fuchsia.tar.gz": "891f1909fcc78019f77d704c3b3b1031c605dee01a116f04e7f4f402d6b9b2af", - "dist/2022-12-27/rust-std-beta-aarch64-fuchsia.tar.xz": "3033d409735b299b6754852c28c1dac378a94ad892144ed76199d542a265c8a7", - "dist/2022-12-27/rust-std-beta-aarch64-linux-android.tar.gz": "080c97ad158327dfdd24a3c17477614de1dfe27f1236c73ed43b1e7e881f6b06", - "dist/2022-12-27/rust-std-beta-aarch64-linux-android.tar.xz": "80b89416148f4ed917978686ba337ebdbb3d4a50903a792831fa3b83032c43cb", - "dist/2022-12-27/rust-std-beta-aarch64-pc-windows-msvc.tar.gz": "854badcf35650c196b2051be46254d2f4e86b4522dbfa9f1d1a64148cae7bf1e", - "dist/2022-12-27/rust-std-beta-aarch64-pc-windows-msvc.tar.xz": "e4ccf358da4cb13b281c999318816fc99948a3531e9ecd6d0abad9b819c117be", - "dist/2022-12-27/rust-std-beta-aarch64-unknown-linux-gnu.tar.gz": "9473f12fc35106ab9144b38bddc3c35d56b0413bec06c2d1d5f43d4fde614331", - "dist/2022-12-27/rust-std-beta-aarch64-unknown-linux-gnu.tar.xz": "5cb44be7d8adc0589afca90ef0669c42f03a61a622d856fb057d450554d24c01", - "dist/2022-12-27/rust-std-beta-aarch64-unknown-linux-musl.tar.gz": "25ebf045fc59488abc07ed24aa3364fb64cc186f6c852b12cb5c094f81d5fd69", - "dist/2022-12-27/rust-std-beta-aarch64-unknown-linux-musl.tar.xz": "d43bca65f55159d6eafb7e342ec5d4598d63bc8fad0c9fc15b6bd88743321d4e", - "dist/2022-12-27/rust-std-beta-aarch64-unknown-none-softfloat.tar.gz": "91198741990d9300024da5113843cbeff02ed9ea344d9feb57736e9334136d27", - "dist/2022-12-27/rust-std-beta-aarch64-unknown-none-softfloat.tar.xz": "0aee6204d34246480be1d0f6efd6a66eb10d83a9dd1c215433e840949687c598", - "dist/2022-12-27/rust-std-beta-aarch64-unknown-none.tar.gz": "97f3193bfde82b997346b49231a0f24a6960da88773bf27c73f57f40ec4f84e6", - "dist/2022-12-27/rust-std-beta-aarch64-unknown-none.tar.xz": "1d2122442cc0a6595c901831e8cbaaeafd2043fbc8c4b028265310d2086673cb", - "dist/2022-12-27/rust-std-beta-aarch64-unknown-uefi.tar.gz": "6d351f35cb9252c2825311eb22049283534cc2877cfd673fc1b5b3c94c6ef864", - "dist/2022-12-27/rust-std-beta-aarch64-unknown-uefi.tar.xz": "054bb5a98df25830201ab04e81f63630dc329f48daa0d715a3443f95d2c0f442", - "dist/2022-12-27/rust-std-beta-arm-linux-androideabi.tar.gz": "93b70e7c6b686ed5695bcf2f0b2da14e89a50e54304d445ebfc35107f689c442", - "dist/2022-12-27/rust-std-beta-arm-linux-androideabi.tar.xz": "9b8983be6089216428007e968844f57bd88e2371dd592b1ca06aed2aa6479d8c", - "dist/2022-12-27/rust-std-beta-arm-unknown-linux-gnueabi.tar.gz": "753ef462dd47349fee5f45adadc073363250fbcbf566ff337250466d0ce73343", - "dist/2022-12-27/rust-std-beta-arm-unknown-linux-gnueabi.tar.xz": "c19389db997fd0e158e5a5e847f566f6b03f06b3161ce5644ca0178fae25d0f5", - "dist/2022-12-27/rust-std-beta-arm-unknown-linux-gnueabihf.tar.gz": "c819d6a3de743f54e28eab0f2c7744dd5a5be7c6677bb712bfd3f93938435194", - "dist/2022-12-27/rust-std-beta-arm-unknown-linux-gnueabihf.tar.xz": "4ca09f9df5476449c3510c82e284026329411253e2a02c90e6239f30a9a6074a", - "dist/2022-12-27/rust-std-beta-arm-unknown-linux-musleabi.tar.gz": "f7994d565baee0fbdb010211fcd30398f7f90bd97770ce72e5ba34bf1f06a466", - "dist/2022-12-27/rust-std-beta-arm-unknown-linux-musleabi.tar.xz": "f54e1efdb9a088a13371e5fd7e1599a7bcadc5db4247e8811ab9d374c17fac8a", - "dist/2022-12-27/rust-std-beta-arm-unknown-linux-musleabihf.tar.gz": "add3333e892ccfc31b8fa506e79d5633261daf13e7902549ac5ecfe8f3655bbd", - "dist/2022-12-27/rust-std-beta-arm-unknown-linux-musleabihf.tar.xz": "bfa9a7cb0de16ecef093d593677e32164e4e68042806f543824c16f2a12b55ae", - "dist/2022-12-27/rust-std-beta-armebv7r-none-eabi.tar.gz": "81c958b4ba5933c02cb2872efc4d5de86a2bc1a1d326bf563256ec74e256fd8f", - "dist/2022-12-27/rust-std-beta-armebv7r-none-eabi.tar.xz": "634d2e35b2314826198eb2a7fd6f253cac5c2bbe7a5a7c7cdecc09949db23b3a", - "dist/2022-12-27/rust-std-beta-armebv7r-none-eabihf.tar.gz": "62dd020647cfa88c6719b4b9a803d07f3ccae7c2f94c924e1529def264db1be8", - "dist/2022-12-27/rust-std-beta-armebv7r-none-eabihf.tar.xz": "53a03694b610146cb80e0ef0033600ea4dd6f8b7d413c3ac675cb57c9b4c5cde", - "dist/2022-12-27/rust-std-beta-armv5te-unknown-linux-gnueabi.tar.gz": "ac7c396d35406501eda50191b92abab74e19148ec6caa2d5171bba35f2d3ec96", - "dist/2022-12-27/rust-std-beta-armv5te-unknown-linux-gnueabi.tar.xz": "058c514636a2063193d278e16fc683dbe9c1dadcbca45707152d150dba71065a", - "dist/2022-12-27/rust-std-beta-armv5te-unknown-linux-musleabi.tar.gz": "bc5400e734bc4747b3ea44bb5c3cf9af5f11d5b5f2e970bd4626a25a276f15f7", - "dist/2022-12-27/rust-std-beta-armv5te-unknown-linux-musleabi.tar.xz": "0079d1cb3d1fd5be99bed480e6ec0b451dd9e2a2299e3347cbee33344cd8c718", - "dist/2022-12-27/rust-std-beta-armv7-linux-androideabi.tar.gz": "9dbc9e97f9990f03efe67c817c9dda7fcdc931c7605742182f4d128859c1a53f", - "dist/2022-12-27/rust-std-beta-armv7-linux-androideabi.tar.xz": "d0119bed6cb41629aa65d83f7c1021e05e2f90bd21a28e6f0d3b6f0ea9127dd4", - "dist/2022-12-27/rust-std-beta-armv7-unknown-linux-gnueabi.tar.gz": "09cab74e4a6e38d07622fd80e97d424d7437d554c05ce1896acaaddad0e3b637", - "dist/2022-12-27/rust-std-beta-armv7-unknown-linux-gnueabi.tar.xz": "4602ca768e8ba85cfc5a4d4a2964cccd048ad82f349b7453f077e38de918cb0d", - "dist/2022-12-27/rust-std-beta-armv7-unknown-linux-gnueabihf.tar.gz": "b983a7699fce4c6f9c7f16ea3fd2905a8ddf21623bae71a9e7515b5cd5b288ec", - "dist/2022-12-27/rust-std-beta-armv7-unknown-linux-gnueabihf.tar.xz": "ca2d6d4c09326559a1528cf32c7a899f985c7e3b7751cec8911d0facac149e51", - "dist/2022-12-27/rust-std-beta-armv7-unknown-linux-musleabi.tar.gz": "dfa375f608f297f4dd0fc39921609ecebb31101850d73a8bb8b67ce98e319f3d", - "dist/2022-12-27/rust-std-beta-armv7-unknown-linux-musleabi.tar.xz": "3159afaebb2b17f6b12128e2829944f9406e26cc7019eb33839fda311ea0b809", - "dist/2022-12-27/rust-std-beta-armv7-unknown-linux-musleabihf.tar.gz": "5a2c2361c944d85455b7a037bc820fbfe824180106f5a6d6fbf4066ef78236a3", - "dist/2022-12-27/rust-std-beta-armv7-unknown-linux-musleabihf.tar.xz": "0bd7ac1cada0a3a3894d404ad5871ef3abc4963eeb5a1f05f59e6264b1e6cc3c", - "dist/2022-12-27/rust-std-beta-armv7a-none-eabi.tar.gz": "1f9daa0af4695c51e4cda38235497923b9adfefd1a6eb4be086d720cffab7594", - "dist/2022-12-27/rust-std-beta-armv7a-none-eabi.tar.xz": "b9e5b75720d71bc9e0e16b73b7cf04cd3e5a57da7a6b842926ffcf273308543b", - "dist/2022-12-27/rust-std-beta-armv7r-none-eabi.tar.gz": "4837b13f144f12e9edb5b49ddf5169d1cd13cff0a3ec3e54160714d45138448e", - "dist/2022-12-27/rust-std-beta-armv7r-none-eabi.tar.xz": "32a56e92757a9ee82ff71962c7c8144e4240133d44de77d5955510640a31061b", - "dist/2022-12-27/rust-std-beta-armv7r-none-eabihf.tar.gz": "d31ed0250a195a8043e71c8ae3b2e86111ec07b00892ae05c3783761b20774ee", - "dist/2022-12-27/rust-std-beta-armv7r-none-eabihf.tar.xz": "06b70c26d9161b17c2e4ca9255ae1a73f7bbeadb24d733c320875e3dbbc77caf", - "dist/2022-12-27/rust-std-beta-asmjs-unknown-emscripten.tar.gz": "6271afcf4b05fb4de2ed08ba441b3ee0b476e2e33dbda8a5efa3d7540475bca5", - "dist/2022-12-27/rust-std-beta-asmjs-unknown-emscripten.tar.xz": "131c51bb571df676dbafd84d5015888c4bc15130bd7300d4c53c1667907f7f51", - "dist/2022-12-27/rust-std-beta-i586-pc-windows-msvc.tar.gz": "d6bca2e8ba737a4704dc01dd6fca58a7c8dc8a065107f9fa98588c5fbdfe39a3", - "dist/2022-12-27/rust-std-beta-i586-pc-windows-msvc.tar.xz": "d64aa029d4209256e18d7bed6e0e28156a965b1d50cb3eb8d70abab57be55a97", - "dist/2022-12-27/rust-std-beta-i586-unknown-linux-gnu.tar.gz": "f48248f5fedc961ea4050254cf9bdbbe70420ebdaf712847a5374a3c97e21df3", - "dist/2022-12-27/rust-std-beta-i586-unknown-linux-gnu.tar.xz": "c9287bc9be332f084a2779803964ae374930d3bec787155ac3c8d1d6be6a587d", - "dist/2022-12-27/rust-std-beta-i586-unknown-linux-musl.tar.gz": "1914ba0edb77b0bc7cd83dd93d8a6ca53b29800844cdec9a976342982aad8b27", - "dist/2022-12-27/rust-std-beta-i586-unknown-linux-musl.tar.xz": "30d5d1bf54eb6758e0bd3a3f48f186a957fdb1310ba8b3625b5f33994c8a58fb", - "dist/2022-12-27/rust-std-beta-i686-linux-android.tar.gz": "6c05a59ff653bcde6a71dfcbd38718ca3cfeb89b7ec09d1cd380fdb589941d27", - "dist/2022-12-27/rust-std-beta-i686-linux-android.tar.xz": "80b6b57ff73a9483046380c0d4cfc8c090fca5fc4174d5c47f71fffccb7178a6", - "dist/2022-12-27/rust-std-beta-i686-pc-windows-gnu.tar.gz": "941bb6f5107630a0b26b8749be29c6df920ccb467df367a5f55491b062352f4a", - "dist/2022-12-27/rust-std-beta-i686-pc-windows-gnu.tar.xz": "f3f2ece3bb0080980e099c176a8a1366171741450fa8b8e515362572b519e19f", - "dist/2022-12-27/rust-std-beta-i686-pc-windows-msvc.tar.gz": "a94fcee79bd5941e718a112d855163563f6e5377b59a9c1405ac8804131b0383", - "dist/2022-12-27/rust-std-beta-i686-pc-windows-msvc.tar.xz": "4bea862e2d998e976526cb741b7d674a7d620fc7e4838955ef4c53d000cf24aa", - "dist/2022-12-27/rust-std-beta-i686-unknown-freebsd.tar.gz": "e5cc60f1c00d966809cd76fd452bbb03452c5cc94a487ef4ad14af12608ae5fa", - "dist/2022-12-27/rust-std-beta-i686-unknown-freebsd.tar.xz": "df8df7d1750cf9e92b3e4b57b83b195c1eea6ca62f38ad317882a69e2e813ba9", - "dist/2022-12-27/rust-std-beta-i686-unknown-linux-gnu.tar.gz": "4ff8fc04b63f7a80587d4f75376c74ade7721369ad1508faf5c0f83930e1cf7a", - "dist/2022-12-27/rust-std-beta-i686-unknown-linux-gnu.tar.xz": "4716141a8be8017adb8540c05f88e6463b2add95439320b0084ffb290bc0d943", - "dist/2022-12-27/rust-std-beta-i686-unknown-linux-musl.tar.gz": "d7cff128c80db94aaaa2bb708bafa3f857fe8b819ff21a85f7c6c7c5170576be", - "dist/2022-12-27/rust-std-beta-i686-unknown-linux-musl.tar.xz": "bc83b17627e87ee4b555e9cc5912dbfbba74586f46719994be6832e22f70424b", - "dist/2022-12-27/rust-std-beta-i686-unknown-uefi.tar.gz": "ec6723c138565c4d9ca87bcda199aceb7b3a42ddf979658cf9e8433a4dae9c70", - "dist/2022-12-27/rust-std-beta-i686-unknown-uefi.tar.xz": "0e67f10a29f2826399604839a4dcbd173f8de39a755283a0c245c54b8a658210", - "dist/2022-12-27/rust-std-beta-mips-unknown-linux-gnu.tar.gz": "a78f899f6fae1671e41aa7d76b37d9041cc32dfa6e9315dabff3afe21f93700b", - "dist/2022-12-27/rust-std-beta-mips-unknown-linux-gnu.tar.xz": "4c74cece45b9271c77c4b328d1b3d876b50429077074580d771fc2b03f0d4738", - "dist/2022-12-27/rust-std-beta-mips-unknown-linux-musl.tar.gz": "a854fbab503a0541d593cf9496a4e4cf8b9edb49422406b3a7f34e3fa21905f6", - "dist/2022-12-27/rust-std-beta-mips-unknown-linux-musl.tar.xz": "f42a81564e7366d5d630632af3113b99c5de6d147d7eb9e31da762bb9d35d4ea", - "dist/2022-12-27/rust-std-beta-mips64-unknown-linux-gnuabi64.tar.gz": "de070d1ae3fb8a825092a9a78c26db553839c6d862e451a497d5f94230414bc5", - "dist/2022-12-27/rust-std-beta-mips64-unknown-linux-gnuabi64.tar.xz": "0a7092c99c587ef69801af713ef834bae809e4868dfcff43babd44bec532717e", - "dist/2022-12-27/rust-std-beta-mips64-unknown-linux-muslabi64.tar.gz": "7077c20142082b0e2b8d6299ffcd8739c8295d315b917563cffe6d42e129cd08", - "dist/2022-12-27/rust-std-beta-mips64-unknown-linux-muslabi64.tar.xz": "86f0988f3baf0b5bbed81483e7d68004651f227ab22d1d36b34c73f132191dfb", - "dist/2022-12-27/rust-std-beta-mips64el-unknown-linux-gnuabi64.tar.gz": "536fe3059a8095bcc1c44391c27b7d9832d6a057388b4de089915810cbe1baae", - "dist/2022-12-27/rust-std-beta-mips64el-unknown-linux-gnuabi64.tar.xz": "6b4e397a3a175f4cbbddabb750df14d668c1f4c8520577d35fbcb9dfa8613097", - "dist/2022-12-27/rust-std-beta-mips64el-unknown-linux-muslabi64.tar.gz": "30f42499ab4f21caf21551e0e92bb5db9a2e0f42fd0b3e59ee9789dd40d10391", - "dist/2022-12-27/rust-std-beta-mips64el-unknown-linux-muslabi64.tar.xz": "1190cfa1023a8d35d202979a1070863bb713495c2c9b720d0371b6d70d23bd7c", - "dist/2022-12-27/rust-std-beta-mipsel-unknown-linux-gnu.tar.gz": "4ac79a395ba5d70e1a09d0e1ce232b9405b9995f7c459d176be52eade40bbab7", - "dist/2022-12-27/rust-std-beta-mipsel-unknown-linux-gnu.tar.xz": "42f3666885680cbb2d15ec85cfbc9103e5b170346a9b8cff63a2d15f78472c67", - "dist/2022-12-27/rust-std-beta-mipsel-unknown-linux-musl.tar.gz": "0b1c979205f8476ad6f0e35c05acb1976cb4c44006c25931e73c35025939f1ff", - "dist/2022-12-27/rust-std-beta-mipsel-unknown-linux-musl.tar.xz": "7b6c76ae46ca56746b0bdea404125256636f05c1354e5dcf32c2a487d25e0ee1", - "dist/2022-12-27/rust-std-beta-nvptx64-nvidia-cuda.tar.gz": "ad9cb2ec325e2a2f14ac4db6a5df53a7c06adfe8c4c58f0f2c83748a34d0c550", - "dist/2022-12-27/rust-std-beta-nvptx64-nvidia-cuda.tar.xz": "1d507bb0cd8c80ee4e9155a0740c2319027ee5280552c1056ee7921a82bb9aa7", - "dist/2022-12-27/rust-std-beta-powerpc-unknown-linux-gnu.tar.gz": "e8d3b7bb483d7b3b737840ddf7a27a28c216d9d0b3ffc7ccded547f76bc932c5", - "dist/2022-12-27/rust-std-beta-powerpc-unknown-linux-gnu.tar.xz": "130edffa27b82def2876fb5562fc7a3971d33855e3ce023e18507b3e1bd47d10", - "dist/2022-12-27/rust-std-beta-powerpc64-unknown-linux-gnu.tar.gz": "b5659dcc18fb0e5849acb13df7153518c8df5ca9566852cabaeee33583321d1f", - "dist/2022-12-27/rust-std-beta-powerpc64-unknown-linux-gnu.tar.xz": "6bdfae3e9cf07608c862f4c042c47ed318c388bfcfb4cabfa233580b90c7a459", - "dist/2022-12-27/rust-std-beta-powerpc64le-unknown-linux-gnu.tar.gz": "f28795f8c2823bd817df63486d8a11b6b7cfb9538110e87d8d008ed979a81a3c", - "dist/2022-12-27/rust-std-beta-powerpc64le-unknown-linux-gnu.tar.xz": "695f6acb6ddb4c4a87515646157b88d2f58e2114b100f22bedcd4e2fa8de00b8", - "dist/2022-12-27/rust-std-beta-riscv32i-unknown-none-elf.tar.gz": "5f004e4b265efae872e8b0d8fda81f4e65cc50452d558ef90b9bef7639f6ba6d", - "dist/2022-12-27/rust-std-beta-riscv32i-unknown-none-elf.tar.xz": "c93c1cb534e83d43c40c62ed6623559e3e380f177c4bd151a0d1389a80a58139", - "dist/2022-12-27/rust-std-beta-riscv32imac-unknown-none-elf.tar.gz": "79988bb7bfa27dcacae0c459143be6a34f328ec6bcb73c2267d41a6f022fc045", - "dist/2022-12-27/rust-std-beta-riscv32imac-unknown-none-elf.tar.xz": "11235a96e7e8e14a173db0be71cd1ce7955c79f5a7d20b7436238256a06342fd", - "dist/2022-12-27/rust-std-beta-riscv32imc-unknown-none-elf.tar.gz": "a315accc791f1247e92a6362eb7bd6ab899c4688db7decb36b8d892c200186b1", - "dist/2022-12-27/rust-std-beta-riscv32imc-unknown-none-elf.tar.xz": "a4f6ac1d21ecda00c9d3e34d900771a4c5a50e3e5071d2eba837c9e4738edc80", - "dist/2022-12-27/rust-std-beta-riscv64gc-unknown-linux-gnu.tar.gz": "06dd8941f63c3031fa0383dd34981c655b26fd10d5510cd06bdcabb4a592a435", - "dist/2022-12-27/rust-std-beta-riscv64gc-unknown-linux-gnu.tar.xz": "882e464b44acb7e286f49d45a4f5a41fbf570ee0d78f1915fd6f94ac392fa928", - "dist/2022-12-27/rust-std-beta-riscv64gc-unknown-none-elf.tar.gz": "734d6f54d143ddddc2141da72ee02a32d4d505e20eaf0041c86c89f8ad8730ea", - "dist/2022-12-27/rust-std-beta-riscv64gc-unknown-none-elf.tar.xz": "be32ca1ddb2d48877c70c9a128dba02bfdca7a00e93c114c3c99127e7be04adf", - "dist/2022-12-27/rust-std-beta-riscv64imac-unknown-none-elf.tar.gz": "a6c70d3715b7e50ff15f5473348d8e1c5a061036055a85784b5e84a99e4008ee", - "dist/2022-12-27/rust-std-beta-riscv64imac-unknown-none-elf.tar.xz": "0dbbf637d310f7ef44cb1bc08122c172606c8ff1c886195eebbd52cad5789597", - "dist/2022-12-27/rust-std-beta-s390x-unknown-linux-gnu.tar.gz": "3e2f7751028f9123d94ff72b08f8ce0b40da36eada77e1414d4178756b46313a", - "dist/2022-12-27/rust-std-beta-s390x-unknown-linux-gnu.tar.xz": "382a35c79a03f7abebb9c5788f9dd19bd0973cb89e9b07a971eaafc611c3645a", - "dist/2022-12-27/rust-std-beta-sparc64-unknown-linux-gnu.tar.gz": "3eb49f766b206966433eecc7cdbbf709e75991644eae6f44596e5ec893fb3e8b", - "dist/2022-12-27/rust-std-beta-sparc64-unknown-linux-gnu.tar.xz": "9162e50f2ddb12fefecdc7c4c2d60e76874e78fd89b45d7fd81a6c95a856ee28", - "dist/2022-12-27/rust-std-beta-sparcv9-sun-solaris.tar.gz": "dbf20b8fd52e1b6a553369a1690344574e6c660996ddd5121d4a05bfb71c87aa", - "dist/2022-12-27/rust-std-beta-sparcv9-sun-solaris.tar.xz": "a40d8d444e57eabeecf8acf0b59f24b5d4e2c97ee538bfe38904a1f81a48fb14", - "dist/2022-12-27/rust-std-beta-thumbv6m-none-eabi.tar.gz": "1e63244aa865e6a115e603f238b64410606453fb38802b1684fa6397660a1501", - "dist/2022-12-27/rust-std-beta-thumbv6m-none-eabi.tar.xz": "ecd94de3f4a3aff8f9f920ff68383e342dc293ad2fb2584c9d9e48bf60eb82d5", - "dist/2022-12-27/rust-std-beta-thumbv7em-none-eabi.tar.gz": "ad21ab2584999c7c528dcde2e435d0ee73686b9b94c4f31dfeb3abf3cf9b9821", - "dist/2022-12-27/rust-std-beta-thumbv7em-none-eabi.tar.xz": "9394854e14bc3e671060630c01b6977ab5afcf9022790986c492fe58f0509191", - "dist/2022-12-27/rust-std-beta-thumbv7em-none-eabihf.tar.gz": "1cbabb457c0546da725a548a88b3268bb0feca4269af2b9cd0b98455c2e0c468", - "dist/2022-12-27/rust-std-beta-thumbv7em-none-eabihf.tar.xz": "1bb23d8d2783554e2043ed71cf982d9750bafa3ccac6e387b25d279137042867", - "dist/2022-12-27/rust-std-beta-thumbv7m-none-eabi.tar.gz": "076a918e524cc33a02ab2c94e3a607dd293d5d6d63e0797b16f2246057d1082c", - "dist/2022-12-27/rust-std-beta-thumbv7m-none-eabi.tar.xz": "de8f3e8907fde91bfcbff0c353eb3d1cb9d06dec31142479ef1ad2c6c368d5c6", - "dist/2022-12-27/rust-std-beta-thumbv7neon-linux-androideabi.tar.gz": "658d66031594324821649058e16e3e0b06542e8c9dd17c5fe705c487b5915ffe", - "dist/2022-12-27/rust-std-beta-thumbv7neon-linux-androideabi.tar.xz": "56a9a0235c0aacf561cfc9e7981c57a4d174dbedf5ed943d266302662246b10e", - "dist/2022-12-27/rust-std-beta-thumbv7neon-unknown-linux-gnueabihf.tar.gz": "3318c23ea42624e26cf2a25dd5fae206ccb96137d6833f28d7bfebe3ba7e327c", - "dist/2022-12-27/rust-std-beta-thumbv7neon-unknown-linux-gnueabihf.tar.xz": "b91396e82a9c30711608c3650d637a3ad56ea90d682460c791210f8bfb5a6854", - "dist/2022-12-27/rust-std-beta-thumbv8m.base-none-eabi.tar.gz": "55b45e9863e197262bd97a9bcb80991c9c34385acaa228b062546b690621b530", - "dist/2022-12-27/rust-std-beta-thumbv8m.base-none-eabi.tar.xz": "dc0b7ed56a142475759164713bcdd7c64958c7e7febcafa5371414082ae495b2", - "dist/2022-12-27/rust-std-beta-thumbv8m.main-none-eabi.tar.gz": "b2bed92d03b295035e4bc4e0fd63b44ee1cc634edb394cfbd7afdc00353a73e9", - "dist/2022-12-27/rust-std-beta-thumbv8m.main-none-eabi.tar.xz": "bcce53fd7c0c494ea1c45227190a959e992f07851dd064b2a9c599fafb07077c", - "dist/2022-12-27/rust-std-beta-thumbv8m.main-none-eabihf.tar.gz": "d6df9026c218b906671e89e433b165552a9486e41399a8f01a12d10495afc8dc", - "dist/2022-12-27/rust-std-beta-thumbv8m.main-none-eabihf.tar.xz": "f5f2411e3ff94f6e524a14ee46e6e6bc2e9ec91e395b0382f7a40bc6e970d623", - "dist/2022-12-27/rust-std-beta-wasm32-unknown-emscripten.tar.gz": "c766ec36907ce0a7e76ba9a227fdd57eae7a744bc5679b67a6ce1d6ab41ea19f", - "dist/2022-12-27/rust-std-beta-wasm32-unknown-emscripten.tar.xz": "de5f398bc34fb22489e9f6f2a9847954d8231ff5732f2595e8be93eaf7849986", - "dist/2022-12-27/rust-std-beta-wasm32-unknown-unknown.tar.gz": "e3ed4bc39da4731443b3bbd584106444aceaf91720546ac66e98712fe65dfa93", - "dist/2022-12-27/rust-std-beta-wasm32-unknown-unknown.tar.xz": "704a65e4f3e1afea9d1bd6a60c4d3e5fd57e3e14ba0dd2e2b94305c3e1c92cb8", - "dist/2022-12-27/rust-std-beta-wasm32-wasi.tar.gz": "03e2ca41c758fb4f9a2ea562ac4ed7186e27607458bdd7b575d786368336ea11", - "dist/2022-12-27/rust-std-beta-wasm32-wasi.tar.xz": "1ebc2ac44181d6d26928cbd550c64c5b496008e97356c68497f15f8cc8351f37", - "dist/2022-12-27/rust-std-beta-x86_64-apple-darwin.tar.gz": "0f0520f7163ef3d659e5761b2f0c7a9f2de00b2f769eeec8d1e7e9b3b08daf6d", - "dist/2022-12-27/rust-std-beta-x86_64-apple-darwin.tar.xz": "25795f1876330666b7fd6dd724661b364643448d0688d479f492c02faf2f7a4a", - "dist/2022-12-27/rust-std-beta-x86_64-apple-ios.tar.gz": "014a022bbb524d8c550d5dc7d678b9764adcc9962538980e9596ebced9c5614d", - "dist/2022-12-27/rust-std-beta-x86_64-apple-ios.tar.xz": "9b38e214e203c959eba0e8d651410f6cafc9e4b5725228c2bb4ac8f562e6cfa7", - "dist/2022-12-27/rust-std-beta-x86_64-fortanix-unknown-sgx.tar.gz": "afd9236304892945334183b31072b9b9f9b4faef8b7cdc4ad1f45a9b3e080a58", - "dist/2022-12-27/rust-std-beta-x86_64-fortanix-unknown-sgx.tar.xz": "33a7e5fd18f2166fb2b6cbe7630d80915533d59afc0080f1370bcfad1114eaa1", - "dist/2022-12-27/rust-std-beta-x86_64-fuchsia.tar.gz": "7e91e1298da3676c4c051d7f34eec21f2fffa0a34af212c785b79c2d1048fe92", - "dist/2022-12-27/rust-std-beta-x86_64-fuchsia.tar.xz": "fff70ed752d0760990f7a90bc3c50ac6586e8b012e61a15b6dfb325dd081b9a9", - "dist/2022-12-27/rust-std-beta-x86_64-linux-android.tar.gz": "f9183794392422fbe8cfd61ea7bae0dadd8731e82b1d15a59f4e93acccd2048f", - "dist/2022-12-27/rust-std-beta-x86_64-linux-android.tar.xz": "4fce2ab0dacac153de7d9805786b17d517863b0ff04a8224540daee86eff4056", - "dist/2022-12-27/rust-std-beta-x86_64-pc-solaris.tar.gz": "d5b64111b3763063c38ae63915ca366a4fdb63f0dcf8121588a8953f01ebc669", - "dist/2022-12-27/rust-std-beta-x86_64-pc-solaris.tar.xz": "c396b086773dc06db2e59bcdaff8ffbb7069efee5841b9e3cdd4dfb05fd95ce4", - "dist/2022-12-27/rust-std-beta-x86_64-pc-windows-gnu.tar.gz": "e851812f69bcb2fe606bfbda125fa6b3f55752fd1a2330878c48ca99eedbb8b6", - "dist/2022-12-27/rust-std-beta-x86_64-pc-windows-gnu.tar.xz": "689738a0952a0eab27ba3d3f9bc9b531ec29f338ea373bfa783a83786d5c2885", - "dist/2022-12-27/rust-std-beta-x86_64-pc-windows-msvc.tar.gz": "b51f78199bfc1417f020e2d0dd16044f63f6b6675b2b6856f669f8604e44a6bf", - "dist/2022-12-27/rust-std-beta-x86_64-pc-windows-msvc.tar.xz": "7713269f3c51717f6231cf4100043eca2330512b602c2962da81af561e90193b", - "dist/2022-12-27/rust-std-beta-x86_64-sun-solaris.tar.gz": "9f0a129f4c2ea324e2dc94fad3f7acbc7bf2b988f66d9c42dd8abbc60c569acf", - "dist/2022-12-27/rust-std-beta-x86_64-sun-solaris.tar.xz": "6ca71851fd0a7879aa750a63deb4ee587f82c28b27486f716e4fae5ebe599086", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-freebsd.tar.gz": "6cfbf0f85757854fba1551c3312baac820e398b573d50b005cc3958723db7c82", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-freebsd.tar.xz": "2e2dfb82fa7e23f888ae9541a30d15ba978cb29bbdfec6afb00590a39c16df5d", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-illumos.tar.gz": "92650856a7e74c8b912d5c84cd1002a490f9c8e3fa4506733fcbedb3cd42792b", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-illumos.tar.xz": "3dd302996bd3fb9f8b077e6d5fe3dc6f7dd9590d5fc3eb3bab2cffaada4e99d3", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-linux-gnu.tar.gz": "3a1faf905ffc7263e725ce7571cb84dd8698adbc45b6902da86350299b2e3ccb", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-linux-gnu.tar.xz": "daef635cdf88c8d9c924c0d66e2b26db1f56bda9b48ca0c21e089060b07dc997", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-linux-gnux32.tar.gz": "567bb99f67737cca721d1dc6975daefd3dad29b13d531d3b939405ef4e7aee84", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-linux-gnux32.tar.xz": "aa218c4547e77f33ba4bc45bba0b6fcf3cce9355c2cf11d74a3a4c5e49f9b3cd", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-linux-musl.tar.gz": "de43b04cccb3c2bdcd2a7993c391299a4bde5041102ce0eb5e32b6cfae86cd79", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-linux-musl.tar.xz": "f99963704b4c3189361925ec8b53daa2ca15ae4af9215cbd87cfec23e044cefa", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-netbsd.tar.gz": "3d4949e63f137552e3b74e50b366f95d7a153e7c61cf5587634be51516fdc610", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-netbsd.tar.xz": "5b48095a35f862190536e64eff726327e25c23981c0bc1224c8c44bfccbb705d", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-none.tar.gz": "12b5c69138260daf976e963ba503c66ec4432f11cf7506bc9ba691ac2c1df4a1", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-none.tar.xz": "5c334a67f6586dc406b6e55c7f9d64b7701e1c7879bf5860b378069301c57854", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-redox.tar.gz": "58c15f9119e5f78d7c70b24e67af57ce10bb2d2cb1347b9b4631478665c624de", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-redox.tar.xz": "a2f8b635254d53ec5b902dbeb8ac63c6c3982f94dfbcaec3d093f17f0f5fa896", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-uefi.tar.gz": "1ce5c25480e97699b12c180ed6198766a0c12a3543dd317ba6f4a52538027b0d", - "dist/2022-12-27/rust-std-beta-x86_64-unknown-uefi.tar.xz": "e4d9ffe34ba40e5ccf87007085dc4daa20a8a52944f092e2a075527702b55072", - "dist/2022-12-27/rustc-beta-aarch64-apple-darwin.tar.gz": "f5c8dadb8eb0335a50326a94f858625e4f01e3159e933d58f9d24338d47943be", - "dist/2022-12-27/rustc-beta-aarch64-apple-darwin.tar.xz": "0a6eeb32e4d85b628044c3e075e5f1414a42bb582905b199d360addae466d3ae", - "dist/2022-12-27/rustc-beta-aarch64-pc-windows-msvc.tar.gz": "0f7ce917f14a1d42637fbbbc343473596becceb22634cb7c7cdee6beaa2b9ca1", - "dist/2022-12-27/rustc-beta-aarch64-pc-windows-msvc.tar.xz": "49667bd902fb5fb2855e843ca5c1dcd453171f164a3dee2dcd9e09b0d9e1e57e", - "dist/2022-12-27/rustc-beta-aarch64-unknown-linux-gnu.tar.gz": "d5a03695685afff4debff8e09f2d91db02d2ac29981a9ec230619c3e388ce1c9", - "dist/2022-12-27/rustc-beta-aarch64-unknown-linux-gnu.tar.xz": "db1aeb772a08f111d8f024164b570322f45ecab0f6db4e931b91971b2b982323", - "dist/2022-12-27/rustc-beta-aarch64-unknown-linux-musl.tar.gz": "0e51f97b677b5c813862bba3e5a3b0884f0ecdf9b7c3676089625431a3d0cb2c", - "dist/2022-12-27/rustc-beta-aarch64-unknown-linux-musl.tar.xz": "f88c6c33ac3682f340ed60b4f62ee8ed61eb21069a1f0a912024d19e41c0d5c7", - "dist/2022-12-27/rustc-beta-arm-unknown-linux-gnueabi.tar.gz": "25abe3158ec3ab7c064341247d78ea265ad7e0dc2063837fb5cf0a3bea9d011e", - "dist/2022-12-27/rustc-beta-arm-unknown-linux-gnueabi.tar.xz": "1d430b8e35ebd63a79b34917edacebb76b2fa8f1cea4772ba2c4ef0340485fb3", - "dist/2022-12-27/rustc-beta-arm-unknown-linux-gnueabihf.tar.gz": "1858d5ed21a3132af4b56c841cbabc9fb834d501946956a0e9aeeddfa095344f", - "dist/2022-12-27/rustc-beta-arm-unknown-linux-gnueabihf.tar.xz": "17cc52dbd6ccbed4677ad52fa666ea10295c11209528e78ac190f01b5d509f87", - "dist/2022-12-27/rustc-beta-armv7-unknown-linux-gnueabihf.tar.gz": "3440edd99025f24f2640528d2d1c10047c834b93cb09a935c65ecfb72012e7d0", - "dist/2022-12-27/rustc-beta-armv7-unknown-linux-gnueabihf.tar.xz": "7e1ff0a950db0ecbadef3a9ee55a593891f11a42c6c0ff59637074c8b5c4da74", - "dist/2022-12-27/rustc-beta-i686-pc-windows-gnu.tar.gz": "90487ff490c4e71ae62e28492cf49600f8f92e0f35f5d76a50eafcf4bbcf4bcb", - "dist/2022-12-27/rustc-beta-i686-pc-windows-gnu.tar.xz": "8b44fb934aba0eef296098bfc5a9f2994cdd595420ce10f4f310c5ee9d481071", - "dist/2022-12-27/rustc-beta-i686-pc-windows-msvc.tar.gz": "0fefda6b62234a43976ebf18d7cd62057cad5b494c750f2d9730f5df64cadb00", - "dist/2022-12-27/rustc-beta-i686-pc-windows-msvc.tar.xz": "c9eecbc06e7456bf5e383557a8e5720d00d09de640b8c46139121faadc354d74", - "dist/2022-12-27/rustc-beta-i686-unknown-linux-gnu.tar.gz": "8b17d032192aa17e52a3f08a074079561ad7ad6c439f9274aef228af93adacc3", - "dist/2022-12-27/rustc-beta-i686-unknown-linux-gnu.tar.xz": "c70638cad594097450a469837411b110e979c303727341623427e3c9e4e4f507", - "dist/2022-12-27/rustc-beta-mips-unknown-linux-gnu.tar.gz": "3669ff9024092ab467a1b95aec2cb1692810ee716739f31e3aee7d89e6bd6d7f", - "dist/2022-12-27/rustc-beta-mips-unknown-linux-gnu.tar.xz": "165859e42492e33bff634c80b6c96b13fd2252981b4be2821b96a6593933e22a", - "dist/2022-12-27/rustc-beta-mips64-unknown-linux-gnuabi64.tar.gz": "2ac418c0cdeb2382aea7296169d747f65349d7e6d5aebbdde7b377e985de354e", - "dist/2022-12-27/rustc-beta-mips64-unknown-linux-gnuabi64.tar.xz": "21ae51357508398527b6edd2e5fbb1745fda1c8db2683c40847216c0ce251d47", - "dist/2022-12-27/rustc-beta-mips64el-unknown-linux-gnuabi64.tar.gz": "3eb68935676424aa8c68bc32b06c010c5c1302fa6f77e9b33e5543565562d176", - "dist/2022-12-27/rustc-beta-mips64el-unknown-linux-gnuabi64.tar.xz": "0eeb58035b510a166b8506168f67850993e278888986773c779bee24d7a6ec11", - "dist/2022-12-27/rustc-beta-mipsel-unknown-linux-gnu.tar.gz": "f41d878b2e49beb9ee3a1bb8863ce1b81fae7100a786a78d9922bf8a4fd0dfc8", - "dist/2022-12-27/rustc-beta-mipsel-unknown-linux-gnu.tar.xz": "e0cd18973c7651cd2e1e041f92900375a045bef62754d432df539000aa5946c4", - "dist/2022-12-27/rustc-beta-powerpc-unknown-linux-gnu.tar.gz": "7206be82ba39971c6a734f4a89f7f750d581768d82253e31cd985fecd1d17c3e", - "dist/2022-12-27/rustc-beta-powerpc-unknown-linux-gnu.tar.xz": "f9ec2a3e98a3b94b170237386256c763d62925b430d0e12a289982c7c79d2bfc", - "dist/2022-12-27/rustc-beta-powerpc64-unknown-linux-gnu.tar.gz": "32be7fe5f359cb2312c9bd966eb43b143b336b4acbdf118bf09221574f157b16", - "dist/2022-12-27/rustc-beta-powerpc64-unknown-linux-gnu.tar.xz": "a8163a5b527b1ee932e06589d690c17d8848dbfa8504de6984a718579698abb2", - "dist/2022-12-27/rustc-beta-powerpc64le-unknown-linux-gnu.tar.gz": "3e875cb943dd0ffff907f6a582a64f923cb84a07ddd8b5e6f1ec2e1d4228342f", - "dist/2022-12-27/rustc-beta-powerpc64le-unknown-linux-gnu.tar.xz": "22537364de01be77a2a5d79486b1090dbee7b3273fc634073031f82576a61a14", - "dist/2022-12-27/rustc-beta-riscv64gc-unknown-linux-gnu.tar.gz": "230041ec7d0d4debc841abafe2f3314de51793d281a1077835d9190286a558f7", - "dist/2022-12-27/rustc-beta-riscv64gc-unknown-linux-gnu.tar.xz": "2dafdb1a97469737123149608476c248a77ccebeb22834b6a2166fc30551a7ce", - "dist/2022-12-27/rustc-beta-s390x-unknown-linux-gnu.tar.gz": "0bd96121550321138dad9f74f331eaefd77ab388843e5561c5c0cb32e9d80072", - "dist/2022-12-27/rustc-beta-s390x-unknown-linux-gnu.tar.xz": "ecb02c8535c1518e589eefb10be17830010c40be61f3184576abe93e098d793d", - "dist/2022-12-27/rustc-beta-x86_64-apple-darwin.tar.gz": "600b83ea5c832dc6ad9746d74b7dbc8ea566adb9208c4260b183ef05078d2bff", - "dist/2022-12-27/rustc-beta-x86_64-apple-darwin.tar.xz": "175930f3062b433fc0a2b959917933bf3347d3f3e0900684785493d0ee9dc6f3", - "dist/2022-12-27/rustc-beta-x86_64-pc-windows-gnu.tar.gz": "d1701678ee1d2f2e91f3c1f898f852593ec1b109e430c53c13bc2898b08bca3f", - "dist/2022-12-27/rustc-beta-x86_64-pc-windows-gnu.tar.xz": "3400e923af537d28139b9d5d780caa039828e06677cbf499322614006552778c", - "dist/2022-12-27/rustc-beta-x86_64-pc-windows-msvc.tar.gz": "d462ca50803b13e136fbfd49ac4a6e186e416041f3cdaa8b4fe72e628cc10555", - "dist/2022-12-27/rustc-beta-x86_64-pc-windows-msvc.tar.xz": "81ca0992ec8306ff67b00f5f85f31c6617f78b7350116dd56df082c477c9069d", - "dist/2022-12-27/rustc-beta-x86_64-unknown-freebsd.tar.gz": "65fe64154264ab76bb94aa7f107efa9b58cb801c9aaabcc7e6ffa0ce14319ef9", - "dist/2022-12-27/rustc-beta-x86_64-unknown-freebsd.tar.xz": "cd6e9bfb6e8c08a46dce7bc623cfdc5a04e55c8377eaa3a75fae0bfe8e00b43e", - "dist/2022-12-27/rustc-beta-x86_64-unknown-illumos.tar.gz": "a66bb4b0d9dd9a21b54857c4fa7eb48a88789f0414fec4a1e36c798546c4b71f", - "dist/2022-12-27/rustc-beta-x86_64-unknown-illumos.tar.xz": "b63e6299e961b75d9c9bcb46e1dbc22b8fec89292ee6c8758edd43f4b89cb12e", - "dist/2022-12-27/rustc-beta-x86_64-unknown-linux-gnu.tar.gz": "c768beca1350bdcbcc31c7d3f30c3ccec0ab2bea0c28bc4c89cdd32d9780cd00", - "dist/2022-12-27/rustc-beta-x86_64-unknown-linux-gnu.tar.xz": "62a675d74274ddb4d8a9146c20942cb91b86e0c94a902169c2cf77f4d471d645", - "dist/2022-12-27/rustc-beta-x86_64-unknown-linux-musl.tar.gz": "8f2b81b37bc34291f3d90bb6aec621da0ac760c39727bfd24449c288cc8cb3c3", - "dist/2022-12-27/rustc-beta-x86_64-unknown-linux-musl.tar.xz": "053c313c9a751bf0102448866fad2a80ca67b9f79afce82ce03805430e2e695b", - "dist/2022-12-27/rustc-beta-x86_64-unknown-netbsd.tar.gz": "a9f42eb0ffdc4bef87669d8fb5163e81a5d82ff6baf631f159b7bccafe9df453", - "dist/2022-12-27/rustc-beta-x86_64-unknown-netbsd.tar.xz": "d1ea529e56d57132de1782396a767f8f00f30e2b5f7c9a5fa96c3289b43e3515", - "dist/2022-12-27/rustfmt-nightly-aarch64-apple-darwin.tar.gz": "411b96fddfbcc90b4522e3f4e2d6e174f3440960e89193c97fcd5ca8afd62809", - "dist/2022-12-27/rustfmt-nightly-aarch64-apple-darwin.tar.xz": "29db6fb11b411dc8351a8a8d1b148e81d9c87f9fb234b3a18722ee470b4d36c0", - "dist/2022-12-27/rustfmt-nightly-aarch64-pc-windows-msvc.tar.gz": "32ab437117791eb7113ac522ee4119e2e43722528141302772adf9cda7306b24", - "dist/2022-12-27/rustfmt-nightly-aarch64-pc-windows-msvc.tar.xz": "4d892f3c65ef8e32670ab3c3e8fb39a2ae623c59d1ff555ec94644254e954474", - "dist/2022-12-27/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.gz": "8bff3a1591d25d3e1acb70600e6cd54d712772247376ac5eb90a4b2aafd21a6a", - "dist/2022-12-27/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.xz": "b81b094d128a37b178da1eda7c72399a9da4bd614e697c53e9c4d78589f859f5", - "dist/2022-12-27/rustfmt-nightly-aarch64-unknown-linux-musl.tar.gz": "b3a685d1abe4ac639a0a3ea187b83ec660cd838e7c5c010ed60f8620d17df906", - "dist/2022-12-27/rustfmt-nightly-aarch64-unknown-linux-musl.tar.xz": "10b7563202520708fd27cc221ee8db34b368563eb1586be1395955ebf4313d6e", - "dist/2022-12-27/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.gz": "34e5ca3d51b51ccd97ded5e0c31c999a84f9d5ca5ee3d010e15212a97ab40567", - "dist/2022-12-27/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.xz": "16638ba8478861276c10847b989fd23de942cb82a9d4da9d92858c6800a39a9e", - "dist/2022-12-27/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.gz": "13fa3bf29e9d20291703bf2c03bc97cd8e2081d1c747b6835eb0a06f94dd5d19", - "dist/2022-12-27/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.xz": "98dd01d90657e43ab3a2b91673137cd6ae4c171633db1f1e4b68b2e90bcb9bab", - "dist/2022-12-27/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.gz": "1370e4c8ad5bab425c02fc924d5ac079ac1387368a3ea5d22c1cdc2edc9c6ba0", - "dist/2022-12-27/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.xz": "8c312da4ccd992c303fa3f181dc46f9b01022f72061ef43b2fd5848736547870", - "dist/2022-12-27/rustfmt-nightly-i686-pc-windows-gnu.tar.gz": "0d7a87816f50452349bd26cefdd9f53f2d93a53243290ac59bd5de414407aa1e", - "dist/2022-12-27/rustfmt-nightly-i686-pc-windows-gnu.tar.xz": "982fc6783ad07235d375c4c8964104fdc64a009ea359cca532cc268a8249e88c", - "dist/2022-12-27/rustfmt-nightly-i686-pc-windows-msvc.tar.gz": "a5b76840e49a912a819809a2b4c73a0e750422fad4876d11b409a8ed49a77911", - "dist/2022-12-27/rustfmt-nightly-i686-pc-windows-msvc.tar.xz": "9566b6417a0bdb4c73272d167cc743b297db62f625449343a6f1ab60c52d5327", - "dist/2022-12-27/rustfmt-nightly-i686-unknown-linux-gnu.tar.gz": "bf6cb5e886ce02a3f9b4b00a3696da0ee277af8f690f5a31119c5fce5779cd4d", - "dist/2022-12-27/rustfmt-nightly-i686-unknown-linux-gnu.tar.xz": "7afa5129bc43346614869721e7094f65eba6681bb9b8ca8a3559925f29433f10", - "dist/2022-12-27/rustfmt-nightly-mips-unknown-linux-gnu.tar.gz": "f9805697506a0c730299492fe04c53433c8c4deb70ca245ff1c2cf5151fe306e", - "dist/2022-12-27/rustfmt-nightly-mips-unknown-linux-gnu.tar.xz": "f5d7d5a841a7e7a5d749e52cdb118d2f2cec09de68835a42748db4b3a0a79979", - "dist/2022-12-27/rustfmt-nightly-mips64-unknown-linux-gnuabi64.tar.gz": "dc903c64c969a3c21664263c2a30e9cb0dc42069a95f755545ce9648240a376e", - "dist/2022-12-27/rustfmt-nightly-mips64-unknown-linux-gnuabi64.tar.xz": "de6591cc73244d99b3469d88439ad442f00037a1cdcaf5fdc5a694b52e47b2fb", - "dist/2022-12-27/rustfmt-nightly-mips64el-unknown-linux-gnuabi64.tar.gz": "f4e8dba56a1b90d5871bf8722a5ecd2027a4f101299880a8689f5cf46df2606a", - "dist/2022-12-27/rustfmt-nightly-mips64el-unknown-linux-gnuabi64.tar.xz": "496c19042848726db446cd3df4c52f3e8a5527002ca5492e2d6ef72528d6887a", - "dist/2022-12-27/rustfmt-nightly-mipsel-unknown-linux-gnu.tar.gz": "58742a5c8230e8749b01058acea639d92d45090bcec6fb7eb1d8f356b0f08631", - "dist/2022-12-27/rustfmt-nightly-mipsel-unknown-linux-gnu.tar.xz": "bbbdaa32d8d29c407133b0ef2851970da884032effeb85c271d57e58b7d38a44", - "dist/2022-12-27/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.gz": "1a8a59193dc15d331c3243a2cfaf5c81c023464becc4da63201583d2d2cdc27d", - "dist/2022-12-27/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.xz": "ee86ae7621804a7b57ccab06dc73b7d87453b53814d482ea43dc26dd01dae1c5", - "dist/2022-12-27/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.gz": "21a79a050e4461305e280ed7de7c0ade2774ad5230f671c76667be7bdbdc47af", - "dist/2022-12-27/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.xz": "033afa47c24a4887d40d62391f9f66b76dffdc1bd8f1ad622bfb14db91d7df03", - "dist/2022-12-27/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.gz": "01cea51850a7f676803f5f8f9a556a71bfb8e7a7e04cc5fc0e7d1b706473338b", - "dist/2022-12-27/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.xz": "720bf138fb2c541d8d8d0c60d6584cff692c932c6f383901f999e7b3d4078770", - "dist/2022-12-27/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.gz": "8c3f3fd601bc7d8670f6acfcda29206fd5590fb3a2a6cbb3794ba29cf749144d", - "dist/2022-12-27/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.xz": "8f1b43479a724197c7ac051c6a6d2a10bd87c6b24fed1d38c9e93f503c87e5b6", - "dist/2022-12-27/rustfmt-nightly-s390x-unknown-linux-gnu.tar.gz": "b38b6dc1e65cc0f5031d2045a90404f3b2ce2648884db1f658641e76168d0109", - "dist/2022-12-27/rustfmt-nightly-s390x-unknown-linux-gnu.tar.xz": "ed635e2388fcd3bbe94f497404b6787edd5e7471d6c6471345386a43444f46d1", - "dist/2022-12-27/rustfmt-nightly-x86_64-apple-darwin.tar.gz": "457995f055ef35a2491326f95caf31376b21e3cc4c0316cf4536cb7604e472d3", - "dist/2022-12-27/rustfmt-nightly-x86_64-apple-darwin.tar.xz": "d80b01e8c007da58250f7affea8d034a536437efd766eeb8de6d5b7feba9b0d5", - "dist/2022-12-27/rustfmt-nightly-x86_64-pc-windows-gnu.tar.gz": "ee2ab7683e75fa68ad482c81e546cd71b9209497f16a0590507e5de884f1e627", - "dist/2022-12-27/rustfmt-nightly-x86_64-pc-windows-gnu.tar.xz": "d08326f42bf7f38855e37c624a38923d09cbf162b666e8058891aff06ec017c8", - "dist/2022-12-27/rustfmt-nightly-x86_64-pc-windows-msvc.tar.gz": "e42ee4dfdd0aa342dd8192204fd6cfb503eaa0069f70776adbbca352d7e7b661", - "dist/2022-12-27/rustfmt-nightly-x86_64-pc-windows-msvc.tar.xz": "76ec230ae507729fb4ced016a45b0020775a9eef068c2b2e5ae6e3fcb451d32d", - "dist/2022-12-27/rustfmt-nightly-x86_64-unknown-freebsd.tar.gz": "55f5c89950a81b00efc542c19b42cbfeb9c969af63280106fc78e8893df3d568", - "dist/2022-12-27/rustfmt-nightly-x86_64-unknown-freebsd.tar.xz": "5a4cf3589d06e562ebed70bf0015af3e80f83de1c4d311c810ebf09feac640bf", - "dist/2022-12-27/rustfmt-nightly-x86_64-unknown-illumos.tar.gz": "fb44bc69be6c89c7245b914324e23284dbd9887ac0c1c4a65379344ce78cfb28", - "dist/2022-12-27/rustfmt-nightly-x86_64-unknown-illumos.tar.xz": "8d34915b54cd8ea6abf0bff01546f31f74342e1d21128b1e14c32cdfd3505afd", - "dist/2022-12-27/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.gz": "d15403f81b36c0a2829ad2dee5c1edf39a993a13ccc57f01bb45c77898e3b9ec", - "dist/2022-12-27/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.xz": "4c0c61f404ec6bb87ab044c0850d116c577a2ff3cfda9ac1598a7858b4fe1a7d", - "dist/2022-12-27/rustfmt-nightly-x86_64-unknown-linux-musl.tar.gz": "8bc1fe0e2496769f52a576ccd13f706b26f706f060bebb2618e2c64c3831e2d3", - "dist/2022-12-27/rustfmt-nightly-x86_64-unknown-linux-musl.tar.xz": "bcb527bb736bea88bbbb6974ba388b11fe20596c2c178314bbfdad5e2db65fcc", - "dist/2022-12-27/rustfmt-nightly-x86_64-unknown-netbsd.tar.gz": "8bffdf816b12c53d5443e2523c0960a37ab67c93590b0bb753fd5a026e67d368", - "dist/2022-12-27/rustfmt-nightly-x86_64-unknown-netbsd.tar.xz": "bb5c947ab6dfa28fa7c3d7050e9c14c02eaedf2a4e06d290bee554f569be2c30" + "dist/2023-01-24/rustfmt-nightly-aarch64-apple-darwin.tar.gz": "dbfbc33fe90a67ee39e8c1ecf3015405c5cc6a3fd93ae3b004c54861b488b09b", + "dist/2023-01-24/rustfmt-nightly-aarch64-apple-darwin.tar.xz": "aca5cdb50aeacacbdaefc126c5f2236d4658939f18d1cadd68f120af7b4c3ecb", + "dist/2023-01-24/rustfmt-nightly-aarch64-pc-windows-msvc.tar.gz": "97b4f42d93dc10bb7f4a967f013be88a3c507815decdd93a2ea954b75b189cf0", + "dist/2023-01-24/rustfmt-nightly-aarch64-pc-windows-msvc.tar.xz": "25615f274ceef21054d081914244051d00322003ec40cf0c467abccd1037d8b4", + "dist/2023-01-24/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.gz": "02ab0d565707f2399326526ed66e197a8d919c66a0f21c7c3f95c840ac20244e", + "dist/2023-01-24/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.xz": "5f148006e087e7105b88cdb64f80e27b3c4d27c08944217ef889add6185f067d", + "dist/2023-01-24/rustfmt-nightly-aarch64-unknown-linux-musl.tar.gz": "8291ee3a006d8ba932fb9cdd0449f2caf690190ed87cf9ff81c32da510ce6b70", + "dist/2023-01-24/rustfmt-nightly-aarch64-unknown-linux-musl.tar.xz": "760aee321753c993c861292a014994193abfe1da85b91124d9c583646836d156", + "dist/2023-01-24/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.gz": "a3c8935265ef05f1e4a14ff22f4f4d57c6aa44816a6ca55a48af9c5449b3ae84", + "dist/2023-01-24/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.xz": "5cddc0649e59498fc887cbb9150ee16b55c8a72eb4f67a7e09b37a0ebfa30046", + "dist/2023-01-24/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.gz": "77b21f570054ef92c8e1b7d28d43e40064c97fd97e01e7ed6bc23c35e20786b7", + "dist/2023-01-24/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.xz": "b027d1a6a46631b1dcc5e62466b7a459443c4d2b01e7781e3a7a5520d3f79ece", + "dist/2023-01-24/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.gz": "cea014c2983692ca40f8e5d9e8fd2fbbe6d3f44a6ebcd554ce6c75316aa55e4f", + "dist/2023-01-24/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.xz": "bf3ad7d15b9b3c2a1db9c81c359e09a61bdc92932c6cef83073f886fdf138c38", + "dist/2023-01-24/rustfmt-nightly-i686-pc-windows-gnu.tar.gz": "13789d43a9552e490e7e90c23d6046245b5f858abde9aceb2038b1ed51530879", + "dist/2023-01-24/rustfmt-nightly-i686-pc-windows-gnu.tar.xz": "b1de4837aaf4dfcfde9eda904c5c2a506bbf45439c52740a1d465a5cf223bc07", + "dist/2023-01-24/rustfmt-nightly-i686-pc-windows-msvc.tar.gz": "7202987c56395d7742b1403866bc6d3f2fe844e77efc9b1abcff102ad7db8091", + "dist/2023-01-24/rustfmt-nightly-i686-pc-windows-msvc.tar.xz": "6cd740234171c3164bb2ee296d7afe02702d6dc1d75d49fbbd0e43a1c875aad9", + "dist/2023-01-24/rustfmt-nightly-i686-unknown-linux-gnu.tar.gz": "07c19deb3f3de9e6a149577fac37cecbefbb7db2a8ad27ec374fa4b04f9d7226", + "dist/2023-01-24/rustfmt-nightly-i686-unknown-linux-gnu.tar.xz": "1501bf589a2ece8d4cb70bcd582b5d0a7999140b2d2d6c56613f16c70831814c", + "dist/2023-01-24/rustfmt-nightly-mips-unknown-linux-gnu.tar.gz": "74bad9753ceb342fa11ec5fdcc78e97b0088587cbea8ade63a9d21d78a2b2722", + "dist/2023-01-24/rustfmt-nightly-mips-unknown-linux-gnu.tar.xz": "0c89c8f2a533db51d0d55dd783451a423de473eb9b0dd092a6e70cbf1424afc9", + "dist/2023-01-24/rustfmt-nightly-mips64-unknown-linux-gnuabi64.tar.gz": "b06d454a4d4e77c4e6e33a05cf74e7fbfc5c5cfe9f29a8340564bce7cfc9107c", + "dist/2023-01-24/rustfmt-nightly-mips64-unknown-linux-gnuabi64.tar.xz": "f3ff52f12ab81631a769431f6c815b70fc252087685a53d6718f67f49abcbc35", + "dist/2023-01-24/rustfmt-nightly-mips64el-unknown-linux-gnuabi64.tar.gz": "669ffedfc4db61034e8352f1359e135851b771a4ead0a2a4b2e2523305e0347c", + "dist/2023-01-24/rustfmt-nightly-mips64el-unknown-linux-gnuabi64.tar.xz": "8f079d3d4e508618291715db2181b1516edbd084909d727e5a15538ee4b7b24f", + "dist/2023-01-24/rustfmt-nightly-mipsel-unknown-linux-gnu.tar.gz": "9f12607d844249fcb89f0e879ce2c7f7eed3bec7213a01d4c7f156e2d0109564", + "dist/2023-01-24/rustfmt-nightly-mipsel-unknown-linux-gnu.tar.xz": "c65cfe59919178b4431f37d997d5e6e4af00d0ecdde50b7b9432a71e08aa79b3", + "dist/2023-01-24/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.gz": "ed7866cbfde12692438554f445a475fe3ded60210adffd34778e200e22730f36", + "dist/2023-01-24/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.xz": "8b082eeb39e67f1a9d601f4749b90a8f37f21026502595ca99f9ba6c8f00b510", + "dist/2023-01-24/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.gz": "02cdc38571616260749e04dc44f01e122d5388f682ec5ecde18d555bbf681c9b", + "dist/2023-01-24/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.xz": "ce72390e2116bd8ff4d1cf77e0ff760048464ab647e6d21d669a8e451e16c2fa", + "dist/2023-01-24/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.gz": "3ce12078c57df56569f2e6c13b24c6cbcae411a60a0ea386ccc514f1a4d05bf9", + "dist/2023-01-24/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.xz": "36a34f7fadaf3d5f6ab191a47de698b5574065b1b86b53668a6475ca7628a892", + "dist/2023-01-24/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.gz": "a6c6a5596f06fe1f7119d0befc208d646caa2be2841b219b6717c6c7f52d209e", + "dist/2023-01-24/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.xz": "248f4b77dbb659134f019c3819108c46c2d3a5d1c37ded7152fa6a86ee938e3c", + "dist/2023-01-24/rustfmt-nightly-s390x-unknown-linux-gnu.tar.gz": "da830d46e75cc7c795d722f0b52595031740c60c063bebae3921fc5bcb8691ee", + "dist/2023-01-24/rustfmt-nightly-s390x-unknown-linux-gnu.tar.xz": "5ca4d5c1f36950682903fa02d3f1a07fe6117eae0d2987743fdd835178bd1eb3", + "dist/2023-01-24/rustfmt-nightly-x86_64-apple-darwin.tar.gz": "9ac34c02e7fc80964d02815fff239c67abddd4de216fec4a43c7ece10c239228", + "dist/2023-01-24/rustfmt-nightly-x86_64-apple-darwin.tar.xz": "e63033c3ecc08347bd14ae25e497f8471419d6f110358d2993d4f24b9d5c35bb", + "dist/2023-01-24/rustfmt-nightly-x86_64-pc-windows-gnu.tar.gz": "ebd8db08c806ccf805428f454578ed52124a4a989be85a3c83a5f249af6109e4", + "dist/2023-01-24/rustfmt-nightly-x86_64-pc-windows-gnu.tar.xz": "c9c1779798b5412d66dc4cee0ecb15fd168862b150ed1ce0486d0c56258e34ff", + "dist/2023-01-24/rustfmt-nightly-x86_64-pc-windows-msvc.tar.gz": "3c55a8ea07044d7894e1a584ae216676fb26a83de41a1ad9fbfecf5a7ef3c317", + "dist/2023-01-24/rustfmt-nightly-x86_64-pc-windows-msvc.tar.xz": "b5be35b6b20b7f0a72c76fa6d76c55b16dfd86461018a623ccd289d0836523d5", + "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-freebsd.tar.gz": "9763003f2f0790cb379c238c73ca26a9683d6034f7aec1dacfc72a601e398271", + "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-freebsd.tar.xz": "8f7073076408d5880ec326ad673a5c33e023a2f1ddc92affa8cbf3aa2d2f1274", + "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-illumos.tar.gz": "d667651444a2fc3a87d3b5c427d35c1b2629f4c14d319c73e54c3efccd0f18ba", + "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-illumos.tar.xz": "8a57c358861edde8a1a59139609525c999f596034a3271661bb7eb573306e347", + "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.gz": "b56c7533697f3db80901d9012c4dedb7599d9d3f8489730d64e19d857552ff3d", + "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.xz": "0233142bb789b2a1cfa7f746cbd6d3f074c2a9c9925b9bac5def9a53bc6b6f55", + "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-linux-musl.tar.gz": "51978f029470ddbb5915bf6f4ca68d104f3b9ca36a3584ea14824c51e43afee6", + "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-linux-musl.tar.xz": "d27c5768be94e48ff37d56e41b67b81c909e7764f0d753089f4627864bb31bc9", + "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-netbsd.tar.gz": "6aa26a4bad451860941074576e2b56bb39cd033194b3d75df5a9c55745ec16aa", + "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-netbsd.tar.xz": "0c6fe51cb3de9af84deea4cafb9e1734b4d5f7d62be42a36b85408e655ae3504", + "dist/2023-01-25/cargo-beta-aarch64-apple-darwin.tar.gz": "323f3c4c41892765b24201aae83a54fcaef08e47b9b2912a2680528c6ed4f8f8", + "dist/2023-01-25/cargo-beta-aarch64-apple-darwin.tar.xz": "2039157d9100ccadf4d3596f5d7b052e10ff997b59ac7619999969794fc51eae", + "dist/2023-01-25/cargo-beta-aarch64-pc-windows-msvc.tar.gz": "ac3c88c99aed8d4547f8b0f857ec3538456f10223411580278eed10f6e2be30b", + "dist/2023-01-25/cargo-beta-aarch64-pc-windows-msvc.tar.xz": "27b11ea3c67f202e61b5e7394d36bedc7f1b054ca53d68e53ccd7bacf77b4af3", + "dist/2023-01-25/cargo-beta-aarch64-unknown-linux-gnu.tar.gz": "4d6d1d47d34e8042aa978fe5a6b5b8984d6626d38731081db2d5b413d5b844f4", + "dist/2023-01-25/cargo-beta-aarch64-unknown-linux-gnu.tar.xz": "a50e473aa6b6bffd84a719aec602d4bc19f03ccb0ee5f26340eb466501cb2970", + "dist/2023-01-25/cargo-beta-aarch64-unknown-linux-musl.tar.gz": "a043def73a5c72d515c3d7dabe09022c353b047e7a4e4e13e9b17da9b30f8828", + "dist/2023-01-25/cargo-beta-aarch64-unknown-linux-musl.tar.xz": "a63a8915409df4ae5d76d530b46cb7e83b6e6ca79790fa095d899e33773124a0", + "dist/2023-01-25/cargo-beta-arm-unknown-linux-gnueabi.tar.gz": "9c0c413187f1f1e0f1b6f1b66af0bd1b264d94f73439f6df24f476ee1c6c04fe", + "dist/2023-01-25/cargo-beta-arm-unknown-linux-gnueabi.tar.xz": "cb79e76beb989a3e4ffd1461817ad2dd0602aca3bce1a2e54cccc1bbb518a303", + "dist/2023-01-25/cargo-beta-arm-unknown-linux-gnueabihf.tar.gz": "d57c5806a13b498768b53a053c7eb17e8becb19ea5fc9561a2a600dafea32056", + "dist/2023-01-25/cargo-beta-arm-unknown-linux-gnueabihf.tar.xz": "33f35d8c2f5fcd5fa7928f2186a8b2417040e01462152430bae978d8d5a661cd", + "dist/2023-01-25/cargo-beta-armv7-unknown-linux-gnueabihf.tar.gz": "80ba79da61f82dc760a9dd7bfdfde29fefcab4ae94917cbf5d908332f93061d3", + "dist/2023-01-25/cargo-beta-armv7-unknown-linux-gnueabihf.tar.xz": "a8e48c6345b0e195ea58d6237a247b0d20c8d128af1b12813430806b9a340d5b", + "dist/2023-01-25/cargo-beta-i686-pc-windows-gnu.tar.gz": "052e2c0ff954d66e40101dc075bdd19fdb0befcbfdbc26dd94093bc4147c65cc", + "dist/2023-01-25/cargo-beta-i686-pc-windows-gnu.tar.xz": "94681fbbeb12de4b97b0a5a0206204c41b16c3de1c7c3262e1488f00b22aeb51", + "dist/2023-01-25/cargo-beta-i686-pc-windows-msvc.tar.gz": "3c0c2205e97136ac5e13b3c89d745af24afc60e6b5adc24abf22755d8d0007a1", + "dist/2023-01-25/cargo-beta-i686-pc-windows-msvc.tar.xz": "9ccf1a81d524fbac3f859c0185421936b97ae565164c12ed32e6a39052eac695", + "dist/2023-01-25/cargo-beta-i686-unknown-linux-gnu.tar.gz": "68749447a45ada6bb6e06488e3d58ecca7939d3c77dc40c22f22d7257eae247c", + "dist/2023-01-25/cargo-beta-i686-unknown-linux-gnu.tar.xz": "6b8942c01d1b8fd1f1f399b7f63db409a30df240b5aca5cf34e3166adafb5053", + "dist/2023-01-25/cargo-beta-mips-unknown-linux-gnu.tar.gz": "7f8fcf5d25353dac5d2cd6ad04b20da19b2dbccd25a977e8122d85724a632392", + "dist/2023-01-25/cargo-beta-mips-unknown-linux-gnu.tar.xz": "91d0ec836e2941287ac28a753650e1b7b57364af58fdfedebe1fafea8612f1ac", + "dist/2023-01-25/cargo-beta-mips64-unknown-linux-gnuabi64.tar.gz": "171f40046f777d84fe5a4349d3565ad3485fdf075d8fbe194ca31ba2be9eeb1a", + "dist/2023-01-25/cargo-beta-mips64-unknown-linux-gnuabi64.tar.xz": "0521be760b2a1e6cc134bbe3473dea01a6d0fbf68b05995f41a75875d489eb60", + "dist/2023-01-25/cargo-beta-mips64el-unknown-linux-gnuabi64.tar.gz": "ee7c39af31d09a42c5ce1151da6dc1147b5c1aceb0ea94cb3059bac49e72ba2a", + "dist/2023-01-25/cargo-beta-mips64el-unknown-linux-gnuabi64.tar.xz": "dc8ddfc8bd305c3f1f4d7965b8bbd8b24235ef758c38a32b3d64b5879fab25d2", + "dist/2023-01-25/cargo-beta-mipsel-unknown-linux-gnu.tar.gz": "4757229750f44b3d523ef7a9c778d923113a8eb8b93ad97ef5e4f23a6f1e6a21", + "dist/2023-01-25/cargo-beta-mipsel-unknown-linux-gnu.tar.xz": "36911ebbdde86d90bca90b61b1b31f6ab054ff65907ac73a22d5ae09d061c444", + "dist/2023-01-25/cargo-beta-powerpc-unknown-linux-gnu.tar.gz": "8e4ce0a0743d301d056a1bafb4216ae96fd6cb06ca083216eaf7f3a21514e064", + "dist/2023-01-25/cargo-beta-powerpc-unknown-linux-gnu.tar.xz": "47e28a41670bbcc7a3787c68dcf72ffe42bfbc3e9f14418871ca814538f88180", + "dist/2023-01-25/cargo-beta-powerpc64-unknown-linux-gnu.tar.gz": "7bcab6e25cd8208eb220839f6adb202dcd382e4bc32fa63b83c40fba330246b9", + "dist/2023-01-25/cargo-beta-powerpc64-unknown-linux-gnu.tar.xz": "650bb4d6b51ef5293164642101395fbf6d9eedcaccccc8ff3e2be032d9e60316", + "dist/2023-01-25/cargo-beta-powerpc64le-unknown-linux-gnu.tar.gz": "fc779f539835c1f3e1e7d9c1eed932568a5e731888f766202279e9240dd20e36", + "dist/2023-01-25/cargo-beta-powerpc64le-unknown-linux-gnu.tar.xz": "b39ab17c34560266df7dc60b6cf5626758f8b28f7142b916f1f3399342e6e0ec", + "dist/2023-01-25/cargo-beta-riscv64gc-unknown-linux-gnu.tar.gz": "7b677b4a2cc59b3baebc1265f8a364879b2195905de1eb20f62b66e2fbfdbb08", + "dist/2023-01-25/cargo-beta-riscv64gc-unknown-linux-gnu.tar.xz": "bceab89d3ae1ffd25fc155a7b3514c69e3962ce8f7727cc7e7c4b40f0c6eb3eb", + "dist/2023-01-25/cargo-beta-s390x-unknown-linux-gnu.tar.gz": "d0522064a1994aa338d12f5ef68635f8804a2cb9151dd67771ae132e65560790", + "dist/2023-01-25/cargo-beta-s390x-unknown-linux-gnu.tar.xz": "478fdff509a609e5310c54fa1e0eecbb3870a0636132dbcc71291e150c805828", + "dist/2023-01-25/cargo-beta-x86_64-apple-darwin.tar.gz": "cfb5bc9dcf4c85915e5c7e4a29e7f45c4e5de4a3535c75ce7c192c08511e0350", + "dist/2023-01-25/cargo-beta-x86_64-apple-darwin.tar.xz": "6b1f48ceebc916f9829f599fc815de2b8724873ce8a22ba058a2a1ac1df46295", + "dist/2023-01-25/cargo-beta-x86_64-pc-windows-gnu.tar.gz": "60d119c084899f0a1d7661188756833118bc538d7e7298c72d1452b06e27ef62", + "dist/2023-01-25/cargo-beta-x86_64-pc-windows-gnu.tar.xz": "801d03dfab7e8007a97d95c551b3a069e56371fe33fa4682e20fa50a8123bc20", + "dist/2023-01-25/cargo-beta-x86_64-pc-windows-msvc.tar.gz": "269bdb128749d234e12b5795b90acc1a91bc0c338ed3be70ab2e62d476fcd055", + "dist/2023-01-25/cargo-beta-x86_64-pc-windows-msvc.tar.xz": "88737cc19187a0752e45345eb286a5e9d500f9c71e03bb26737888fe42b350b5", + "dist/2023-01-25/cargo-beta-x86_64-unknown-freebsd.tar.gz": "146d1af37cce4b6eff9f99bb74ad33f2d91383a2b69dfdbd59ad54fc2dd44c49", + "dist/2023-01-25/cargo-beta-x86_64-unknown-freebsd.tar.xz": "9466a4417a1ea6a9ab03ea7d05f747a731ed0bf5545148a1c782c797dcff50a9", + "dist/2023-01-25/cargo-beta-x86_64-unknown-illumos.tar.gz": "f32fcd8a18047646865afc67f92d6edda54fbe3f4e9963aba2095e23295e6ce0", + "dist/2023-01-25/cargo-beta-x86_64-unknown-illumos.tar.xz": "25431bfe87d8c944225122d21ca4823cefe72b304b10933c628d5d2df13d5f5c", + "dist/2023-01-25/cargo-beta-x86_64-unknown-linux-gnu.tar.gz": "cd67e483efd3a9cca57523cee428cd9a5555ff93b057f7fef4178a3e2fd49309", + "dist/2023-01-25/cargo-beta-x86_64-unknown-linux-gnu.tar.xz": "45d578c09399495b67ac38358e4251e3d7a20e988428a1a5a1e39387d2664da8", + "dist/2023-01-25/cargo-beta-x86_64-unknown-linux-musl.tar.gz": "f66eb2cf2c637b4822e2c326b4a57d63eb3c0b517ddb69ff57a45001bc0a110f", + "dist/2023-01-25/cargo-beta-x86_64-unknown-linux-musl.tar.xz": "7a0817ef29d6511d4fd9dbbdf3e9a92635f076d9b0633cb55b325cebeee4efb9", + "dist/2023-01-25/cargo-beta-x86_64-unknown-netbsd.tar.gz": "1330a1b4f975b1d96692bdc4a6392ca87e8e99982768acefc2815e386b6f4e77", + "dist/2023-01-25/cargo-beta-x86_64-unknown-netbsd.tar.xz": "919e25bd54133f4a8cbbf09218415ca7a5041298b32181fa566c5d4a8bfd8b90", + "dist/2023-01-25/rust-std-beta-aarch64-apple-darwin.tar.gz": "3dcf5c58141e44d1c84f33f58ca4dd99edd277ef15a69fc6b94fbe7c67a27483", + "dist/2023-01-25/rust-std-beta-aarch64-apple-darwin.tar.xz": "a651af6487e2f3246075b984fffb4072338a559ff8e6c373289a6242c0ca3ea7", + "dist/2023-01-25/rust-std-beta-aarch64-apple-ios-sim.tar.gz": "5e3d5aa50784ee63c6df03b07ac92649f76c40ac6fb49c24d97896814002697c", + "dist/2023-01-25/rust-std-beta-aarch64-apple-ios-sim.tar.xz": "0ae7440c74cee87c25757159a5749014eecf77b2bcee7e1e71eb9249f917d725", + "dist/2023-01-25/rust-std-beta-aarch64-apple-ios.tar.gz": "a47acbecb37786773c5d80da5990298c5facad11151c9991796eedf80472b1d5", + "dist/2023-01-25/rust-std-beta-aarch64-apple-ios.tar.xz": "9168f9b1cea16a213249a1c452a59719234c145045ddc6ae1752ce4bdf02be41", + "dist/2023-01-25/rust-std-beta-aarch64-linux-android.tar.gz": "54fad0afeead88e1f33eaada03b14710052c6fa0b7130dd87463d3670f1d9fb3", + "dist/2023-01-25/rust-std-beta-aarch64-linux-android.tar.xz": "5fdd761ca88de80754cf3e1221db141204f79e6c2aa57c72c0879af3b87dd0f4", + "dist/2023-01-25/rust-std-beta-aarch64-pc-windows-msvc.tar.gz": "27196acc8f1ab9d6843b673835927c16d6730a8daf96b1f05959884ac53232fe", + "dist/2023-01-25/rust-std-beta-aarch64-pc-windows-msvc.tar.xz": "0ea12b5fade681173aa4795399710cf5ff21d58f5f2fe54eb8d2c7516ef387b8", + "dist/2023-01-25/rust-std-beta-aarch64-unknown-fuchsia.tar.gz": "7bd0d57ba438868635726bad30fea7a52a5c429e77329bf2977805872deb1be2", + "dist/2023-01-25/rust-std-beta-aarch64-unknown-fuchsia.tar.xz": "8520674b4e10a6948b25dc0c58369e921a68c48a7b961bae510ac36e5c29cfe8", + "dist/2023-01-25/rust-std-beta-aarch64-unknown-linux-gnu.tar.gz": "67c5668ce3427245821e53ea976201ebc23d1cb3c1a35a0d725d935de303e8a6", + "dist/2023-01-25/rust-std-beta-aarch64-unknown-linux-gnu.tar.xz": "38236c5e562995e1aadd25151513580a2a7c7828df3baec0e0cccc0f6a856c2a", + "dist/2023-01-25/rust-std-beta-aarch64-unknown-linux-musl.tar.gz": "a5453d21e3620701a957208c573d718872c3909c2c4f9e83be33e14d36677cda", + "dist/2023-01-25/rust-std-beta-aarch64-unknown-linux-musl.tar.xz": "751928d0f640e3b77e2fde9cda623c3e9b3bca7de742100fc1f48388e4d22d8d", + "dist/2023-01-25/rust-std-beta-aarch64-unknown-none-softfloat.tar.gz": "5a036c4d9cbda730e6f2af8c4912506659d1e3065b4d72050cc5b18e442105ea", + "dist/2023-01-25/rust-std-beta-aarch64-unknown-none-softfloat.tar.xz": "2adfb04a0700dd3503527a80eb5ee71733b0fa2dbe974650d450d4bc3b5c8b0e", + "dist/2023-01-25/rust-std-beta-aarch64-unknown-none.tar.gz": "a92fa3278a98de5ab93d1f487863453dbe60bb31158d027aaaef85adf1f62924", + "dist/2023-01-25/rust-std-beta-aarch64-unknown-none.tar.xz": "1c0e523505aa9dbc07ec867ff8527dde29a706868bb55694d62e31924429e235", + "dist/2023-01-25/rust-std-beta-aarch64-unknown-uefi.tar.gz": "4adaac4b13c8d8170b59913230ac9e313ae48400b314d2ce10c138631626728e", + "dist/2023-01-25/rust-std-beta-aarch64-unknown-uefi.tar.xz": "2a2178e4e55f35ea5147f66d36450f9694416c0fbae9b776f39f405a1ab31cbb", + "dist/2023-01-25/rust-std-beta-arm-linux-androideabi.tar.gz": "17e4384d3a229bc452897e26400016c70912feb7e6ac2991a256829c5b391148", + "dist/2023-01-25/rust-std-beta-arm-linux-androideabi.tar.xz": "e57afb560be9a93faf5f0f852eac5cf5b16e2c05383d995a4e6a249367ee4567", + "dist/2023-01-25/rust-std-beta-arm-unknown-linux-gnueabi.tar.gz": "d5a7c8f2fd9c3a1baa573b805334e5446605d2aa4589262f67e321c0590ef19e", + "dist/2023-01-25/rust-std-beta-arm-unknown-linux-gnueabi.tar.xz": "1e62c48781111afd20fb1e015a4f611c3a3301762fd9e64e49beeb6f2bd14c8d", + "dist/2023-01-25/rust-std-beta-arm-unknown-linux-gnueabihf.tar.gz": "9e62d990466900818533af63479758f01f6e914d6ccb7910639c6fbbd49ae803", + "dist/2023-01-25/rust-std-beta-arm-unknown-linux-gnueabihf.tar.xz": "e685b0f2acf33c2eb58ac1e1a526787ee9df2f0bd1a1850581cc681c41a3ef0e", + "dist/2023-01-25/rust-std-beta-arm-unknown-linux-musleabi.tar.gz": "7a02618c26f17076add562a9f8792d170fe60190d1868703936e37df3af882e4", + "dist/2023-01-25/rust-std-beta-arm-unknown-linux-musleabi.tar.xz": "d8988dd528dcc19742b703d44dff4ebcef71cec66eaae39768434d77e53557eb", + "dist/2023-01-25/rust-std-beta-arm-unknown-linux-musleabihf.tar.gz": "882e8f09cf68f135a29e64d0eb50727e4ac56939c4cfbcc3d369b928be442099", + "dist/2023-01-25/rust-std-beta-arm-unknown-linux-musleabihf.tar.xz": "7d9b1ebaf89cad6024f07543519dde11da15eab0e2de3df88543156e4a44c48f", + "dist/2023-01-25/rust-std-beta-armebv7r-none-eabi.tar.gz": "a7e73661652b1feb9b1f50d271ebeba2938c169c8add96add8a26ded3d8468f5", + "dist/2023-01-25/rust-std-beta-armebv7r-none-eabi.tar.xz": "2a80ab44cb2f2b9769f52b6ddc5ffa4c8994092b18a7fb3125cdfaecb4e1a578", + "dist/2023-01-25/rust-std-beta-armebv7r-none-eabihf.tar.gz": "f70b0f86c783cc771700dc1f59c43e53b0de2d57775fef5854cd97fde4406b11", + "dist/2023-01-25/rust-std-beta-armebv7r-none-eabihf.tar.xz": "07214e7295be853fc7859481fcf94a4b20cc3bc2c022bf1783ddea56e30f92de", + "dist/2023-01-25/rust-std-beta-armv5te-unknown-linux-gnueabi.tar.gz": "72be8b0740b14edda6656d2b5cffc69dea01f9bad7fcc9202586a901376116b2", + "dist/2023-01-25/rust-std-beta-armv5te-unknown-linux-gnueabi.tar.xz": "42fb2607f1c7402f4d32be981cb5c0755be2e36fd0296b3b2753eecae98e5cc3", + "dist/2023-01-25/rust-std-beta-armv5te-unknown-linux-musleabi.tar.gz": "ae9ec6f3c3444e5b14103db8c04b95597705fe44c68c253c75383b47da4094de", + "dist/2023-01-25/rust-std-beta-armv5te-unknown-linux-musleabi.tar.xz": "1e0f7f1ccf9e4f6cc010a096d01f3e6056f1d4b0d319f5699dc67cad2f889d4a", + "dist/2023-01-25/rust-std-beta-armv7-linux-androideabi.tar.gz": "6e8b70d2606902b369dfc263ee25343fa3c71c4081f03066822e9a2a260ac573", + "dist/2023-01-25/rust-std-beta-armv7-linux-androideabi.tar.xz": "e3f9052bc831ca0a9b38a3da3be846113c6ab2c4f320ecdba489f0eddfc7e47c", + "dist/2023-01-25/rust-std-beta-armv7-unknown-linux-gnueabi.tar.gz": "e858e836806f3641c2f1074e63ce88771cdf135bca36d7c0d3dec0d1a4c98f8e", + "dist/2023-01-25/rust-std-beta-armv7-unknown-linux-gnueabi.tar.xz": "becfe9addbca5bf2123d12e70007c16c036c79fb299de2ce8da067d0f21b0f74", + "dist/2023-01-25/rust-std-beta-armv7-unknown-linux-gnueabihf.tar.gz": "eef38b595752add74cf3bd29326116e33a0945115d08ced77e603c5bb46e72c0", + "dist/2023-01-25/rust-std-beta-armv7-unknown-linux-gnueabihf.tar.xz": "77e5cf7b344e590b9a15b2c160473f7c212304f624ed9aea8c7a8fd5e0fd787c", + "dist/2023-01-25/rust-std-beta-armv7-unknown-linux-musleabi.tar.gz": "2a70ffd7f8f3289e005c0f72e2c127a44f8f014628df7ac01b4b0ae2fc61a9c9", + "dist/2023-01-25/rust-std-beta-armv7-unknown-linux-musleabi.tar.xz": "97e2ae0072d5ae01644eda9a0c3438e78da27bb2f78d843fd626d3db36a6090b", + "dist/2023-01-25/rust-std-beta-armv7-unknown-linux-musleabihf.tar.gz": "7a30075e86bbd33241120dcf078b31ca9ec1877788db2c5700f4752cd447b587", + "dist/2023-01-25/rust-std-beta-armv7-unknown-linux-musleabihf.tar.xz": "2c1dfbc1361f030a3a116936f3e43e2c3adae2529feffc98a76e78fdad3572d9", + "dist/2023-01-25/rust-std-beta-armv7a-none-eabi.tar.gz": "aafe7ae2fc49e2c4ae9e1e008700f399f397dfca05d624dac4999f6c733ae2cb", + "dist/2023-01-25/rust-std-beta-armv7a-none-eabi.tar.xz": "d4bde0e0db35cb07134f6a94eee24e4359478dec9054e8a3802440eed68f60b7", + "dist/2023-01-25/rust-std-beta-armv7r-none-eabi.tar.gz": "fe83fe1f0b051838767589ecc9c17915441a44cd77226c9be26e9a63951bce2c", + "dist/2023-01-25/rust-std-beta-armv7r-none-eabi.tar.xz": "94eee8d1125537ebe1002c424c686c50996c03ed31d0a1275d49fd7ef0420ae1", + "dist/2023-01-25/rust-std-beta-armv7r-none-eabihf.tar.gz": "6ea9fca06fdb82026505c85a7bf7ad8be01926096be63c6cf20c5625c42df7dd", + "dist/2023-01-25/rust-std-beta-armv7r-none-eabihf.tar.xz": "70459483493bbb4cb2cc4b2af0cb012c01c47afc214643a588cf894a028a0ceb", + "dist/2023-01-25/rust-std-beta-asmjs-unknown-emscripten.tar.gz": "27d86df76c05de73d0ff9542d6904f03ecbd2cedd3a9d6a9cb654dcb78363514", + "dist/2023-01-25/rust-std-beta-asmjs-unknown-emscripten.tar.xz": "24b5a81721fe20849bdf075d39a99c0e80a21178327f9fa96b21649c99486213", + "dist/2023-01-25/rust-std-beta-i586-pc-windows-msvc.tar.gz": "3740517ab4573f77d5812c9b9c04fe63eacd29e56ea7ba5c5f335ad66026bd30", + "dist/2023-01-25/rust-std-beta-i586-pc-windows-msvc.tar.xz": "6c4e780249dcf8b306f8fab3fddd232724248b2670113dfc14c7823781d669f5", + "dist/2023-01-25/rust-std-beta-i586-unknown-linux-gnu.tar.gz": "15fc95314219ac5b38f44a4ec3568fbb4ce66d7ff7b63cdf1fb7a8b058f2933c", + "dist/2023-01-25/rust-std-beta-i586-unknown-linux-gnu.tar.xz": "b1a5ffd05afd400760002da124a8e5c86d091db574bf1ccf255d86b2515789e8", + "dist/2023-01-25/rust-std-beta-i586-unknown-linux-musl.tar.gz": "ef3551edc72cb79e776c7792346352eb858f3e3f7ee1c261b47ef974e52d9a2f", + "dist/2023-01-25/rust-std-beta-i586-unknown-linux-musl.tar.xz": "0e1a8e0ababab458af0a329e14398274fa55bf0e6ce2b2a0a515e5f6d12d6f34", + "dist/2023-01-25/rust-std-beta-i686-linux-android.tar.gz": "74a26b7fee3e0b95f4f0e065bcac58b865abd5f9abe14e42b2263bb0b87aee69", + "dist/2023-01-25/rust-std-beta-i686-linux-android.tar.xz": "c7df97d2322f5f331d349e35091ab5a61fae8dfc16781f1a74849c7c1e150293", + "dist/2023-01-25/rust-std-beta-i686-pc-windows-gnu.tar.gz": "396ca6747252adc4e6d41764df00418de22c22ee77823836c4fa3f1bd7cae869", + "dist/2023-01-25/rust-std-beta-i686-pc-windows-gnu.tar.xz": "4536de17560a21d543f81f6bdb25581a3b145b792531590a6ba35464e95c6389", + "dist/2023-01-25/rust-std-beta-i686-pc-windows-msvc.tar.gz": "da11b2338bacffa3940497b20fbb2544c0846696925d59cf9d7cf4514dedbb81", + "dist/2023-01-25/rust-std-beta-i686-pc-windows-msvc.tar.xz": "5bd5cd665f9e3d92f26998694c12b1f0e53df8ca9ef305c4cc48dd81bbe181f8", + "dist/2023-01-25/rust-std-beta-i686-unknown-freebsd.tar.gz": "b1553f92e0d0891717635136ad698a017c6aaab07a58183284752ff5480b37bf", + "dist/2023-01-25/rust-std-beta-i686-unknown-freebsd.tar.xz": "d6d2a550d36028e5adf62b875fccbae2f78546828de880e5bea33effca22edbd", + "dist/2023-01-25/rust-std-beta-i686-unknown-linux-gnu.tar.gz": "3d9f9c3108d45f95ebd12c284147111155cd3714caa555548111fb6791c7ef1b", + "dist/2023-01-25/rust-std-beta-i686-unknown-linux-gnu.tar.xz": "a4d9ee2238037d3ca5d4a9dd51c04737ecc2a12dc0be1e2996bbe46d7c1cebb9", + "dist/2023-01-25/rust-std-beta-i686-unknown-linux-musl.tar.gz": "9380bbf6ac2d745d1b7c3207c2cdacdd7bef0ff225e3ee5f22e46d826835b17a", + "dist/2023-01-25/rust-std-beta-i686-unknown-linux-musl.tar.xz": "517232f4e831f5305e836cc0666adef721c1b68fae80617a57bfb56405e343b9", + "dist/2023-01-25/rust-std-beta-i686-unknown-uefi.tar.gz": "1e6bfe0d160e3650a1a453de57f51673a6e04f9348f361fe08d2e96fa89d058c", + "dist/2023-01-25/rust-std-beta-i686-unknown-uefi.tar.xz": "f19c1458ef1386540cffca6cf7485ad22c38f0e9ee8a62e26a4e10eeeddb2a36", + "dist/2023-01-25/rust-std-beta-mips-unknown-linux-gnu.tar.gz": "6169b653843ce79f799a99fc7f147bf8315688214dc47a64aed792f5ca274ffa", + "dist/2023-01-25/rust-std-beta-mips-unknown-linux-gnu.tar.xz": "7f5e0f0e02c51dd88b9b819d1ae370e922eacf2523dd0ae664cbd8d79b7cdffe", + "dist/2023-01-25/rust-std-beta-mips-unknown-linux-musl.tar.gz": "124c50ad3ca4da2c97a5e96599762d7fad6701d0193b4a1ba3249c3a67d349ab", + "dist/2023-01-25/rust-std-beta-mips-unknown-linux-musl.tar.xz": "0a07005e369def1cbc8d49cd2904a1fd60c23771eca700e9b4abc49d2edf74a6", + "dist/2023-01-25/rust-std-beta-mips64-unknown-linux-gnuabi64.tar.gz": "5278c6eab22d49d033595f8b98cccfcb89fa8827ef3a8ce487e78c9f74452d2b", + "dist/2023-01-25/rust-std-beta-mips64-unknown-linux-gnuabi64.tar.xz": "206a55c0e4fb54ccfe2f372888bf42212352d56a7f1b3ba6628aec130b325573", + "dist/2023-01-25/rust-std-beta-mips64-unknown-linux-muslabi64.tar.gz": "f64069192d200f852e82735e239cb678fae027a7120e9d79c136aa4a3887bdb1", + "dist/2023-01-25/rust-std-beta-mips64-unknown-linux-muslabi64.tar.xz": "b31af554724c4582494548efda53dbef35db5cd3609104550ab2eee1bcb3f327", + "dist/2023-01-25/rust-std-beta-mips64el-unknown-linux-gnuabi64.tar.gz": "8445183d07e397b5bcd0f45fbb1b58ff22dc0901d0a1a3637761929f6b0e0364", + "dist/2023-01-25/rust-std-beta-mips64el-unknown-linux-gnuabi64.tar.xz": "5919f229d0ca138205def6752109056c989493c3a2a241cbd891bfdd84f8c7f0", + "dist/2023-01-25/rust-std-beta-mips64el-unknown-linux-muslabi64.tar.gz": "c72e51c7b1a5720dd74a923fc2ce1caaff1da484c063b50f96bcf84db529326f", + "dist/2023-01-25/rust-std-beta-mips64el-unknown-linux-muslabi64.tar.xz": "9a11cb1d587e2389531edff732c205a653e43bc62132cf697cb9fd04842558df", + "dist/2023-01-25/rust-std-beta-mipsel-unknown-linux-gnu.tar.gz": "682fe8fe1e3dad08190e8c42fb2df8fc734a42df081c59d0b30f4cc9f5fcef8d", + "dist/2023-01-25/rust-std-beta-mipsel-unknown-linux-gnu.tar.xz": "7eee1fff997cd847aac8d6c61cad4bc572d3069dbe59ce2a06c39d6b63346d34", + "dist/2023-01-25/rust-std-beta-mipsel-unknown-linux-musl.tar.gz": "0b5c68bb95668394dda1c910cf99835007271b5598d4652c7c6b974c6c0b2acd", + "dist/2023-01-25/rust-std-beta-mipsel-unknown-linux-musl.tar.xz": "411c8552901b80720a3bca0707eef475a7ad1650d34cda0b29fedfa9fc9b1852", + "dist/2023-01-25/rust-std-beta-nvptx64-nvidia-cuda.tar.gz": "187fef84302125e38937cf390bdf26d40ef98c6d06fd5893db8adceab3e75f04", + "dist/2023-01-25/rust-std-beta-nvptx64-nvidia-cuda.tar.xz": "83ce613db91a23549e4a1e1d5e4c24ad3ca7ddfb586b45d25e2bd85e67a19390", + "dist/2023-01-25/rust-std-beta-powerpc-unknown-linux-gnu.tar.gz": "785bdd67b22af15637696a03b6a4a917f8195049a4bda14a88dc48e6c3101a5e", + "dist/2023-01-25/rust-std-beta-powerpc-unknown-linux-gnu.tar.xz": "df034c1d2baea51f6756e1efef58db81cda5e795691c3a7175cb3b61edd8f33a", + "dist/2023-01-25/rust-std-beta-powerpc64-unknown-linux-gnu.tar.gz": "24d020c96db72a49c39dca1546a683d4d2134718dafbd74fb846dc77b30cf78e", + "dist/2023-01-25/rust-std-beta-powerpc64-unknown-linux-gnu.tar.xz": "a798a58bf5723f86b08a11c92f901cee246c5a0af06c4f7e08b303c7fd6c0354", + "dist/2023-01-25/rust-std-beta-powerpc64le-unknown-linux-gnu.tar.gz": "0c383e01f53b5bf85301c46978493e94aef2eba98a966ea283771de7829ea492", + "dist/2023-01-25/rust-std-beta-powerpc64le-unknown-linux-gnu.tar.xz": "61040426e2eb9950a3487109977ebfe66c134f5394c95847df222ff24c61563b", + "dist/2023-01-25/rust-std-beta-riscv32i-unknown-none-elf.tar.gz": "ef44851d420b5ee0cc3351084c9bc645e4caba447c8dd737840315687547657d", + "dist/2023-01-25/rust-std-beta-riscv32i-unknown-none-elf.tar.xz": "5cb083baabc7f33c515f2dbdaafd49465c85888d97af68dbd2bcd08a3e70e016", + "dist/2023-01-25/rust-std-beta-riscv32imac-unknown-none-elf.tar.gz": "96bd2d16b470e6377c9c2894b24e77d9f7b51dd54d5369dc361791153a9d1519", + "dist/2023-01-25/rust-std-beta-riscv32imac-unknown-none-elf.tar.xz": "93af94b167327c431158be466ff47b3aab8a77319bf7bed8bdbdedb4633a8e67", + "dist/2023-01-25/rust-std-beta-riscv32imc-unknown-none-elf.tar.gz": "57071d1f70a444a1b4b26b2a579e6c6324522893de60be9e97fe281e8878f276", + "dist/2023-01-25/rust-std-beta-riscv32imc-unknown-none-elf.tar.xz": "a75b8cbf062d1c6fcd8b2089c83f82b75247ced44793272ec56849c4448389f9", + "dist/2023-01-25/rust-std-beta-riscv64gc-unknown-linux-gnu.tar.gz": "195fe88c1b4b77cb12f566e27a9d3ff25ed2edf5f26be9b3b3dd0a88ac6f5e3c", + "dist/2023-01-25/rust-std-beta-riscv64gc-unknown-linux-gnu.tar.xz": "76884a90032874b98b0f4f873818dd90befc91d2ed96945120a1ce5a6a80c4e6", + "dist/2023-01-25/rust-std-beta-riscv64gc-unknown-none-elf.tar.gz": "017a6896b2b0e534c1c80f13eca4a3a570560800a117ea2d6b4ae0e6d665a969", + "dist/2023-01-25/rust-std-beta-riscv64gc-unknown-none-elf.tar.xz": "ac712a5b5cf3cd2eb2ae3825e75a5d84c5a899f86a104195b200711da15e9e53", + "dist/2023-01-25/rust-std-beta-riscv64imac-unknown-none-elf.tar.gz": "405fd311dec82db95adea38b3ec0e53454aca72bafd58f7960f8be25b50f9bc6", + "dist/2023-01-25/rust-std-beta-riscv64imac-unknown-none-elf.tar.xz": "0a3c8988561da39a817a3dba8115237f1c4ab6642f1925f52b7398102184ec7a", + "dist/2023-01-25/rust-std-beta-s390x-unknown-linux-gnu.tar.gz": "65b8a84d7355f889de036b1ce760068c2b81d73b43e5f7da29f9706ae1806a89", + "dist/2023-01-25/rust-std-beta-s390x-unknown-linux-gnu.tar.xz": "1c8843868742c36a5e9f6839275b4ad2b8a45f587f18f798448a674e0b0841cd", + "dist/2023-01-25/rust-std-beta-sparc64-unknown-linux-gnu.tar.gz": "b225da38b37554abb5a7f098be013b2e5971f9f34c634661d3244dad3ef1315f", + "dist/2023-01-25/rust-std-beta-sparc64-unknown-linux-gnu.tar.xz": "78018c4b996f7fd8bcaaf6073c84a3180250840263b54cc68ff6d195855b0727", + "dist/2023-01-25/rust-std-beta-sparcv9-sun-solaris.tar.gz": "468853e0d54a486aa0a25dd9fd2ab47c08e48c6aa47838c350c108738d7ca812", + "dist/2023-01-25/rust-std-beta-sparcv9-sun-solaris.tar.xz": "c59fec4162cbd9204d73f7aada19aa459e23f3ed73584203d83d52439a982382", + "dist/2023-01-25/rust-std-beta-thumbv6m-none-eabi.tar.gz": "326a3fe4191366ad170f44bfe726d80954024b1a3c7560d75da77bd16b44cafb", + "dist/2023-01-25/rust-std-beta-thumbv6m-none-eabi.tar.xz": "9c59dca2473fc377b65ce74cda0a3a064cf9fe07b1fb1eca0a4641b6de397d0a", + "dist/2023-01-25/rust-std-beta-thumbv7em-none-eabi.tar.gz": "ba2a8bd5d55ee9eefb6f5a5bae987822bf763783ac0374b97c823cfbcced622f", + "dist/2023-01-25/rust-std-beta-thumbv7em-none-eabi.tar.xz": "e8b7df90ffd190d0122d20d4c070f42273bab2da67745f831934fbc09730f34f", + "dist/2023-01-25/rust-std-beta-thumbv7em-none-eabihf.tar.gz": "183f0945d1df7a68c45bed842991486ffee21a03313e60e89746ac4122ca348e", + "dist/2023-01-25/rust-std-beta-thumbv7em-none-eabihf.tar.xz": "039816d5dc555e28fe45183a09a77a6357ce571111041740d0f95e89489b7cf6", + "dist/2023-01-25/rust-std-beta-thumbv7m-none-eabi.tar.gz": "22c48ee80a14149c2635eb344f74ec5765bcc5b7eb0fa1c7ad55b25c016c0934", + "dist/2023-01-25/rust-std-beta-thumbv7m-none-eabi.tar.xz": "a690f9227a3587f5dc143ab86a1ea7c83777a36b1ff18e877801c73745ff80cf", + "dist/2023-01-25/rust-std-beta-thumbv7neon-linux-androideabi.tar.gz": "16978fed1307ce642c4c9b0acfb09d9dc532b64a72d25e2d1f3ab3afbcb673b9", + "dist/2023-01-25/rust-std-beta-thumbv7neon-linux-androideabi.tar.xz": "c1cb59f61a45cb2a842d235762d244a4f4b2f078bc9cd1fe6ef5c632c665573d", + "dist/2023-01-25/rust-std-beta-thumbv7neon-unknown-linux-gnueabihf.tar.gz": "7d005cc7f199344bf7ecbcb5d3a4acc8ef42cb61d18fa091fe001872a69ab4bf", + "dist/2023-01-25/rust-std-beta-thumbv7neon-unknown-linux-gnueabihf.tar.xz": "cb567b761f1d78188538e1a5cf4f01aadd641dfec3e8c1a3e2ff2d5e7b930070", + "dist/2023-01-25/rust-std-beta-thumbv8m.base-none-eabi.tar.gz": "c7c83022f3772e1f7af9e8883a1082695f17956ad4b2d4b8fafeb2a8b9ec6ee7", + "dist/2023-01-25/rust-std-beta-thumbv8m.base-none-eabi.tar.xz": "392e9bdc0d84e9b9ab83f7118abd07ca39df9fb5a8482f6c9a1bb8969db2c1b5", + "dist/2023-01-25/rust-std-beta-thumbv8m.main-none-eabi.tar.gz": "97f59b364d4a3491f612217f455b1e7285691e12e73e42d4e7a074c301a973f6", + "dist/2023-01-25/rust-std-beta-thumbv8m.main-none-eabi.tar.xz": "4935afc5e64589ca8f06d3b8bda2ccb89901a60334b50c45be0b760d6f9f58a8", + "dist/2023-01-25/rust-std-beta-thumbv8m.main-none-eabihf.tar.gz": "eb165b5f5924a077c563d7e8e2eef96eff9398432748070b87f4baf0d04388a3", + "dist/2023-01-25/rust-std-beta-thumbv8m.main-none-eabihf.tar.xz": "9c2bf943142fb554fe2332cd7d12ebd568b8b59e06df73e45ad35da27400757e", + "dist/2023-01-25/rust-std-beta-wasm32-unknown-emscripten.tar.gz": "bbd4bb99dbf9b8a178ae767962877bbe8dbd73175e68db654d7eb208c0f10cff", + "dist/2023-01-25/rust-std-beta-wasm32-unknown-emscripten.tar.xz": "265ef776729a591e3867947eb23384aeaf02887a2f03f893bb21489bac1aff88", + "dist/2023-01-25/rust-std-beta-wasm32-unknown-unknown.tar.gz": "177edb18d11154664c510f27fc02b566c40320b5604587975b0897a70647be3d", + "dist/2023-01-25/rust-std-beta-wasm32-unknown-unknown.tar.xz": "7105e29d9a6540ec629a8844407b84624efed5e2a2642a5fc18fa8d73ad5356e", + "dist/2023-01-25/rust-std-beta-wasm32-wasi.tar.gz": "d13a3c25523c269b2515d254558af46bb35fe24d796bdd00aafcc84c63f3ac69", + "dist/2023-01-25/rust-std-beta-wasm32-wasi.tar.xz": "97ee2ec6214ffc91e46e4e590acc8dc4e69a7a935a64a0e2af31940d745e2ac1", + "dist/2023-01-25/rust-std-beta-x86_64-apple-darwin.tar.gz": "d184abb149484d78b713cd1d0f94db958dc4ac182eed453178f669c44856c823", + "dist/2023-01-25/rust-std-beta-x86_64-apple-darwin.tar.xz": "e3c448e63d87842f42f99390d7d0ed18c13e03a226967e8f2e9ef8c764d10318", + "dist/2023-01-25/rust-std-beta-x86_64-apple-ios.tar.gz": "04c884f5f4c4a6d1dfb0941b62e16ec5516d42e6ecdb7b3b86f23994b8c7b295", + "dist/2023-01-25/rust-std-beta-x86_64-apple-ios.tar.xz": "6a3c0e72376a2f1654e7ac08dc5e38794a91b432450c7bf978be97ed10f1fa61", + "dist/2023-01-25/rust-std-beta-x86_64-fortanix-unknown-sgx.tar.gz": "fc41a378f93c5bf1280c52d21f495924c2e76925f609356b8d27e43d0650d2ab", + "dist/2023-01-25/rust-std-beta-x86_64-fortanix-unknown-sgx.tar.xz": "ab6bd497938262cae110bf9f39cc94f5ef1ba831db19e63b4d60c8fef7f8dc90", + "dist/2023-01-25/rust-std-beta-x86_64-linux-android.tar.gz": "d990e089f838d0158fa2ba3ea08153edb48f4346e682f0fdcdfed1b37a186b2d", + "dist/2023-01-25/rust-std-beta-x86_64-linux-android.tar.xz": "0b6e71cdcef8c32e649dc209dbe9bc30a0864aba4fc85d0d615ff5c405204f6b", + "dist/2023-01-25/rust-std-beta-x86_64-pc-solaris.tar.gz": "3cc30012778b45a27dc6c92f5cb0955461dbd1aba130c191c20a510d29bf2c00", + "dist/2023-01-25/rust-std-beta-x86_64-pc-solaris.tar.xz": "0e3f033b01d1223d9f55c86497c9625c4de36953b6c269ca622c96b2fce09afe", + "dist/2023-01-25/rust-std-beta-x86_64-pc-windows-gnu.tar.gz": "18a61cd3593bc67eeb93b615c4585e18495128cd4f50933776705c6ff5cf1616", + "dist/2023-01-25/rust-std-beta-x86_64-pc-windows-gnu.tar.xz": "8bf3998dfd69a17354dd79dea20220f405a2a116842d3813fe033cfa5a6aafdb", + "dist/2023-01-25/rust-std-beta-x86_64-pc-windows-msvc.tar.gz": "76137f8246ad53adaf26d739c91dd3bc5820697a0c1d2af0937328bb5e6536b9", + "dist/2023-01-25/rust-std-beta-x86_64-pc-windows-msvc.tar.xz": "2febd8119b376da8f2b1baf3ca63b97d11a17e1a766986ff1d6dffc522cb0081", + "dist/2023-01-25/rust-std-beta-x86_64-sun-solaris.tar.gz": "b5769729f089ea5cd5fb5ba1995a0e18dcef21425b69b7e952d42c5bdf0253c2", + "dist/2023-01-25/rust-std-beta-x86_64-sun-solaris.tar.xz": "a8593120f87887738390e0ec9ff1d72a743a77dc17a33276e7bec7b04f45442e", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-freebsd.tar.gz": "269fec46599b8839f3a81c6cc85fbca7a7e86cb661e5cbcbffb853ba674ae1cb", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-freebsd.tar.xz": "20c2d1d3e64f56f00c237ae261d5880a7fd7c6f1e2360dc7fa0039b3ea932c66", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-fuchsia.tar.gz": "d64735ce43c75d7c741f9cb7754812f09e21706be8bd0931d72b09916d312844", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-fuchsia.tar.xz": "f501f199bfe1120901e919a14684e57f0723b59ffb5cad79f501834a63df5570", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-illumos.tar.gz": "a80058880e7441e2cd6bb77a7a284902d15dc21d8f0b37f2af3b3da31f07f9f4", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-illumos.tar.xz": "17d07564595b2dbc9eecc8271d3332bef81c7a57138559740c606d2181777f89", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-linux-gnu.tar.gz": "0e4c01e6438fc005ba7177d33cc0dba8646eb51a47da06b079ef9fc2e264f052", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-linux-gnu.tar.xz": "1f95934a853b0ce1f4bc50ac86b1ae74a34acbae8a64903faf6f7ba63e49051b", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-linux-gnux32.tar.gz": "431fa66d45ff345f1fb2e279eb52ab24757ed3971f049f9a04a63b228a417f59", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-linux-gnux32.tar.xz": "6901b028b8df3d09e994387a810d3a74b873d2ff5fcf93c1d49bf7c3521a506b", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-linux-musl.tar.gz": "a22d8f960e3d15886f893dd4e137becf9c84b1bb2ce500d574e5cc85f43b2b64", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-linux-musl.tar.xz": "1fa467a1334a1cea4af8b27f7fc186eabf3a8f26091ae29b501bec6b2564b98e", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-netbsd.tar.gz": "50f2c04d4ee499959f52546af600c40b16a5627bb9adddeab819519231cf1efe", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-netbsd.tar.xz": "69084f5bf6e22d6ba232d2040bfee15b00418ab20980c716602a19134ee54bcd", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-none.tar.gz": "5a8b98fce343e17fdfd2f3f9b4f810097cdf12430e02d65b3d1042e273f1ddae", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-none.tar.xz": "d5db956978faa532d822609d475599c12507e5b67ac73b9a9194afb7449b9b7d", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-redox.tar.gz": "3c4f69556a6ed2c64fd6274bfa17ff489b5e0c9f1f8d6884fe31c28c39e15d89", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-redox.tar.xz": "feb6456b55a38b83755b281e039941d97659947b289ac2750fd3b3588cf43fd3", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-uefi.tar.gz": "81e795c668369a3947d4d69aeb4f823c8446b09ae18c6fdc800d54aae514f27e", + "dist/2023-01-25/rust-std-beta-x86_64-unknown-uefi.tar.xz": "5c51b99639e5f67e01fe37a868dae17da4ff11d755434b189cc4ae81453826ac", + "dist/2023-01-25/rustc-beta-aarch64-apple-darwin.tar.gz": "9d6277d58b9a679d47eb80d1132d590102f632d5fdb85ba54ef653b2e602c6d3", + "dist/2023-01-25/rustc-beta-aarch64-apple-darwin.tar.xz": "6a49fa544dd3bc4d657ae064863b760935977674e6c837f6a7f84dc1c9dbe95a", + "dist/2023-01-25/rustc-beta-aarch64-pc-windows-msvc.tar.gz": "0536b525d92007041a4d5f4b57601bcc17e1257f44eddd1e4630fbda8b5ea2e8", + "dist/2023-01-25/rustc-beta-aarch64-pc-windows-msvc.tar.xz": "35621c50a8e1ce5591dfdf95b4f5e17e60478309348e67f6e3bf767b57c494ba", + "dist/2023-01-25/rustc-beta-aarch64-unknown-linux-gnu.tar.gz": "feb0c0534f2f78500a25906fb6f0bd5772574fbfbd23b6abea807f074905905a", + "dist/2023-01-25/rustc-beta-aarch64-unknown-linux-gnu.tar.xz": "fb269a472ef44aad092259352bb55b24dafc56459eacb7300fd7db0bbc5a96c1", + "dist/2023-01-25/rustc-beta-aarch64-unknown-linux-musl.tar.gz": "98514e08e1a21f94028df39496e802f5b6379414dad4e7069253cd8b3f961c43", + "dist/2023-01-25/rustc-beta-aarch64-unknown-linux-musl.tar.xz": "b01b5ef23232834174ea31bbf402fd4652769a7fac5b522ac28e53c469389b60", + "dist/2023-01-25/rustc-beta-arm-unknown-linux-gnueabi.tar.gz": "d638873a2fe3bb666174b4270a44da25a9f7f05f0a2544598556485661b51d66", + "dist/2023-01-25/rustc-beta-arm-unknown-linux-gnueabi.tar.xz": "7bd32b738a280b6d42fb925b5c7cd8b4ca660285ae77cf27b0ed6eafb0b0237c", + "dist/2023-01-25/rustc-beta-arm-unknown-linux-gnueabihf.tar.gz": "8ed861c6ccc085030bb0947119746df3c83b9971e7b7c0ca43a8133700f985bc", + "dist/2023-01-25/rustc-beta-arm-unknown-linux-gnueabihf.tar.xz": "f4ffb8ec45475b96815eccb657d9a5f443e8067a2f7b50a18eaf80c8a9cd1944", + "dist/2023-01-25/rustc-beta-armv7-unknown-linux-gnueabihf.tar.gz": "e6a809e4e255e265aa54ac730655569e93b0227037e5eebe2995e6ed13c4a2fd", + "dist/2023-01-25/rustc-beta-armv7-unknown-linux-gnueabihf.tar.xz": "0849a22e9d82c3cacfb39c5067106767bc40380e231842e968770b7d79dc9376", + "dist/2023-01-25/rustc-beta-i686-pc-windows-gnu.tar.gz": "348a94bb0048a2de0764ea5ebc83a6578d1f63f4edf8d6627cd346345cb3beda", + "dist/2023-01-25/rustc-beta-i686-pc-windows-gnu.tar.xz": "02885355eefef4a901522a441c376a59521ff91889dd6e2438cfe5869360ad7f", + "dist/2023-01-25/rustc-beta-i686-pc-windows-msvc.tar.gz": "56d6b9b2d0e8eb13a568b60f2b5284cbdb3efcbc921d6c318408c58d12c6ee11", + "dist/2023-01-25/rustc-beta-i686-pc-windows-msvc.tar.xz": "bcf405c76b2aebb76ca70595ddbe5de1faf8c34320b08cd4839db7f46dc9dc7c", + "dist/2023-01-25/rustc-beta-i686-unknown-linux-gnu.tar.gz": "6b5c11f41bdb8a7b596ac92bfe18e7a2410a7fc77fe7ca7036e72c563b9e41c0", + "dist/2023-01-25/rustc-beta-i686-unknown-linux-gnu.tar.xz": "7291ffdbce495b5d0ca017730495300a72d3341170d099b3c8abda5cb9ed190c", + "dist/2023-01-25/rustc-beta-mips-unknown-linux-gnu.tar.gz": "6005076b8cd38020a02cd2720e8c67491d31f50465d62d9f5148d93feb4eb198", + "dist/2023-01-25/rustc-beta-mips-unknown-linux-gnu.tar.xz": "1b421c2addb488faefec78cdcbbaf03a9c45640f4ba6740bbb1afbece3e30ba0", + "dist/2023-01-25/rustc-beta-mips64-unknown-linux-gnuabi64.tar.gz": "2d1f7463d3922238c189c5f669b8f4e80f85f389f5edca000b63ebf041fb4222", + "dist/2023-01-25/rustc-beta-mips64-unknown-linux-gnuabi64.tar.xz": "29dcad8e598e6b79730a53146d3d8ceb5acd0029a83216060ece931d149e9a97", + "dist/2023-01-25/rustc-beta-mips64el-unknown-linux-gnuabi64.tar.gz": "c3e1527a463155bc9ed2c3eb65217c72fd067bbd316432a16a2777a444e7eb9a", + "dist/2023-01-25/rustc-beta-mips64el-unknown-linux-gnuabi64.tar.xz": "8a031c5830bb8168c1e20426082c0783fa52310b22a28c5fbb5b1214adcf3bd5", + "dist/2023-01-25/rustc-beta-mipsel-unknown-linux-gnu.tar.gz": "5c1af72641cb7bf514f936def835ebccfa908434f9e26e6d3cf65756d68fe24d", + "dist/2023-01-25/rustc-beta-mipsel-unknown-linux-gnu.tar.xz": "40a95925bb98eadd7b49be71dd9fa76abf09fc16bd2d6707e3206cf7e7f9b9ce", + "dist/2023-01-25/rustc-beta-powerpc-unknown-linux-gnu.tar.gz": "2dfea875b3b5f3405f9df83fd5a5144b8fc93a90ba17a3ffcb437c934a9772e8", + "dist/2023-01-25/rustc-beta-powerpc-unknown-linux-gnu.tar.xz": "2c23590890472f2ed15df449a33188bbc7d3dc8755e8929861ccdfeb24ee0909", + "dist/2023-01-25/rustc-beta-powerpc64-unknown-linux-gnu.tar.gz": "0b31cad32717c5c7a75069bfaa32fab82d0eb75190b0d34d2e09c221def5f7a5", + "dist/2023-01-25/rustc-beta-powerpc64-unknown-linux-gnu.tar.xz": "939feb641d84aa98e46934c3896adee94169d8e5d8d2d97065e904aa1eac16ad", + "dist/2023-01-25/rustc-beta-powerpc64le-unknown-linux-gnu.tar.gz": "d031874dccc1fc029196bc49f7713805226be2ac03a17fc38dc2f40c7f807093", + "dist/2023-01-25/rustc-beta-powerpc64le-unknown-linux-gnu.tar.xz": "8b6f367822b14dfd341d711c4736e00ac1fcc914a3c5214209742f2543bba880", + "dist/2023-01-25/rustc-beta-riscv64gc-unknown-linux-gnu.tar.gz": "6fb98f6c504ff7278af6f840e39d1236b7209a35a3f5dc78d281c59a2264b525", + "dist/2023-01-25/rustc-beta-riscv64gc-unknown-linux-gnu.tar.xz": "1e5a16e7c67bad200e3f051aa959cd9123ad26e15443128ee9ce28151b28e7ba", + "dist/2023-01-25/rustc-beta-s390x-unknown-linux-gnu.tar.gz": "c8bbed9a7319e601e9e53461665201f89aceca9bc72dcdd1e3206110d535c6c4", + "dist/2023-01-25/rustc-beta-s390x-unknown-linux-gnu.tar.xz": "05af8b1637b522af7ac981d133eaf88c157a7d4ed414ce53c13bbca0667510dd", + "dist/2023-01-25/rustc-beta-x86_64-apple-darwin.tar.gz": "ead6472d2644ffeb7f27252e0445aa27b9cb028dc982da011069975767711249", + "dist/2023-01-25/rustc-beta-x86_64-apple-darwin.tar.xz": "3777d00c129c51b8980afc2ba1b1605f58490ec4d5203609d260e05ae5801182", + "dist/2023-01-25/rustc-beta-x86_64-pc-windows-gnu.tar.gz": "5871e7fa9b9af9af9ccc405866774db110dc5ba8b66649c87f546139c383cea1", + "dist/2023-01-25/rustc-beta-x86_64-pc-windows-gnu.tar.xz": "9804f9a57acfa97db3a33fa7f77f5a8ced7d6b9e5013e61aa76287dfe45d9223", + "dist/2023-01-25/rustc-beta-x86_64-pc-windows-msvc.tar.gz": "3a7387c88e4a17e331d8f8800e6be0cf113242edb2b760fcff0dcd2ff97c1ca8", + "dist/2023-01-25/rustc-beta-x86_64-pc-windows-msvc.tar.xz": "12becb176b75b9274a44ccb22a4859fb8cb52df2cf954011c7294d22dc2e8721", + "dist/2023-01-25/rustc-beta-x86_64-unknown-freebsd.tar.gz": "262df9ec15e8b14d1a2959f9d386717147af17612ae92762916e9e195ac83c7f", + "dist/2023-01-25/rustc-beta-x86_64-unknown-freebsd.tar.xz": "2647f9420cc4b2a2a94b32ef6c7d88285bb50c3b04bbd29bdc11f6e5fb8f9c4f", + "dist/2023-01-25/rustc-beta-x86_64-unknown-illumos.tar.gz": "82875b6f60bbdea438f0da1a162c30d236fdd32124296a83510954f89dfbb20d", + "dist/2023-01-25/rustc-beta-x86_64-unknown-illumos.tar.xz": "19bd296d5c116bdb620e50b6fba3c7d5a5e978f26a8f1be1afec1c6854408d2c", + "dist/2023-01-25/rustc-beta-x86_64-unknown-linux-gnu.tar.gz": "45b8d74f203b66d25a15e59db755918d0954a3338f08236664007de2478e2438", + "dist/2023-01-25/rustc-beta-x86_64-unknown-linux-gnu.tar.xz": "c047becdba71a802c1d06b31e5c3dce8efb11a9daa299e1cd03a0f9f6b48cbf9", + "dist/2023-01-25/rustc-beta-x86_64-unknown-linux-musl.tar.gz": "a649445f1676acafc59b4808211aa669c9fb8093cabb7007432d0ae2f6e21239", + "dist/2023-01-25/rustc-beta-x86_64-unknown-linux-musl.tar.xz": "b6ed06a8df0de6b64099fba4d1ca9478e0802dfc086308f425692ee40faa8d2a", + "dist/2023-01-25/rustc-beta-x86_64-unknown-netbsd.tar.gz": "d939bd071f42aa7657297110be68dd9d2aad840272bf881a1fdc82053914f970", + "dist/2023-01-25/rustc-beta-x86_64-unknown-netbsd.tar.xz": "5671084575291d8c4ef2ed0930b22815d6810e2378fb98ca5a0738faa76b525b" } } From 9c3fe58917cbd06c7747fe2c2b09bf85636207ae Mon Sep 17 00:00:00 2001 From: lcnr Date: Fri, 27 Jan 2023 08:20:34 +0100 Subject: [PATCH 05/69] small refactor to new projection code --- .../src/solve/project_goals.rs | 77 ++++++++++--------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/compiler/rustc_trait_selection/src/solve/project_goals.rs b/compiler/rustc_trait_selection/src/solve/project_goals.rs index b583705ac436..891776a937d5 100644 --- a/compiler/rustc_trait_selection/src/solve/project_goals.rs +++ b/compiler/rustc_trait_selection/src/solve/project_goals.rs @@ -122,6 +122,28 @@ impl<'tcx> EvalCtxt<'_, 'tcx> { && goal.param_env.visit_with(&mut visitor).is_continue() } + /// After normalizing the projection to `normalized_alias` with the given + /// `normalization_certainty`, constrain the inference variable `term` to it + /// and return a query response. + fn eq_term_and_make_canonical_response( + &mut self, + goal: Goal<'tcx, ProjectionPredicate<'tcx>>, + normalization_certainty: Certainty, + normalized_alias: impl Into>, + ) -> QueryResult<'tcx> { + // The term of our goal should be fully unconstrained, so this should never fail. + // + // It can however be ambiguous when the `normalized_alias` contains a projection. + let nested_goals = self + .infcx + .eq(goal.param_env, goal.predicate.term, normalized_alias.into()) + .expect("failed to unify with unconstrained term"); + let rhs_certainty = + self.evaluate_all(nested_goals).expect("failed to unify with unconstrained term"); + + self.make_canonical_response(normalization_certainty.unify_and(rhs_certainty)) + } + fn merge_project_candidates( &mut self, mut candidates: Vec>, @@ -218,7 +240,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> { .map(|pred| goal.with(tcx, pred)); nested_goals.extend(where_clause_bounds); - let trait_ref_certainty = ecx.evaluate_all(nested_goals)?; + let match_impl_certainty = ecx.evaluate_all(nested_goals)?; // In case the associated item is hidden due to specialization, we have to // return ambiguity this would otherwise be incomplete, resulting in @@ -230,7 +252,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> { goal.predicate.def_id(), impl_def_id )? else { - return ecx.make_canonical_response(trait_ref_certainty.unify_and(Certainty::AMBIGUOUS)); + return ecx.make_canonical_response(match_impl_certainty.unify_and(Certainty::AMBIGUOUS)); }; if !assoc_def.item.defaultness(tcx).has_value() { @@ -277,17 +299,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> { ty.map_bound(|ty| ty.into()) }; - // The term of our goal should be fully unconstrained, so this should never fail. - // - // It can however be ambiguous when the resolved type is a projection. - let nested_goals = ecx - .infcx - .eq(goal.param_env, goal.predicate.term, term.subst(tcx, substs)) - .expect("failed to unify with unconstrained term"); - let rhs_certainty = - ecx.evaluate_all(nested_goals).expect("failed to unify with unconstrained term"); - - ecx.make_canonical_response(trait_ref_certainty.unify_and(rhs_certainty)) + ecx.eq_term_and_make_canonical_response(goal, match_impl_certainty, term.subst(tcx, substs)) }) } @@ -307,18 +319,11 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> { )?; let subst_certainty = ecx.evaluate_all(nested_goals)?; - // The term of our goal should be fully unconstrained, so this should never fail. - // - // It can however be ambiguous when the resolved type is a projection. - let nested_goals = ecx - .infcx - .eq(goal.param_env, goal.predicate.term, assumption_projection_pred.term) - .expect("failed to unify with unconstrained term"); - let rhs_certainty = ecx - .evaluate_all(nested_goals) - .expect("failed to unify with unconstrained term"); - - ecx.make_canonical_response(subst_certainty.unify_and(rhs_certainty)) + ecx.eq_term_and_make_canonical_response( + goal, + subst_certainty, + assumption_projection_pred.term, + ) }) } else { Err(NoSolution) @@ -434,14 +439,12 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> { [ty::GenericArg::from(goal.predicate.self_ty())], )); - let mut nested_goals = ecx.infcx.eq( - goal.param_env, - goal.predicate.term.ty().unwrap(), + let is_sized_certainty = ecx.evaluate_goal(goal.with(tcx, sized_predicate))?.1; + return ecx.eq_term_and_make_canonical_response( + goal, + is_sized_certainty, tcx.types.unit, - )?; - nested_goals.push(goal.with(tcx, sized_predicate)); - - return ecx.evaluate_all_and_make_canonical_response(nested_goals); + ); } ty::Adt(def, substs) if def.is_struct() => { @@ -453,7 +456,8 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> { tcx, ty::Binder::dummy(goal.predicate.with_self_ty(tcx, self_ty)), ); - return ecx.evaluate_all_and_make_canonical_response(vec![new_goal]); + let (_, certainty) = ecx.evaluate_goal(new_goal)?; + return ecx.make_canonical_response(certainty); } } } @@ -466,7 +470,8 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> { tcx, ty::Binder::dummy(goal.predicate.with_self_ty(tcx, self_ty)), ); - return ecx.evaluate_all_and_make_canonical_response(vec![new_goal]); + let (_, certainty) = ecx.evaluate_goal(new_goal)?; + return ecx.make_canonical_response(certainty); } }, @@ -479,9 +484,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> { ), }; - let nested_goals = - ecx.infcx.eq(goal.param_env, goal.predicate.term.ty().unwrap(), metadata_ty)?; - ecx.evaluate_all_and_make_canonical_response(nested_goals) + ecx.eq_term_and_make_canonical_response(goal, Certainty::Yes, metadata_ty) }) } From 85e6f38e797959d2f65f908f88a81d3e6891d609 Mon Sep 17 00:00:00 2001 From: lcnr Date: Fri, 27 Jan 2023 10:01:16 +0100 Subject: [PATCH 06/69] assert that solver results are stable --- .../rustc_trait_selection/src/solve/mod.rs | 34 ++++++++++++++++--- .../src/solve/project_goals.rs | 14 ++++++-- .../src/solve/search_graph/mod.rs | 6 +++- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_trait_selection/src/solve/mod.rs b/compiler/rustc_trait_selection/src/solve/mod.rs index f44648c95d74..ca14fe0a8c8f 100644 --- a/compiler/rustc_trait_selection/src/solve/mod.rs +++ b/compiler/rustc_trait_selection/src/solve/mod.rs @@ -174,6 +174,7 @@ impl<'tcx> InferCtxtEvalExt<'tcx> for InferCtxt<'tcx> { search_graph: &mut search_graph, infcx: self, var_values: CanonicalVarValues::dummy(), + in_projection_eq_hack: false, } .evaluate_goal(goal); @@ -187,6 +188,10 @@ struct EvalCtxt<'a, 'tcx> { var_values: CanonicalVarValues<'tcx>, search_graph: &'a mut search_graph::SearchGraph<'tcx>, + + /// This field is used by a debug assertion in [`EvalCtxt::evaluate_goal`], + /// see the comment in that method for more details. + in_projection_eq_hack: bool, } impl<'a, 'tcx> EvalCtxt<'a, 'tcx> { @@ -213,7 +218,8 @@ impl<'a, 'tcx> EvalCtxt<'a, 'tcx> { loop { let (ref infcx, goal, var_values) = tcx.infer_ctxt().build_with_canonical(DUMMY_SP, &canonical_goal); - let mut ecx = EvalCtxt { infcx, var_values, search_graph }; + let mut ecx = + EvalCtxt { infcx, var_values, search_graph, in_projection_eq_hack: false }; let result = ecx.compute_goal(goal); // FIXME: `Response` should be `Copy` @@ -243,10 +249,28 @@ impl<'a, 'tcx> EvalCtxt<'a, 'tcx> { let canonical_goal = self.infcx.canonicalize_query(goal, &mut orig_values); let canonical_response = EvalCtxt::evaluate_canonical_goal(self.tcx(), self.search_graph, canonical_goal)?; - Ok(( - !canonical_response.value.var_values.is_identity(), - instantiate_canonical_query_response(self.infcx, &orig_values, canonical_response), - )) + + let has_changed = !canonical_response.value.var_values.is_identity(); + let certainty = + instantiate_canonical_query_response(self.infcx, &orig_values, canonical_response); + + // Check that rerunning this query with its inference constraints applied + // doesn't result in new inference constraints and has the same result. + // + // If we have projection goals like `::Assoc == u32` we recursively + // call `exists ::Assoc == U` to enable better caching. This goal + // could constrain `U` to `u32` which would cause this check to result in a + // solver cycle. + if cfg!(debug_assertions) && has_changed && !self.in_projection_eq_hack { + let mut orig_values = OriginalQueryValues::default(); + let canonical_goal = self.infcx.canonicalize_query(goal, &mut orig_values); + let canonical_response = + EvalCtxt::evaluate_canonical_goal(self.tcx(), self.search_graph, canonical_goal)?; + assert!(canonical_response.value.var_values.is_identity()); + assert_eq!(certainty, canonical_response.value.certainty); + } + + Ok((has_changed, certainty)) } fn compute_goal(&mut self, goal: Goal<'tcx, ty::Predicate<'tcx>>) -> QueryResult<'tcx> { diff --git a/compiler/rustc_trait_selection/src/solve/project_goals.rs b/compiler/rustc_trait_selection/src/solve/project_goals.rs index 891776a937d5..83fcdf496c85 100644 --- a/compiler/rustc_trait_selection/src/solve/project_goals.rs +++ b/compiler/rustc_trait_selection/src/solve/project_goals.rs @@ -45,8 +45,9 @@ impl<'tcx> EvalCtxt<'_, 'tcx> { projection_ty: goal.predicate.projection_ty, term: unconstrained_rhs, }); - let (_has_changed, normalize_certainty) = - self.evaluate_goal(goal.with(self.tcx(), unconstrained_predicate))?; + let (_has_changed, normalize_certainty) = self.in_projection_eq_hack(|this| { + this.evaluate_goal(goal.with(this.tcx(), unconstrained_predicate)) + })?; let nested_eq_goals = self.infcx.eq(goal.param_env, unconstrained_rhs, predicate.term)?; @@ -55,6 +56,15 @@ impl<'tcx> EvalCtxt<'_, 'tcx> { } } + /// This sets a flag used by a debug assert in [`EvalCtxt::evaluate_goal`], + /// see the comment in that method for more details. + fn in_projection_eq_hack(&mut self, f: impl FnOnce(&mut Self) -> T) -> T { + self.in_projection_eq_hack = true; + let result = f(self); + self.in_projection_eq_hack = false; + result + } + /// Is the projection predicate is of the form `exists ::Assoc = T`. /// /// This is the case if the `term` is an inference variable in the innermost universe diff --git a/compiler/rustc_trait_selection/src/solve/search_graph/mod.rs b/compiler/rustc_trait_selection/src/solve/search_graph/mod.rs index 0030e9aa3e51..7514c7ee5517 100644 --- a/compiler/rustc_trait_selection/src/solve/search_graph/mod.rs +++ b/compiler/rustc_trait_selection/src/solve/search_graph/mod.rs @@ -45,6 +45,7 @@ impl<'tcx> SearchGraph<'tcx> { /// Tries putting the new goal on the stack, returning an error if it is already cached. /// /// This correctly updates the provisional cache if there is a cycle. + #[instrument(level = "debug", skip(self, tcx), ret)] pub(super) fn try_push_stack( &mut self, tcx: TyCtxt<'tcx>, @@ -79,8 +80,10 @@ impl<'tcx> SearchGraph<'tcx> { Entry::Occupied(entry_index) => { let entry_index = *entry_index.get(); - cache.add_dependency_of_leaf_on(entry_index); let stack_depth = cache.depth(entry_index); + debug!("encountered cycle with depth {stack_depth:?}"); + + cache.add_dependency_of_leaf_on(entry_index); self.stack[stack_depth].has_been_used = true; // NOTE: The goals on the stack aren't the only goals involved in this cycle. @@ -117,6 +120,7 @@ impl<'tcx> SearchGraph<'tcx> { /// updated the provisional cache and we have to recompute the current goal. /// /// FIXME: Refer to the rustc-dev-guide entry once it exists. + #[instrument(level = "debug", skip(self, tcx, actual_goal), ret)] pub(super) fn try_finalize_goal( &mut self, tcx: TyCtxt<'tcx>, From 167fbbc994870508047e0b9c7a49d563f9339a3c Mon Sep 17 00:00:00 2001 From: Trevor Spiteri Date: Fri, 27 Jan 2023 12:43:00 +0100 Subject: [PATCH 07/69] rustdoc: update Source Serif 4 from 4.004 to 4.005 Version 4.005 was released on 2023-01-20. --- src/librustdoc/html/static/css/rustdoc.css | 6 +++--- .../static/fonts/SourceSerif4-Bold.ttf.woff2 | Bin 81320 -> 81540 bytes .../static/fonts/SourceSerif4-It.ttf.woff2 | Bin 59860 -> 59716 bytes .../html/static/fonts/SourceSerif4-LICENSE.md | 2 +- .../fonts/SourceSerif4-Regular.ttf.woff2 | Bin 76180 -> 76260 bytes 5 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/librustdoc/html/static/css/rustdoc.css b/src/librustdoc/html/static/css/rustdoc.css index 8699508e4391..0ee1207511dc 100644 --- a/src/librustdoc/html/static/css/rustdoc.css +++ b/src/librustdoc/html/static/css/rustdoc.css @@ -22,7 +22,7 @@ font-style: normal; font-weight: 400; src: local('Source Serif 4'), - url("SourceSerif4-Regular-1f7d512b176f0f72.ttf.woff2") format("woff2"); + url("SourceSerif4-Regular-46f98efaafac5295.ttf.woff2") format("woff2"); font-display: swap; } @font-face { @@ -30,7 +30,7 @@ font-style: italic; font-weight: 400; src: local('Source Serif 4 Italic'), - url("SourceSerif4-It-d034fe4ef9d0fa00.ttf.woff2") format("woff2"); + url("SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2") format("woff2"); font-display: swap; } @font-face { @@ -38,7 +38,7 @@ font-style: normal; font-weight: 700; src: local('Source Serif 4 Bold'), - url("SourceSerif4-Bold-124a1ca42af929b6.ttf.woff2") format("woff2"); + url("SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2") format("woff2"); font-display: swap; } diff --git a/src/librustdoc/html/static/fonts/SourceSerif4-Bold.ttf.woff2 b/src/librustdoc/html/static/fonts/SourceSerif4-Bold.ttf.woff2 index db57d21455c94e80aa7cca25cac803a08e1b01ec..181a07f63bef8f18e42a5a57463e0e60cf8e8035 100644 GIT binary patch literal 81540 zcmXT-cQayOWME)mv}_h*LDBrz1X$C>ubM*M&QYa8#)%x zi>%s1CIxE-NW8dH-w>iPdE>XNol+c<8-D5YmGx?5w|cLd|2)s&*j4`KdC}1y`8J-a z{q`RP{mS#pc3Mc->rzps zkNs;rl5X|P_Ron6G=Gq}`Ru&8?i2SPxY7E_%=a^&Ro zbAGlg(CpsR;y=~=5NBM3@+K(6lALetD>(6P zhE-EipthV;Yx?rmJ%P#Lpu zhiCV%*%lT_6K0DmikbbMv*634jpsX>&jxUqyC18$FP_`o;d6iXi@OGfP64}I=FR)) zw0arOlHeVx&+ePN*?D-^(!Y<*wHL)#d}p^PxxRX_@p&Dl+nn()@?ZD3h)zF|?NjmP zX`ImCbMHS|o=$&KwxmC0wZWtP`)9-@9)6NtlvdMwu}k{Xk-4%>6aLTZ{i~S%N8V;8 zhww~J`yXw3fuW7wqG793UAFoCIFvg5{ui}Fb8h%7ycA!b#C>qi`}F#qg+=%Hb&nY= zyLEihO4-{PI#X<||ICW8<9+vM?LXC1p-=21Uw%;jqVQ&6;54V~qke_nlXLWDaGU-) zew;gAJ?*&oYvboPHnUy)Zg%|Ml@-V8&i!EtldD*K|9ZZ_43_+z8+8`-`dDmS+vIs@ z+vxzUGm|S+gWcxMa0qgnwArE3zYY*vt%H_9y^CH49yyKR((?$`2;g)Q#H z(L-yQ{Z7vJd?Z_=mX-Qx*^1N><=-WmcUpKG#s6lPoBunS?4{SEao2Ftg73~8tEG3U zZdQ8~e|^r=xm64GRh{)V{4m_MV5OPS^xw`!JoWcDc5(pzFeW0?f*b ze)sKJan?0t{uW<}1&^ocF&OlnNMZF`xUDZqx(QZa?HQXm5Q}SI$d#EJL(HGwS+?#}>dv>*BDbHo{Yyq+du!6=UJEm`44>nN zHWn@vl6+L79PDIse6i-liM_3DFY07elO8VH82j>=-WFq&bOFcA{uJSEhYW(Q{S*wPcwZjv8sQs&Hj0|-~aw#SU4$Yg$fT>ukWEo zCvKJ201>wbPP-1z346D!^W*EQzgA>;2ug2T?-JgP`XDCfCXXvP-j$TCe|K z61F|%+q<~z9{mPoCCf&}d?ubgaTT-H?{VJ7W=G zZ5e}*{}=OHp4Tl79GLZL-$mio&5!vj8ZO!=Z&LpgefeOMgiat&n^4QIe++kb?_Dl3 zL8Haccw&dR_NABMugngb^Q(NFuJg!aQvTg-(dB_Y@3wgeHTEd~aX+mXj-M`%T%kTVov2|~qX?)62|K$(8)@K-WD^Ihy^evd1yA&*!TCg z|2DeqnZYFJuh4jV&L*|#af*q0&L>XZE(@1zTl(cf{F}dX>&;nBeJ86)xm=V?ktmq# zpvOK_LvO|W&2RIij~J{m2xD4#=KRfQ#)Cy_wKLCMy1aKA&&vgKisnCZ{{KGs8_&nt zzuG-{m^j6bFtKphd{`i*!|3GH&@vv-}b~^pL~Qk z6xmpcCKlHR>W0p|ofyw`|2*$~7x7Jw|J>EOq8_zo?A{Yp`og^Sy_vlkyZ(`e2-hcB zb(31mu3TRJ@AGc`@9M9VPqOUGxfva{e%YUB^S8E@*9=ppa2Pizq%_Hk7)?7X)|0Ka z+-G9U>PC^qY3(6dIG|)>-XRPxAW8en07A>87CDH!`LG#8zYU~jaW{2?kT^%R(-woKf%>+ zbXGjjy_gpAqb4pf_*k}+vfAog{tHHxrO_YWu${joGw1rDgO|3+<`rnjGX1H)vpw(a z`|S}kGF0lfm+^jiQTzBPt3*bFuV}!AnU@y`TWbFJ^^31zl454Vf~I3%UT6HvUG;ju zwYu%my0@AuMBXlvS+w)S;TwIj(=N|_aDeYYB%g${0y|IQ&lH8ooeaf}(;hd(Y?5_~ zR1FGJChzsSG5pSp6w zHz&EI5DT42p8_QU<{Uk-I#@)iRMB#R#~dfmmLnD>T#Fw*{QW!RzGpelgQI6`P9EEL z@$9CcWezigqJBLNy>F()as7Y2vF_!6KXMv!CbYlV_~ew+x%HNooIy{jgjF`J4j`olKR+djRg7!=(dOG3OgjG{^*@^d_KJ+%U z?wS0fwmZ8Q*|DYFbxmcR!gk5csO8}2t!I{eejn>qyYc0tViuhs17q!-CRL~2UZ{R6 zF~Q~>cSmsH?2SDwZ+w0*9(eQJSNmnFfTZ>D4?6^RybM~M<~~byxx|&L`?E~EcKc6f zD&o7-?z@oF(0R98og4f4`fA^o`?baYewlyi!oM%Qm!}-^ZtrD0+p}f$@|%TyI@{N8 z?2EaTQ~2`JE>TO~b~g3}m%_YO_Fg^A8<3!?!eZIDjLo2fwLn7dh5uE4i5iC)7q=RV zd2C2#OwfxtEObSF-yiS8e@z$lD?D2(vuxi_kpt&11|3wEdUcJ<;~29@jvC{p7H7o` zANc=1l>Tq&Fmu5kk=8K1Wq+AOba+*a^;3_AbChori#YOr?z9`rZ(p6dL|DMd-L0|Y zpL}HXw9}`5U9wucMlp6m5I4`Ghx702N5%OWYfiiW=*pVKI@LG72-LkydLf)Nefb~H z%f2B@!$=Y$#wbbWswThXguvtK+VaxXNN#DZmzkOnI zGA&bdTV2?tM5hRbu0jDG2gM+@&3}C+o{>1>GI{oaY>}m0?6&jOGs}$lwFCSYyjy<% zgM!rLr;j7dTVr1y`{yhW6KMD1``hnXjkzH$J<}%!Jko7cDO-{De$U(sDOUWaoR}sm z+w40wEj0A;i5=JK6uIO7M%}vdb(@vzQ|FW;b`Ou8RG#JHx^RM^)Qk3~pB&zvjcnWB z|113BuHzkhoo76mv#R=v@BNaj@Ds1PcI{v}`rv@)66UDlg*N$Ik7semo=G(LxAK1R z<+%Z;%fH`L5j>;edA#{=Z}tZ5PK^)k&hMA~%l~5d!>U_pN3Ls3adF-0Z#%bvgGTesQWtJ@kd)m5?A#^p$d$MKxgI_;Nb z{2rU%Ot;>c@=krn?%cQjNB+5}bo}+^c&NCLXH!e^yL(3_J$ZL+Z~gbFN+2NQ#IalW z|L^-tw!9DD6(*bh{a$rQe29z7k&eK?|Xv%2ms*L2)E zO^U^=+I>at8hsHz1%VaZna|1}e*a%@?fiUi{jq)f3ws2W-CSI{JH!ONGgCE}@tV^{xI=+7LmgH-B^SvkhU)MpkSeNF79ZO}CKYV%hrS_(#$KDd-M23Q! zvx+}6E3im#Us%BS`m^@EZ*SfDTGq@zyJ%wS`M|$bDL2av;(K-2O9P8i9Jv^p9Qi~w zZtyV)Bq%Xtb}r;@(-L^Ky5Hac1JBP-f@0A<8!l~Bk)5Usqwax7(Pxa*cR@g68?ov4K zG5e!ju=6rzv1e=6MBd(5_u%}@w+XwPEVwn+F}2Nh(3{zpsC8O&e%}SXm73}zU)s-LbvMO(n|_n#g+I>kgfbG3-CiJKrSrq2T=Gjq z=ZV-pfgBe#H6;=2z#sf?E}p*ln)P2!y^`*&IDx2dmZvfl_nALAA{fOX)U|ul#*gRP z;y+8NJ_m*7KVPpN2Jnj#ON)~=1)R~Ly27QImWGlL_fXlkBPsgg~gO`xS=+M#;eNvD^07jMK3X zZ#-U?rvJUpH#`13%kOC#2Yt@H%P-o{vN@|VdtThh{y+6;7GBSu`l-dg`!1eXy)*BL z;qkc@pI*;AIalgY72kiG`X8I+i&i8??d~mkAt{r#qg5y8$WfidE9o_w+h?D*SbScT zb#oSXs_yh{XP&N~ar;@J?c+5`d-lfNoppWZKIU&vXZ$YQ`DU)=6*u*mXM68BEsxw@ zn;Y=ohU3o1loiap^(u>H-X8J4w4?X?k4@hjIOl#)^u43v_bKb%8u7HV$M()Fo7ofc zF6~?NzFFcu<|prL_IdwgyU*sT%=~n#-3QwwGvm%T`vrfPYBja)wIj#7_HKpK`4h_% zjk;Q!W5ap#Ehb&I-deio;=d~kIwbv_&h9_DVuiQxi;wvkFC6d1JkRSjTiBsh(%)(v z(Y0sp(MeNx>v&(k8J!}=ljYf(|Km@B`X&aiK(ki=l~sFoA2sn+j+!&mh~;N%ie}`7 z(}|C^8+06R?zXtDG;!CbRT(FewusrC+9S99|JzH~AH3M*&mI|bFgjC6c)P;lw7hBJ zY@Leo1}DyCT)LOOQ7w>HN@#-DM7EB_OT&Y=^0F6)P1b zODtsJw6@>{mo(10>YHz|iTHT@K%c)G|ZB0}E^6}RNr(+!rDFP_tJQS7~tIA3>w z>)VcoCNrxYKoP16#QoL4tu6Xm}IGxvrO=?T7n;7q| zTzth;MdwqBT}gP>&#O_F(?4IcdbMu7&Eej+t;d{1o^DMsw{+z4yx+3>Yaz?NTW>tY z^tM(p@BaJo(%QdMwb`%K*eKS=F>}u>lCuwXKD+g5r2k*uYd1X}`x<&T#{bRj3^luv z*6&=j=kTB7VV|D7-Q%_YEbm+0U_<_b;QknuvmI=cTho%FE*R{ZwOOv*p{?BZXsp(K ztNVoyWp^Ix?mqj+)&AG@Yf}%tEHCqamgq3GxOmRhO}DrFjJN(U``oW+^ZzS%*Im!H zfA_n7-v7TBoOW&RidnZR{mM7-^#|)Y**_ku%=a`uuw&bd6P-Rq67rdX{-S zTv({y62K$DdDz7wO($Yw;_*gd@jRP~kAjXWfj>Ic+9H^a2>LU1hAdE;y23~F)#>dL zOG5j#g1XLew6^KY=$Y{JfZ?Iv-@VL}Ln8vaN@L7&uI%77yP0%RPGsuQX9Yi#dQ>Mf z>11(Emc4tdbNM+7?zJ5H?`KYr`+Z$HfA4q6fRjryx}r=%do>alKis(_MaFeUOi1kC z8->CTgddtOFDR%esS)CGU$n78X{J~DrkynlBecR-nVPt29Gm&lyvIrYGFNAQz#KX0 ze}W$!CwMNL?9(-Sg{qHQeN6VAzXyMK{7+C)a|*Fzdt?{S_;6}M-%j1zKUn&%$=-IG zP?XQ<9rCDag@=TW!3)OA0j#p8LNup-T&m?PbYDfCHAYP|(rfa>RU3@18Z3R4wM1>! zl%-)=$|u%tmjBH>?P3yFQ>h$c)x@@N4K@lAju;q)IVfNcg2F{rGb0u z(hj%k|7_}-_MOH4`R04c50+OwR4ISR&l%|LA78b?pZo6q14d2^6Hu{@WiOy(N=5Llk~^1T0dWr*h}RKEeOW!d@0C zk33Xn&Q36>FsW>DIpitzLS?GXp{@lvtf#)X^~K+Ou&p)!i&_3Nx8J}1{fn!Aes8~R zlAO0(y!>+Y!)5;OHvc)f^V-j6-E~{n^M@BSzW&ttm+O9e>JQC7a;H9+)$slQ`1z04 ze8bgB>!!?Fcr|Cer*K&6+q4IakuGwMQu7vws@{9N+WhPFxaVj4c8K|FybcsS|2R70 zr($5IXG~j4#Iy9mqED5YSHA5^5Dm}vocfvV zFH1kYoIh#l1)tb&SqJXezAmWy&>_E-Y5iGc{)Zxs1)Uw1rVjDRho@#=K3QkL9?W2W z?W^O$tJyo+ti!%?XxpB9lwQ}fW17^KV<$LH)v8ABTDJS+mpePezt3boEa367GNLO& zsbt~98Mbi#omXB z{S{Y|<-WJ5+dj=aUvaH?-uEW)y-!ltS6t1G`|h^qrSrW{+sgO6wtfHmK)cR=3y-TNk`=AxzNbPS6}j4zAL`JQE}lx-9J(VhGKW0kvp-p%fs zzst9BryntDTV@&i#ozQ4SEB0Yk2kq$_ebb|$eM7+Cm}25`nz3a=db8Znz!{->Cc!u zpFW8}!0FbfSAu6R%`2JyXy)9rGR0@Re|{8+c;IgT^QQjO>&Jb<{++3hFyWS;-+qyK z>HEEmaV#OnHtw|e^jCL-K#rZ+4n}1jGnEOG1T}X}<#1+|&XS6%TDaY9&;G*i<-!wN zgnMU7=(r>u?VM||r$a>4_vVb=+_!HuB`@%3hiimp^@c4smvB7ukkdtIrqj}kl0IUy zFTdro>D3qLIwG{vXI;RmD^hFy@;|&hyYjz9U+S{GhQCK&@C$d z-|K_#=d}&*m;AJ=vG|sBQQ?6)58Jxg9ziEq4smhB-}pGU<?l#`*_-R4XtwREzze>i@9GhcVJQz z3^Kl!;pthq?FX-BfvZKP1-ou=}#?mpQ2h%*MhK3|!KdxP}&Wdp(!bzW>SL zX4>p?rw(=ZI4+75-MRRkLiY#Zs~#)XraB%Esz2PDCNig`BQjrTVVlJf2fo`GE3X{$ zJQnrh-1=jNjFK4~J-vbAFKwG!{)S&uEEIklu3Ua<-h%xc%GobN+v-A%IySA{kQBMt zKg6gdSm#=IFw5?(>K1}k_u~HhCHA~?e$!QXTkK;^@+OH)+11NtaQw2aIyGxgl7iaS z4DAgp$$7h8@hfh{MUM7LWF+}HFaCeq^bh~;cL@tF{H(MM z)j4LU!Nj+dNV&N}`gVtOcZsYGp6Y?U~NjV7)#1O!kCLQHO#gs=e#fWdtO6 zKbLer(lfgH^7rysudZ??CdFwhwlFPwvWBJUjhtgN|BC67Dr;sf$otn+bLDfD%jUN% zuLFNQyts+++FD*7qe&aQa;7f%`E(`IOb)GhRnrdEhmYD?WD12&mx%k9&kStNeKyn6 z;G0q62UmqfliC<|_w>XDE#LX>4|?!jz~%=m;~Hb zn0D|Gn@MOy^h)0hr|*lF{fv0oXkXNk{-LsJ*6B9kOEUS1xA>zscuPEf?Gw;N1KC8Hbne__!gnjBL1j(hoJI-DXUAA3 zFWR83Fe78G<-g~m+%sHGYKRvGG%NiJj~6A*%B2$fi*hm zb?WLO)m2;ic$`A3c`D*>7OfX}>U3K6%^o(VLnlrPuk!om?6^?&`j-Rw9WMS?xlhfr zv|*Y3=jZx|;ZDsyf;lEr;@oyDzu7#gYrl-0THkr|D#b}HQk))Zls!2n|GFVxqh7YH z;K+xA2bm%h6}BkmPkQ%5j4ww`*4f8!f5K%>55?>2PDomGJknq3!W>R^QhvNlar>maElRPzNCP#(FT-H0jRYc10LATRw`NJaj z3N|E~HP2kDJhiLTW`VTN|19B>*>Oc@H<{MmnfGA&$!{BS0`~9JFJrrYBeNjw&dk%i z53k<*^?hQ<`&m;P-GP_$<8LLN)~mnA;-9{! znX~LsTT#Lp#qtLqbLU)4I@J^Gqx|K*dBJHjb)Wm&t}K*Hm_E%`?EB1PWjYm7CGi{; z+a%PoH~DgUwT2a_S)@F#iCF#A)pcreie!ubw62TixE}S@q}QwL)ACz?_zUMV)Mf~lU>%jlkLN1&DLAY?7eR}zfE?1*Xs5z^@G6N&!3yEE^Vq<@uVbohVmS(3wN5@ zj~S^7pH1T6He7p_(<|ET;mMN|b$Yh53q%&|5L7-Yb#mo}5{m|>N~@QfR<{3FU^l(r zH({o*OYVlJU1FO<-nsG~x|6ka*G&G$4byKIdq(YfW&3jG?iW%?jcd<-vKQER&TWh3 zgDE@N9a%G0am|r>m9d~x?AFA-i3etEv~T??A-mvAm;KyHT}K#gx;^K)hB7}m4ye3$5;wx($H z&!&jUBD*-=t=ke^werGlJ&yew_{59itleVjmF8^ReRb3BD{fy>)Ex{qN!6$)DT#ca z!s#+&u}nzx){W;kmxS$?XIYr-{`9<~I8rRs>wX@X>3% z-Kz50u^y{i%4CbIcqNRI&a`+Mo6X)nS#zrKio37aj-~ZkYX1JuUwV#pdQ9PA-|aRZ zO@6(VyME`>ovhXTYj@u>3ww8Mf#KwDn>N}S=uLYSu{}}Ydy7+Y;aMid0-kvu%Zwu5 z6vWTw{j|TH$BOAHllWvW4VN?Ki&R+Vom5fDo0e|*Zb4R8fX@q&n9pMC{+Br|S*ji2 z7PLbp-2L>KgBlAP+a)&#mZhJ(zR~Ye5?Ae%KvumYkBtvbyQpmD7TMsgm^{DF@`LKu z1Cb&3)md2!c`DX4NB=VvcpbyEFtT6aa$fL;2IsHOuR8v76*y9_E^vqO!5l&MjqS}P zSxs!oGKa2BYv1x=tF^*xXPMIZihWl)1S2EnFW7!W^O)oH)#ZV=H=MaQ!`JrQ)7NuO zO$ynUw=Y^_#;2e9uXA*=5AI)ZVP=BV8GoO9hc>&}`-QOUJWHSV;ZZx6#S073nKHTW zRw(qZ4zaV*)v~MBpRep5ztp&xi{E1rTguE=PE%IeIktaa8UCw~`_9g!g*q3Hd_Ek0 z#M$+##$N%Qxm7EfH`bp%#rO1j`@{^i?^5s->rmbI zIydv6;^Uj*75@6wC8d+E{rJLc*CG35_Z;7Z3l4We=5nu#SR&xjAv!O}WpDYCLd&nG zCY|PXDBomsWzy88fqm?XF_WH6@c0zqrKUL9XR5Yh(?uX5fAFq{}>jNms~u`i+ zQf)7}I3f~6Im2!@Bre~(L$Nxj`}eXrjM6`ptIvI**0=)%dk)XOvAnRM+`k^8~R z7k;qODiRBvY`!ACX~VxxrC+Ljui{-|_AlZ5J9+6B@3=MfU0d!>^pD1E?nr>E2YBFr6<+wJI%#!;zF;Jc_F91O>VOA(LOeBUK4j(gRnZQ z`K6SzHw`Yybv;Xn5S7ta>e%M7$+s)3-R<<^%eNB@f~K6>5EZ*V?Dhn|>8q|km*TnU zmi$*OxHhf$Mv`XA)@#{`Zw)uiTw^f%vek6yX&%W86SOBEeflY;RcT#VdX`CU^{TU1 zUfw$98<|#oWvbKZrUaIw{e>F;d>k|yJPRK7dJ1wS8O2njd$}B%A;r~}x$wb*EG6aV zi3w>5iBB6hI9H^&mh`l0xwtJ7lA3F{qvd!yli@^bLUC+97#zN)82S<=3!0V z$7yo=O`ImQ913dJ=sX&!25boChjbG*ykdN5X`BbuXJ1 zId8tQ^?2CbsQdSuE}EI%zJ7N7ZN2AbUNyz;&#iqu?dsdxMb_m$Z|_aMy+8lggT^}# zo$p;#-nset6K(yD@c6>KI+6WfJs*8bzg!^KzCz=S#}u#RpvWezprX)OGkLD2%sd@f z>zJvrs`m7|f1$Y#Qm_9I$^W`C{m}a2y8FxbvR~TA|DwWapT&dq4g1nQ1lIC8~Q`m|cB|(d*agff`2I zQzLUcO>!1p-P`B)UBJVd!)3QdNOeX@dPU7{m7wJzS<6kLPM1_^`=nLplnL9!opwr0 zPt)C=BX?n?XvXeq4|H$4Y)xXny^=Ypn$L5t<+3errd(TT>}IStl%7ObJf?wlD{k&)-`EKytI=M<&tFRo>RH7 zGi28`mTl<~?HcyN`!4@okfqAZ6uY{L4ABI`ix2TWd^purjd9{F2d0;6AC#Izst5t5VK{oQZD( z-d@z?kyJ}~DJy9k+LpE{FG<8}sZ(gLn(x{f7O5VS6@7QD+I8&ns@{KDebYEZy?5By zX=Jud-CPuQ?v!?0paGZYtHm3X^g?q~GbE-ss5yFVnss5t3?`Qyxr$BPnIS%mN_Vyi zJpBAa;M+ysy9|l~O@=#T_?#42PCtDld9dfrnz)RWOQ*$o>2AHUZChsBwS}b_nz`NA zCce60#iP5lRHgOOvL^mL%=aqW_cC)-yYEqE^DduMHJ@2uZP&MZUUq4152rqy`uJ(* z>KN&QlQWBt>&aS|zr4|E6XX=-!Ra~SNYT%Y^Rhz?GZo*T5K>I(RC(bdU8}L6!;Gu$ zqLW~N!@=dB95g0(FElt_(9@Gz;dkhy&Zx$Ls8x|5YrOQ-|5U- zr}Xss)%Iu9<7z_B|B>JPTXV&Hn~bUzJOPph2l5+EDePxtWOlj6uwZMIsmX4Sy;s!A zmm2R`y6#=Zd`q1s_kSVjH>YSQ+$xKlpe^WlHPT$wDnl-JfeV-5N7I{G>o)6NuL)D? zcy`P$&*b8r+sYj}tB(GYyk}>Vq4{V&#G^lv(^Z$gf0r?V-?TFJ8rz_;yw)otrE@RcV3N zomJm|FkhQ`JfCUa^Kf31i3@5zc^NF~UtadtMqPN5_{8}Ojx2n~HStxJq2IQ<<*TN= zE?qYNol(h?mp_Xpe+-^(xwXsDr|Ez7S@ol@wyf;9x zEX=G}x7q)Qg+^k{y;mDF_)ESituT>3@pgZOY4n^=W$!CO9$tJteb=tG<6Cci^8O^= zaK0$Md7*p5rl-b>13o|A#BKjs@0hp6yz&AbL)8Ll@iWQ*V9>`#;!M{bF&!5{3GZ zCOP4>uE%_0eoNzin#LbzwlS3d&BkmZ5#=gTa;msg@=Tmq;2f_bnY>cZnx^esxH{xY zjqZ_t#fQrSxptmtwGk2W?{hGHBgwfzOJH#ur>KPP5tV~W6*{sWhwYspH2KAaRnDs` z=k6+beR1`92B%{?F7&rQl2$mtQTo)V%}{~+@TQ{aa$nPTUu$x$w39VvHfC047A|Hx z>5-L~n3|lPkR)c1#cq%+x>7wFGpFT9M$#G_E z{A{c8!|I!C7AGsqx$hHRGm5(fu!u4$F|^276euvcFuXX>$lTMO>Fpt@x;SOZlu3a` zUT&u|x|XF(=@AMJ@=}`?Xf#VG*oea|U`Doe{Sw*CTMpJnY_~k5JN;%T&gE!QT9G3$ zS=UVW8`F%CB~qd*y+Uv9Srk|tvTVw!5YekHyca{R2yJ!c4Lt30+vSRyi*Dd+d&9kb z)${N7OHMZZ|02TZxN@WB$ISCDT5m7@wBy&rA2ykN?aa#gw-2r44%F0g^$uJpGS&5M zM%Hclsa9tFQ@c+wd4zz4rxb@wNW0Cr^2$x8aMKAZBCOIczwfzn@#a~*qHnFmCuTFv zcD{OL$wEbE(eo^4Tn@PGy;5TNC&hJ(Nz%%lK?{VYI&D@FXnpg0$uZ8mCtU9La<5wQ z-|pg<_{VFwitpO&Rl0WIMA_YY7u8NoZ;~zhZGM*N__thtKBf1!gBMpEyyq$yA*;aa z{_%6bEVWsjHZe>y&0*mBB2ujOmEs$H!VxfFbxNtZ|J zwR@14i@Dq*{i7w7e)S(;=e^tf=}mv0Skd;*GbL35cK>A@izhzNV|i3-`c5y{bxK`0 zZz8YgO6IQi3+a3H!!~6%86>MD_{c_1H7XZBc1!fB#w?D@>4GP+Qx3{Je>smcsLAQ& zkyny|rdK<47nI(uo!c@?YQ}GdOPy7ml{)5U`W1ZJ+1xbxm#R)bcS6Qwithbo!3@(J zZS@V3N|!exUl_J@Y?J{bynX+J8Gp0)V%xh4U*#Qe1v0Y;t zLFuM1QH!5g%etGC#B4ecQMu`|OK#eF^EVEPU%ZW93#tCw_~w(Mjdahw4|YxdSI#p^ zEHW}&#j!wDj_oOzg20^{PdsMrwiMic+PCe}j>0zH12dCy=bK#lrF)xS>BdLB6Xrq3 zYu}yO*_r5dcuVe*sf=zr&UYP7(IZ<~J4cqsaN%ZKNN+&^8yLS}Mb zQ56omlrXKy%ja67B}>tv4fnGWc3xe;-0Bo}!hF@%T`#xX*=1~GSd@OLqp5Fk^9znf z4keBav)r^;1e_QSdNgn-^e8M6beOOxw4Q~z3h3H|0(V|y z32l>%F1asU{xm8%@Y;%Cv#;SZ@9jD*qwLJ)tL>30SgNx5hbZ5T-yiJGnl6zRF%gf| zm0l?rA0cIUQ{C{wk1W4Ua*2~}u}xKLi4Uy#QSzJdNdEjzBjfltmwGJ3JKhK0Ya7ZQKk+2;rTa}ezNCFE39er@5&d1f-4xhjFlE}eymE&Eu1^NTL5k2!fV zbKi1D!QB(x~qPMOosC_7Ux`Kljq9X`(?AQNQGJL+Qdbt zPtG_yQLeCEO0i*z|4k30)#lk(G8Tz#zWnM{nq0(;&$BkBY-U;J*ROWBWQgf46%uCBF#T+c5rvInLMx{Fxtr6tO=R9yiSizR> zWnn~P%CysNkqe9>GMi@2$|&Kw&k!73T_9x1!otF@ps=8UiKC(6Kr{OUcL&A_hy3`} z`RqY8(XE%JtM3zI<`!I}Zg!FPu-=-ro2#C0U3UFqVx;?;#cwXny)N}W(tXYMz9ZW{ z3;M84I%BIeU&V+arRaD|pQX84>X}Z%A4!K=?>uf4J>cYmPB6 zPZvqp!2L#O_aTNy4w6?(h1zBuYB<)T{YHp+Rw1M03MPpq7cMFnG8{|1p_KUGLaXz1 zzJ<>1iE|Exb!N`v$i0_Z&{X*9!l{n%6MrnUsc!Ef8be-lglFH9F+ z;gGqgxkmNGLv2Go*0=Wd2Lc{4&2<0P%{k7inbdn!s?hZP#{V7R}{rGG!lK>%A%!n|(_vds%5sw0T%|$=b~GdR7cP z#~-bkJ;N-})zRI=UBg|*+|kCLEse!dsEpHV3FEAWh6N0ajI3M&4Gjkz8H-p%4k%Wg z?PcO&x9nSHELPH4QhmqI_?(5W(F>=S-ztt9KE54uAdhsMoB5+zJdT zUXDD+@;Gb?FDT6FNxpuKV*_i`mBuBF{Rz)sU){68E~tFj@{8-wIX^l0v8h74WFL!v z&9=qT=NRApdgXrG`K^H2lh7Md2RD7n<*v-s^iP?8)aG*i%D1i+vEi(1HzjeJR(tcl zmN`G==)SfK+DA$cOb}Dwbgw9D@B6<2Azvmv>_6Ar8vk?c(x&Tz?P0H*9^bmhcjS$7k;TJ}kIO*|5?=*yW8KmH3w9qi$}R65g>_vZ$N*6eu+9C=69`x-=T zT=Qx7!ZTTMCk^A1J(uiiSKT@@g7?PSFC3e9e|vF#WozAAw?}Lirzf5}Zs{E4cfa+= z*0*MCI`1FqG%){WWLkCfL0esT*Q_sZSc?;;x!wFI_##Kz#@JVNO0D3s#z`tl8#HVr zzHYB*=38REqLx?p{_=AvH+oY(?iYHp{AT9dkDCluW*m|G;FS=XcjUnGH(ge~T6o>(_RqsVuN|CL@Z@P);KP=~7p7hO zdM$lNkzU1fIWVl8eX;uUG?3=l%kyXL7W>}VqIdf`7?>)gAKVkQ;4D%N^ZQn$T7R#da<}8%@qHE6 zZCCQXm1V@w+aGYwrBY|*=ht3^QCfc&ZBRSX{;g!Tg|bVT-Yr+QlE;pWlRNglsHi%5Sc9u12d)0kE=1ussY1aDv+f8cj*Cs4xsu1n_Hjz8xrDN!?Jk3St{3q`C-+ABuIww=< zZ?_`RRm*0D#f#n0=U=6M>H*s%-skmye_oW_dF;va*%3E-JkPSu$lLtLCs;K7_DX~D z?0YZIPe1cs%4W|ukGSpar6HlX`U<1kCMEw-86b*-0CA?H0gc0 zv5cdVz^_nO0iP}Jm7m|}|L5=5X6#t!Wq6KdyQZnhrzz~27T!sdC0_~H-K$U4`SI$5 zFH6q0S!QvJs~0cZr1<5V_2-$s$GIVIQUM7_U}~D14W0=pIomaAavKqw~!&&T880L=T;s^fz=uN*G*8%+ITJ6 zRLfMM(3e*r;CaKVDT1BZSq%+V$1gm7y5Z5fyINZ^op(IoZfQEy#5_&&^pv^FQ`Utq zxh(70eEO`eX~N7+KAVs7>X~mplU`Zfwr*={pHkfFSsDie%C7LfWHvplz;j4}A4KpR z6yRty;Al=b!OYQY$l)#<2%En8|gI=$zZz@k^ielw^0cK6wh+VKqKE+;ZM z1)bl%G`juPw!&)luHWvpmdcDwZ(^!`RUh&GQTVL?iC)T;R*pGgZaSRXk4in>B-3bY z{Cvxi88ZZLPCLL8C$3r`bW)Hp>1b;3!_xbER~!u8*rYnKqcX_kdhSW4;BVXA4{FhUzA5Ohihw>$KOc^N|KMU->v)5r^ok< zkBYFkHCvX^FO71!Xv?^H_v7k*7Rxs0o4Llm+0`}k^vTz^%9gloKRQQ`FIFaCjzQ9K zz1V&PVINzL zQ%pQd4gzeo>xH#wfoeNI_uFK527MSC?+<>WR{*6=f`=-5ocBC;RtnFGb-FPEgb^@DQjO`ua>wBh7FP%8MK-hoHimnE(*xNIIy4!EczoFuE zy=xI~|J>$nXLW>&qB!nf&q$l_sqV^lGM7uWob1K&x6^^W_1c0m zEs1H@^rW@Eoj1SuP37s6%O5)URy$59xVm`5R;Egy&nN46if11+ev$dBLz!`=a!dcK zI@zurry@4Jv+h4y_~~$@xp?B*lfSFNVL{KS&Qx|zp&0@si2_pM%?Sh?fI?$cLqzi0UNNcD0wbDO-< ztnYFCax&=)<~Zi9(2uw>YpIu(vXt{&FXmYnb}G|P_SK&M z8`a-F5&4n+(cSo_m7;1BgCo0-(2J>)FSz$TD6Z6&+5Xs2OyCobPJq5o!g>BR=I_4> zKV~?!e@@?)6{#g#?@xDJZF{6e?fQ<2iIvGo;!{O;`tMt!+Hm1O8t+`idnIAKJ-Lhb zOueDt|98sW-$zbti50qGmUH)8Sc>B!-4pLmKTVHcny0yS<0R_~oQZj_xelClN_&5f zFYBz#qEc(?mR#Mfim8Xg=0+Z^QWf63tnAtYw;aVyFP1H1sa}zrVDr;6Wz$EApq}iF zZQrI?&fLFpMS^|9ADx3cp4<&)Y1`u-5%A#G+RiSH9p8$WOqO1lrq5Y<@&tq9|K2Ej z^Rkv(mvc8_Fs%YH*?MFm}d)rUpp4QZbwi-%!Id}%)geDmGm7-{yi_LgzFHeUjr_iWZ8|! zFZ;h}_lJmG41(VTl3n)nUv8?kz0|)VQQ**@DQli}x;1~y-t%kT;|qU@ZjiMGUSwe=3j@uX>d#}M^zwRvK=D%`=xf2!2A6@9?+5GH+u71ngBe&Dua&;b` zzE8{S?Di!UkzG@^KlQTf-`=~-^|w;?-Vh0oh(mvl4 zOnPm=6?I~xx7NCB_eEFIDC? zS_xVxyErjUpSn5kgs9ifuBDN!4jLaEDzp{mRDU~W8vbCdgXe>Z54c^N82ueSxX#$F zlppBipi%kFD=6b#te}$rj_rCZEPW4c?nK8#fBh}med1A(jtZw@j>jc47UvC9dQ6x+ z9fAa;gBq47+z?9%7n;mqZEUg*(r5lc`E9q5-9-G9~>Ud}2|KpYug@g?n9{N0Zt$k_Pq`firuQCp% zcJJEh`c60T;Jpt!W~|X{^O*O^#G&ibU(4F(cWjPq&TC#e&vtu8YDZ!HhPeknC|wQU ziW4+7iDm2%+S;n~(ucwM_3G;4x!Gk>4&t{~SC{97yyXrIVOD=#DqB@}#mXyF>TORK zr;@{S^QEE*Ob6|hW_*!M@jo=L#v;13@UQ)=NpTBTeBHtmEnDT6vf63;5?ii@Me53e z57!y5$?%qGv0|5;l2)9-7XEu3Pp0h3K;5TFr>=21c~{JPx^tb9zxV>#H(d^E`DO>s zC^~egDmuX7I|qNIJa5It>KloVM|hGsL+%37Tqo1oX%-lrf_*K z4*DCY#HqbSWZs^?X+iDppNb2JhzW`cPoHv0O;>rfcii@-MU&+Ap8EAgnkD>o{sObq zUH9(KsNOJ5H*y;jgVO?z_`TmZYee5Qo8O!uiP`}9@>OIR4aIjc1@YJuSiKh47616NHZ%w>G<6Ot}iCb#VK!dQdG@`uMy z=>4?Vy<>BL?a>SW;=Rw^lmDfDSagK_0cXAM&ALm!^qVe- zteXDdi%?G7qqL7n?>&=QI-)H(oMX)ULt{JAcT8`%u6)mY`Cr{IP7XQcTbe?JU) z2p(cm6*v%}wRhr~%m?#B>kVsHtrHN_Xk=&$dMWly>{gYIS^L?8cMje;*y{GqNP=h9 zdXsoXw&sW1r5;Ha}P^UM0F3xqSav##pR`0o+|La-|Lw?!b&4=u>Qz~xc#@Tux>;0;|xb0~ard2_O8%vgMEU>CM)0D(a?f+ML>%Mmx+t z?9>W461^kZaeMQQquYINt}45BZGrBr&}n%AVeA{HCQQwI{bcp+qiribzlq|!{&{{+ zr^lqJJNDfcRQ=r36~ZX`QrLH`c5GDY#Si*rY^`o887%c}^?TR1)dp6zefiO1`G0SV zd3sO*+vT(ioc?Ed&b4^U|9EeE$)q+fZU#remx8R8LtkH)F5!uNu&ng%{IV_4YW!lC zW9xhpcfFPhp1E=5>HbXL+Zuw?4?lLv?mo#j|9Fz5Re{g(rIn!pAweO(YPK&m-#s;C zF3oc3RwK;~R4`U{uxLR}l$~4(u2kP6tI8A!0bK3c1S#9z& zW~Q+HAq&%Hi1(Jc~7l?}X?_-L+hHr{yO`o2~X_zU%#~Co96`j+08* zPNUP)&dn3;o2_YMA9mvUskuLSN?KOVUuQn2Fm(>UVB(E!-7iBmc;;qxWz1Xq?XIoS ziYFVcSAEr;v+qd#-OXy{-}2v99hUc;6k*5wFqczkbNt`ON7hd%n!l~)XS`Wb@SHy- zwjYE|*>5e6KiL}SzpK~(d(^s4?)fvbIu}j+`rEQIKp_0R!0V33X9{F5*~BmVxvz{d zY?l6?ci(lG-1Qor^jIDB%Kv=7AD*+Nb854DlyU8Ov-hRK*K@ap^}k8J87!INzkPqj zG4uO>B17s;4mc|W_M4j=-pILAgfo~){{0o{ZmrdCRGR%S>s>B6?H=sOqxa$bTXD+= z6OITT_mFvQk+)N0Nyix#?p6l{qx5FQd(zEkS6}$Ywy|aI`;(8proBAn`XXe*CRzW5 zf4SNso*y_j$A7ojktEK;|Gxz6X*Zkr?xLx^{JhxJ26HnOeEuuPQ64Zot}7<;%;dvg z)fTl{&J!-0@Vw$&%|*RuF5WNJCznWcNKa|Cd|dP)c+b4*H6Oby>@S_mb@g<3HY+WZ z`?^|b%nPBamCN%Nq`bJ%k-w&S*By~Az9zTDA`_gJGAJCCmYRF8$c@p#S?1-PcHXXq z5?u=onS&<1o>SsC$>QZ9?SsLOcK6gj?!1=k;khTA@%Y-AEh{%}@(2r$@ZAzPVY;^V zbrCMpG@)h3E*UY+UCMYxl6~&Pj43Rh6Gd`(q?LEv5ok`_V3^aBAn|NhV}wds`Snb3 zhMP(}i5$Yo9L^Gl1p6LJ91=Ko@QB1C1)hfz?9O(ADy}Ummp0zH*ty{2>dQGbJxgtO zzBRS~{@zh|#{pI;3B7`YXClSrDt?zNx;a(&-Wqvd^H2Yb_f)Ra_I*&)IPH|lE*ijZU1uiL+XONToo@ccBzE~BaSQxv8Y$Qa*_zj!G=Ql5j? zaQP);N3CUUI={|HPMxWDeDM?OIbUP{AAPo};Zu{ro;L3Y&Ubnx$9?ATcsc$Rj5G6C z*Ldm>;|Vq=M!TTKpIJYGLnNIGS)zVbZ5H_c#l!WVZ*!q%r_VdP$b#I9S6^KG=Do@M z1pgfFX${S@eq`%jQV>#UV2(XkG)e0{Z?3{BP47Kg$EHVVtrhTiF}a}f#ZAwxVq#KX ze`qdx6_T4TmZWWM#8qH?ZbE~YPtDdxJN7<4P`CP0@1(ozUqc=>&-^aF)Rv>OX3K>( znd1?{JH1409!!xryk%ZZEPvjyg@&SY_s(@Xc&3+?|0FwW?4K6Sz3j{%ma#9>b@OmM$hf!N z#mneG*S)m|cA2|>+Oh9K%d<=E_bziSy7qXr1HaxKdo8bPo-PTm&wc9%>0qr(%(*%} zZQiu-Q*S2Bc{F?Kn=nxYlLdUv6MNQcA2sH%c9&0|D)cMXYEAsHMKM2jMD*Vd_I|o> zL*vr8dKsrXi?}KuAG1pFSv$+YJpIKlvHE8pu3f*BW?>uSoe(^W!GH>mFGf9#=2ABJ%Ey zywk;i&iDuFD?_hbU!c5L;<2*eMBnF1TX!9@tDCy+`1IaX(Y>s1MM8vqbmzX_b6|DM z$z_~>&-@npn|yJ9-%%g?i$BBke%!2g^R^bB>Fb(se_Hpav&-iBabzBOxhMUf#YARS zyVIXLn|13}RGi?y@;P+(=5%}6hNc5mDhXGZSZnKxF1SUX`nWDN=6&AYyRW&w?)%t# zbg|Z#PM6bqC;q)!zgRd?Jz{hH>!37w*(KfW3fJpyw#v6LT)5@>LjUKH_sgq`Y|CF> z_3gP{$|CUVcu7Kj3;!W^(QmK%)Xj1ejx&DEKeDef?dlo-C+Ay&|GU(+@$Wz6%`*4? z6`oCNgWt|vIrH?X$c9f`VqGEJ3|H6~rCi#-O869pYI16FdU6VDa%Kig8W%@$3Tu8| z(A28rI&qOl;1Y%q?gLB=4h?Gj7ZcfpOBfnHz0$Ht73}(uTOiah?R?-v&F+Af{ATAD zQ(tGjO53!7SeV-H5@b#!Dc6%<&+CTOC%_|K=CXM}D{v)}(nXYR!4fP`JayN{h()p!2o z%o~4|^4e?Fr~D}1Qr33aCTY>0+WA{vFW3|5yPtn{H%|5PH^(%s(j1y zb5@k-pUGY))-SDY;5f-9B$V8+ch14f&&oG0HrBkmSj7L_)XM8gbIUKqUiZ4W$6~*f zPnFL97uG7e8dAqQdUH$OeOlyR*}1msd)F%i{CPkDAAPy>$9w^t|u~ zALh&EZDsG&tA4VpSkF0r@5jsD^){vVyw?lm&V6y}y2ic8=RD_Fmw5kt`sl(@hvwD` z;!3-JyGyKJK7Y%#tiyZif9#dzyKPuqbEiP}K*=^{>D4uhxdqd_`OLcb(iT-rm$S;s z(B1x4@TL9LFSAw%?xV63_S~wE1J=$x zxTd(|$fUyHWjELtZ+v^_*woj zG`Y)LXRO3pzGhFcUF_nOQ_XL$Ja@5a>+SVxwig{c=HRja?e453$vt^p(~S?lNE4jw zpB$Rdt6T6^Rp@2PtJX?XS1)Y zQeU($$Mc3ty}r|?4u8z{%@oO9#Kx{~uy4Yqocc{1y<7qr`(8X-`Yh_x%(F=nxr%Cc z9~a#(EqQv-iza;Ju}0cJ24CwDB16GyP3c+ruXLo7MJ9=l9J1 zvdAg_)s)iNLKUuTm0M)dDBmum@?^{RmcD~3&UybT@;h>Smfra1SNwIKZw~*{ms|2L zCQH5-ukbUD*!#36PJEMFbr;Wc>xl=G6*o67urU1MIzy*H%*TO!Tb{ud9g)f{hJu}6 z*@ZLI{XF%ZFYa1*rSF^F%Ua#7R+r}GRIIw&pxg0e_J^6PAFXZ(aemUtILR_~)wJX% zyfL;QNb35`V~uCsJ(JZBKEIN-qh&(ju_G4Ne=3`ICFBV_-4ZOq zGWC^<*RPC+w~a5q;(5O5lhO69U)9ttmPMDpn$zQL+j+38_UYHdy@r;>MS~Q zP8?wM@Rq4lVib{Tbz2yi5i;Yuf|;t(bUR7!zXo=1%G3B-m>A!ePCR3*JTtyP!%Lzf zSmDtBYja*);}^ZZZoRbz@!{wfNbpg?prIpUpDL z+G>()kUHfx6EVza#XvYhWR{ki*R?w0vdba(%)rL+EhohEAjcj4sVo(tzr zm9qN#u?8F7DvEPUd;S00qWi0UesB05Tz}I4nR{;e8}mu8yq53ueH54wb=Ty=n;AF% zM?O!#z^UEIEqy=v+R<(W#n+la^B9)C%~$(3=i${;oxfcFWnH#qT6Fen#K)HC6n_ri zg@UOYB}@grgs*UsFb|5JDeZV|NyZ6_(xY?jHm@qWD%cyF?iSRYep`2qoUOp>Q>ENf z*ce1-8@;(BIE%H4^|#{17P&|E7w6nzJhxv_wbtNa&F(At86Q{O=$^V`XWv!cj--`a z88|8$xUTc5I&pp7ZGUOY+{!m2?tl$|D|HPSo?!LU%^@P#Nv`Z_F&-9*P zond?<`|5>ds+|*y1QpFPc14|6*<+jjMsU`K)4MOEq=-KV?2lGt-`X5mwL*5~3#lnS z`SPpHKTYfxVeZjBcIKqi?Ut$kHXr%8aYyB}rH5R$wYN^nTwAI9T2TK{;6(1fN{w!M z0u$LTOjg%BBPZtmYU6Vq`;K!S7Ed?FXL_H>HGa|a`s%AaQYvDHTMw{lKVQeQuI>4> zWsiRqE{M&WB&W~pb}Hh%*ZM;K?(3nciw@>|I#SU4Ql|9!Lc??}>GPMiWy&%BJy)=O z#ih<4ml+;z-ymZ8((rukTI3%#jxI=DS|;how0 zTvPcb*>>bC@qCy%$2{ik6Dds}#^nc6yq#xwsN}sbpX1Y(s4M(%#Rjf6-uxXV##cp4 z45mM~G!_)UCq4OIe*R6C%?ah{k+xalp$BA)z17Y>zRMjqS0KY=c^xw| zOn-Ey9O{$0e(kQbk`8M=GwBe6UI>5J@_o#&R$ZwPxVap=P97+3a( zWpbg*?e!#-cQ2T5a^vL9id!Ok>^UdBWq7K&efgXY=7;YtS{&Z9b0bSlL+9%CWnULp zafSO9zVXs}Z}~dsm*o|uom(m%pSWW8^QoWYcDC9RFAwYXEwFzf7vFH?&o(cuqP%H~ zS=S#g)l}@3ol*UvVE0E`o!Q#QESH~i+7o{Dz^{+`Zw_%zI(I9VZ1p{kT{0x_A4%ir2pRt(vD@Hz?L+?o+*gDJVnp5t9OovQx0P z;&*fV=*H8WG2!Vc>vq4HHIsYawNlaB=T$8mU%%?%`Ktcv;fCC|o&WsH+a4^FnJv}d z`6lhoqT4K1UXwLXo>4S*UvhGaTCmsaEh`M-wf~-X@kmfIYuo&LMv;@@qsHKc0URP+ zsi_7cTulz13wfH#uK$1fvS{o4pwD7Q;!n6A44*sQ?cHSD0T_PWn}SV4027r;Wd-e$u?UBxFaBUFxB!Qb%|WFY))hQn%EgVAjK>A?IGN zZ@RKR$Thd8uA*b&qCZxPO1uK3R5T_pn>8&lh-Z#4_XH8npj|iUI(=5EO9=+kdGV9put zXNd|)JRBJwTTCw7F5Pu+OD{8;%>`YkE@q@qas{IP>x&s?*4is)?mf3E6pztu$JGZT>jH_N(9GJ7w+HQNvaq(+! zpLJK&uiaJGTDj}zsu$B=eOKLGJSF$+PxXH~r=#az+jKKDIq}0x_l+}e#2-l#*l^g8 zW8t9-;k;}fJGI4Pr53bpi72(#?`;c+*z!h@anp$+kC2EnZ!e#?uGvu_wZ+v!*XP*U z#dY%vy83Dj?>>8Vd`oH7$L#A4;;)Xk*CrWpVA1m|hS;Eg5 zTY4-Cw^y&4=yI#uW~brlFD=)WB|jwuZOeT{%%m8Kf2f6VcZb@2GZ9Vu zw*8*;T-vbO{GnWTfS|4 zw618@cdvsbS6%EE9hq@&jrE=-VdiRgF8AK}*MIj_+)2UbRyrl;x97c{Q_(!Ru>F~h z-+Be(o$Jr>1PdkPA2_LIqOvAs-m&D+kBxj9KVF?aIxSqbSfyP!IWNPK!{haS>kk~p z8I{HUr{7<=!@SmR!HO*$ZxZand0rH;M@i0KeZ%R_mUU^1&F{_7hRSYv(;K9 zughocX}xbGqP@X+?X&rTO{+H+Po23>YWB@``}kgs3v$hTAKtFKdhy=Dl<771o-g&g zB>k;ACFt&)Wru8w9$xe7{knF>rscQfC$A9P`f-8=o4KEePsG_LU0RKK%WodN%E8dw z($mz%*51R)tG_(iqatU+%9(QI`k zSl7a&6*Jbodo0LRT5i%~`gO<8yt|v#q#pZRzH+ANu8-NH0^3JL6*Y|)=5cIT1=bR> z&LG4m{A$lt-;i|%COej;iRo}pV?Et;G;wy}84DS`_T?wVIb0d8o3*cAsb1`><(P1* zw4>m`!dUAf=38P!HqAxAtY&hrA zb`?!ABNg62o}&eqCYY%3_U_Ubtqh%M8zkv`=lvtro5t{x;$cn zI$ySCSmZbcxm;Pb<7?XNq_drZJ9lK<{&b{M(93IvK&VIOEZsEO9KR_-rtYG9FHYoC zaZvlB%$AfSd&qom6b=@cd4tT!p0DbsPC()7r85^MpD9*tWR*n%GjalR-LU^a|N zy(zU_CzK(ZC6jFi6H7yjG@m2W^#i>#7|S>m6+~u+t-c~6z~uKp|Fqsg)+Le;*aTuO zZJi*piNm45C))9g+T7HeDw7_uMrSY!}0K)ziP8&g*DI2 zv`$}G<2mWWyT|R%SJ&6A>-j%HZqM(+w}+}vYWtg1$kspERaD36mueMu_)+9gH$`*~~rv*j!Dw6WmQ1Y^pX_{=Yt{mv#H|)YZJs@|JULo{2ux zh|^uH^@jJRj&AM!yB8zZ?B#gVSsB=F*Sb2QbJo|T{i5BrZcFNXm)z{C-88*1M)dFZ zYZ>N0*LY`f3QkE)O}HBUY)1U_s6A6d`bzXBb4@GR827|za@|Qorc3O*<9|1uW}2{Y z>T33iHzoJok2ZFQ+_pFy_EBkXqSJ#$o5R-~iiKC76_`?g=7jhjks}MW4pzr7m){PH z?3oksebuK@b49tg@eylZ?d|R7+NQa6USOBF%We6<`J9Ru&$C9cFWXS!wbVFTdUk63 z%U;dB*_Z6zbPCuX@H^MIV9!~#Rhg>-mM zePtwrf9QnNl}mOP`m|f_m{{?)lAkO4@VBoIHr35prY>2zX!(xBJB#^u=B5doTdS8# zeO8PS5j-M)L}OOaYV&9(J`17QySBJ33&?yWTVo=0T7=WB-edJ;={0NK$}Gy5a7m&w z;t^jv#~~s886F3v#IG!x{``V^JEOayUnh&EXZxfr>brjSlxv8jPJHsj_|w9GWDYA4 zjW-&ZFRw2vn|pJKsPKdeX&H0;wVglud;i(JJUVwe6Z7Bw`%Lmn|C5Vm>FK?yymq|z8~dII z;Wu~=y!!L^<%9I)3m+ydNjg{kLgx2dW`oU#)OhdZUe?jb7Z^pci!|yJA5=?SpBv zb$9K!Zu+hKsrXr8v&WbAI~q2u0zu7MDwjzFBa1%Oj`dnJ0SvRTUZQYc-Q~PCR)sQE}qQV}B2^S&F!-Y(B9pAUIo` zA=tbvF|$_aY{k9S1A?J{ofm91tzmlQ)A~H|yVR`jOBSZHy8FMW5iqn_a^yJc^h=X|MmY-tc?+IAh7RL#z3fH~1Xp(COT@(7nuYg^SVKy^k%V zw<>L{Sao|R%aKFN^BB}OojuT*v$AdCasSxB$tk~sq{8ZWomo1Q#T*}xwXvg)>MvL zkJ$3(owA;KxmaW7f|WJg8Cvn4$Inz;5zX~3TbJ-47pl& z9148AHqDl;_uCzB9+56L8I@df)_|yl2ep5e=8G659h_#&pAq5s!M9?jpAv)QRo@by zo#7AJ_lRxe4DX$OFZLktQ9B#C(eQR*%A2KEvi5Jg-q%;lXMK{T$yVh` z^Uv3{k3BjJTnvQ*mhQNnng4q6WX*WPJ}#T}S2N$8+x|*z`S}HjPTrdZc{a@s%HH$b z;-G<|Seez!mT7t@L-_yQ|BliJcXDkkyjt;cuiD$_^Jan)X6Dk0 zMpIr`oLTbr|JPn64G9ayLjp%V9AY)KR_xaHT~>3{LhHkxZBOl|SzTjiaWGq&eB{Km zc=JPnPuR44dg>mp7TWb~CZ}e=!?(vwW9nl$=UWEIsihlo-HYvM=~*^iPUCN5k*vn! z#v*wMW2S1igE|}89UcGA%KNxm{;Z+zzKd44i=`*P_z*K9$tG&%;``U1QP9Z!+&iw@7U%$g^iEWjwW}R-~Ge3@Ke<0XEiNc z_LUQ~8yp#BPX~OO-zLP(T=cK^l<988t$F{}mgZ^y40QOa5y7~I?U4FnA#Kk9pWS|{ z%*W2$NRn(h5E#KUbJezmJA?IhK5P`fr=6L6Thc1WjX7;nn%TMkQ+rco|7D+!-c+=x zbF!G%f)g8ER=C`swr0~ZJC4T18(7j5HJEypgI2tjs%CK1EDH|kUOcb)wa zi`h6dt8&<|Fq{Zj!032jVS?a{#2WSQqK>c5v68c)l)QT%Ar?040#=0Z8QLA2)fUEapagpO29#u=@VL7 zXUtG(nKeaWp^{7YWDVC>FVp6*J36^`i0Lcj?wcl=df|zeeoSI&sOhq{s8@j{8+o<% zwJ@np4~kkS^mNsgtP5+dZnJ)~rya}*xUft9cP(pn&Xy;sdgVv8@4x7ceXJzDb;i-$ z6K%SM$$ahk&wUqu5IeWy0i%Cq$>o6QMzh)_BzB3puVW2U_|&!AHBiL$>oBu;ML zWGi}1$aCBILszUF44bBQsf4Xt`0nz&XyX|Nd3boNZp^K8o>-ux=(T}6tn-21A_+xN z&ovt^XgE&iiCtI8p%$~D-+Kzr5|cnF>jqsNtp_RwUyZsXg_u@)RLcJ_@NegpZcBX5 z%Dl*pGt6k(?w7MyP4zXK@O^q{VT;O+g`tH8U)@BMmniML^kLJk{h2pkZ*-RDKC?pp zYi@^>s=(U`f|oA%&X_X6;flt=tYcnHvxOQaZwa`SvL@U3j($4hhnpzINgSWi?a<*BCu~x8~ioH(CFmTV)goO0+!Dm{DcRm^5ceYuD))cFZNF zb$=@UJ>6d(e6NY4K7Fp#gBi2$t-H1Bq%m7+h>Ra=c~GH=&t6_e3*9N2N2Xu=d$sj? za+{4<#rMmR^V8DO(sHNGW%6r(qjtf9RnV?zd&5GzpTP|-7Cjz;!m?MJ6aQ@UR+QL% zveQDT^~;LMD=%z2vguyc(iF@7?vN$AL7z0CVId6)QJtpM6@g>(;v~trFWK zB+SHHcFrqHOPupE&ap^!``YB7NhNReCFeUWV41ot-=0}=zQfw%=jVGal!|ibtv2LOS|Syx@^=%9R*OI%bG+uvA1h|`h_3y;cf;q|$mzu7#s zFpNg6y#;~@9~5#8~!`X zP3{`#-Y&GY=U7}(m08Kkpcs)qFJG@sSjE*?=Q#Hw7422aq?e^yuY1m(D58ElLHM72 zm{$0ztyPO}W|i;S`!B&l%75AEt5uutzU^mcIa<)PB%|$Vh2xYI*Q+Imx8xlE`bVMX zkqT>M+!S*i%|Bj0V@}-msol}RDS3xQ)TcnPMMPoBg+m`qsel5J#*R^WauX0V#p3jR5czb(%9Uc_azIe8K zYQ*-ZfhA=TI~mV!Zayezs?4}2@cPf}a_>iXtyi4hRdMZWb;NG31q@{;6!$JR?OlH| z@>!k~+qyDGwTG{!&L|U}ef{^P@QqRbtL<5`zgyhgVv+kn`uKO-<+}{ua6=!rm*I= zqoG5s`mJyG*fRgtDwzGNd?Ju|psl}QUy#oJsN%=Pp|uGu|79eezB;b9gX#3HDW3CB zPZHGgcf0xdz7(gy*{zB5>;GP8wc0KIY0}U4lm4dk8O!aktEqW#>eHnU?qNpdXX^qI z4^E1hR=s*Qd*r5NWnPJ_FC|PBH6^AVT`j&;{%GC9=L*M8vDYwb&YQh%MnnR8PsFx! zlkTd=m02Wmul>22Eh6Go#-fAFg`Ml}^zB)-O|d0$qLT5KQwB%tj)fm&Q=PKq(bqk7 zfts>hzj|hDy1A%SqV327&nc!~ediXuTl!(e2ebde=h?q-Go@$8GxJR7S3Jd$+hcgJ zsUX3og+cX@M}bjO(~?CQ8CGr=jJ_nkI(?~st^IL^busfAYbu$VTmBwY+MXidy~Jpz z)6alVw;u4>-v+bJh)oN-X11;D8;clUUD21#m%r!k{uPmOyur6+tMiPgem=!^mi+!r zC5n$G3CbF5vlFQhNpYW(%;9P$dbRU`l(VOUbGcgOvH-D5hOrv^EJIv)a>8dF5L%U_ zwoW=WgV&Uk`+jYRQnc%8b(z`WZ|)WTIPy|@di_B5a6SG!DyQb?C6lrSP3LSLpGYg=2d@J})XTd$ zYAjVbx$;98;+M;LdgX^Q#ZQmZJbP~?lg9d}S7FM*hHWba6Q$N2-lCHz@PBJs#tc5O zWy`sZFSJWqw#}4qin)K_-cm=l=pz#pdA_boOgWrsm=wUP)0^Wfb2dh~(v7o6>};=O z{o93~?p$^`bTHd1-pEMHN{yq(+e@))R$E`(9F|U>7@MW(vS3+q-In3y;4GW$+w=~O#qb~D6sS@e>5s$nk@x4!*#>t%;vpQg#p zNdB{7&${n_U$U`T?X808w`Cq_eM@zZ{7m55c_&f%$NJ<`JLfLcdY7JL!fzaWda+K= zQj6@fr;0dVyY6V3w8+nO*`AD*FLEU-bE9vc>z%c&+3i5t4WoN~JL2ozZ8LTx%N1s< zJZELOeEZ$lUElA-xAEIVE$g?9o%VjuZ1X8+_%!z$80}tCAefS}^v`NO`}n3G+CEbX zYO{RyEL!3jKF6l=?I~SXfd|TqTDi0YuGs9GvUJspOJP1o!)hc?RrEct*~!5o&+;fr zpkuazfWG5~E0?Nk-mKnpt>>GTu~=SVi}k+LP3EUQ&sflYKx5OwtU%vF!RNmgi7+?q zKD0yZhgnyN^je9dT4jY@;eUiQxXhFBmFt<-@`?oF%Od_tvTen z+2_!EOZ$K4C&$RWQ!aY8+0fv}6Xh?>yG_3fx`wZ_*kbi$(@UKf&tLRaDt1h8?lqXR zOrjvtH7v(kIR51B{oK?qyJ%Ev8}t%;Arw>%$)3XDIOJ`kqdZE$bUzXp**;h{c8wms~$m zlsS5LUlHL^_N$AVxc0~VzjsS=iZ-Nt)?5}SRru<&OwEbi@smz(-@WVf?nkfIKk>@i zeQEWIzpK_Q-Iu-lV@r`v#xZYcUxE6!Di+R1U7S*S*pAxwvYl;?bPG^ecG2`@lc3YA z&DwNZs=McyQ6h%o<{nd52wHX_#OP;_#q?XxvC|JuNLckI$^|na8*GfM-8f_H0w&i5Cbdh4}GnX8v7wn?RJkpIgQleeGw zTj{C^F%N?D9&_nE_tGm8eJ*gsIpM8?MDr~nkELzfX3e~yq56A4(6iTtF`@Z2Mm~q; zT{>BCBT%1Z(aA4=HhhVh`jP!~%Yc-^^k z`R|^Kl4mk+_I4k8Zg6&u$h7XKX{novB7d%7U8A~YuK?R42PO}$qmG>cTp?^|~z3I|2r6*0n zZY%e0?~Z-#sb6(J{V<mzMtfs@Z_gcf{st? z%n!TM7}qp}ZkQLg>G0nNjvovvSZp%e!yj$+zr~Z^T)tM-es%lg^D|G)Y%R>r-0>%K zJ4YGEH%^%y)gLk!>iv9}BvX6xSzeH#zWf(kt+gLyf9>f1x#F}?ysgRNGuP%Xx%xS+ zL`RcD=-w?ck?qs-_g$*~^6lO^>k9pn9QTR3Kchan|9NWs_2h|Pq5o&O{f|krx%_|b zhkab0_Mhsl_N|)vGOV`czUqhFub$szWMO6e6CYFCeenIx>vtLJbeqJB@4wRc&iwNF ziP`6x<10U8$4_0P?dSaEl7sBk95wM8=JPSiulFppVQdJIe#7;Rz1>aFBvHEL=dDrNrg9mY&kDpgod5Pj-ukB>Z;5sF zi!3s|v+b?;-^pcP+~vi;q%+=M@>_ELiX+}O`5$it^R8w37I!sjojTWQrkjVRAD8Xf zATWL1)Avq>@vDB@{|?_?<>#ps`R3sI)&IU1oxkaooy!~dD!c#8#)O^r@Ad0qcTeTw zyZhmFS9j2|JIVfk-gDpoktcA{_I6|3&yznbXXF{#m~QK9inRIf@zo%V=cUcmgT`NL zmM&Dt*u3O|N~Q@{i!RgRNTZDDGFHnvzMWj`%$0FD?u&POT;>I9-(O2y}OuiR;g_>GO-eSKkZU zyWlFn=QXh`-{-k+7Ojolw3A~t*Y?#J*32=l_BpFsiCuj-Nv88rMtDr;yR?^iJHq?e zpYDv$Q|bO3e8qR>J%d%reT4@KL35%$ooWWkvnkm7t zNq+5e!MUAJa#EfzvXH;pnxW@buGx0lFt+n))`aYhvHWGqeX|Sic0J!_{ZV+w>0Ez`;McV#<}rDf2{LW)@wWzb<4-)GN6@&A>1Fb3d0YaJ9Z@AIrA2zwzLVIjq5( zQnEOfrJwD|nK6Cx&z%|^nXwhGcPBU}ZgbtT*Q2^?^Y;2!?Xyqic0{fEpHvmGPiFp# z$Hw**-n#EszGc2?H|eQtXyrO9{gn?zP4_O7(l7C!D!1~YajDf(m+1;6zO8wVFXtE~ zTOEASw|PUcSnJpHjQaME{^@^buitN#>}heDYr`G~ZLUow_32)LH+a)`KdmW`d9kkh zZt=R?dDCBpNxqx%H1B5TpJ(S8`u+=bJoBz`p61MX)n0e?`kb7fsTu2MHYxM@Zk@dE z@MjBI{qDobn|9W8*|z9hI_-Nv)OMAMpZ^Mm8DHxe9DXqzK3-mAqsH0YDELQy#^efy z;)zEO+)2?l;9tl1EZ2_l+3KGktrHl9*div(VGuj?`@o?eavM1AF^lDLGU|NWWm6!# z!D(#=f5TJ{!3{>5EMbc2jiDQPB66Ez-$&Y7*Bsion1jJukU1gUiDCDI?gQ(7@NT$0 zCGGp136bAjIG8OuTbTURWFAb3)??m&^zk=)9mVo1b0?R+7uv+JW3~?SJ4Lqxdynw! z=%2)J$A3)&yNCV*#~SX6ju=+CW8WLxJ7hm-sIpe{=&;D;?_{tE^q<6WAXtRa#+R3E zo}$=+%|BQ_$Sh^4nD>K0f5N>3-Dk@iroR&1Bww*Ll5daN{OvlIZ<~GSE6;smD}Q4d z|Jw)3^Q{)0|Fh+M>=W+zU3bFwJzVwoth6O-&FQ`S-d4xmy8r*_S^f{3{~oTlVEA$I zp8oUaKi>ag`u~0Pck=~2m;X&$CiI~EtNRzGe=YTl^>XKH|9$$SZSebRenUOO>v#5w z%Ny%Wtr`BW`~NWD!G8;RiKF`)|802Cut90UgK~xDsSPr9{9GFpH7c)1X>Q=uXy$YJ zd0#WpIG`m&B!^EcaTS*t>s1HegJKKB)~!qM4(LztIM|ncFF~SkoI!J+`GCv`kQY`7fZrZicIAwrC8`HMPrcnz#?htdcK1u_^E1 z`GZw|lK-;r_;!=cOlOBsj*G0ccnrJQ!iB!v@0e#_y!edud$aC~l+&;Kc0@a-M~mAq zY+Kl!+rCxy%ZA#6lM~o~-Prh`aD(vPH!&Y1ZnVxTlf9N_aN*r`+oJCcG1cNVjNcNc z)pEx%|2Dkzk2SxMSt2{{;OhqtZZpF_uvv6m^?Jm)v)ldmnFKLZfo~ z{KY%obyS=Dc{Za-zB&2l;X+n>rsJP~8#ewsXWty(U_Wn@OpJ-$6V|nNB0dQ2=+vBN z+iZHESp6TDjeH-wzQF6FO|K7nn|vxdc>96qvC6FvYClK`?~VJwSJC|Oo=%1MpMK7J zS{3|zeD^J7Wp7B0_#086_=7XV^jynfVFBZBZ4nPDJ48P#oSeaNiACJ$)`R^M^vuN_ z%~r07%r#uTwk~hE{jI0^)z|l(UOs`@uKa?!`aboA5)*>EYHphQP2o9lcCm=VKWi_( zC)WbC6t?#ZHQd?h#q#OE9=Tsj-Cv(y?jU>d*o((|3Nx6JgO;V7IT>Z4iF zSzE(4v&BZQZZ9=El|MPs%z90@yHCNDOl9k2uhwPSMc1yJn|ZNx^X^Q)?PuQhRoYfO z_s+}sk=1yM*Y~?G!&mk#N3OnHk(3epHTIRsmOKd=o7_BUCbxFK)3@6kXRuyAyp1*C z)A5(txBUg)t-t(u+x-J?-n-6i|Hdx%U*{Fmmi-%ctys~0K`go0GjRF>-J|bjEz)z2 z?mo=x8r!%{aQW=6U0k`wdfP=xd2fZ?c{k(nt!=_K?=)YrZP{C4`Ngtk$?d*|_ZI#w z;?GuWk8SZ-FH$OfD|FEwv*(GoOFvXEUa|W^p3vLFi{3d_yYwt|z1tqQ<5@%gJrc%W+JwR;MW+|!KPXUd#UGcPurtrXdn855J{H9b$yeEUzM)Tjfe zU%Oit{nd)!cVBnIfsl&1I-5@Pe809^yz3uZ=mo}Aoh$*&a~DkWV2m|j+0`lg<)DRx zqfG)&Pt(RDtZD~EX4I&%wqzQZTKYCi8q{vOpLIYcVs1*qOauOZ4y&3XH!xhAwPc&w z297lU8!`!;Ym86c-gdz5Mqdf*?Zb>W8cUe14=LX0EMd1kEO?{!3+wJfhBtb@F#kTx zYSF;MR{T&%#-pv_=LeoS9?u#lKQOeId4_HIf#3qIncU}^!yo+7wr~2t`KR*_=RY^L z#{Y*ncW}%)aP$NJbO+-dBL5z5dRVc^=Je;!yPM<{v^N{=FBfHwoO|`>=IjQy0^L7H zO9R-~wa4#ZJjG~!D7`>9gek9W{SMYu2iAVz-R@|*Lw4U|z7-62IO7k*Uf_SH=2pPZ z(@^axv4fxO;NK%Gat(SP6fQQlFJQOvaXO%Ufm=>>;RC}L%>Ba56->JhPIlp+*W~%Z zq?7sl0hS04rUbz?&FP-pA7pYGo_l(KI8?B&$WZ*U#q=Ug?P|$OB72xtKM1|VvxhDF zLFpx#J&dOx_+Dc9!@uo7^b*qw>9PaXOLQy5%MMmAk*$#bc7T0}?GJ%%2i=$OM(~6u zaL#0zcE~isO|AK90k@r6@Imzg{(t_~D~NDEnjO({POqlY(|}a%~FRBF**4eP-(KR|@Zgd)eRZ zy~rge=i*?Zpg1$&B11`us@gOemY~Mw6P^N>lUh!#PpEje%C!AqrI!4`4~s5~J?}1b z_?FliA@u3sr?3xI8-+r%84qXYZWexh?3Y9KPKzF`IDk=f0>*KX%@^KQGDH#xTKX4-b!Z8!4w zzwK@gxv9uzkU2|hd*Y=pp{v;^r`krznPbg2gmw6)E;Juh`f8s>ZEY~RKANmH-)19Mql2!(V zW!$=}^(8BiFQd1xq50opHHPL`2H{T$9n8<`fPuq;gC|5#PVdI9 z!kq5-V}G0*;;njr9`;x<`N7`(4~u4hs|x)i`Ihzmdlqe>XU`ZP|9w%)81i8M?EQzW zq9>)dEbWlKo+zrV!7=liv+C32Wp8-tCv$6K~i1CWUQTv8ufHts{O+8}s<3gtjwG5Za-%=^IOP zn^I9&u&AxCM5xok@`o8e3p6G(Pgz&HDvoj5gQm1M(@NexEHdxV$&J-X)m{ClC_H!v z=a=~&5tfFk_iS52SOnr`Ot;lE%vv%rz~x9glkcrOCqQg)4Pj_fAW=P@kY` zb9zO`+4(CcyL9w+XieTU{qx!a^R1`9eUi2MSD*1Q#Cwy3diZVOl|Re7-o1!_(HgPl z{iU}Nws(H;U%0=zk6E+J%q-XT+_t;B&MoorUiZZ0m)g17b>B|~s;}MP?DP9%fN$t0 z|8rLaL|-4AS{N5*l@O*Zqfn%()Mm?Xvgozhg`)0ri*L*caefxrq%ZmE?g{1I7xSdu z)a}lm*p@P}L-jzMR@8MRYjs)2yBixjSDlpfnrYbBc&gyc662;dB2PZgy2x7)$F(`h z@+7DFB!eQA(l0lY5BtqK<-(hwc=T@6jPz&Ei+fL79=CC=n{m?ZW9>te>?>PNJlYlS z7C&`IX6Dj0M-`XV7R|gcVQ)?HE4_yHvxZdxK2`-r4Sdu zSUl_9_k#U@e*8(QJY%Ulx#RLI%O`uze-;05X44*z7b#M|5|@4d6ywoxYyVG~C4$$q zHu?9eKQGOjaj2!{2G5?J;`}cTDOo>NHo5hOczv33+IwZEk=JzV(}^PNDjomTjA~~K zM&HTTFF#_P!=Mn=8Ya&&MAFy0qARPxi|$&~qvjxKq< zMDfoRh9f-uFB#6Vbx2oSkYJnVR>C*UgmF@vhfVRMWect>W|Ik%5LD7U9l0WK;Zh@E z?-Lrw_!XZ|yX)+5rqJWzmVm6Ut2>#qGS$2_gZ+d9r`}3*zrO17#EL%`zW$w=dFiB+ zZhuGr?8|%VRDQW9ZU10(OI|Pb=(kAI^Z!mKY6<>L{P%2)PH1N7&c}5k>SfWTwafkg zq&~ZJKFi7N^{ephcdP2cL!Tcup3Hpzm(!Vm&wGWusyL#x)mwwVh1&AGyL{!$Wcx`r zGW#sGxnm<@->i^-5%OyCzVN(vB}p&Du5T zZKnEzryf(XlUz)jcy-T6RV-k7zZ2MV?o7zb7d?6O<(YWm);_rAOTsWtn}{_yz7Gu7O%bF3MsdN0Wwk2?Ns zX_Ls0pB9yorw+?qOX%(_EPM0ScR%y|#_|j8o`1`4?whwhwDQjWJ4-&#V9)p7J@>w0 zlIDGl1M<5{CYjm#oVvYo#suXOZ3ep(-6c%E%XDSboj92eS{m{!=u~}@ZzAL;xPtA; zOeXKezgG7ATKMQ+#+9S09E_?zrs|&0nk`h7eN}+LFYtul9M3!lM%kW>EPfwHo>mU2 zqJSC4S$Ix4s4Q+@FIV_+64$B)_w}Um)u->3ethFn27?^Sg!PHirY99=y;-;-r*^LS zeX|93ca_L0c)VfwbmG(sr)`r=E8lzzkJQ>Ir=nma!ys>#{nA41m+QuNPSSt8)t)Hz zifmi)A$QhaaiRdvaNSQn3d|LOG*nv zUWlIlq`0#C=JpO&$(iL_|GO|6^qCpjva0V0x;b0KmsL5N_sjF$eXssYvr1@Py>f2J zv8X%Gq~ET+k?F1ES#X)>!tJP{BHL$8WosXDdFC9xJbQ)O7NHpnOSVj``I7f@Sq6Wc zR@>V0{dZH^=?ymvfp3wMWBr&(=jxo<5uQc!o}gb}ajCBbL6V z6RJXW(XXe3f8Bmuce`fQvR$jE-rl>&a?N(rMWGKFHi?>SPMnjslIj0(>-Tg0=J4KJ zH9zpxr!pbaN0$~d-1r_pA)u*QLNX>bq2E6z>wL7B!wL^4CqHZ3+x_N8d@@gXm1Y`f zEc>D0)X>1PuSo6bDT$8Q>)UL8dM7cwR4#9fn_jK`^bp6SYrV79wB)tRqni`p`7n8?uHA}Mla&(~+%HbDysUw`c1kDtI)fHm-jBrPGbFbU2MmTng-FW_C`LnOO{8Oejy|{n=m)CpWGM?M& zKQ|ea=~lOuMJ^I|sFYtOxJe@V)-|o#6;}^2SvN6soM8yNX>x!NUc`h&v50v2?A;r4n9{uonWr1>1Lg)&COnA^DtCSK2laY*t_Mb>b)ly z8ckkaaX;nLym-@@4&`M>WI_`cYkXNQvt)AXBAau+-PC>_PW&h7KmFq2q$LlXrr-L$ z#dopjkBmjk3+-A%N-nRx;XG}@CWFXBr%qila{Rht(wqo0oh_QPEFxCznZ0^rwt#u^ zN>|4tOe;fU>&k-Hzhvk&0i-*Hj+W_y0dtBiBExDmCq}v)$(N*>g)@3mz(+`FHQh z`%Jf<sG9NpHdSr5rz|mPVR#e(yWP;-`2v=)iWnxR9l*n-e?cGJRG5 z9Ocxi$7%n|V0-=9g2-uN;nSVhzFb&b8&Yw5YGH1GXq-9s(du}S2b0@dM0SSkZcyk8 zefrSfc#Uu9ru6@t!U_!p*0=q6psb>u@=32ZNb~67Z@sbB&o#dv+q%E}_iwv@drxlH8WO=0ftLbVM98VXd>`iBn{gCqa>dB?ddn# zmwN5g3nyDwM?e2j(wn|jX5*t5uU=j;(R9s=>rlO7wEg_M7hk8o?%T1*h@VgRx>U)h zQ%lQi)E=vI$39tf&}Y@o^)o`h_?@|Qo_pe^3%k00N?I~4Ot8s+%Y0n_eU3)PtDe~{ zS&t@fi7D75*2SrCI(ctv!>ps9ru@|V|Kr8N?IoWavXTNVSv3uBOKeQ!DJ%YUQ0lqy zMTg9&$yzCm$EVD>e7sxujvasP>>G(&@=PVI3$6bjp8EUp-z&BEZ6crUHGJtPU)g!B z;mNM<+rJNeO2{b^wwT=I6Y8;k-keYWY&tXl9bzhp((+noGClkJx@l`|mKQAF;d(BM zt*dJ19675CzUr$Ze>&}IezBTwLCiUZ(xxMOQ++sm$=`aC z`F7?UmGzg@*5!Q@?Yj5pkniqq;>`CZzTV|sU#&Fr#IE&mGsBaFPny2yYFYc%nORJ! z??Xz-zQj8_t|>)S?Ri(FS@Z0SEz4Hc*=wq_&U;Nh+}ygVZccjp-L+vhd#d~9C@!4A z!p*E>81Uyz?xl~?aku?rcO~C7-gLWU@!`2vn3v~X~G;D_3oGM3XG=Gb`b zD!4R%&i}>dj@EN~D%sy%_qKDp?A4i1WP~leoF$(x=DmG6KwGHA$1Y zCpaD69sHlSFYoB0Y;D$qOHN%#bv*Hd&EQjs*$TPnulff=qkB3p>HWQsFfae=#*4Wc zJv}>3ADVdT*=ZN^HB7EN@j4sYTNA3~-MHu2t$)S6%Y-vdi3jrBi_Z*S-uW*16I<-G zqw8%d{=C|k8h7N_F2A>DwlW#7NSbiP#7xM&?8sp;L1l+Z$%F1{>y!7*VS1zO@J*V* z?c1DNCXDlp6}n*WJbMQF$_0Wlu`_?W*}Je)GFj8eT0q9_;q+Gwa4ps{P$=yB_z{uK5^jIr-f$ z;{#KJpIe5`%*bTkGq+YXYFSC9!p7c9S64-q?>}=y=8O6L8@Zx$@*UJTI!@dU-RJu0 z=`3$n&YN>fH(f63Ty>e_f1=Bp`kk-8tTbWf_#wPif0~!f{(v14s{>EGGvVw|JM@?9|t}WgZ&_ix$z-kc%QJ68j6P&&kWZd2fl}mdp>j`!?||kJqn1ro5^(LZLR& zzsPn$%Y(RU4h_3rcFudD`MF#5!NLcD4hPpT+Pf(^9{;v+r_TKULXFQKWz<&|NM2r5 z9)97Mrm%_F*T>Hmr>wcXqrAD&Y^L*vmIx-@JV#~T1u20Rh1Z@R($YKdK(*$(kMi~~ z1tmqdw&@#dEWY2HTCsGR1GAB!d&cRdf6p1{%-F}ibe84X(2K>g&SxdORcpM?2mN|H zVOQ2O<9|+;W|dyNU-rzIU(yx({A$FaH1^-pyYyAEdYmwLokyqq#sT>3%gv9-BzV)Gtew%TUmsurXBhv}Wq{NxWp>nGW4@{jbIm$dxN zN|opR8WJu|ZW2F&1)f7#G_exsPg50#FP zla0^6Os$w5W_RDnxg$o~;;i3CC&8@~a;vVyZrgJ5nk%p1sTUVl7H+HeIdEbAe`!h0 z-mKe94qH#3yV(9A@3Fw^AE^g>{j<+j8gII89Lk_}*DfLDpt{X*4L zIX_*s&rxI0hUYRp%#gQtvsk)Oi`SWi4`nF(#!PcAYWtUmMUd;Q$`NB)Q z@$h`>&HK(Mx;Ng6sjw5+RZ-px0EbEcs-Hni9Hf%%s|&kL)r#=g4W zI4fw2iOc0TnJpcwTerSVGkk1!@y0}Lw*{`e6*4zE&dzkRGB0z@Onn}&#rtl?nHel| zA4T@rY%0u6iL{*hY3I^2OS}Uw=cGmpC+TrGK4 z(VSgIUtGZS8-vus(5)v+L_4flQdROFZxYxM<(YA;Nz-m2bLYv0|5qq(vzdE1?&Xd- zcKyMhwk?<+Ybo&Q)t?!c_6jL{o6D7?|Euo%GLDy9U%h(2(Yn*mD=sH3OM$(%T31T{ zaDQ!v%j~D8PDNHr)SpN7DGuIU&vGQ+ z>hdecmh8h}p=~Bf?!}+`+*KpEr4IE=hqk_Wudv$g^yVMdrrX4xZU5EUGmXvtQQ3+a zEDsgy9vya%?EiVEG&rWM>F5dXXt@L5yH*BGa#jBuHP2k@zQHb2)$eU#26vymtbO-F zEydvDCn@uWceUqd_V3y@b7IBe6}pnD8ZV>vu2h$c>zU2Up<8(JPWB45s4lAoe{Gbn zCMedg`rIy|Q_X8!*SIS9jC6Ccma{9T_wR$!jV!L}lO|1=nh|QD!~C_~oY6vW+u>gd z&tLe?xH^q>R*Ke!UAhaT+zyv+QdDU6jm-PJuHkW1Tgy|{^0K`vdlnsQTf{X(c}0>y zRBWG);&mn2IgcLg_?+k{e_bh7BQ|{J4X^O9)0wGH|GuoTJjUc~mt8a?|H|K1TTPB= z=i=`Ri-k1iuiU<4U486{MI}bxEkvU$>ns%R`@GTfUw!9Pn|q1myWcwMzQ#+ z;R>&aPE~O}Cc{9d$`-4V(`O1Na!%YfwaBVFgw16CiSJyjNmU-KFPHJ~O<5$eJ10%* zVgv8T(&OG$T zRjQlp-$kMKI+xqZd~utZY&dg<)S`uJ`YQC8PFvjcDdvBCV6IeR$rBC#iyDhx^l!e? z9s8?W`C*97V-;UjP9|;?2 zf>2%UtC^GEuV`03@$Z29hZq@krCxJ>CAOddy;}_V|9UHn{GHV&vn}wQc7EdCRGafx zUGD9Ab^ZH`n6JHgjYe6W=95F(s(50ybFKW?uDM9$o{nX~vffL}TN-U!R8y`^(2eN0 zGP(7L7GIPHw|CzckN3Y^`F^#$SjHW%pd!8P-||gG`MmoW7#mMAaLt&q)>gM?y#>qu zUv~0RhPv^|e|J3!U)mLU>f)X7$z3tiS`DuXPBkle5uq*~zxL%CL8%GVPc9Z~zdK&k zeaPti`QAP^p1QD?Hs|L}S{c*1@^9T56E9!w$>-a*hTeU$@S)&}X!ql`@l&2OTi}Vt$}LKb*3#l#<%-*k)Nsb-&dVC_>a!*JQlrgQkF#L zLDAA~k2OK7pP$(Hz2z#md&qg;=-Q~3r6wLB7x&hGymNcXkC|aO+LpJP?67hNb^t2|pjBBbWU*>!odYt#3pF){DmrSo4~)XcR# zU##$>Vr1^+x1ZbpS0q}exa2v9XJ6#L|L)74o2t9?MfMj=f7)HP_-;|gBI{SFJeziS zb=#M};`(2_^*{f_N*~!J%VxWpJn`|%xVP}swF;>q|6c8N#~Yg@xo*cUx~+D4){74X zvR9U^%5rJqXDj|R=itBIZj%GTTl|k-S5cmRtoL2!VTC)%SCjJl{7vV}nVgAVcKDZE zxk>e*A9DnC*Bh?XES&LBIN!7P_1%4Z&;MOWUGd>)rnHfM*TMq{6I4o`<$n1(Q=xIa ztnaR}63t(`a%ER?8|bxN-)(to?};@tp8EusS1bIy|E)V|?KerCTW=1#v2Unv3f4I3 z>%Olq0_rL)!-zIMC!&+uY_VBGRMZyzfy7N1}7VBaIRFZbh~7ynG@@xGdV@r3{R z%s+14)*1f$}F4@>F->RsJl^l@h|< zt6xvQ^;KcDu-gl<5-Bz1m1}*yJ(rgCXKX9Id@uRz1g4}_`)4g*?b7P7>WkS&QSPU? zPbXh#7c?yW5xtmabvgUv^PeB^Pm^W2XEgIoO8?AMul}qF+|w^Cth?$q`E~5g2-%E3 zxxFuUuaP#L;e55Dc&VUl|GJ+ob7l+vnEh0ueP8;`(;1=fq9daDzuxNYtBWo_(LKFo zUD>7kf*Ik9i?km{PBNBZ-+F(aM1;onh`o$IcGZ+m4Pscgc&*jNzSp<+3NFlEto6`a zAauFzgx5`hS`861xxQG|Z+zm?pDz8B*_U(S&Z~>WJ{^i;us1P_K9;y^k;&g_hu_TY zyWadyY3UN-7gzN=cWd8!_gCG!Y^P_kwd}fa zWnX+-AD-Mpg?=+bUBa8m%mqW3-JivH=BZwqUDE-Y7_x#Xz(HRko)kKL>8 zofVp`{YoLkrB`R2Lwm`}(ns@pZMH~X(ksxkSu(%#O-YpH{{Ggj{WZQPqgHza8Y-Nh zALQLouW`vC+NA$=x~jy%#?Uv9vL^OfOzd;`VX#d4icp6AH%0k>lP77i8Qgoap)O!~ zvC%^y*lB5YeQZLkF&&|rqy%i|B#bcHRN6<(Yp1sh)pAy@gGWEg+Q#>#D#_<-C_l2`_1NWb>}=i7?qAMVCfm-J zDqpd6;?cu8Yktl$ckb7pyi05K#Gu!nuXs~)m9otSmXGdbrVPX z%Ivc;Hyj=RYR%lJJUeOOjF7qPZw~#va^LmYWY%fD$9C0mTb@o0)(}4yy}5F4(v9`vFv|-8yox4B{ytWt@75ry+8Bp;l3_-A2k!_4`3wc@1rE?oaV zCz^VH(w%Oz=kxxrw$)27%zPLnD)Y%dXXlA)y)}E{Yt28XU@$zbb7O^Sh$#fK>JGJpp5c}?;>07t3P)&3z}Co z|J|9V3w+%7idI#nA2VC|!`99>-ud*mn5C}zrbWKZ$qRQlu0LY@n1AY`DeEM7cR$$W zQ{~=Z7HQDk{+(x44I|sM{rwxRm^t_mhW(PET9h;rr9^_+PDB!KJ!F7qUl!JcH_V^FaCq&+dr?7r(T^JbuQf$Qr?>}NDyDbU=e8m?;v{$>n zap*hNG})IYx@rO2H z=Dj&Hb82Jp8<$^mnLgCG*w$<=*e=q(mTR(&6W3P;ZJU(=*YzK0J(Rr7+Yxfwyv%op z?3dJu&1{PfWwJaz<=iEIy*ft0O>Xn*d8YGXeFWZFpVwc1LrR?QXQ7H!=|S075ziG0 zEV<9U(q#Se;<}9P-Nv`Sr#bCz{M{4L@+9*UH?yCM*45_)AGOP_xNWvx#IAp*<>*T0 z9&sCslD9`RKBc?fZP;^j^Y@%7Vr!{oHr^8J&kLRoCA`}!Ls8?$a5-T1WZTSc|$ zv%LP_57hhn4rJZ^ZDDX`;fE==0)9j<5}W#jtx!Rlx9M~L&I#5wRj=B2GrnQjwS3Oo zxvpY9j{Mn<&n_{pI2kRbzQIepGx>x%v&i#R|JV4P+_qP4;>1HS-m`M@O^<0XXBg)1 z(mHzHEb`B+>hx#6Yj>&J9PSG%oV&m2>Q((!^KY36muMG0IQB-_yftjs#>)-MYlStd zSYAsCntaRrWy!&<+}~Pjm~8Cakbikw=6?hA#dAuM%8I=nbWBi@b>$aIp5A&&F3@{r zVMi}>V4Kv9!vBVd zo_;)f!N@A2RCE15*3@SQ58b}JYNuZf{~WsyF{@U!m9Wp)wsw}2(>s;Ma1V#qF)M1B zW`tLKOgvt6qC~+5Iw#8@px&9J?r`O+B&6ar| z8MF08rSbNAHk}N%yUuaP7vDVdV&lS%s~&4ry__v{cGuB0Z+@q&h{#vE_1622PJfkJ zu}E`~c%p#ktC>I4d-ETzKJimV^K*Cag_$yJ2XhTyDv8fdvRuCR=Dx@25`52ob<}>i zts&g{LT$>b%p*?bP6BsDTbzS7c$>8^pLTSn+l$1nM;Clw9l7DdAN_Wl{%NWFx3+8& zy2P`^Cuj39ef|`v912cSJs~1R+#NtuJpA|^jqy-?j>#^`4MaMqt@M6 z-q>_({#It^_ZsuctM0fvZYg}+E7kBNK+yadkK&GVxz2eLTYPtkB{{Os7iCx2xNq&f zM=XjD`}z+@Ep<<4oWW&JcwC8k4?Bd>)eJxb|w-Pghg-XXR<25~`V4qN4B-nn1Qm2}z4{_bMWMG|~5 z;d2d3KTkfhb7$$g#j9hg*EoG&#cS#LFCsZ2ROSGy_TSaJWW|(I8?J=3@Ja2Nw~dLN z$x1zaby4=3K;LUeJ{O$Lo&I+s{~uA4Mwhb|42#2FXV2dLD!P$nw#)}gHZk-4NXW;*j#L4;^K43-2+TNn~uVj1bxAV9viJ zXZH5x0h&|qdu|Z(NWNTUyZEwSsGXCtzvHnUn;*Y&)O=Ir zlC$2HW*x~YUVKTum;d!F=|exI94EfvS<&mP-1gJfkLg2ZO|IL4a}`|gSl;mPTrO^6 z6I^|=X_W#~Vbe+}-CJw*%>T~X%^YFjnh+wSeQa*8X=S+-8L_`>Qi;b}okUu3a-iUjj<<5x?sKfhDA^6gjg_?f0Q|EtO-N!{P9 zd~%cEzB!kk9yoI4&#Q~37kN*IMo*|baV+V$rE|1y`E%g>2(({#YMTUAuc<&->MdnVSBkA7nmz#V;4C zPk*VR@FM2uM7udm*sRt?9hRQ*myGZU*ezP{6!K!`7rLll{rGmp7WiB{qcK za7;KmN%+NtBXd$dr8;lfz|L&7S9IEyA3;(#|Ez2I5YAz$|6)cSlY&*E$J1tcbz#0m z42*k|xRSoz>3RBM@lLME0;ks+4!{V%7i=k`q0|IuS%)*{7mKwn0F)(26=lW&%C zs@R=rmf|T86bjdr?bq2G@I?P#&a{%lcTOMH|Et!^=bHTDMEgc5`_8_`MCVP*A78P% zWN~4^1gnj5J9ioAWkhw99y9ekwW|3^bbVGtU_`B*uFIZfU*A?T3b~XW$iEe)buCL} z`t|d7+B`i|bJM@nvdf$2Ell~oAf0FO=0j@PJh}VCX7z~kv86-`u^(5C>rLCWdtQV^ zbo%jYty^Cft`j)z7bcVX%EUJ0_-@`yIf6Gnh4U`G+!*!BVZCkmy)5^4AB_4}vfM0K zxllVzrtJ2A&L0Xj-IwLQ9TzpW`295LiRijgnJe=IQgSjw8;?9Kz4oi1H0id5T-U!B@4E}SyF8`Qz@_ENKvMV0W zE7Vn$4`IKaSm=3hx%2&qPBpi0hq|OX&xPI;S(7whYw|nm6LC*|@I_TW5-;<4b-MmR z|A{%0TYBDXI<$$J=_Izeq8tTb1L@ePE}9Qv;L4W1!`b@2-9JaIM$ms*=ir zOpg9#YxbVmVrt^LM8W&29l!K-t79um^{@Up^QpuA*ZR8_-)<=Hnq(t9$GPxEYyMlg z)$^;R;@WGygC>XM{&u-Md*5oyD8@N^S0yN|3y&A5IwmR1ZW_?Chp4*v-39-&Iv|V)M=| zuXpYY`OFtSe~N?0-q{~|cE74Q$Jgs7e9W}Z;_eMGwHF)eW1864IOl!;G>@eEJ<|$Xa&~6v>8Z81j`l=)Th2NY!KK`1#%sXn z`kvvi_Rf2k=3V`IX`RS^CY@XLthYKI9=`bF;J(H$N5fr@y()3!*?jllR=o`j>hZtz zcinNGw@-|F*;(b5j+eZ`r%WF)I(PC5ESvm7`lIINEjL>@xc0G1**}(_dBHMS&p=}S z!B=Jm`dBtYF z#@S05p>xewbSz_7%vy5bTZ7dGv-sajw@uiP`|;*V>8QSU*LCZU%t%%6-jZD6RpYav zz$|3Otj~-;J!LK&JF641)oR1eM`^$G%-?-%I6lQ}rO!22HHA#>7Af(t-~X?!@4NTA z{}|sh)h$gsC&|rXo6CP%W=YfCyMOv$*B|)*bA5V;RYCebvBf8qjs@QpH#;s=dhnKx zQ|q<9OSY-L=UHk!u6brIla2amGHKDCfTxXoS z)n32$mO)p}|BY&?cSD0Zj|;0FpEq&J=2h<;LPDo$?7bh(8dW5vePE8`l6iN|+$<4U zxG^ur!+obr^^%*N_rJ}}l~V3)HQ432-*%nxuhh+^mzPFAVY1FR>?i+}U(hAj)5)c4vh`q+Hj{;YS<&w{jC zA%Q%Fb4w1LugD6M(mt@r*`aEsNZ9kMOQ(6v4$X*8>Yo&L;Hl*-`7JXg9zXi{`&sj4 zspCF{S8PsySh&?}_GGoXV(*k&*IyR5c1>n0SSC>AJ=>|mZt;`eIe}5?Qx3h2*zj57 z$NstBMAvp#%-+4@`<-*eOLbpvmRf7p@N##>W!JhjVat3Ur}O#BGA%6L;`VmuJk!7C zdsppUQ@ViPW>55c*VjQMb!UG3Pm`}*wtHRiLjStI#~Cy#&2j~-KfYg3zoz1?>)N>m z5wh=8w}n^#-F*N2{&QX6-4s z9@1U9$n@!)dpCrxEj=>9`G0p?shZWj9{vQgkI8-KD%xjmPiA`javn>;x9Kf*OCQ`- z-pLlWWy{@(H)?b;Ul=$Ee{3mTc0EfV-t0*nzh9Z^{qr0L4|+LR9thj{*v5J7v4clFAiZTms}PrhZ&~gGoxnSwld`_IXEfl7XIM^m?PS z(>!DEcn6xvy}dTa)->u;wy1`B)(zVqa}-!5*9A4*Gz&a8@r!q*PI>UepwE|Ti!1Dw zTsN$Y+36R4GJtoli_-k3JRIpi9}9&l>E@?PKSywxCwGBY@5;$skhP7Y0Di$b=lN>9`9Lf z5;L0w2#H3IkPtX{1Y5@Jtg~ym2qabgOO)phQ$IS zO)Hy};D(o(O4irNXqNkb@^5`HskzM{$g%hZ z*Q85vom^aNs~MaPTYNU2^>MLy^i9}q+e*_E@uGU)h1*R$L|=xyo-$ju*?slY2a#|3 zPCax^x~jTrd)T);=A~^{YY#{nRkVG6x-21=ze>d|@AJosYKg7?Z~d#v))jPqy{xQ2 zI##iIf?tZP$;`hIUypd*m?!l;!S=tP*57xAQS(`J9t57Wzxyez+JwzZaKDW8FP+cg zpZ?YYw z2aC;?@fmzIU#fR!kF%J{?6T^4O%!yz*6XetG#;vQuAGZo6^n;*3GkNwX{%9QQeUc_;-6*K>e)f#Rrc5 zw(il}p>k2!ug3pq;;jB2roYX`@7~LP@i#sYcwhLi@zkSw>uyiDZMpk?&rSE|X**}S zE8AX;uzyq)FzKk?VyXJQ|D?Qr8q{Y^SgGpjrT0(pm!Haid&YO-ll2Yy56)TalcCLi zuk5=vXHxjHwKj=zZx@9tv+!yUK#LDuQhPZz8>)%tDkA4i?8U)QH^b+U_cZ(hW7c%fFty(nokMC_$y85>+mb+zB^1sQkGHc>(LgY90Uhb3mmbx)2XNS;Uh7F1rGd8Pi zR+YM_c`4_lruBC<{~6OQkN;NBt;l!s{87rfsi$VH&g>s0Uuu>rqz3e9wl7*@b>Xg% z^w;aj4$cSkLRha#zZRYI%q_mkG0^dPxn^^0L9XgVpR|m{yVz6MW7l1>FI{@&iXq?r zJjLlxHmWY4VVrQTL@n8hecr~do107Z(l1S)zeX<2_Lso@tJ?&x3;$HQsP@k=A<|>^ zaT{JG{o5Ax?Q-iDPl~zDSXwKX*n8r@@nf;g5kXyh8}I$UIOl9f_4J_dPPw(KH_dX{ zH~Πywlj)~j=DEuKF}xxI2>fYel$zZW*w=oUFnetB>DqZPj|X|3N7{Bq@)OLmj31sXq5qioe@VO+A#{^?sp7a8U}+k=Khm;?^9zz;$86;=hc+oqtwe zFBKII^8e6MdbmYTBv0I8-kS3w_G_cdJ3ag-9Im=HUClh`>+6Y0r=7gq47N6^m3@1! zA+kPCMr=-!`ISWH6;t?Mt>pe+bY+slB4;z{!PyPtB%2Jg)bN<>vM&VsL zijz}>V4KOdxk4d;9G|lXu&-sVCSMT;zPOiT$a66?*`t`bw3zmo0gl68^Cpyo= zR?qTEtDR_!U+`@yh(tc_KC=lEn6=FOd= zyZ6-gjc+GL-PZV0Yjo9*bu!JvNQJ7g@5ha8eJc?;(S$y8~48FwvlYn-)Cnw zHeKP-Yks;yW$7H3(uA$eQ+98hs(*jN$^I*wBmZyEVSGQ^v%CE5X|?$QaxooGX8r5c zmONtrSF-C+-Fq7`m!5NX_O*L;_;fi4d%0Ad=bgM)#I_#NqEzhPN)i2wwho&aL&weig5& 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%0A}qZhlcf*otJ#V!-rc$}&h@v< zpS~u`t(@;~n(EtntMSfW6Qx&ge(S_CQU8*ePTB5mHfqbe-*Re)Rx798kNNj$wRVKj z6ya)*(#LaJ^1LNH_n(-%H$b3CkgdzGuqkEZ$`|}*47j;(+&#TD`2WpTo9xX=Pd;vNvQj&?>E0jN*Y3$_KUcBr In##Zc03eH|X#fBK literal 81320 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

;h!HL`TlXw`&F}- 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 diff --git a/src/librustdoc/html/static/fonts/SourceSerif4-It.ttf.woff2 b/src/librustdoc/html/static/fonts/SourceSerif4-It.ttf.woff2 index 1cbc021a3aa22e1469542d531e9115fb78d497ec..2ae08a7bedfed08cdfea76039c1bb1fa1d6cdf67 100644 GIT binary patch literal 59716 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∨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 z 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 diff --git a/src/librustdoc/html/static/fonts/SourceSerif4-LICENSE.md b/src/librustdoc/html/static/fonts/SourceSerif4-LICENSE.md index 68ea1892406c..5871e1f3d1b3 100644 --- a/src/librustdoc/html/static/fonts/SourceSerif4-LICENSE.md +++ b/src/librustdoc/html/static/fonts/SourceSerif4-LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. +Copyright 2014 - 2023 Adobe (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. This Font Software is licensed under the SIL Open Font License, Version 1.1. diff --git a/src/librustdoc/html/static/fonts/SourceSerif4-Regular.ttf.woff2 b/src/librustdoc/html/static/fonts/SourceSerif4-Regular.ttf.woff2 index 2db73fe2b49e8cfcaaf1d5311a610e730b8ed502..0263fc304226d90e224e53053855ad138303b70b 100644 GIT binary patch literal 76260 zcmXT-cQayOWME)m)O^Cg$H2hA!t{WFQL~+ah0&b>3y^e^YUPq{y;vjjN{uan;bH<; z`!bEz-;CVTiWnHpm{ge8Ca@^5PIh5`Ul)CD!Di8a!6o;sFO)kq#5kA*rNK!g@SWfNeZgX0Mnxm*_tQLU+IC;PQM~?c z?cxg+)9$P{SK(h{dQJSy#NtD|orVi;M;$))M9!Phzs>eq(z2zQ2inRq|H;HTEzt3m zUzOXcy#mHwoe*)se^IJ6Iw_*JnYyzUma(Tzxf*@z z;w-ba&W^;1O=@ZXPcKiLl{B!+HPtWQiOW6a{8$;LU zU1{GgeRh|6@B65~yXSFFeY<+ikK;0RwvY9GiP=tCV?Xh7{%m8-EoDEZ#(mT2d*HW7 z*dj9h`0B{$-tuWJo!4d`Tl2Hyo{)eO=ks4Rhu>shdh<$N?Dh9uItQORtd{-m7rDs( z+zO#x%P)&q?24>uZC)`yYiY};qv01Z$=NqdG+=#cY5hNJKUw{O&b5ID;E~|=DxL9Bz*m=#`;e)>lBr4 zcy8fHz95v`Jg-^I{e+>z0l`Nd zB|Rc5c_nm(pP%48@1L%pc}vCqUX_;T!F{ICmv6 zZM&hNyWfNATesIY-7%ei<7)qpcQsdRoTMgXYzS->D4QFlzjZ0FeW|lJk^%Zrq zZC!a-SRB1nUVRpI+}NeZX~<<*yt4S=syVmwZf-w!``xzJu5s%gRTY*qd%tIpkN04= zIB2##rGDABSC6l@PxjyUD?{Ga?%J$H^Gp6NF@AY^N%w0L!6~Nck;CVvyI0I=;rzk>{m-_!{G88cIW)9Ra}iVdrq>ZHc=0!f=G`PoulcO09#M1lMbGo~JUqMDz?YA}JBksPzt&U-nz_*O`k+U6}SqOm&^Ucy!R>>Y3H^ z=NK0rJ6gp0b^C442M-Qxz2KzWu*&Lr_U{Irj*pKESG|9?Z;Ac}o!gt{S~&1I1}8}< zl*%fJPGF0O6Ii}FqCtAQvtaTXTd(xs!)u(yyyFzBCgsdh>1=)W@Bd}rl^cpD?|1wy z!WAR%B4Kvr?RkqCxkAscT*BDpmJw{t|7Dr_zq)s(KOP;=*qs0DNXq}2iuX=j@e;~z zo#5FkG{vFL{>!IH@th6P-qY3`xL;oB0{l)Kh=2t(gZ7l7rP+G0# z+jHVX&y>=;DYE*F6HmApt?+X_u4m79mTk@5cYz!&A{nk1gp8_Q`PY=!C!O?JpcJ9w ze9(+zMSVTX{#RdoCwTNbFXpThWovbkXkpoUZ1Fx9f49!NzR%9iz8rq5Uh>54vxWf; zJi68{Z`}n{LZ!ts7)o{uCg1E0XXf~K{LY2xCntZ|xlUhs;hTx3lRd3}_4#Fr2`_xb zbJ6#Ho#5Wjis8JAQ%-6%KV6huRZ*a+J3VB3(W8c`ejnZ{%U7~h6W|Qxf!-~4WZRXd%J>&lF{q^?u zBW#vDhg&@O5?WH8v~{h$v42a^o!9zbOX7pCwz!@&@h_SBRgNP zYj&8ZT3K$=S<}8r3qzu2uh_f7pLe6r8lBTKwcbWGrOcVJceQYtm!Hqi<#iv*zwg;D zpZvj{JL|$Cv4j7gH7zaCj5bdDZ5C?0?OL)bMfd;z{j=}i zTM&Hi*|E$C7hQDDvuQ4kTsF1%Tw8SyheW0JzLkGBJ$wHtdaVSv(vs`p+FsQq4QJfd z&dHr<3G!!RY~a#pSYNj*N9a~<*Wo0UQ&X(ulq<{5U+OYE@c+O5@3hy~=9w>Cm2Ozx z6|gzLkn8)w%{He(L&dw-)z|q~wY<{|@)I)`JMMIR|15z;QoT~{UdI$R2WHGUR=MV& zcE_UG*Ld~R8udB8MoM}8{hxK~HXp}Dk*yQ$+b$`J&OLJ1RMtu7md~EwdhZy-74}&? z$!d3g%OCkm^E9JAQ!`_`h`qVW+GM`1{_}&b?<~2LmdA^Q`)9;$o_w+M&&(^k^7;L_3^-;TcHqnU=bc{qSJl$v zm~F3BSLfZCC%^gZ-+lN<@5e3GmRJAp_X_=5FWRAXfQv;jp;z^?u8Mo(_RvW@lNPWm zcJpcO2o_?xRe8)|d53N1*)so<4q1n zl48f1|3t04d-A`2h43xyja(;x>~xVZ*yN;pM&|6l4=kM_jj^wz6r8~EC4Sb%_s# zvqC{lQ=NKTCU@WKul%*;yYiy)wDY!``3&B#sXWBbx~ifmdy#IZnpBGh=PPc(ihuR1 zE=7c|_rA-gl@*}QxNFUagGw`k`BVSu&0oM;as6RgN4>cS!ybmK?_;xW1m-LiWpa9v zF;Q{uPh;zor#|f~pPfB7?AnB+CEBtRoc}!de?N8en-t^ovUhmLA3qx^}ty! zC#E)KeVqR{?0q9Q&kErUK9O72KhA!5`s1v5Prsihlj9G-KNtxge>`sh5I0Ykw@~_rHC+esA!%Gj-LwTQ0D0 zDk(h@3F=_sEJ}~8pRIT+=69Hj3(w0(mpbNnJzTQZrR%w5i$I#CPRZ#yzr_J8k%iY> zdS0nC7nhqe^C`9%JaOizQ|>Wv;!tieaJ}5IOfc>5{R?~Y57ZZzE!U2{$ESKj)zPKt z#9=<8Sle5>Ufqr7tmw5biW@Nd*xMH5Bl17ujt!#gf ziB5*sBAn*g9IBG$SUyKdL_=ZE$F_h)Q##yCIwCq)mG};H?hx?y^fedeTr|-`|D+4s z3on(c8A{4$RE+|Iluj=Yj$CLn(dK>7ljnO<63^Q&udiq0d(y2hVK--@vZQfa;o})E zC!hEhDdJ?^Rm$|(V3o}A=*<=F9c&?cjvr+|{llkY{goGsjwc8mF$(*o(7(a(=rgWr z=>UEUo5%M>kNeN559HEhYzmX&=qqXvSjD%H!?wlhkU-SLwhQyLTKY;9OHw%&npd;_ z-KiyUBKV*{c*(@b=#p! z3!0~ItDVRpZ`VC{rC$828QXs)Y5n{Db?#ZE5RC(S=Vddus_zzS++{mmb%%%6uiX7S z{F+DmRXP;bwxq3?=Ra$4h~3rCbGZUGug?~LQLv;|@Bm3YW_d#Odov;-7}@Pg=y-l12rs0!9V{N|B5?w!ZoMiz>*WevAd49b!f83F&*&; zUJ!Nq=HJ}q62`d~ciC>S>`ywh^+$hjVA7Hkla~8TRf}zl`tv&}%g^CJlV7%Qf7QQC z=ftM|w$4R)s~wgvNdCQTZM0c_)So3cOj`SA2d;A4>{lh3GUan@?mlZxhgR*xrIFiH z{(0>_J}cWWbEmLWeb&3{H!ghGJEyy@Q2*r8eP^bBeOj z7i@3*t5+_@ufI;v@bI(n@Y8Fzf3AEY!n3;nW8KP|KCZgK+I=ixw-ub%DLr*xm|Ljd zyY))k@oRcZ-j}|7f8AUDFOQK@^s%(S3jI@mR((qIc&E0LbMx8FM~ePD*mg8ZyMO!5 zq}dj~WwfqzTGdXME4y?rQ~b>B!qrEY6^eYf`EoxXt#1FkuJvWU$$j=Gr(FL1`AhoT zuX*qP-T9VrUTlNFcQI47&h$&dI`8aMf8O%RIw+uhVrAu?)YVVEzPh%hKRf>W2jM%X zlYc*BQo4Sff#u5k+hO;<-Mi)5d|S!K`nts8k8|p5Uh^H_<)PXhEbAD4)nloPQrL4_ z^Y|0NAy1kYg)V+|y;sOx@3!KENlC_H>k>P6EqgjU%K2V`yyky;KE@3cjo&tJ}fI0ZF?rLB1|Lv zXW?a8zOOTv*vaJi+<38+TXc2TN!FlE%Wq27ySj?MQ%sxqPk3u%SJctPe+&O5aCvpv z8f`J$I_;Rd!E&$rVlOuQywD)L%;I66zA48NyRVt6rha2taOP7-jo8&2LAU43)+%uM zsIt}asKw`P`}R~PSDeqESKV89*w){!dwtCZ--VO(x;931$Qp=UoV?USbcUJpvpt7| zte$+4HqE^@No3}Pu7r@!WqzB_TYZ%>Xv?^_sWc`@hp#N);?W=TeO&jXuD+9+x@yfa z`-z^ue5I#CHm*33=Tm;H_}u;zL9bukuGwY2f2rBKPfBL{zj{Z1`}FMUUe^k{#!voA zymDI-rJTyIxSPz zX@+Nh?QvE0{U5GYCmrdaH$8;C==t{CiKgmz-B=5=R=-JDQ@5~l<*yzmvr8$>&#Y6q zmaLoj$;znk<@q@|Yd9{*i9EivWKQj6$#lN6D_zf*Qzs^` zcUY)&)N6{?12(J zHJPhFZS`5kFddIjjRuJZ#e;oZp)0?MsLY?z)i$lKF>u1hj~?06FD?w8o)>9b^ogsh z>g!AMgbNcAmEC$5p4N+7q}9Q_UDZ$b*nuktE}!2de3(Z7yEM0a^>TA4~ zsnKPQ$Pz3ebXj}FrDbcksaF2(+w!lBch(!t=TG7s{q`{(l=hT+r8eDlomHJs zts9fZ_9qi`o$r5@UZfsnW+n7!>GPe(JI6 z`ec!h`=-lt_Fl+7kvLmx&DH)#G7}y&MPEu^amY|@X5qh9ovgy_z|7=T%fI+IHodO@ z^z`M1xy^o`)AMG1(ElUBeo{idzon~DY0c6%S6*G3Tpe}(_wws6i+{~^Oh0n7pl>ek zi}=}sp`CNv_cr{!+v##KKy!u96z;5+TMJ)akk}%1i^KN7$3?=6gBKYu4&C8*C-jc? zo%zOgES5FQ91e;+NepZe8Exk;a8?&YE~-)9tLoC`F+*pf{EfoZ(aa)J=_L{3R}wo?OJ;pk{5!)WZLV0atufmP_7;to z>`NlAopnh+YE{)`^Z6yiRYuo|25v!nN|+A6nDJ5Ywa|GR;RR+3G$!4Av4ic7gT3dk zn!BavKld;Ec|PEjnR3{B&Brs@nWs!W#ukva!Nqb_dBLxTt{0-)%H`cOd#5-WEZw~( z=QeLSmwW%#1{amEOP~F|XFGL?sisth+?aOp@3f63hWR;_ujhWZ`||Pe0F>z*pl++D))OXt=(XSaH$UzYA0 zl9Nk62w?P5`-^q9afiG=9Pw*z1p6Y^;~O5Y^*?!g8;4=|wbm^E zwTD$KG$tOLdZ}!x@}bn|X&2Ub)YR`^zN;bO)SBSVpx(<0OO9TMxZ+$Q!{c_TzkR`^ zOF~n=g&IxeIW0C%!|Zv5NW#7!7ln3C*~_2h?s{BC_PTXq&9}Nu434KhtxPmhOR?G8 zS)REhf~$VIgiq{BDaXFXLZ3a7j#D%$mT?9IIHsm%nOvKAacjbUwF$~4@w3*H`CmO? z#MA!g{gS1I2i8s&Ia=~=XY;ogp;l*tjCZx?ZarKe!q&N~cly^4e~(3pw;x+nS$D(h zYtc@111{fPoZV}*UEOc4TI;#k?RdoT)Mo-4PhY>`(pA|oZQ?G~b)uz?kv^w3GN&!u z?XCLd;bHyPi}G?VzkT^ka+)0bgTSV`f(MZ|lHT+(+|yVeyG<|fuIDlLWziF)-5y5F zWOyspk}YMh_RF({M!rtMlbMct$-nL?t9bI@&4UOvUP)noPD_!Wm)}~ilCt9$3{ah} zY9rHll<(QK?LKRS1uWELHqHwVygPC0t%p|Wm$qA7Yt~Cyo)BoVcw^E;4&xhPMpC)Y zcL~ZeHsn$nDRKY&-uar}n$5MbGOy2FY0gb4W(+XYh}@Jt!TgqG z(0+ZPQudY0OFv$2e9G_jx~$N)F;gb+Tu0l&x$wlTOaBBHdzMrv9*^Wa$#bCoOf}16M%O2f z?;h(l*9r%gH@x|s=X}(4@&D3EK`VA2={U}}z&K>TR+Hk64LOOOa{Cr-`^c}bYFGOz z_rJd)B!5-K)$FSI=6(EexNGC_V+yh_uRWBt>E^5U$gRE0(h-&1yn7ONbM_x#;k&WF@yWcQ?7NEP49Sd#nd(T{H*q+&mKT%Qr7V(U{l zy=qO*alVp&bIOJ1s@dqid}(Fve11Q}qob$ejHYZ;Q#{eWByQ@=$nS5r{hn-awQ8qh zYJ2Uj>^<*Z+Hx4IeSWvwlEG!>@m&srzH4+3K4y5cUHr=d)5xy-PbaMviTl7St!TZ# zT43}2C;y&aNs{Fk3@&jeho_gL~@m7HkLIJb7UL&%zq+Ntch;y=HaXXLLr)VSm6YvDf&+PIyj^BqVGz7g!R zZ^2BSEnHH!Ja+`Hh^wl4e&|jAk2Oy|`#)E`P<7<;yy{hfYft2xD9&H?GSjMuNwDtR zOO2(8fA>GVe!V*4#j{x_P5A{^PADi*$+;;uQ>Ct{Gt9wnvcBZa9~r!FRWu@8pS&y% zWIg-UCcNj|_swdppH|9Sh;HJP>e;}T@=v{Zu@qxZ>1EyRcMGrEez*N_LAl@d<0@|< zl>;4t?N<*-nI&DBQOM$wZ5A-cO1fZyr%zGP=cqFE@SUqd*QfDj-)!HSm-Be`jX8_9 zTsmiM^=irNcU2r0&oeA!lgybBcx=`?>HCrL=W5Dz%Q`k6xBI=`@R#k|j$}WNf?Ja5 zv0InhO!CUgTvKJ5>}z>-i}AYJr>o;%Z>v0XOkHW|f`v;Lo3FbpqQKI3Q23-zS@>7} z{Uu+Lzg5_??kaPTI4gKzbH!{HR=#_W4sCoSxbDx{rF%HPvRuAu^5wX+2SeJUf1lcK zuNErSvaV-HIT=&S)3|e&)|0f!i97cset8v8cUozi^n*|thmt>MmF}o;ZL4lrW`6w9 z=fb2{IllxuRxIgnxY*{xE&HjUz4_CU`khPYZO~pJ%As-I~E?Cy``zxOLI7H(|_wf>P@5K0KuKS*CKu`Th3w zo6^rK*%jE$J}52irSr$~4|htL&U7=eXGN-qFP}W^DKVkOPJPbF=aYK>HvMRb+P>hd zW~ctnsV19tWh$>|TWc9Tjm09lX5ki=X0NpIn}xRNyVa*_b7{|3 z|9j9#(kre>dH#VZ=NG0bF3J+}@O5_C%W{83gT&kfiS)y!>snLqOxSSni;|9LQ^E?P zTeD0|r2Tex#l#Bwxhrz8B}o*r2}yXW1?fDwaAHI4{0ApQ)ECYPm(_dG`REu=d7{mW z4?aIaB`+=&Ug^~lQmDev_fan-)3rSl~|gslun z}sB)VtjIwY4J=&YwnX_6PD_P1o^a26}uXk-}Pq3 zr$tsTW7CQpqRl=XogT9!w))(qg^Pb(TDkd#+~=)sP0gz(mAqUvujKW)sJb74$}>$O zZD*Rz?L9N&q-)yQXFA2tR_T9!*8P^*K3j!bY?aFXKda{HM4gG6rjxF!9kyCoWyzY9 z(`DZ_B`@dNl)e4l-<hOz2+2p#B-)^UT08bO6P)- zDU-XsyaGc_?=BZDEm<@#?#gw4Ka-9&x08yTClfmbHB6OKmWiM0tytj^BB9wed3C~~ z{WaU`FL2+p)T()J@%{ah2gyFCOjoB=Jy?; z?gAc>2FKfiOkzK7b1U-;xgPT6%*Ow+eZLnRuRqc`|LcqKlp<*I(JyeehnxSKSl)Cj5{~ ztiK}DQK+%d{gTY-6P+^kPgoZoIJrn|+T6>cmcgbA&i!orbMwo;tIv|$^-Fi&xxU(Y zvdyRH`K!+E+`IKdj{e_rv#k2ppR3oeVE=tS@UQLdE#1HGU+u2j-2ZOg<94gcU4Hjp z{dt_Wfw{q(!&Ra+q(^0nkwEw|pC1dSwyN}8>S&(Q%+l1Q(6*vRWnzd(UCNY6r=~s+ zSh#43R_M{t)p{%3ay?65aV=bAwkodHlUIr><4Q!(G>$NmajP0KGXU2@y z4I4fsKQ?LV4wsSNufmvExYot8qtkoBq^FAN=RF+*?M+JyrDi#meEBIM@yU2&$)QtG z$BtcNw62~lGe@?du=L2;yNvw)?R)mfa&Vani0NHZyW|zMtE=p7V~@{HzSzdRyH7V& zFM< z=$)rr`h{cXWOvKP=LUl7Jx|px=K3>p?&DXtCLO=?RpH&jASO2^k=}%eo%$8JO*&6L zX9tET`iiewWfl~yf91l8r7J_Dqjyg%o$Iu5N2&8+C*{T0d_{ik*`VWKA+W^h;(-lf z$E#VyCh}VD^m0@b5uH4#XvGSZ(5r5~YeT}{XJu@eHEZG0shO`^*5xf;F3-kh>wMV2 zj5GN1u`@ah4J=ITB2fnu7~9P`QWgZLO36m#91?Ew$njhvH&aH$%XukV@3a>^b57<& zuIV|;ski;G2?(>O;(P>{p@?sg;8FtTDd^G9{%d;hiZx)NLak!CwW0qWZgM9mI{ygjfYfJLTGs)9kdSbok1=2MEUCG%tr)V`QtA> z?Vp~{TDmDX|A-{x$#dOJRczw9-=Z{6UHBdo%Q#utphM={gKpDj%lmHc+*l@?Aab*A zb>Idw)19BZ?N8n2k>68XTBf&(Q*>3{f1b5d+&!;9_ie8(+#0Z9PyDv!DtT|LPIg>h zzy0`4$92g)9T6`)tOI=Wbj5_&UPZOBySN>kQ1~HLNMx!>9U-)yFZTa28&j_Q^MPp63i zDk7Y&g37K9EebCta_EXI7L0qNBoY~HUtYds;qujMmOQ<+Z`ZZt`yp@omcjXpnig>; zdd*n1V$}+%lz{y)ddoAq+KP6@T-~!u^<07xd#>BIXxWpZPehw11qFn4hJ{MMx^yOb z-q~%cj_&F&UTNw4ycYi@*T?R~%{=u<30xI+$!6RhOaWO99^H#B?LNFGtY%f)Gp7YC zs&BW%6vhK7CWm}H)ZL_^Gaao_n)gqDZk2Yc<&w>{( zYxB|7mrYzb@sj%FD66cDBflOl(pkjJw^iqgosPd5(-ek6L5GGXj9i5Roh%v+0!$O6 zH90;CJW%#(@L>57!q*t|FOiw0La~mghjHozekPW71>rY}Yu?N~Rpysz>ugxHNUA&N zl23Nf;vDtoU)3K=#-_O5EwU}^b=TJulgX6H%;d_Hc`I`1%BA4iWfc*(_x61GwJ17Y z&#tOi`_7!(uIrveEaeU;JUCN)uDaLs+DnptyG~59nw+AbnX#l#>7wFH2dy80>HO0k zT%06RnV)haAyDd%Q0=Q(KqjTd-rLpu@$Zi{8)3EVlmq^@wuZ zYo>XdS2?}bx1F@z%trQ^V3eYMl}5?m-N()Zdr4NSxLy3ur5C-k$*;y#bmrV})}nWM zK|3zgUSKHkn9F>PLvhWa*^~EpMmWn@8cSvt3Lb3#8gVOY`|ZrAtYw9NtdwWEGTfH+ zmX~_DjnjSMiTevpWIw8AG__sXyKIkhjX-?oE$ORA1dJancj9o@S()H{;Z)>j!OSRc z^#zBMluf2<$8c(H{`Ti*^@HSX(VMMvSMPi|N9p@LTY)o|qh>y8*|k{z?ZUhtY+e8M zyjEywIh3v}xU$l%^4;9G*WDW&-c1&f?rK>#cW+I>qJ*x!eit@)&#n8-)3fTl?%b`} zKkc*Kt8$;seDT718`sI1lVoq|ShFi`*y8uKZPtf>H;qhYGK+2hT)N4jT&euNaKO$t zUs`zQhPU16xi7D0c=7s~t;QQHMP~~b2{XS{QQ7x9;Z$q>@m-<`FSVnRLT87#SS?23}thr_v zQCB3e)+beI%|%DUD>u0h8F}%uv4p)7czmvn{mHz^>}B4ERD7HS*(MtZ&$}Tc=5i>FB!|{_fP4kVNhl*TzmxJI5X4az)hGJek-A5{ZDQfcM7U~^c zxE^yA$v&YI#JLKrj5ptW)T2J@@jm z$(&X_I>E&fEshR4Pftj6F!CH`U^`hN!)74SY+%G@z@gYIF*BGgal&VZv}u|_%bX?# zHLdjhWw6p_lijD$$Dl#h7r}N@> zSJAMjm>o}-{q+ld_-V(Uyr73#pLXn7XSYQrZuTW32bt1CT>YmXmmUv&QkuKy>4#fW zrd57gv9>_8`qzyvwb+s+JN5WVMOq7ar_PWzSjG2vrD?*Hm`1j)XQv7l#yw_vJ9pw@ z$2RBw)@#SBCl_B_u=E7`pDjY$O5&F^l?vomZGBl8WS{<{R_}Zs<2**Y%Bv5~+MiwI zyp@06F5XL3)83S4sCee+&CS}&+|FP1xbxpDNrOGR&(2!1e4U!Ftj_~igP8D4g$3>f zvspGDe{5&;_Mv|eKSR)F#VKjWe;oX&{9xU7fp!j)GjkiH9`9cLK~Okx8{6abq~~wj zHrMVje028nJ}ci7bIm(A4&O25);_E{b;{=AO_$z9F`gG$W#!WGgt3&VHfpW7u2G-m z>s>n@)?Pn*(lew#VU?cLnERu3PkM`9x_IT^ z4Bq~r%WSp1!7nfTtqoTHwCkkR`+qDqYu75@6ZEv-yy5p(osFV=*)|6@@A~vYJ0*9o z#I(Dm7SF7=s=u{SPMN43BztYYz`3Z;gG5V)0()Lw}_cHdE-u6p7P|){>_NvWO zBf{cjCv|I^c|DDr{2(Z0nbXX5>)&17P3?2s=GE z{_E+^$d&i5@E6@*z2duNSmwLd+Z@W`p*mkedRRL79S(fT;msOd>Mby1)&mXI zK)2GBd}|Jv_#C(*Idk!|zzYvpX0Dgy)m^BzRCPgipj*U?8HEeiu2OS76Id+bEIZp> zuvs`|UqZm~XI>teq92wX&|@voRN#(1t-WFJJu9 z?!clnK}<=Yk%QNXIa7g2@Pufl;-RSyEo?=u6XKh6ijp_)b=`UJn)A;cjE)^$H=ePu zatTavy~z>J6e0A2ZE>E;tG9~V?@7GUQ!KyH>^M(Oz-xhu$%N(NQyla;r!YJ4FvwoW zlvG{z?}!8c1qKEa2lfUwi3YwS4QwwyCD|%WV=i&f-`&%4+0W_b-(w3k?u94_o?qQk zv+d=~t{tnQf?1TeC6%q(xc-2$t8>|6r^f*;D$Hez%^pv9xumOd*qM$Q&I%=mCx&uU&c~|Ex+xfYk|F?@u!`%Dsrsub*+HA5o{m`^Aj`?@h z&f80Rv~TbvdG9YSUo9DXFf@iw7(W)w?4}D*~=BE9VxfJxdYM(ss)b5J;X6)yeo}4W| zdD%aC-g_Q@;x96+xZt7XdVbDDzJr;!Zmxahotn9qUoFkeT()UJthTJbzSp7Yg%3Gm z*IeP&*GR2y`|wafW|pYatgoC#m#&m6e&6;$>CQES@3kMY%C7BMyj$|n%J-Hv&vY{U z^WW{$*gjclX2gBw4t7sIZ6PDa)_@g!eNkn8!382^i?%R|f4jCfC)vWld1BPd4N>l{ zeJ8yHKKr;fOj1yb>79nH7RMSm(Zs*FDE3% z=1#p(IBU`(nSc+|)z(iqw)S1p6p^P5P5VuLvhb!%ltc;Cz+n3t2fVK_@>vxoVtnNqK8Z zjF(umHDhbBts zY&{%(bR8dC>*^Uk70WJh^yJP`alDl=X=QEk{i_vo4l1!OOI@+h{X_Zld6fqrI5oX> zn0LFQ=fb7p*KbOnpKs%-Tb;iDhJMSFqVgJZ#!Z4BdJnc7x!$%_yr^GRl8H6ZZ0TMp z7O(nL{VNl9r}ep=CzJ+o#8ONbu3a*i)))AgllT)(GJ2us}_!FI#k zU`vdYUYYbuqrR{EQ?*jE?+J?tnz2q>Y7xTrY41l5qut8VtR?n!#d}q*RxEgWLF#eH z*{sH@pHAMQw-nx=_q)RPbJ5Csmp-{oYK+#g);lBkzOkL>&c0)HtwxDa7xVu%cs1@% zKVX#S8pPVZS$Nj9)Ne+%{Fgaz-^x;0(QlZ(B0%_U)0F#*r}}0tII~_e>{OqZhl#9wm#dZli~lZHnTYy6$nahGc=d?TyGjKZnS8g*Axq}c`M&a zM=praeG-!8yKv5x?I$mry_>Z7W!5##4L%R-OlHct?PlzXt^I#0Of>f7+sEZR6MNok zu83x_FqL>W(RPg<+uN!78IQgl&N_bL3O8GqSg`uDAOd-qQczaFrE+p@K9 zHh(XXezhgh!S=1w?AIHgedRI@&`K%X;&N0vadNswp>$+%WAJJPyg7nvQw;= z`SX!E_BNl*LzBu%qW$Zy-C}$1`{?KTo*B_o(ta=e&|CgXKKNeSGX1ne)uydRrZ-`?adeZ zHYqDC4)X^W-iy|j(G|^E{V8((^Hvs@sHs!f*M9xam~-J(9Sb*)Pt&#@3q7^JCd++1 zb4?<RR?K~!D;lO(7N&SGPY+#? z^5PDsN$=vzAr@Qad{dF~d17iO5&L_dRXX;)J%)`KxpnslA#PZ1A?Lt0gOK+9QusN@{6oPglLS@Omm}x=(c7d67jf ziNEW1iacFo>1*)YqUW$h4(nqBzQ-DUhctQ)Tl5?VGw6F@(07PK=DEit1rgqr#b5e@ zXXq*JeX*(?F6W%adML}Wl%;Z&mhs`F4OJ03>o+D@WS2cX z5uDi;$RgH!HKyN+Y4PSqTil*+nU!c7;VT%3o*Lq*4;}zonMm}I&-OxO@7P@$#;R79M*-$JEZtt z<%-;0plKR4@%{1)FKL~Q`0wAo=uFs_zKY>)v)qYSAxyS> zK{7_YZMP5A3PtLPOj(u_bF*sQHIHV8Imah=tG!$rE+Dl0U{a50^sdQltaEB4Sl2ES z{k!zL>~p<|f~AvOR>e-*b$#Bk*^=Szzy8dx|L3rA`OH{{M-tq+Ma_>3Ry;IUvlV?A zGAFp4jVCrxvob(ui)-|zYahjG`Ch8~OK@)XUDtX*$Xv!lv?Ns}k&od`W0zrnc=^7g zhJHq_>QCGRgSU1sIF=du=*v^bI}Ll^fA^YIcf#)n-=nPyzq|;Ydo$Q*wvy|9?YJe* zImySO&z%hXTK!&Wn~O>7;;AZMR>iH|>)@Xp9=`GRqc7RspKtkmndRaAj61Qea^hRI z4|)4lZ{1J0rz^~py4~>wX^6V=!YK*Lbg}vitWBUYlD^Z z6N4E~4(AlUUHgXp(6gDZ)Rp+p)cv}jfBo~d-HGK2*@eF}$`ja@{>zklrnoa70P6K9Spv@=S5|5+Hxf?w)O+PJZA$vFM3?H@)ApzzM%VZ zjtXD#+^$3GEH}>h8{|1-&)uNSI(iRVejmG`qiH56ZnuW{@{$ry`BP~-a~3_5o?_w~ zayl^5N3Q5x`J87zm?lp9eY$a4km;o#evc#fIPJaY`7>$mpBpvPfB)8IFS}9nWVVU! z9>Jxn^!q&LY~eFsW8uF;!~cNf>Hi;77C3B=T|USAGuxNKqWqU_r9O+|-ZQRRWHtZJ z<+igoAAOkr=kt~ct(jIqeY@wH{rsDJ>qq0OwnCld-Ko}38&`U5+Im0hSd!}Y+zr=E zKEJJI|5w>M8(tvoO}JO zLUJ`%gVJ5P7{7{Wc41799Gsd+Cq%mlr~6*`+azloY(!$&gMYwM$VZjYm?X6Zp#%; zxD)0$UB$|R_k^3Uv})+iBOy~ubynN$uoX)0Tt7>$$8^FJ-ZiUVE}OYaZkDw1-pQ=n zUZwBae$4smUp>dNDUv*O3M~c;BA@kmon+eUSA zQLe6O!BU?p9qkm>wMkoy^e*?;yz8%Z@V*&3bDH*}N4pkypPQNHr@ef3@%qbV)5CXd zu0ELg^p(!zs)m!7PxQ_+^;2ISyuHaeovVvsF-NO_gQkM!0S88vr5uqB3L1J}TMXZx zXccheTE!@3)HR`{A&sTOk&B@zrBrztwTg#rL1COt8GxQ_MQ~vaCbd+Y`Pvf2N+l9=dk=kG~~n+kdv?cJ}O*|D?>G zcz8lI%S>Ykh1Zn4Hi1kdJRNgy_ zNtw^K`@~b7{pvsYwugPHpV*Z8aFK-HbzZd_1`lIztkNnK=$ikZjWO(w6_3*VnQx9W z=NJ1u%6=AlIf0v7z4eUKceX><`%l@fZO#3r@v>!Y>gM~-vN=nCy(=$goqqSM%$H9M zty`Ow9)_zb^Vq*UZ&B8i$a-eYtpj(ef+i_tNo&c@JGpAZJBC%$J>71SL#>%SW<=Y=CZ_e0xir=C~)c@-DgMpD!hc6wjJHVFv{RwcRC0+uXJq)vSCGy+%FqZsen?MLw1?ha|fc%un80 z=K4UYRf@Uy@vN3vO|#u@cW&ukbGIX&#q@Vk%x8W6=-Uo=zYAGfYDHy9h3*Xxyy&;< zTbkyU^;b$2xGoiaDe;V7d8O3g8dI@}*@`Efv&8(pbNBsU(wkg#%<-^>PjPoj+M%hD ziA{kiJD$v#qOodG@yuT>t}Wk+dmXDZ%giyn{_4Y(z%q)TR$pW z3D503_vM^R`Xb{%0oIAatbqcm6UA9Q1z7#2xE$mWG~@~l?G8P(>v~g9qt^tXi>o9K zILRr8oYZZe_~7d)g;@pRbL8%wp0K-0HBd@{;X=g*m&;xrDc)Nmd1hX{HSfCf>9@DG zc`NO-x%tT|ET5~{OXv2sU}=l!ZQhdl{LxJnGOp61n^@Ej&73AZRYhL>L5-u$^PE-Q zEj~H_t+%W1ls~`CRyjB4hE77{l*`#Z*FXRKb+mSt$I8h0+te=aRi4bOdD~<0MrY-g zO+|AAUo@V7GqY9wbm)Z3Y@RcBZV&R2dn0LZ(j+?umpPpKMvZUBWJ*|zqaILhn z>uVj>=W4y%yStfkmKxREeWk4yoU3&F^G6ep!$;bVgxt0{#>^SU9&++-dH06CmLlCs z-veu&)@`f$JNdqd!ofAC6dMb_e%BH0SX?zZ>##I$kn5@b6zRUSsqM<4?YoVA%$r}D zn0CyV)3W=Mb<2S#c??V^+74B#sCmiH+MKYj|MFuO^$%KQJTW%a^ZuKshR-Ufmb*B8 z^P;1SJMtt&IJKiD*m^FwRVBh#ls(m4;kJzDcaw{Pk3KuhICk9kp6?17;Yp5LeRVrskIU6`r8mf8G_*VWlO1C%rMI5z0dQQH@FSuqHu0}ew3eFXc4E)(p3K1RBC#E*+J7hhlwI_M`OO9) zyFZ7?o7hUQ4+?-$Ob-S=;HkXR4Bx`#|`K*5l*@_B%2OF4#S$Z3s zVq#d{#vDFg8fS8n&pIY|`rUP!*LN1h?mR#F_3MZ83WHnM^;vW6*4wvwUhl?**S4SA z=l3ZitzNx$OThwTJ0FXVi!+;;4mWI^_alDC;=66hdh>pFR2(R05A5d_`DMn-JJDzD z{OyM%QgvDjpBWZTGR`P1kommr%G8>er&5it?`RZE{wZ_kjbCATrQ-`%eWUFetF+!F zZa>tk7P8Xi$`m1I-`)sY?!?o!$<9J67pbgzHs#2wh)1g`C%ULR2?v>LCw)~;De_fm z+m#*~5zCpFeA?E#*;VYl$|}2P@r_kkwaM3t4?kWdZ|0`7B|^e;$)~EA>)USJfBB*^ zW|zTxn@1sf!M$7dxb<0|_z!Z+`580M~jdj0HN>#mQdmL6k%F!z4y3X!Ykzm~7)34Qz2+hKBez;zL&l`dKn zy_N{gWSgWo(H+v2E8(DdRjGOe)8%KlkaWlnJa0Xon!S@;Pj0n zGdCJ18_)S-e!Xsf#818Fv&y=cZh4bZSGMtn@wDhgH`boHv+~?Vm7s1Ry9~4NBNog& zS8@uHdEOjasy%((9Zie*zrR(t)SIoD62~QTbn41l*`slM?%81yZM`aHRlBYP_Z^8Z z;J2{voP4rsYI3Tjj->kHo0HzmY_H#Z9gNb{x^9uOuAZlU7v%cKfSc6H?+oNbNKON##O28Nlmv5 zZroRqINZHMO35QL?g=+{hm*p|KkXabCyP&-eOTL!>9|)!_C9fwiRX1*PVPvG$~Ql? zH`vyFgjCbnLjV`BMrF|UKLoa40xsd4OFH?Orht_q!>d6?szeR|rKMK8ao zSQhlV%rD*c(K%<<(oF#urhixw611^WTY9GX#6GKA$BupWEAeg=4A(dI@|wO{peFR_ zijLQ>uY6n`{Vz5mFPcAh`^Lldr)tHnR+pYj*1mUEXq9DJecLh-i_8$6`BJ{i=S^K^ z7FxJY-K*s*+sSs*n~}zqxdJJN4>3z~ZaUOynr^q&MZjzJa=}*(y+uz7^EWjd_4`wp z!+EZO_le5-l_v^ZcQ15*>z`Vlb1L%JRh#nXFK2ok4hVQr%O&u5TKEZ#lm%|O?E01c z?ff~@v-=-^`MRHL@?kB%GaTnDip=ipdScn=Df!%~$$MV>KJF(>3Z7ew~v z_iAT7p77vavqks$$fm${TSXSbfb8#Y`pGMhG^ zUtoI2qG(08CX2%E@)?F!^Cn8XXb7BfY4&7x^ADm6I3-e_1VB_lyO)9^*JKmV$!RLSmsET&ig->m@tj<9sb|Sg6VG6k`AZmk7Nqyg zn<^SAYN6EE@z~}#tDyUl#M0Q3v#Qr)#k6-QJrbFFu=rB5lHYSiljE#{?N>`Ls!l&D zBkrQ(p7!#{CFigHr#R(Pzy3S7=52%Pwk7vtGPd88bkSUX*Viij)`z~Y-uJiW{(2P` z_xjn%i0gsNKlU%!Bk+Ds;JY88b!~lT ziWAxlTb&ngSs)j7b%|EOhn4?}?=%1G**>$n)|~s}lkHzcrL@oa&zyTR?`oq3%O-1e z9`9v52E~ug2U+|q)Y{+|_hjde)2sfjS>ncZ^J&esEqj!v9O#Xh@31GhJxDV;&+3zn zLTTWJ*f{0<{F?jhn~-bnkmM_xP#gmFH|fPAPxyA1nSfa=+`B3dgd(OMfiSHd^jV zt&QK^CArc@$XB%>v+WpMlQUy;YcRIj8HR(U>r`+u>)9Ot6B2L*Lw?k&9gStmd{zc&AP zbh%-}_qwfXg9hi$A{`kOtD6>3shD12xXs64UZ{Z zD<0Bfq}%>v0@o7db{7V>fLIUrbrYUAdro@y<>Sl8mygRVm)2ul&8@e?!Lnddz>Qga zJ4=;Em^{z8MLTvirUf4C7yy(@;hcm zI@P7w->!11Xvd|juSDj)2--4X^2e65ul%=|)Cx~J`O0&O*NK#?%1gw8 zB3I_MnE0tJ?U;W~WB$EMHn!@?R>}!gdi;;i*46Fv`~BwiW+NB3uZoLbPYBFDp`n)& zB4%^v=ej#@Z(Q%Ms(dYfK>ET5tF$SG@l)+TI(UlwnzUPtk?;GRT8wK2&jnKcD7yQ>ryj3X6##5U?Zq0oj?~Ip%?GDMIg|DNRDYUL% z_&6-}{Y1W5Hyf``*uK9)hiTOWqm?=LZRbAv9<$Zp{|v>?i7&2qFI!}haU~=0FH2-m zG*7^eAKI!7OBx$XXB#gJe7$G!gN)q|(w+I%XjQvDw6u~^$bF*msp|;ak{PFyc*XD5 zWl5iyXeOIuQ!VvU%!NI!i0$f`OJc!`ICvO@jLxZV)nZ?;`QKCTQ>F*Ey<;-^^E>ZK z#2fp9qpNe(|6b&Hu5H1*2FW0d=M%aZr0GX>#Bjr`A)L~ z`)}-3QF*AeKdDvuO@p`M%&RA(d1k%|S!1ka#mLOBsjmDg?cp@N$=hcy3SU|nD0Pst zeQLQu&eWs_b!@$iITbTBj7Nw_WE5|rV+=G?WQ%hEx|Tl+ov z6*sRpT6tHi{=?@t?J)wuW-dX`j$J$wXyn;??QrG7_d;7&ah%u7R=Z(;G;4qVMhC%8 z?PaU&lh{r9U9N7rFUlHkCe3+Bsp`@W>v~U-m)BxVZu~2%sQW){B?uhT4 zn_fAmymB^Q-b%wOtIm}%B&~2<{d=VW!wMJo%`f}*-R-U8vtjgi;C6V-aZJ!hVR6IM z$tx#pxVU7ASE!okS2NFwtxi=QMpKs@STkdiQEaJmTcqhPmXE#467CKz4n}oI&`nGlj1bTP~|S~NFw%hj&9$zeWG8CZ)+b{<(O1@}e*NHz%n?*eo>QT5MqFmMG#T zDAFh>(Hbbx_tB7Rxk1-~f}FLxR~?L;T>8&t^5xb#GwG){kIcJm^YnF9{FzejqZfRR z_H;=|rTU#|l$g8zQfW}s3#A0^H~i6w+^wNL|14DNWJ?ycHh6Y2oywMDnalj5k?)b} zN$aUGm-(jfCX;684 ze{)v#Ys*Omr@u;biI&?hvHUsha^B8$&WSsp7VclRrPy@WTCbRoUi`c!a#AZSOfHn> zFR|NsBjMKLlM(%)ygqTOO^g1^_I+{xoBk`hyJ_4|%YoR+59ZzKMEonZGv#=Vt)RLk@)rsp=^ zmA<2*@_dH~`}M%(Z=RkPS$=h4wcRgQBfs((ebMKg2fO?W#qam27dA%L_$AK$ulM?m z$h*IhT6?~~IJY6K%su|noGClaxKKHX-%H&U^3NCu*hLGF-BBivFh6=feIx znrym_oAuDrhpT`3tkwA}b(yK?sekqnfwny}ec0>Trr#@O-Zgny2v32aq?zY!*Gaph zpInZVstf$5`g6-i&7L1_4z_RSE57Y6Dg6KMNWhMd>2Z_4d&OFw`TlqH z^h;W^HUFJf^;q_H&+69!U!Pp<+N>8;>Ag=+wYg|P)}g7@>F3nW+%>wi?AZEG#sRs$ zHka=>&%UZ{VDsgjq6zOi+q|Nn^hw%#q|I*D^y>thvp;2tjq~#lj@~u>mbkt0vL`kr z<>8L6JCfO3HZ0Fci{~+W-}gK6vy7hN&dsb>ff#&YBBrrr6TK4KzEqWtyilzEoi@Y;l|WY?yDphi8P(xx8(i>@%V>-3{sEzb6=VI zrTp#9|CT9}8Jpvq7W6b(+E19Zt8Ljj!yPV~mn42NrkfKYF5yqldc_%DFKf@Oi8E9?cH~!=XG^D{ zVgLFE=a<&spTxvJaUGXoOS!IM(-sGzDOY;W%$##ATR=EDsrD$(p(8f?n!N8%N@7lA z+9cp$ae$Gpz@cRAe3n{{CKZkFAaf&2-zY_o@VMSx-U8Zj;p<{{yj-+bNtaVpbz<0A zs~?@bFRto0E%V%LR_EIL%w*cHqsJ~O&opA-vO6T!s>}98nWaT3=Dv?Jqsgf(k#5QE znXOkfRtGBnK5@H4uJG;KIoEDvudnd1oKU3jwBcmq6lP6!AtoWGZ8A5XoiKCX*1D;8 zYHnXEh~1aNooe20_iWakCGiqQiz9y-9<}&B%b zyXXGhQ=i}d_C<5qA4$V!7uL)-UA6gDJ(EE~QnJU4gFICN%neRXGuS&0#2oZx5bSwy ze9yv2Cj}nNvijrXSXZxwi3=kS-}&A5`_2}X zM$;VSjBmT-nH=Z5mdlg8p6j&zT~qtS5S9tzH8UUg-@H1koW1o*0)mShLu^r zI>h^IZ{^#6eSe^Qk>vm6ACLTJ}4 zSE<#M+B0Ribe#LuF)68|Fl|Qu(%v%bM|XmaYc9p_<7zZnwpH&}*R-q^AJd`~uB%nc zl+G(tj_poauylWIXj6uh^xZGQ%4ZFP&uj{qclMjrvqS52Sw$}2-zRm@djAe5fAEihnPRi+CyX|V7dQ8=Io@Zae z*E`0}%3j|d@X@H(B(hKS+Kp!oley;2dN}XjE7O(k+_GOp)DAi<_A$I2l$~3CL36t3 z$%cUXt5H{$FYP;|ddlclNU_f5bA0V{%36&QuGq)rN`08`SJgQoWrE?dnb|wPmYpg; z7Mi;;v+c8WnD~0@+=b@~O9Z7A3|3CNU;Zv))tAVk2gle$M1Gt)a!pp$VRgvzlkRVK zJ*-YSeq89_roEQEH#sIPJ-21;{pY1OI@$9D0uqxBEU7X6Uua+`6ty<(?XRAhTW?th z|J&;``*MLGx1K_RP)c;+tNV>wxou}|7Cku9T<-jAtN(&SN4zF+u6%K*=Fo3{(}P*x zBA3T89}}4W^Yz_#shjfHMQhJ(jy=}4{O9^7wRuWQP6RIVn{Md+t^cuB&29mGyFVkA+ z(Sni_FU_-Vtx=tw^ZUJ*WMvS`VyQ6jfkrouZEMZAdG5mH(-j>P7T-H||8x13dCKB( zH9t6o6w3}?uG92|S>xMNA779rq2XY0z2Vo~n+Fdo??^FaK67Am{o6*C)wg#iPu_U! zM{&tpGydrhG{a8W8t{eWol>9O!=fB@uVCq#aIgJA-?X1@Gn)E8R70k48TS&agCSu8 z4X)2-WNzBnc6!n-b$K-*?U?wxrB|Ygd0o%5hVT5{DyCJ`t|zZ|&@@`GKg7y@+5_kG zy{+BT^E6I;x~Q~se@2t@{>|HMJ{=QpJ(VOZoe=b7<)ze9+KXb(E%4lY?X<;Fd-Dlh z>-*RQj{CEAT#3)UxZta^^weY3|9?&Ro++#;+9i5w{`7-3^G{5Wj$7e4qkNxoc7D!X zi@kdc?S4P>edqhOdGjB+=a2W-Zsr%te5m#AzQEN-N$zJe&guSpdqro?s}%EHru*g` ze_t40Q>F1o-~ZnGQu$w7{;rn#Q?pm|S6dqQzsMy!8XhVfU<$wH={w26^?&VR>#(Hf z6Q}Gq3yfAt>eAPoouVZYwmLLgw&ap?zM>PavD*yIw5}~4Jy(-*zipoT&FVqRWxZW} zeKu`9oV_wZqSwVtCJ9VbHhE%olIiDbuUrddsiQC49%@W%I%MD?>Kx;_WLo63P16_0 zJW-YZsp%ouB^vYpa(WimWsl&%N2(r^m7V5@L~>18d2vboF{LRF*^G5fa<=wvyM2wX zY*YJQUc)PieTHZLe^mc>Y6ZL8Y=h@pMWc_MiP)5QzEj#?&vEulX04JP9s$Wm`gHj$ z9yXc_ENBsA?)m?LGrrL%frqufg_W_r$<@K_@R9x2OT)5C7UyiRw6e(lcKqq%qWZr- ze&7Fb^xM6~70)(Z>9C(v@Ga@n+AGf@L>3(lp4(<{s8{1tMsi>3o5vEnz(t*h5<{C4ZwLcgyo$`xD9 z))=;awg0;$UNP}rO-E5|_{z{VK1-#(&f4X&4nO?5d_|(y{IpoP?eg_V>iB}bm7%Z%Qc}@DTT#>es z;L_IRjZCart0(8KNY5}6Xx0()$y=JhC~zpC<%Qyr0N-`m8t>>_`|Y6gWCrJiJqn-RrJRV9wfT~c47=9z8Ey7fNyLSy}e4n~8{j%ZCGMvsOB zk;EgqF4+pl6%AF|T!bzkc@d=bkiqhytaqEr8qc8Rt0skhOL}1-CFEkFuOcPX6|EV> zz_F0SxkuoRlgx7VI&mF`+0Eu}U##`LSMj*ld}&Urh|>zkiF|<_9n2|@m6(%`%$gk1 zKPN?T&N0b{I>OgjkN*hrsi;Xk(p94Q?@Hd!$6Y@be|o`v-1u;%%+sqo<`vi+dHiq6 zpDM+z-vWFN@t=$Py{h+nOvkeg_g@|6vMkkD_gC8bX86e;U&2@M$xao%zFM_@(F#MM zNz=m{CfRo|*w$;ymRvrrpxk48R7d@>@QoCK6`P(Zsc|yZtPZg1H_5yde!kd#N{#;v z4Ws`;y`jw?eT-CPZGMVOX5^AvtvIo~D&OdwNLQt=iS)5kYF|Fh%D%1Cp!M_Jnt63@ zyUa`8tbPzCd;Xgd6F;w8z=y-ht1chDuvJ=as@}YS>gTiA4KMfFMWjoA5SYF=z)aPr z*|a)nr`M@NhnTx`{qM|dub*vg^HMH*m+rBhQ*CCo|Ic>%`D9=2p?ZC-2Tz_WXa8Yc zHsz1SyI;?R|0w^yUH&g~yZk5C-F9yZD#aWh_5|$MxLR{-{-sZ%DpO|I|Cv{AWTR!n zqU{uFRv&v?eT{W-^7O5%Ufw)>Z_F&x!sqGO#eQ zG0M6c?p0u6ZN7g)hID#tr0H7aXral6tR!s}=jdeEuxqbTD z*Bz7OZFeVi&fC|xaN@?3eRHF?<=vk5=WCN^?P1@U+fHR=uQ5%&Hm8zXZ0+Whq%1au zrUMRFkBc=cPtY)7>pm>pp<>kPwb*!uj#>NZ$J{MS#of;yD=gl-b#r+^Nl{s0Y4P`0 zXLs|@-&gbdV|LUw;S#PVt9L*DSyRrsvw9dtDdjvi3Zq!-RzzD>4+Uc(`R;cXCZ#6|y>THDBmnw%%D6E|?}~96WM} zuPyMQvFJvnRM&%M8%|9THB;`s?657MS7};N$V#@P!`IiDF&x!2b&g{G-PTg}>e5>F z^xeDfGh8aGWLj*nH!@&OiCqy>1yd1IolNV2+rj(xdsrY+}HnaKYjQ#_|W>0nMIXScD2`^ za#LC2vB%_itJ_OD`d``CWS)Jpw0zPe;lnRVB>iHfS2T!rH3-S3gumAM{_08OyO6}G z9iO)^*C}VwuY9;ga`Uq@w_E;~ew*(4+N?ZMQo}iQNzc?yqtG<3XhV*jcyzm}aZulUQxBjpw8cUEsZ&xBvS>VF&zI(JB_)RnKj zRdaEj^YXj9J`|-WM{Nl|6!D|!$ffW9T{nN6e@sI7O~IkbSua^UF0X!m_rsL!tKF+S z?<&_mxqCUw%lFlmkPS~Xr+UW)ZGEDA^?&SQwNsDI&2foXA-C$wgRq#?IK7kWPi@I^ zf3RaQ^UACrZEuP?f2aT7o1nJpY3<#kfmc1(Z(8(Tl;PEW4u>!2A6ERkd;e(tQUCi% zH7^^ApZq!I%h{~(Qt#}i^2w9-$~=otoNU{-eVcFUw0O^{SFcCCzW46$uCIZIXI)y9 zbo=H;z3+UBy>xGAv(Hju{(o&&jp54`SE6nI{4uRrxb`_m-$oU~2fZ;(>bJR9JuD2B zSNr8s8o&O?CAMQ5FXsguo4|M2s`rJ_s@pTx6xymi@i{d+$Y5>8)VS4OBR8M8n4imh z{mhq~X*<*QMP`W2EwHzE1O3lR?whaV z5b560$02NJCKR*8PwB9Go?vS#!)lQ|?nb#0EM^m(i@dfiwOCw~Y4gkcgXH;>lNVWJ z%6P74u{b9-XT9LO_d1?(JS#+8H!Qd`rSZV!b?&pTMLak-d7`jlmnfr+?59OXHYzqP z4|eQPDN_-MJ+WN+soK^1&AeZpv{i9kww?LbXVLQIQ(mupQk~U0&n@47_4?)7HeYzy zl52R?l+Rcn+cbIOKCRp9((aqe?4DMfzN2hf_4CTIiv_Q0|8w7Ov^}?2J+0KMUUj~C ztbNY0zlUEhH@{!^{V%`$zb)U_^aa=4^ODp%5w%r1?Sh6fkI8G#*xO2RG7rqY?{~c5 z7%uukuT?nn7)RQiLMI;s&+OnQS?N1N~Z|8m+m;ZUX{!Z!1 zrxv@kG{4_1HTT=Sh)2pkE%jo{M(ycped$j#@7E_UE8dj6JiF-evg%L5D%MLoCp9ma z5E?h(lS79`vrytwt>jO70n-$H{IKfq+v&msno5Ln=^(D;QT-Q!PD86a$Yw3`VU-|keaizelCOjmfi=7&m>>vU*FG{_V33k zu1{NAH+d)v|M_t8_yXp=>zWqjE_~|Wl^|jHPrU53jLl>HCkY|@KfACtUs){>aPwNv zt(m4B-&&e3{Co5JsO%1o>HpTV*-8A`+xeng8>9jMnKv$907(zvpTlTD*AW#EMw=8!wo2PChv|$;M`~orn2~c&8&f?R4zU z?CjLocj`jNxvJF-UTfP;G*|xa-rjArAZJxtq{fkB@m%SN=RbW}V#B@d*XK1BDk?ghT_TOi-J^h!YOJ4qR__WVitIRXk_GomK?m9j1T*>jvk%qkX_iyf0Yb`E1U8{GZ zxhLjX-m=rNXG&U&Z%$o*Ci(P^RSZjy{N5GusO?ehp(16cxDDED8#n)W!jbxCtw4)( zkuuwXrdRPi>ys ze07@UeEKp|uZ{g%?Z~$t?bfq;y_PI~tiG3#ulqr&<>V_RfBaLNix#QwVS3T)*e3Np z?ECLSan)~%57Zt15ud#2gxd5?nVi~hB9dfR-#BJh#_1oSBox^wm!G;?Ys&vCiprw7 zwX;E{eAOf9=o?UUv_l1wA0!1PnND~+Bq%%=e@%v29DK}dy40Mj(reQzFYju z-E_O}nRf&&G@EQ;tb0!_%H6Onvue0@YrY8p^$GSA5TjbiDutB zWL7q%AnNYft;bEjFWhGJde#1kb*Vg)rXQVbGxL*(X6e+zv>BR*xbEM~=}$gq@!Y?D zr%~S39q()-e*|d9UVZgFaqa7f_jNgWOLFt-m7i43V`}Z5qIG%Vsn-YID)*VZT5Nc0 zvU!>--xMbaca3Wk79M1iQ&3P?z?u8vAcL7BzpMenTEZCpQea<%cl7PRn2)kAa>8|dvqg0`<=&dK zFLT?@u+Fdb)zQ~kRwPV%D)x!HGRjV;CN8Ju$lAQx>cwrnYxTHwz4wIjx$>}TI4PT4 z&bu)w=ft$>?;lN-<0vRt$kIRk$%O_1p;=2?%U-l~8gR_tmXq})PkjSR;?2c>m)+8`Nd;q%t-JkZi7K-}A+dw)YwLX9~SGuz7Gb`_KN}`QP8oOB0T{Q+r5O zs8qe=!vFX7zvVY?$v?}mXWw;(dkhu1>+`lM6;2E~9;o--wx?~+`QPP!tvtF657zTH?vMKUV(Qh+yH;<$72o#vxyc9dx%E73|5D!k zzw*eou_DLd!Oib`j)p(H`T60^*QQl7<4*LNY;tw-wUGNOch(?WPA|lv(PQ<56BC|H z(Am5%fnx{T7Y5edA=fgY#S9S-cOPC`{)0ES#pm?) zxe*}~%Z(r3wo&{n*qU%~^NpiI^84G(OrT({+UVN?iTCQb$r7M@O&8Xgf=V$fHwd>EU zy7&K*&*s&?AAQ!n;qba}X}xpb&ex%hd%vEmmahp}6B2nQY0b@TUq8%WI;Hc;wim@0 z;~sd1eH2S&H*w+pu|#qH*5E~pi?%smP*s`BRI;`uZ{Z8^c^5ps^dD&G_`<2QvhC3- z-F>@+7EOyQUU^Y!=8A)b(o*XcJEf;?xyW1Soy_p~S4NIhum9?kZ&!cc!ZUkn=4Iog zd#~?p*${p9>@wH8dCqaUZxUx$Us)!%eed$O=eEza&38XOwTDBcWq3f)*}o<_j@`R2&x|Ww*m6$n`p!qz@@tN~ znmw^_cT>rR1-a4l-bCHGB=>#&y3&e8d+yX!e~$jNH}K)-1e=}jwmRq+FHYk4@^R+N zs_2gDg_ega7C%Z{u*2be7oYs8xc)cgQ=Jv7{p>~a{ZHyI zyVJW(|I@?D#Ga;uee>3y-CJ6@#p=2q+xwu-SiPOAmzJ&FvTpjlsXRS3AoSw4Z zJF)CQ`b7T5_dgU<9YsT07ihi83E-_13vuUamO62H!Lvm$cG3z>E7=&MKH!KB=8>eM?r@{jB@hEK{Y|xUS{Aw(w2!*A=G@vYD_QaGR36 zfm2jG$E}VvI$(SAT93pHyia9v+><%pIIQI<(|Z-QA-inxo+jH2mK)t_#y8rFIKC+# zJ;-R1cEE8;dI5*1{1g38))qGIf$mMo-FvwEydQ6QFz@2E$md(i@44Dmd&aY_JN3p? zzxu9^`5lwny5(n1-*uhK|1R?Vzse5sr-!-TyJw5+?w#a;Qjjw#qYAlXq z)Tamy6Dmt*!qibe###Ok`MM)NP^jrP0Eu_p+1F zk(t3UVviKoX}Rtf;4ciee8F^Ri5HeK=iAl~C9TU!5naus*7!dKR12M<|zI3LX1Vjy-YB4CzI zPrFH|`dKkG=ULek#JDdj=$f9Z=iaQa*2MqBp%Ra5-&<~{x5QTPW~Nu(s&8+#_iitV znZf;XiLaHuPE*N6!&q@Mhh3b$-&=bp$Q`=$xz>G79Ebn=R^JJBN|(Mrn^@Q3`M>q< z1V$mDT^odj)bt*5TPp}A30Hph5V<7ucb~f-Pmu8b0_I5xRYKx@&Xah2KOM^S=$hym zYr*Jgtn-pvT~V@4z4)O>$^yZYQ9D>AQ_|S<@3iw6T07_eJ7sXM{D@>m6QFM#1@Vv=6`Ldz$oTIWw#ec0fHX=rh6 zqT!P^znwb^*oscCxD&U7VP|s8JH0urcZ{vRi=T6plbGDj{amrX=j`lOmlM%_no% z4)e5A^|Eq5Masf|+__lyu;ab`KZY|5_E9e)uEiyCC)_>Cci>mI>4COx+lF3o?FQdu z>4e$0ci*kO`?2cBY{eiU-R@A8RVvwD*C$2muHQDxitClus^v>6Uqvn36&b4KSNg+b z!KSrWtnahFdpY%8$zJI@*QI@5`@S=}&vdzZ_07F^=iEz-dv9a@yvob|e8tHhpN-PK ziWcvE#T)+JmwV4sZS}9&;XjZ0>%BX_?!A8ArVlzZkr)#s5`{kY5 z?O&hBJ$dqP_fd6z1#^DAJuFWYXWH!f5H!L4$o~iH>Fp6rnR;r?zT*#1N`<7pJv7_#+RAg^TDLd637CABJD>IDVzX-Tdu*Hh zW9yBs|>RroxWrJ0nFD`Q>-|Ap|Yq0LIUyk*|YIEa-S7o=E8mv4! zcgtJ0HLv~ld~M*hJt@35;d1+t#`Pmz^-3h`|Fvyg*$F+7k|4h~D3qv*~62wwqtof4})1zEtbGX1mOgqcCGUp55IBHMlZ=LV7?Cip~J1;v{ zw%9$6KD%IzWSPc%H`86O-W%2gSeleAlU?Pv`PqMG)9U9R9oH^4U7K0^I_iGgcQ?Bg zzFR7{-N~xYpKPC%ZJmC7?YZl6w{G|Gl|1NPe=oNE%DTRiC3}D05Z>y4n$4C)+OdDq z!3D<^@jm9Zm_@mekRU{=TBP|-=Aq!Tz~k! z^8AQ>Rr%p}-AeI=_VPa!lwVcN|9_SJgolD}4abt5n-4BwvirjHAzA&6$bnZ<9GR^gzdlW#@Beb@A@>@A<=>6N|A-}Z?H4Sue7}3)j*riSf>!>U zsiI}H?%BrQv6lMR&uW@32;*A3rE%r_ttXi;hjeXT>G(^iXMX?hD>cdYs+S$T6Cw0y z*;TfRvaH@Bt=}2zQdUTPKPREMXLaNJSht!RWM|7*$$@1LFSppftzpR8p6m09U!GGzPvJsXtZVX$ z-gyPHo<(+)YI#09cgS(`oFfVfS=&7K@IJ9R+T+?)|8BC&smSEmE2s7>yPRi{b@5O= zPm=1 z{!h^(%6&$PF{@AASaNbp^mQ>;#&sDk=D)%s^9w`b+_oH2yLvdliMO{dT)ji+a8}9G zO$!h9OySmie1Mff;B?1__uY&+5v!xtB`xq;r*!zJ#N-=W`#mnIdQGVCIXTI?-k>nm zrj7Z)kuzR93w6WKak8(;3}x)R{g_L`WFIq&MS+mba-PJiW?2zeDjQaZb@nZLCd*;A zYNB{^^}Ov|whHQ7-f(q44)gYY{&LAC{_9q&b+$9eOR%a-<#V@lSspq%H7Za1(axy5 zI~}xBboo}X*Gg4z_OI4IZI!jOb#tZOwF~>|9<1lvAtxPi>b6_Lfqw^Azk7Us{k^d7 zvvxf`$2zghX~MPFvz4+#XErnIh<{j{zgYik*1Vq2RvHef5na=d6tvlz8!TER;V$;! z)xGt)ck|{ro?o}7hWX^lvM{^E=bbLKB9S7~cN#QEDV~2Q)L`fqIq~__Su-miAFSM> z8n|xdsoC@9Y}$83B{kB!I8W)D0E@+jM{Wv?Zs){L>ew9;7dXeeq3F##pE>$J6U+A; z{i(YxvFGfqJtsHyocwk1U5@^bA0eOqJ&{yVbYtUTka(W6OY1=QPsxVkyJlZx=#66% zN$2Uf5t(VmVzeym4Nu?+57vTrGRZ$v7|e{8&YSMj#Kw3|wXoGOGHJ(=`%*0`GqZOp z8_sT!c_I^je$)T$3!hBjS9$s@)Iri^#(@K=Uvx_pk~hA%Ua&VN_FUT0y*KjtTbgyY zm?E{{Cq*C*3=d6}`mo&D7g+AI;`n zdF;t*+*#;m{Ct+Z^t|$d&3woI>Q6Tk_El9o89)C3(*dy-VZO8dZe9-`CR*~=F)Yw! zF&0~R|3JQa`?IK1vwdeoJ(&`H{m+bB{)c97%j>hBAlWQr_Qgnba)V)R(I(cMm_UXl)hI+leS9GsVS}yIy zn$a{%Cep!Owq%Zc_iowO1-CrBEap|b^eUK^{dIy)18Yrampx~F^SvmByz3ty2c~}0 zlhgJI7gxA>BzVf<0>M9Pyk5CPUH4DXF73=)GDEZ{^QYR?6=&WbGnuLWb)nFroA2kJ zad>zrVe7nwE)Hj2hFGjrUoflZcT)ZF^J(mt%P#->{=+r#=&JeW@1A=j^4#%{_D%DX z>+QF^O$@r%lH}BP(UsLMMRy6)>^D;iPKl%{ESV)-$`JQiXYo``#s>3$THJvjPfdRv z@UqJ4U6?aRkCLM0QBBp7%I+NYE;g}GYYwQ$GrgO_!s>Wq$;Yxq_brk$O!bt+7&X)w z-Z9*{`BgXESSy3|o?+TY%~ z;XOT{x1XPAA6DFZM{DUshf^AFG;d$h^wp{9Z_JNb+&5wN zZN7&|J+JtsMUzi0PT*R-*)yi@6jQ+7Crg_T2=<*j_n{~)j*ausdahf}X}cnqFuge| zp|q-OT8mQ4rHk1LGajdB2WQAP&wl#Mw@%+%ll7+Rrj(bgZ~LR7w70J^TzU1f*Vdme z58pAdoK$Hee!@>S>)6?yu40RfTki&W@;{Pf%UawwbH!5*hS4|F1FX zV*1Ygyc^}ZDwk(^K9f7vrr-HNc#2!OyT#MVO}Z6#lO`30Z=Tn7LNrBiVI37eGX1~xbW94MLq-96Ves;j@uPUtb4gyB1d#fpv!)b$xTyU zx1Bub@AOH|Zl9aE)~^c&k7L?>gj{)VtgE!y+OhfH^`8a8qS_4t91B9Fk6JZ>4)I+9q#)DCqR{oBT<;<}WO9ht|e}@qvYGX@P|j*`FE*ZwmDNDcw(~E(p3+l*0goL zN-GOowfXdk(sMFe+nFMEMKFD8^PkXrgScCSnNP8Ga2!1n|WTaJJCI3<5^?t(+e=Sz0=8thQ zJB4ePd3|K%>Ck9C{y~*n)2dELZJXWmR5c$?%QIp=5-%1Tr|h>Yd)C1l^0;PZ!-Q7? z&(Eoc$L8Bc?k@PoU=z*xcIEdRDboe16+vNNjWT6-hF*N0D7;s>LFeh|Ew8U=oKy?( z_}OO2&(C4WEf{;AGKXzz-T@gw&IJ%#lJno?{nC9LP&Z(u*Ke&~{&?vEW4#-9(lc@+o-B&}Zqf5tPxzK-fcn05+sl4E zP0zdeC7?G>Yo*hZTcozCBx%!?lX3OSsUXb!t_w#-S_2< zjV8g@O)`>vbi+T-=dYSL*Qys^6<0WqQ&a}$@JbU64%ZE){E_3dkuGOY_b?*f!+sBg%FR9vO^!+J0 z)0a}WAlFU9{`_<{U548aB8}?OLZj9`qfM zdSxX($!?uPu8`X4ol#qg-nE_WIxD%mx7Yjenwn{EQ;#28<>pfJD`l^^+=jT-#kspW zkL|SCd2-s@j585yzG&F3f680+Ogt(-=dakcuxm4e%0%BDTEg4;FsjL;a{KNy)u&}k zOTDthC*?l47TI*;N?y2?H{Y>$vmUL9R{CJXV7)HG=^XEL_EkF@w#Bf= zbIADZ``K-GmN@INgZ2Lxo!$QR_U>1w51+IPna8#3dJ?xHYsJ)iTd&yWt4!#7AiGvO z-&TJDlg?VjjQ_nVaU7vEL}LmqW?h8Rn^o5tmS?pCVzr0w~B{mI^1b7@k)6g*BEwn*|~M+ zJEYFb?GJcbb^5x#kHz%a&)qMjUuk^bu}A22OX$tlDM3|*F$zDkSPot@k6q(l)8a6B z?UaL?3nG7CO_rPWezsiD!K|;%Yx@~nmWZ%22rrnuLH#W|R9XW5-vZN_}GxVORzHivACI6Hb#P%=@jG3e_xMScgx0o2vl?zGE6Fn zp3=V3$YF!-g&S{FmK|HTeI1iQ&fdW5Z@;u-T(R)N7VYKp;J}gO_TFeX!bJ}Y@3<+C3t1Y{AYa{(=XhKG*7+H+w*aW>Wt`` zVD)0lNp81S*(y#r^vv(qHnb?x6clst?o}g0WxzSzM!G6lx ziz!l)>YrSn&slvos7J>}`nTlI>$8#)-YeGcia&Nf{{7z;{Rb5h9mSI;Ea(Wz-)zVI z*efe~fe!1R_yg8`BL7t_TXqVY`kLmc&(HahrN59r_=%#x1cmiQ_8M=W-+7be$p7H^ zuO3#ro!eG6`HI!=y0~@oi-YH)d{zIgvhU`)tSKL5Ahr7Tv^^WPmONZIr`9Ux?y}`V zU1z=JrT(1#o3fDa9pmSNZA<1GM_U|w)ThXJ`*NGx(dkEy+nFgoUBN7tk(*&`dBV^A ztaGjSytOUAH9TG)4s+Yr?jy$c(V&R!ZQhRL?=v$09D4sqKQ5pkEul^RwUNg&w)rBR zkNb{Z^n0}PpXqf4X^vz};e}tyFHFp@%$5J3+E}Z^y<1Oa`pc$R_pH7;G8D!~&R<+zcQHNvl6`pjR=aaIJ{sI! zF3&#U#EQ_m+vl#nxL>`4u`@Gr(z~DoHQ7hkxoij#ve@CKq8lC(9pPoaYPnw?>;4M` z&wT8r?f;)WZS4_`zykstG9NcJe9hdb7{$Lbn>p;-!c@mKy)Q$5PyFw4rMs<|}u=`sqy};jJxVnG$Sx|gs0`mlF`(V^XHemY8F&bP!T=rAM-t&zMg)+GDJ_xr!=rzS)kv}U<~b^qCk z>I}=>4+_r=T(EQ2qcY<@^^^%;kH0mmb4s{#O3S0`+P$bNfoDIw_BK{M;{3{ZQo(ke zISmdCYAs8b%FfW(R_^+C_12)c;0X5zc1J9>a8`WL^S9d>be!3ZM&X@Ks5i8;_d0F4N_xB4o zwLdS~9Tn$ZW?7N)a=ooh)!vD6s=2Ho&st^%OWia+dy+rDK2i1atkuy6=05Ruvp)Vh zYGvTcCDSif=ezVKb@w?MaI_r$AHZM1dFbJ1RXLe;-f8JyKK$P8e41^J_?(Nyr(!tP zethV_8CrEA`2VA0*LHrI((7TgHZ!m}yo-hR)Jt9&F{!MMzX^99{o32k>e3hV|Kz?U zMh@!EceHBdC%!u0&i%H?I#ERU>$aB{L$8K7Z>N3v>Bn5Fu2v}U+t>H1 z?a^mjX_Xrm@wZg1Iy5gBvlyEDNL`xC(;_YMCgiB7h~4_>OffRG7Mu2bn03{q^x-Zy z%?mdA+&)Z<&IvMs)8DXkncWRoxih%eN#5eEYV(2hn`6@Ug#DNh|0PXcL#1feYa`>P zX&(+6nrrzaT)a4S(e(!c5+5|?IVara>eu#Ez4k2a|H0PQhpRt)inKVej^p6sHsy?! z?ap)Bro5aSWD#lAGN8qxi8K2xI-TgXaOEte+ z%U?N}5WfFs=WfhixxDvdSm$Mlf|OZ?RRx<1rn2O3Tl-&f^=-Du6NhsSPLckkAA3~c zaq{~qBB9q0*UIp*t&Lk`rtt8Y_qkBDjh1DBd8#`ue~$Ih-}88qhNWBiOXshTt0OiB zX}jOu%XZFAZCAHkQqJ~AYyICWDPXzd|Ci;U@SQc6HfwL*IXP5@S?Qr=Ba4@J>e@Rt zci*mLsbl{y%b+%QejEGIIg{re+Wm6UflCi$3;T3>L}iveXOwyW^g!Tk&Hl>!Y)y7e z6S$53iR_y{$J3$XW8;)ntDXtWH;SsBB6w}-?W*kUA}4?DV`oX?ZP{bmySX%W>6AlZ zejR(hu%)aEm~x^2IPYU|!LqJrtDD`9s-AXv66*FxC;RAo-tS(UElzxJla@6y-kI!S z8yXvPpLhCcbC27a?q`oT?7ZH)E?!=_hROJ^hIEEq_n!sk&-QsO@3tvEuj`ln|bERI7!9L6L3yd zyE(CG?UI#w-z4vUH1wLk=9<)jxI*rU=eE)GF~)N8t6AmJKJ}YR=EOqjuy6&*lk5+kXlz;ho-l+GAdw z-ifVEQ{E*=cPC!%-fw1l?^3&|VXUA^@7!%qO(Z#sTr4G(b{v>KP41FdsJBtP)SL}7 zc1UuU2~E0U*T*0C;outH<^ws*tQ=DwuAK0s*t^+%-lv6AuY59jZQSMWIhAL!%DKIs zOVUEwCjUP6xH{NipZ!dWgxq7Qe_F(D^qcJKKhkSs@W?ZxrlNJrYKQLrwda`PvtmVp z&huRT{^#5e(KRaV(!YOZ+Xe6lTTcEq+sGug@bIzK&eqX^6ZKP7_x8L!<-1lrM<->z zQTIF_h0y-xue*2NJe@N^Cf#&WozR=f<*Qm*7j8*C7I<<_tIrjInjh~^NeT68nr!?0 z?vtys=N}i>&*!4e{!ja5cU}7V-(yl8T!nKVtQ1w;y?fh*9S?Ma^IbQ-5ZhgFVC@;d zw@uGAEB&`|8cj$)o$+0#)-K`hwWEn?-MfXCmzsC9NXwcy*@L5cSd^vuc@RXZE)Hhbq%PdSf^OW)`I%wE5;Lv%NbaO1PR zab6YwOcd3&Z+laE=*OeUGd`JL^*^?^r*Y|3se2lpkE_ep{Ij>)VX5M0)Y#{cVeEUk z`fPgLa_I$MO8XTwcUHu;0pBzC_plfx}1 zCbP~;$yqRK_qvuwpGw{R<<}N$eEaIf8?UT%g^LkqVggqd=OthG-nst#*-Jjtrff{@ zkW7}{aOL06o2;`7z8ME3N47G?rT4lUF6^7!H&xpCRK;OW{v|$L59B6G zWk>H`HmyREBR#>*?uKkmg^OYG-Gpq3`x(BAtd{Oy)ABvG`o+4K=Y`*Q#NG|F`SQa> zjCs<&j~8WqYYXT8U#PqIXuWdI%DxZF1-uTJ`AtcyzxVLao18GoZ0qvY>G!*i^q;%t zbEVi|Vu}7&d+sOOZFiQO=Up4b7@~8cfnY^q-k=OR#>>amAq)|9Ojp|?9T^%ZP~>Crm>If z-Tw7HM`ziwsrOuT^@uQ2Uim)wt$fhat?qTH250&-6nwKTWnGK%X!M%>nq#JRC>niV$$X)a>3*O|w#!R{Ka=Obl2np+ zD67fYHvRe=S?}%Xd#188uI`9%&-|FXYf&a^c*@_N^bHjW?9R9C<}{exk-Fw}z4wg3 zx5-b;HD6!qvaG9LYsY7Cc7JX3s();Ej0}zQ^y3>PqTlz~%@#B-&@!!FG_@&g8N24I zq?+GcCW3}}?7zkN_vAC=v(AY3zR%K_UfS&YRiON_^#$fPxjEO~oh)&fyn4x_Sq4?J z9qrclnxy#J`=6V>q|fL0RgT>rNAAUa)A60c817-Q=+;Gx1wEn0NL6OWLLhFdI=AfDXL{{wV$u4q-N$cUwxt3 z@7G(rT`yElc1_S(xwj~>RIc+2PngK=+>HDC^`7*uUD2fT*Jz3Bxp~ZPHC*#IDO)9c z$vykD^u5~TX&0jZg+xU9`8cmCJl%Bi^82i_m9uhroKfU z5H4*H5B6Nry8iFM?k8z(&k8;YruNP}VO6+E^_PE}>ePP@3UBsLIa2iDfw0DustbL; z=gSExe(jtQ6~Yk1takU=@(HItKfnA;%JBZoncj_V}4C(f2DY=x*MX8c^jm! zJG#S9FEn{y<>p1Q(#sB69-0__>%+0e$v)@#zHZ!^`y}m}*QIicg5W^Ll!Iy+)A}qP zulfDPF6Eld?K!gj#!^bZ?>DwCTc2=5DZDY)lxfb^70tK5I@vrndQ{--d~WB7XwI4M z4+y7bXEk0A`y%>IGdd!a|D^8c{DnN052te0&CPSMW__EuV9UORCnU{#-&nV^1s>4+ zYCb*Zwq4}ZPjYhR^1ULzPHyX);daP=<&u`ire`Fst-q_aw`S}8FE6z0y%IjYayca$ zq_TR#<@|XDQ`hY?Pn;Cb6F$T`L})A_-#J#N#WB$ z9~z#YiL_*U8ohXx&p)wybG()v>Dq7hS2ulMQt}Lwul7q;y?rfIGu=#~cX4cr*M{$N zdf7eIr)sDcRm>OF&YSo1K#5-Zq>U5S?Bi0`X011w;j=6D-K%nEcIivsBIJ64ZbY(| z{k)@bVL`&H%csA)_(#U)m&D$TpH_A=ahkg#pBjIqbFZAzw1W|M(n1=Y7iASIAHS4$ z^Q{|mVw-7fE%)rAQwQw4?%H*1^e|(7Bh^^DUqWEQ15Hu;*(ql>1%`HL{A*`myB;#@ zwO*WvM4jdIw4Em$b+&kNS$YN3bv!&6$I%n?uGago;M3Q;n-)AXmuWd-Rp$BdRbURGo zDK|O$Wx}_odaY&B_U9kDKXnS()Vt_bY~gQdulf14Jq!Bh2R+)o-F~aAOHq1K&(E7j z?y_kej;&6+e5x;tt6ZO{uqo7`cdFSL=GebqodTGeBQ)-LHWYX#P=J69@8 z&DFojQXFHop^NpA1ka}x&m(`Vanp~hoEYJ@=1N|3^A9hJ$B(kNmrE9XIb6L}L2Lb7 z(Qh&Lr8^^^zqq|SHYy=HTeI3@Zdw={yW(w*s1p;Tn>X>=E`I*@h|G-xrX7{J9p|Hj zd#4vo41Q719JpSO$MI8z%lVv>dgfA7mFIJZ8$8*SvTNDi$L3wrv%=&itMQ*#;{I-= zqIJ^LZ(5|~a({EaQ_6}0^X~hKi9Vn5#=3fO)~juN@%+-CYJb1IDHNdedbPmuy!VpJm%ZK@$!@Z0qSbf+TZpr zvfz?%4z)aXFv8`?QS;gzp+3v3f|KvRT600~36re%<@WV+JVRz*wZH2Xb3D&n-lg-N zN1&F^BVEH%@ulY77V#2OzcAgG70~*U{`y^qPkHf&fL-r7cZTuo_CM0bzlrzSzIj8 zI1@2z)9>Orcj_AUElhuY@aD;l%tmt-SMXK8`M=@L{3|c4Z(hFr_{bXJw*5c#%i4dG ze{?)={LP=cG)i&Rn}72d`j_si(=5zXs^Gbzrna%VYt2l-8M`gpYZl*%yEN5XIqS!@ zjnB5P&Eb4m<1t(6xwYkoRd>D%>g|{sy>`LB^QXHevz*wr=lPttoql|ki`?e_ow)XF zKz^sq!$VhW4!qZXw&jG;haDk1mlqIc_u zt7gbsDd)*w=y~p3 zQ&&9Ss5$9@;v=rzf7zV>N{h%Y3z@(9(VbP-pG#f-CcH1>!BfK@GgqC-&v+>0UvrXc zIeX6PB4$osmDGDB-u3Y1sZOwWETvI@NL$3U9upKWR9^O&s~R_ ziJIS=cckq0ueq}@F=C(Hs#UkHZL#SH@ZXtuIZP{q@6F;La_xp+|Cc1k-k8i7@IQld z%9}g+{EWGq18XdT4nMf?Z|#v)c8k?_&G@AV z9C&2Oc1rL0bzwoYA>$YTV|GoZ~6+&$#C>2_x_w!A&8_P>%T~NS;F`9{db>>Mgg1HDj`2-nlu}8UUpJq% z=z#ZSN3WD$=9{awCBI$2P|JA1-`MWkWxNR!LuPWsJ#mjc{axtj73JN{*QEBHtPc`@ z#%?!h1N-+I+aA<87VxLD&eLK$Aah0TUh@B0nDC)bX7Z|JLJ08rtb9Z9~M2HJ1tRVYV@z0Tk>`v*yXh;`pHGpwp5APM|7D_ zU%K&A^UrCchHB0=s->xdr=R?Y+uOXLZt+Pa%kArqQ zu-J>c124Z=!Nl=+N$aD%cNf~d^qIwH`gX(LXDZ(|>B^)rUg!ShvQfXd+BwkMx>SVi z=(oa?Cbx~>a-EK=+VJ*hPG5PqU!&2hM#o7LV^lgf%3f`sEb8U;NlmC=`y7w^{H*^! zYs|YaH{bj7{`_rn)1r^pNqF|u>{2uO zg%;0`e&^i1f6iX3K*kr$nZLJ%c&>{4{q;#kdhF-t>N-smV_t2XD48EEp6HzLqvG{V zD|cJot%rV}+N71S!1=B2>7y5?gz{Vpn0@D-(X)u#EM_v7%BEPoDQI??tIOGHW&L?s zX880-{aB9;ndWonOfD5*N^LNah(BWSOjG^+flG(%W}L6FxOeZ>8}>bCm3RuY>P>hj zU%J;bFYhs9@tRpI-mCpRRae@mlvGSwyX@MV4ZS-3GrE>XE1do^NBG~$^gArfW)->Dj^?oA+Nf-q$qm zh}w&n>zrojti8AWc-oAfmtS-X|CxUMJgxOvUY(47@29LR(R%)+SG1>`+5S@KV`y`& zcXr*nsVioOy*hq9%IwRxt_Y>tCzFpd{p8Nh=W1)Y;C|}4mqmSgT;&)sWjz!Q9QgJnb`o5o#@((96%Q?9Rx78hE(!}_yDOYy7c zzXKOu6k9$2J?}?_JIRxrwTkplGR)13pHa!U`Ub<^$H&dm6uW2r-RfLW$z)=0F86Dt zDSz1K>&w>FRQAoi_NTw6&Eb5*F0LtYlBp*PwiJdmy|jo6Uczdo`sq*DR9)|U;ojee zp1pHjEVyGvx*CUHTD09SkturXj}}IJ>+qX#VYi0w5%C+_8y7!2`{zSf&!HZs3o|F6_o_=|JL%+|<$%s@U~UB1+!> z_{tx6|G(<|OX3TH?{EkaDJf6Th;+ z?5R)2mADO@&vyCcrVE5EbMOuc^S7AgT#zv9dXK=5ms-9tH=^|#?;PB6v*Od2JNx%L z3dmfWe){8VXT_}w+ah1%#XV~F`!{AjMn1Y9&;mbiFy`$-Ew%R^dr`p&bnX~M< z`G+EpSI_>+{adM)cZuIHVZ+BHpPet<4R_`A3m!OYe=5cI=Dkhdj%b`*v*&qzx8cFV zY!edVxDI}4KbvK=v8=xHb%ug~y;WFH`kAoz?m8wyR$tt{ZaBOn$g;j7HQbL?TXM>S zW{Jd>4@y!$jvl(hCbi=lZ*Zc$2y@%4rL!1$BH4belz(Q@dx>A@jQ57}8sQ&IyZO2q zn|Y^RYi+x>bWOWYPyS?$bA~!>)>7QIg1lR|{gmETEL`Ec&;I0|v_Ik!?XGee^nLL@ ze5Pr|<*c1$vrFIY!?m@ERJqDsj}zZ+X=e6Yn797^EMkyoTRJI zxaZR(!Hefgn01Omd9$t*_AdINa#B!1Z=GC7_MBK5XIp_SFI%5DYaN}%xn#~f4~w=Y z!^z^ugR(+zu36>3j^$v`vv13~8bA2{yz^UW{j#k-nTJb{&NaWb^>ujQ)_Hep<=90Q zef-h8Y&$W{pa&#Dd9FjVAo|V5c`^q&r5ucY)(>t>k-<0@x?b`RwZr_O?^s_eo z_-U{uttIK1XXyjczP;Nwr{8#!Ak1xf+vA1gv5i{-7n`L%zHL^Y9KJn%^;YrLv>j{z z$v+Wc-gx)gD#O)RAI)9oX}cz4y7%&O-YrarK6mUr)3Nu~j+5-k2c|sZVLU39WWiwA zerEb?Ud2t#g_9lQ&Hre>Y1_lxc2sfeVcSKQzL)StUo)1Cu#n?>upwc?Ow)5`D|c*q z^y7n<;(@e}8Ye|(=+0kL{h-sUj%Rn_{l3n9Z&`xxeh}XvyuDQC<+hHmFP8k3<U#k zdb)Jt`fj`bn!>7a*LUI53pyWdHm-m2=SS|%m;isNLnkCkZ|#<5=rDh<7~l91L$JUMalVJA>otGUX?Soj2>ZO)L#AnQ+l{aeyaFB){HF=D;Vmh>{Jh&Ysc@uX4-d7eG|W!cSh1` zzkQGKq_4h`y5Py-q89s`vI5q#?@jpo=nT8fyjB6mHFvhpT_horm#cNJ$Y1XGgR1t4 z?>}?;d_4AU{c+W)y9KAMl~lgZ-N^b@`ICcx;Hw8O=NRhFFE-!I?iFdU?|-aDp`B{* zW;Lk|uUIXwaavrwo)~_C-&8|u%ai!0nK4^+u1IsUU3@#|eOH!WT=({G$DCw5+rpMk z&^q#nXR4QK=%uNOJ~?t1gLi2~D4DAj&E|C~pCD<-Js_vEBA=dbKK zz#KDgUIU97pYNzHVlXQc*!o zYUSY<4f}6j%nflY^dvT?5jzdSfstbek^5C|q*H>*ek>;q@n6o@Ua$)M9 zk{L3`r6d3K-*ICv3X*&}wa!arLqTn^Q-bUK(3ZJ(+?bRPzR4Cyd|Yx!>15yLr>RPr zjf>W9&R-yAtN6yw+v<3$Nn|Zc*O6&+^F+5FZ|T{6%~iiJ!LIY_Rb5fRfCgjBPto-& zZY-!M$=iF$NUAgH*zc>i?o@3pwUOG`_f5P1#MQm6i;@o{ZR8i>{uZb3byxmYv%Fy0 z z@A-#Bt_DW>|9r=}HlSH-a#7I?t97e3MrH07vZ@W@cq5_RD1PX(@a(Lsg@K3JJ8jl7 zxbVE!7Ynex9zEsGtaYlja!>EwO}?&PpO?byzjE#g=J^YSuRgstNi4Lo@NHUw{o>2)oh=($#Qg%f z7WtiaKX+q};Uvu;)4J+4rEYM@E#SVA_@KAucK?a!mdHM-J(2g$mRggsKyKS7oWQ#cOLuC@Yi|I=RK2zql1@E`z9IL=;pq0nb7ogyJn?SnZG~qRN;O2 zK6Y!xtX;zWn;K z>I@0?nIBfl27lY^QSs~R{#CmTEZ8|0*S|eJ|DMIvsW};5%L_c~XR7ZpY^dXLFF)%Q z+Wjgv$!4-k?f#GdiaMjNEI8slBgN~=v8<^t*-s>Kx#m1e{HyS7bI+&Fu+)@C_g$wf z`VjtGBEr63^4|B?VI7mC=U0U}?42^FMswAhXM8tP-fXJewd0hwgoA%DBoZ0x+;)2+vWq%|8+rMetu)ynI)?Z6= zsX7j8h0He2CgDT&yfHQ*EwdWcuf;u6mD$G`Wpg+Chqv&hoBGNhl*0Fzz52YWbpK+( z-OD!ITOE6S)0BmAFQuKdA)RhQt+KhdCpg@Kc6n;G+ub)XVsg1!4BcUddC+{ z(zRIX^Z)U;g=%ki#+`e#An20$sqWohlXkzIc&4e)a5PCUM^|aCIvsGPkL8)_=t6mWH z>P~b@S2dh*==+YEW$(6~vj4Ee;%}v$_LtWWFP**Ucl6S;6Q6jWuc%?1T)N!rvftFe zhguzHPxyD+ zeQkZmmFz8`9~inrV(phbRar^D&hfe3n&YY`C)slQdF*!%?bg8R67g7>#4VMdbmxk^ zyOYbGT6({RueWr`gz^<#dT^lsnN6C=0&X>>UGJL59*8D7_EleNNa zmme?x%1Yu=UW_!XXNV)d%?O_wyPM2ba3#TZwZcndw&4$g^Qb ztX41cUViAuJnpR-FF&SS)9)AFKRH75)}mAH(=uknF1+(4LSRaVVO3(=^+_yJCojB; zVbNIg?NDx`SlSz2?ga&MuO6tdxK2txGr2g0_58M-j9NMJkF1ZaD*yYb%nOcbOT_`onj$lI`nikE)fMKbi~edVVPN#qMiMit6Uy zchF}4BAJyNp!7nR{lkYfDULc1eHfnwjm1L6J8riBib*udwar@X=7DkB$f4Jt|e0=+4yUB~^ zEf1$}li%eg`fuUA*3T&)vecI>wOG66rp%&8LfhP47VFlnWU}Y$&9A%0**krm zsFwWckur53vQ8b1m3Fze(%&c}vLswf$nf^!ci+r*&HR_K*Z!s2#s^*;6Fqe98brjO zSrb}!_mtNS!_2^`0z3;+b5{3Gt#8X&wfgw_!t+In1<6ubPSUemCfcsgjd>c+%OcV7 z_{60rpA+r=rno7d*L%F#@7C@w3%7~R{+f{8{r<*++d|PBtgi)6vpQ|oeDvX*w5YZf zI%^oad45#t8it$oaxilKbPV)7z1eTm|GQsi_*N&MG*+E@2> z@o~?b+ftz$Kd!dcvVY*P@LcaSwSQ}w8t+@IG|^&BcMjILvdDMJqIy@EBBMsdsNcrD z-@2R*zAAZhWP8s3{zqN=mwmg@HG#3i{i}VF{`q=wtHnE#*UKHRWSS}%b^LtG$$~u- zH`YH1lL`7Ug_k{r^JdtPm{v{o}c>U_^Piflq z58v>a&OCUTU-AC)LS6A2M|rBPcUgTZbn6ayXC8EK!(;9(rVq;Y9+<=XVu#Y#Z5^Ga zCg03@OntVyG>qgUOi}tai4=p@}!@_1g zy~;7EL&Pyf|Jrq~hAXL8SMaQTxFB=Gf*|Kjw?cx~AKVw~9uxNE-YNgc6p_c%Sv#Ul zj3$4Nd41x5I^)F4W>GJS(sk0Z^Zl>IF@zU+YUORp{NkDS_~q=KlA(z*u7~HB>21hU z*?1{@vRUYU3$gj(qQ;L?wP*j1eXm*_6215P(uD4SEi(&T4rRZ*8T8Tj$b}y_&rH95 zt^7-WFK^(N4eNa5y>C?LecO1h^l4Fb;oDOzYx9;Q{Ft~`ev|SQ|If7{u@gC$?9ts` z_G*^*{3CnSj&X~|^rc74mYO@CCv#b~uGuel_9tE13oqB7SBg$CnYVq@>pniKcYk(X znRPKx<&2+9Uv@-XO`6SunXgPm|CR(S`}5?7>5<;NtS$d*u6l|~bDK5IyXUiZ-^(}W z7pg3FYS4U%n}Ph1(-9fmz>sGKv@5 zD28s(VP3KN-ru-XN$=f>hte{oeWGKtCcd>2Td?LM^OV1#5% zSkD)KMl-wc8y5?L^?%O$eY|ri$I~+7W4HC9uRN>oH&fQnIi|KY^Pm5f0FIR+f7#BT zsgY-X^7j9Bb~b_O)+Y_eIwy-%S27f7Ztr z!s_kT`$4;URZheo!8E$ zwF_;THSN6%zg+cgfBt3nsZ`l7I?0KvUQf(lC2%zM?4*L?=h9abce(viNEfn5b6Xm@ zJ^RlwU-3m6+h3IXdn9}{pZQX{Otkjm9hc1)#lw9si|=aGEtZz#>{-*utMMc1SMHHL zVs-}8&aHje$lvnC_0!V|x4-YSc1~K$`mJ}jmd*Oxp@AjSmwtJ;-s}G*(`$K;PiU#7 zrDdHr;(U8@o%=pL-tP^UuZPEA|??N_}qi>&v~R-@@$QdP!bThskz^6sik zKQ?d4;n0(M^Cvv)`2N#&(^T;=c7=ss|AsX&dR$!fZJzs^qmnjtvyVRK^hj8E>b1%0 zx)aVf?^{@B3QgT}>|?6$LglN|3$)&Tte?H%*N(uMp>x_BId=EYQM8$}d-uYO2R2`x z?Gl=BK|8bf9M_4>(_{ZXwK?{{dq?fX1wGS{y(+Z+y)Jn5^>5;5X1%Lpo$-77 z*7bz7-|zH&V{|&2cJ55-j<)}|LhB^YuQq%dlJaE1 z{{)vL&nFqTywy*H2dp}GxN4VxpWozeR(@$Nqu|`crP?X^|CCNEhc9`REVFZ~a$f#K zt6UlW%fj0aaTT}K-=D_Q8@zOaWx~QUBB}p>2nIHuObMTv*S1*sSfqPskZ;4WNGoR( z3*KOLPVFG2na2~(XuO^_bCvtH@1YfWamEaNGh-K<@uX~SySXQ9Zt&8p{ioBu8r#0g zU9)eR)2_WsH%z-{b7*C5e) zyExmgiHT{Oc^d5J_S;v@_;Ou9e*XOsuSbQ&%^%sF4^D`zU4MqrPs7Bp^xL$vS0{h@ zz3PdVYpd)2{2=)aLxfRxRCRZ}B zs?B|I;LGM0#pi?_UplRO`bTNzdgI!@?{E4ZGZ@`^H$TSVM2QO9UdLw(`@hXjzrvCf zwp#y3#q^6mc751=@^fuKLU;G{Z$C|&n^^o7i zxh>}L!bi=nvzJ|1ul4I@n)aI~*`Fn1eSh0|&$`g_^_Jm9zWWhZx88kmJS-=re@$QR z&x6b61t0vJtvhR8&m|4^-krIvnriy5efzu)c?WkLQs@1)yz6MlxfRLRjn?X1ec*XB zQfRx^y6G?Twx1TA*7ITC-J4SSMLVV}QcCUl8^6&>#CGGX7;9Id0OoB|Jxmm5)x8XO zH07ru@1p?otr1~KCfd7pi|)*q34gq=_H4?8^~q;^Ht;;Y<~f7&lilC1`A=OB8Oqtt zY2N+&)~Tf)!nuCD5evG@gIB)$Rn?pJQSZONTh-ZpGdWo~m36*wh^U;)N!ZU~8GYzx z0+-Gfn^=yu{a-cze7pVBbjz>h^#Pj~EH1va=me{Jo7H8lefOu=Fz^5e*IURrNox3l%L5r@rJtN-D<=5nw->$sS~dp z%eR()`>T?5_BR2Rnunj0guEWaCuo0tHIHZaksV8`r@doaIbG*b-c&w2gv*M4ioN;#|H5iZu_UI{x%VR&-E{m9y!|0zu=S_3rH7MQU;Dwk=jW@pp4c*V z!tQ8cEFpkmqE9rF70ZG}} z?o?TAuhwpSwsOsv0PVE$r+xEHF29^%{3G=1i_n(MCKge3<$2e0Qs-Lle7EaV;pJO* zPYPRkY{`4DWtrZ~eFpcB%w1OTZl!6Ce)`;ob#_-R(Xfz8(48U-J>_r{g}KC>XiN3cb3N{Q7vri)uQ z`nrAoI(2H}>t(NFH;V3ky6e=b2VXDu`1zd=41alX+O$6B)pJ5^-RGEF{8hWWc>a!@ z>LOdCmGR3bPh0jxYudw;6Sx?cRJY7Z?P)#yu0!nm>v)Y`fyj5v?DplGuVq{}3-&pi zR`f6bo8h;EXNpv+^-UjVdz3iU+1|g+cW0+HTce_jXIiS^##^5aw=OA8Kle~;MzQIW zOS5g)X8+%IqQy-=e8!t)CZ|%A_D;X7mGo1ICwbZK*d-@ex^=H)ocOY}dupWJ#zWta zB=xj9C_QFT*u{G&QtVO6nrpSzQ}@lV`|25||7>>Kf$)uACcWWa8ouhqwfrexUcWrm zzB=!C*q*)i4(yMQzj`&2DHlx!>w?WW8iw#MGOY!!JENp7|xRY=K4n-|+DIsR~seFEh({FK@|SIln7fIbO?E zCSqavik-aMB3Pb%o^LZPMg5B1iDw!rO}{FR?X<||cH4GhwYrFPF5k_ZRk>ZsezRxC z-3;*-xHfNFsNDOtTkc&k|2JdTn(xPwKJSx~U4K98^MwO>Z(nsSyxM#D@%P_vYei4j zx!Zr$>s-2ezO0@5`&)rY?|nOj_`>wL`ksBf$Ne|2f5s!N{_i}Ws_)c4{8a1pMt0A| zr^_nt_aEKgZ@MG)>Auwmp2Rfuv&{7Rxp~HAE!!n56E?<1&8o8SJfHS`>y)`C`^w$f=|-|ZcR=R`kN@@AYo9qJ|46vd%!>RT(Q{VV*0{j5_0L9*|rF)jXbIj8rK zn@awg3mivpdbLil?hW$t`&6ds@!-_A17#mS_D|ZMB31lxVJP$NgY)*p%+#^F=fd;( zxs2$UeAf@Ag=h5hk0tl*S!~&~<-hg93yB+MJSw|z_wZ^~vu(34&X})MczyrUO(j3K zteO^>&oMP$dFQ3gN*234mThCpJ@7x~aEmuv-ZndeWzvzS5?@ZL{f%{0atXhg)gKnJs=vJ!)Dv`ABx*5&g~`W`)-qqE4B0 zzWU|4KcMq*cHuqeN|BOfcetI*(;eoxtg-UCGrgsKVy#!vj|E>&N3h?!{Yc5|qWiM1 z-RtIm5dSPtJmulNxesogIkax3?hetGtVxmSTcf5n{C%yH`a`U)X3o;1Rr=YxR{zWU zmgbo6vcvv$!lR(HZ48&1K1*8W<=j~O@}##9XVIbl6JB-)KXENTG5b{7V$EW2vHT~> z+Hs)|Snh2wZWRqmU3qlXYaOq%-#0AVtu|%JbgeTBOLXMCTKPhIvmOfZ>~{Mb`{i}y z+?m1I25fq(RD;^$)iS-g%KO9G-lp`1tl4+O>g`^|^J$x;;y9@QQS$HLyFVTO=bzeUSL^-Y<*Y42oy$%=zL;VhWN}tsc52*rjctqj zRVs5s)RtT5Fum+Jk^0zoBST-_pJ~D$Tk{;PB~RXZTo$#}r+&}TSi{?Cr*GLze-szH zeUrn>lzT}Y;=j&T_AGUs@=;r_Apc|F;dq^%T}&3cKc=pBc`1KWjcZcrofiR~J1^ee zC)O`m`a3d8%6Y%f7M-V@8K>PN)w^yUx~OfL^=a3nAjNw>zAv`8_`jr$bziEns^;ZH zqe89S0dk6Q*4Hn5Dz&kF>-)AKGicX!mICv`yVwKn+U(hD{nh+6*X#Uz@q>ITjF+fP z_-WBxI_c|o(Z4R8i_Vriwx!e_dR4jc+H9tV*(cX1uQ}_OweFhh{ll+rn>6muo^*bz z&5>7MCtIHok6@29_YPFk@VI~UmHfPH$tmAYOU71SX1#sXZ(~>O=ZCGQVwGcqw(oiU zqvV=rSYgiU@^kuYj;`U>jg~4;EtZ~}AnKl1m@BqHY@?ghe#t4VoA)K0Jk935kKN|> zOa0a558l>sxA*mldyy%t^ZxlQwf#H8rT+HY z42i6oZz&3M=H+pzEqb^k?CJ}~wL7KKjaFosR#^NInR@2pO$WYTwdW^1;8c6;XPExl zev7sj=ZZp4uAj3`DV>~mH0Pgu^!@Ew>x?X(vsA5RyEHrc#>d5fG_!tXJf3&A^W%dX zODpPsuiAD0}$FDH=A1a zysl81Z!EZhWA@{3#|~J;%t>lr=&>p&n|r==M)l;U?+t=OX1PmTjCpstrDeSU!>w}_ zw z<-aF-AnVv-kG7p(WQ{L#d|rNZdCj_IJq7uF*MjzBNBOOixF}Vz-MFQ4PxEK%^iwnD z8>D8eUH<%su3O~ye|56kUxwY%gCZ>ht5TcHVK3U4B&| zT;;W`jGWC~g}qLSMmuiqo)ouwiqd9<&4FK~*3410yme0ZnZAm(?d`)SGT&@IaMyYz zV^Yzwf>NoEpBIKrc{lSUgQ?#0=RQT{PkNGO9I2Y|)hCPR=$4$r(`}v!FZ{dD)*x9w z`R6V-!v*>2cXY1)U#fbkO*30zUYNjdtyOo5E+4xm%FJV6J-sou_d;?0y`$H-wDQ$# zjpH95Flue9ThF;L?QKj@x2Dh|v)LwRts^_NcxUXL_0_z_u-U%rv!}p675hs4)_&)m z^ZD(+>l;kd=F-2lp(l==b)L^YH--C~NU$L}0!(eckZmo-Cr z#@^(uzRX)6FctHD-c>Wb>bmnYiO-AD(hv5zpYhyswe?ojef4+pk7ln_cqNiM#Z#x? z<>J*D##?;P9s9EDbPsP&T=JSq0G9{qVT?2LEHUUl|6FX>ybD&R`;|MS}nH=UZraNM`&n!sL>#$yW> ziN$ztG}^0u=C)Xfd5^`>uIPr&f9Jb*$V@$_a%$s4Eq$J*LzR09PKr@E7i zhvyfsdd=|jLC^uAgJ)%z=FX1#x@w_calZKa$K3n#ma?zJA3C<|9&#@(f?AW zIfs4)+-fZFacMm8G{2i+>d{MEcWu2Cd02&&?H99A;%<(=6|yXI8%=g}idrw3?R<5+ z$M%2?fnO&~P+!xm6s**sdptTuw|at?2glmoA15iT;*4eTm1_@Qc(z9=xx2@yJ-Rx2 z-ttGnNq5cTygJGjP2v7f6e7KC>b^VWe+*BY>XH28T(1zZ=0;p(s^0Od8x;OqNJwURkstTUgi4JxXbU8e!9@0 z5jBY~%c~|r(d)&*OX@RJ3JYR%V=|5`Tpf5Z!lbx6ayk3Ohi}?hLeeU-9@Q$A*xPER zm{)I9u+%h(Up37ra%R##pCf`FeKs^lo5i`jSTXB{SH{8~9p}Qu3#9FoO|M&;gaz(Q zJ-zky&KpZ=z6x_Zja~e)?TUks`iGwhnyO#xZf?)KuU2)TY3r5dg}zylW&gJ`P3T=0 z5wk|(^5K~)3QVk+rfQy5-i#~0uKYs#%_bC*jS+;x9nqh7OIEANnxDMigwFFhP6G z(YB)#s-i>}1XlFy-D=PX@>UE3*T-kS53d5aDKAap^Fn;^14E%$zCnr9wXT^ znU9P4{r-(-gI^f_znjN&=z8dfkF%8zhspHvJ$y7>eFbBA+Is1$HK_u^1JuIt-p_-n4kKTaJ1Lq5s##9+aK$f=70E$YCfpFyfVfAlk6vtBe$NZ zO|cPBpZBt-WncH=j?C9b7E9N=a8o3-km6XVjhEg`YKmp^1Wu%5eIv`XCin{2^e z)Av=~*PHHS|4V&(U2x^LXY-2;HVQUzFcmKkn;fsp{;>1&2748bQ@ouASg$5MzoRC= z8pGrqReSW-s>+Z0m!yL}{64AFxbWGWTbB}Uy!pgBL*w4(YugU4aC$d)+H((t@qX7JvPrIv%%cf@8G4~ z6~PRVFHc^dZ^Ib9On(2FpP%v$-pvcOZ`yzS?VQ^T(<>evILNF#N%Vn&#fe7~cT3O+@@r38@qWt(e?U~hY ztDe5=erzRR`*xbN^4#jFybli?4ZLtwzj*(ikb;x!ajfU|>;6*O+_(AizU2!WmQ)$u zIx1^fz2>vsGlN`nhO>uw?wP%p5nHhRo1X9^qwK5;#m7EZU+)PI`9=Q+Lm?&9)kDV{D; zcE?#xC(geAm+i_?UDPPIdD;p>Oj$c`_W@^NP?={O;=J@aAQLbfM z{P5t06$aMpZ=cOxx~^j1!`^K{GeTFImMpzy@m@Zhoy(N(65FL?+ls!{Y!5tp^x8?e zC6E5qAC^BZwPo8xGgos?>*^C3W!H^&$XAQSFL)I9Z(iag20vcG$8)C0M!oU1w@JA5 z-JF5{>7SgROS`{29n$@4(@mjmPs`-G|cgvW!Pp2z~Xm)DJR{jkif*S^KcHy1tjG<$p;!b46l9)&g5o$sKmjzpZ85Hz)gleDcxHQ{DcuN%~Ke z7vJ$GOYO+a^0H?PZ$x+OuzEKm;*@pQ|Lc|&5BJHgb)05CoypiUbbWX8(eH1nWxmyJ zJ9T#FDKjn^n|Vu>O3%yg?;PyomGOfjvr%gU9Pyi!z|Z;=iG#O z?yHwCV34`7xZ^C-5xEBU`lWWd#g)m6LYIGA%f7RYd%J7m9hb{1-$@kj{ulbRKIdr1 zo6VnX@}Jnu=n=PyT&uQL@!P}iN6+*Lp4#j@!S{%YhW@;(xt3?11d2TS|1>(kWY#VR z@6$h*csu;L{xMuF;i&qBsdhRO=JqGbygNFfeBz59t=w<(v=po(Yx2d8I7~YE-(cYy z<_D7lAN_vQ_}h_Dw(?$Yx$lC=EiY~!dw%M)Mv^G!?hkX^p*^7^X>R|VfajuSjN zU;n0=vFF+K+_gWor+Mt!B>1L&(R`UZ;--J2SkiV!R7_`GZ2rz>)-#covfBj|LdS$<}TKtmZ z@#>THWyMZC3F`DY*!thY_b0c{J8sXAH{z0v8Npi5*ZtsY4h_1%oIj<^f5N}{or!63 zRUaPhwN;!q;k@;0{dp@Na-7)9 zi;GU}HJ#CNx-f-f!PZIo9+R@~3s3sM-n>-#wo0$lyz958GA}5&ceJi%>Sw1ZNo=1s zPSh^Qo$mRf!u@9J%nXSF^SCzMTN>g@<=YwMkJeR8_4#>RYUyLun}Sjo1O00LOm+@` z@xLwTotxtG#RlKLMh07F8uEEHPpev0^mT{a)TQ>1{=GCb+cxV!j$mn}cwKd{lI^pM zOcC*&bsi6W*Sub@+mWR4zI)F9jVom@N?9JyU#K7D^I2;fX9vfd+YEspxJZ4^N4-{7>q_xoAFlS@^06wId(|s9%>JCmVYv=wD~ID- zudiMI;UCxK3;%CKBu%QQx&OK|hGo{>=Vr~i^Dp}UVU3d;s$Ngc zb*|55=eoPc|B!xWhWEbPPuZ6!#1&ky@KlSnk9ySoZ;|{jVf~x0&j06n_WxeEtgd}Z z_tts-ebZzMm)<{hWB2J0Y0vZ1o1RFT^tW3}ma&Fze|xL1ehPQTqCRPlwMSTF=%#p1F-M!@A%(XQ z5=Wlfbo^C}Osish_47n@%41op+=j*3E84}Mc_d1kbMM(Cn!JW%8B+!CR@dE|ZW?L7 zuiG*~Yt4bg6)z4fii=M-)0!owqpYH{jfp+@p%=&L1E!4@-9;BNOuy?r4HL@9`0)H) z`-`QEBvyHGmJ6O% ze-!ncd%d}Su12f4n%u|LfQnC%@;s;c`pM)wyD^JtBYizoOOW zzLg0iWoxz^eZKed!LW2&$%4<1OJ^T6^IrA2W7oE;+dSTs>@I!FSHB^wUuX7>yu-^P zy|#P|Zu=*Fs607XIW^+D+^YQw^GbGJG+dDzdepmTMW@pArpfD0@jegHT)Ib9=9+)m z%cn}ByM+g}eb=U5uJ=>ZgTx0*~ zLgcM2b9_wKOiA}@_dIbqUdp(AvsLqzQ-YErC0)M+T@ClGQGaDpp5j`tXy3!oH**c- z=G>RBwz;Nr*Yz4(-NJ|eEHvl+IyGg^lIeS17KZX{PDwGzS19}zlq7fb1kaucf)jeB z)%H2aa6LLGe`fWxY%QIc_iiTqeOe-VJ&woC$F;(tPT+jX9kydaW|b$8Z~U9GeZS(G zkfm3@&YZtLG$||imaJ{v`o*^oZM-_O{Q%c3vjo$FQpXej=V+`xb9Z^h;%fqG*CuQX zZp&?Fy$~CD=6d2$BTcL4FF88@hsxb|+Ewj(`#fW1czL~h`t`eV3rgCVY@$|HXPuQR zPi4L|OI^{sefjs3udxaF_q}S;W=6>(n~_$Dgm%eUSK@EiK0|cl|=w?EHJzE_mIa{Q7gzkDGP#U%j~_ zc8&L@8Gmd=+=HA5`AgNhTN<|(2A$C`o@U1SC5}5cDR&1~fmPumnFvK&&Qk|JWW8~j zGFNe?e_z?#clJA^ST-1Q{+_UWlIc>u+Q0hCyj-?OJXn+b^3&(#c{Wik1)i8(7!cVf=sGY?d4PA#x0e{k^b28;EtSnhtk@1AnS-*&guk)D#s zt^3uE+}YElJe{Y%?9{21kE26pTwM^68rjR#HNCuk`hj;l_fDLZ|C#H@vmK|JLLaWN zTWcz^EzCwFRbKg&Sz}zkY~Ky%We+|{=Y%dluW@n3-YFSBlQr*bOMbvytUYzsw1U~G zNe=7Jt_@f{yE*Z6$ozj(mn^K9USnahP`Kpk@u$iU1sUYt$ni~2zI@tyi+2Zy$iLYv zA>ZHC-74)VDM?KH@k;2jXM&5K^GheKM4Mij-Gwt}cbH9G>oCJ{AJ^Sa=Tqlhw3+ep z^V2IN{Adz8`mW;5ZEsGUQ>;mLt2|$c?L2d=Ae>8H^zzU3 zrV+Png?|3qe8MldKg&v)d2;>A)!HQsl&0~wPwC(HivP=VYp(;JI9$FutYzK)^Vfz- z>F7zbYx%yXrjQ})+i zPH6p_V>(eYnMzi0et#ye8-F+{DQ5Zc+%sOj=HWM6c2C>nc=GZ4#peDkJ}0+dxENR0 z_I`?Z=NbcMui*C|x0g;?uqLbJsbsoWHuI(1o6{I)f0*a6cfaAP8HG82W^o1vW*<~8 zndPjsu7pignUnvv)#eKm3V*r;TBgs|lD#Z>(5H3czqX@#5l=r=NEshCF4%f}u>|ML zqc>+b&0Tlx&ku*`tVKT#WMq8s9<+tpQC=Lo9?hQG&*|RX1nk4uz&0L zD|s~Et($rEmsj$l=|>``nZ|!L$~by^IyHV7hAC5)b%~aOHKKrK8tZ~Q=5C{KF zi21f+*2C#-j-lryl@xs(CdEno+x-0YZ~jlB`%~9(x*WWpIw83DV72zVLV+`9&wh;k zy^n|I@!XFK=Kq~HEw|-TMcMY_37oThu5`;iYS~!gR=FTbct&pj$=b~H%BBR**;`oe zacb^ZIO%S?@-y4n>+^mot>pRiV?m$s>~(6p#ryt9o?d2Exjp6btt&JBnsVM3fBv%T zzMsPTe$QCzy-KWePJ7({onWGSkwHjj$>H!rQ`~&+9p80Y&0c2Oo~;SG6CIu;FPrni zw_xqQiu%4yE3}exLo35m4%(}oHeZ*dXt>Kc5g^3GLGq37H9drha@HL_xF`}X|of2+n*j}|7%Z~3?2^P>0G(p>x4Z!cJ`+S$2E z*XeF@>bh52(|%u{`~3YM{n*^^;UCYBj#G^UXS4tRpS4V0(&l zKo##ghH3Eu*HpIuwmc9P#&fXZMn5leRoD~t;y<=Wmjrr!kvbmoq4xAcqYIkz;y70x zdU$~42H!1jDb47X6Ne%!Y_yK=X>OS`-_aq1dp(=??v(P9MNhgTkFr$hO^lxZa#MRv zVR_@fv}2nNb8J6cm!tCHir#;pS9hdB%`_4Ic}u)qNGtN>jzz+MrDe}4Scvam>-N(#?%m4G0^AmN}&hnnh%c>B4>8&3YZdt%pzZ=F^C1vgVH?_3tPu}NWK z*q^i}W!b~471}p1uk2fQ+Ap+p$JumEbN*lN&jr8y!>uV)bzoAjo0-ZBC&$@=%lnxx zK7Uw!`mp`g32JluSYmh8KlhW6k__m4%^q{|lCxcps<^qi)!AMzw$-aLyNlj(7c6M= zDZaYWFTJVy`{w$ckC$!{&MvPw>)zaW;UcT*)UrPImzJ|UvS-Y7*WG1u?e6#A9UD)c zRPOD+S6_6>NX8{@q3XpXHq$%bmu@KBYJXUDW{-&3EzQu&(KA{zxck?8tgva6*t71a z%g!AO_SZ?UiLX2A+LU+KPdYKPrgqEHxMs-*0@rytr?$*;ka|8bI4X4iv>2s~&lPi7 zKLvHoRgdz&!CR=sRr2~?kTOfYq< z`~9{+P$=Z=E+M{mQA;YzSIpdP_O8GyIl8ycxwdxVVPoE-AJ>W zPu!N?Opf^}Oa{e`XE&^_OqIU$o~e2Mw|865P4;@rc2m@!OQm$j5!wH*9ycAFz{=Da zkS+6cU(UhJdjf;4ORBYW4<0XK+wvsqywS&BB@d3z)nkmB`A6;J4Y$+5S$ckRxpHne z=id3aetyVh!>+CXQNtatCoJH&kp4PD-TP=?+Rm$mtChL>I%5(oHf;XF+9psd>=N?z zU(2aKZ)yXVw+cVEWG~ECV$?klJoT$0??u_buxDFdNKbpEZk6J7?&|LrP1c3pXLETD zYbH+mH|gp3$W^wl#kQJvzqJ2!^Rh7`=ga$(KHZr5aNnoK3kR=Oo2^V%GxIx6V8)Hly|K!;VwaIWtuQrwQK@ z=3`a0*&U|s<%zeBq7n67d$ zs#+)AT`l<9<>Ovs`-ZE3r=>4VlZle?$T|05f@*Mg_U$K+=SIoCb-A)FLZp1-3$>(o z0Z;mFOnS9ywf`%l>YQz*JqU-H~Ar?e?Awdy&TGuvBH`7N5!+g83Yee&%|X&A#dv z>T);v-jkIa4};Q*Hm-V_Z>}h{Vd*aKMIjCEZrE~u5>cNgka}_Ey(falG&(=lwAbdG zIFnzoU`@!fYHi!qhuwb7)#%z(Dmia*18df=+RjZH?W-S1tq$6`zw+Ar9VdN+vtBqX z$t^0b|0ulg=bOowQ>GXk)1T`!!If`;(aYCw8jsCb8~EX|p;W4dw&;8tPWv$DejD4n z{rf*M=`9H5WWO{=_2|yI;@@?90@;*Rd;MEe=Wz0dZmgAeoOE}iX;#X6dDYN8O<7a7 z?aVDpQ$Dcc)SSJoi;55A6!M60_r+}v5S|jvCU{LJ`p=t~nb&5W^_*gPUYz@7aMS+x z_h)F`ESH!Y@F1aMMX}-Z)UVZbPmX1lfBaIh?c;ax+r1~0=6byT)?2e$MYvc#Ie&N7 z?5SJ#-en9t@W}1e^?Wb?F28k3RxUxCjg2K2<@(LOk`j6~YsTkL={L)sb1%`ls>J-m zYjGt*d*1wrh`S4ALRDH7iO>xB5( zIs6TLXHVw@Rcfs{YW#20>UVZiT|Nr@V3cQCb5?$1BQN8h@VNg|pY_!R-bg$s(Bc%M z&nIVPAvdM_NOfbZ^1*dKzb!X9#PIu9qD|%26*+egi!r$W3cC>_xUuT}v00@lt}{}b zSZrKdUULX0|K&E7arcArhG%2S>_UX3A*`*iC zC-9oJxT|H-$H#goItnB-rTI3^xQx0<-6;^LFZAF}qdA3Vb?7xPk3F!N>O_1_QY znU;y_)V}|v?mzQwsBzdD7VdYV|CF~lbU#?YdSIjXMgi?cOV^7=$M3ycpZE6c$~7v+ zHhYg3=KQv^-x}_iyRdHS*;S|4PRd@DbMc%h=ffky8h&SPv>%mwRkL)y!Mg_CPd{#n zna8zf-whJ)om=U;D2s2WglDg>?VaqJPwCUwxv$+;@+D)n@9$Sz*RG0MV6kn_3<-mu zGgaTc`MmhjY1V>uOr|sQDyO`8_bZL(uHcQJe+w03#fsF-*D&ZE?vHp-n7dA|KQ}T% z!!eEJ!+pj*qB}1#KP@{OE0N^Jkq+q^}kt|#>Mbufs;g<{2%pko;^_@ zc}aE33$05FN=%ndOlSEWq{cT(N%V}YafhmS%vR8s- zE!QvGYO}oVt+}!7&$Oa#r*4aiwaE6}kzt+VtbNO*w1;Qup?ekEthA14t}U+@j$ZBb z?eD|&LNjiES;4Z?_(;vm5{+*rw(i$ePMWaYDLueq*mq2}a1NJT`updlvs~ibzj96# z*s$|f@V$Lq+ZKtuTD9L&;LYFF@5&OU{#2F8E#SE7Y25By7`IhTS**L2EBU~q;#Z|g ziFc-)x!}5gde{NWyv8GIHbh+Zn>203>6=$qb=95y?DJiC;nm|6iFuvwJ0>UFwzWsS zwRD(vGW`BaZb=jG3A$|OI?si&X`J5_U9LX&mUZ8E_VeBn+xTzX>abC$sm%QszV+gr zpI6Ek7R&UDXaD1#r{%qA@uw^Ci*4jqG@jzC3tCq6$b0k2?QLi8-&tU`Chkkh#9}w^ z`B&T0m7nEihP)2ft*V-kc_1vx@sVlmWf6%i_qFHSLVNZ}6Zx_c@vd;0+<_iyLWfbk<(%;G><=-Fm*@R-A~(pt36FGj4o7{KJJmtvbjfT&AJGO z509=#)z7{+@75OPX^S^LQVmgg_Ijq-6kC~DYqD4M9aWf;{8k~^^WZ~~jn`SeA2$6| z`{YyRxl%6O&o)a`F6;Eo;G7omh-q!bbg#&l0c%_M^gTE3JoqcptH@R&Gw4mR-ISDD zeOFEk+8(&#>Ctm!k>7@63ucPWTy-%jdz<^BGrWFcUR#uTof6p-e1HB9c@qA(K`?Ir z|J4U}b$xR`@^Sag(B&^T?%w%PVzS~ctJcQyqjziLgJxQPzqszo-8HX_Oa9C=5jmDr zvBk_rRWtSDLY0WbC_S-lr_QL&dvwpmHaa6<#=`Gh9o7zW4hdUc`Sfdg!=LzPGdG=o z`fHs=&xs;Mzu;fmQt6pKc%Q`KBsi#kKJPi|3BZio7IK|{?VH9?)1KhUzMVFzir*L z`)8*6s=TK1$1jRg_|gx|{19n=ar&RAt_Ax&1n!*Et=Xk&G>PlPwT8MopZ}c>y=l(- z@%O2_@(1%5Ts$Apsa@7~K|D?FVW4#Q)AM{S{N``cm*yQ1`JH`gb(GYzi_`ybt@|PM z(f!{E`%m9EzgRzMnDi^&<4xzI)+f=?viq5I7qWKqpR&w6*rg!mG)<(o%CYg5^Opy` zd4|Dj-evm+dAmd|5S$t#6Lf0R+M?(3l^g;BTsmfrR{rPMOe@~2?M=M-ltahgT+Dnq z=k^JIt2U_@o0*-~4>oPN-m}j0N=Dl8iZ7~vC%=8V(l)fYOLeVweC(3si!Wwno^MGr zd%pXQYUiHLDR=j-c30=R{Pv!Zz?7%&oWB?p`N&Gwn6X^hcJASsL)}VK3gbANRLxH{ zXI+Unpx)N2$$6$NUUjdg)9&l(4OL4dwOK+d&Uanh@TQ<*db))7uerJ>3af$&pJ}Nc zUq8W|W%;qRB2!maR{0k*GPgX~+0f2%OzhadO%;E%|1-=qSh&E?=iCZKc7qH1FNE!7`Jd(aEuMojas$JWQ`dKFj60ex zeC)=V9YW`gRsK|5Jl0rgpvXK$VOpb{!1wqU#V6Y57beVhXcV*)(K2wpA5qH_-pQ-| zXM%M*uk@~h&-?x>KTYpjE9iOYwWfRm%Zka~M;5SEPP(=3@EYczg_7mR#94D~D>L3N zWR7$eefGz6;QiBI4Hzj16-}`^`#rKlUCr)nvk>%y1aKt+DoA=2@(M+PM zS|Sf(bB?PPe3j>9x}rVfXVqfowby3s_&+6c>w2qO)_0UPRz}=We89}T%yIM8tqRq` z?{-Yi6#S^W#d&Mi;a3rPb|Fg3w$`p|Pna1dDLZ@H!b)+EU+&RNS)y!jO*fXrR_!W3 zQr{$OxBG(Zmj}(8>?3{ubDUT1^mMnH@meju`uNk-#;5{rWtQ@bD^<7dSNzSh#ON$f z==y0NSZg@l0w;6aQZ@3mcGtdi^-sYaGk!YZCA^!Q(K#ZJtN~g*?9l*S1K?h zJ(2P){_vk^t-9SO^$Biug}!}l|3o5BJzF>H+FI9cyLO)o3r{!n`LD||ybwQuRr*Ej zo8IJw_KM~vE4S}|aokZ{(R9m)qDPaC7K=A$#GB{6yuJ9m?!*iKC-7Y^SeCh0iZ!45wBh!Q<{6{uZ*hHFOJBKbM3#`U0=N5^aRQ63mhY2 zULECPY+YOVIlRar+^ni+ZQbW&tp)nhtjCWC*~+e%9HYH;O{~zecAp2gO(kFKxxjJr zH^%7_G8QEQ??2`kcCGp9~x4YDeyX4U^vOU2uW%{Ixl!H;CQ7_1Z1+wtQCo_J39N zk6-%!WIS7IFTf>!GGpF!5q7!MX!k>j5dw*NF&Wj0H`eTkSb4-hRz&==we$l^r%yhw zR)$LoISG4c#&Nj*^l2BhV*j%4cmD*Ll!HP|mrksDdGTs)-?XUm;7Om~G=0eSk(_-l zY`06)G5<{)(ll4H^!kewo=9H(e@?Kks?hSA7vH>kwL$leta;PPUdfYsc`_3^U;SIU z`Ck5aV|meLC9Y0GmxnJuUtnLEC*7kVTDs=>imBfA9LL{Ycxs?2Iz{kV_rKiY%bPD} zUz>Vh;iU&>EZp_mBs@b3m~F)`yl7fo%o+Ias+DW#@|i-@miw^#-rTUxczyKzqSC|n zcpjWra%DekKSM#s;^C?Fm5R@0<{sj85biwi#mZ85%ctAAJ)F$NUV*N;RcZXjIaeRg z-=9*O+P$wxTO+KjWBn#Z-D?HC39A*k+j%Y9E}r7{k-L25hM%^S&VG?)btL)MEB^@_ zGHmBe6OlM2_!=6ahgma5; zS53Q_k=N3#753#^;ryo?>+5?TGskzfY!(v?QexiR9PC*sFZ9)6&6_j7SXqA6TekA-3 zd%7yaURLYLgcy zogj7gdb`NeJri)@+FI7B955qy z;YJUE_*CJBGyfNyJ#jbd(-G@m&yzN(1oWCbeyW+?8_?!&;?O?7_D$9M#S+oyXEsP&YNW0v}3BnlJ$J$ zU(Poj&i^m?kJEDDPHpb?+zgH-O5vwAh)Ew*(vGdHJL0K6?L9-!RQD}Oe){s#UQu&R zUf)>r3&K&>kSv*k2N58KGx)49v{h6yNyTdHmnxj(_EwY#It!TdOzt6O!${-8%wJvYTFe^Th{Vfx;h z<};`DvFlFOCZRds8lGJ7kDU-T=&RSV@OM{wYx`C(9yGtaKb~RpzT99nEv8nX0CwZa$S~qA3$) zI7fT))|wxatB*D>xDh#d%cBL%6PW&cum1n&c*Enyo{jnk`MiSG1o+6w2AnzaG^sOq zorHu$=$dY=Iu!x4ByDEfD~B?*-rB5H6IThH=f^DCGc&4&FZNDfLtlrTbIHONJ6{x< z@&v5dQTF)54!+QkA}Emrcr9yz_9nNXqIQv808L zdL9>-vMLmv<$t;G=q!g@6YMtMd>mbS-PoXc)=dM&YV|&ohX-E7S+3gPvG&r-HEKmu zQ|#@gJpEyurJ?G)Z26&ulMUxnFYC zjO-}WuC?>F?7no;Aw1sN!SDCiO(zW5_J6Y0xZykh^TjXc(shLjcu$^R>$ux}!DQKU z;?hf-vf27P?mi1O=LnHr_bhuWQ>W3HTl+O$?$FS*o|s*HNhVETr|Y-L7Mqvw$jSw{ zy55mp^E&vp<>F+P@3mTm4Z4?3PZ7#?TJf!9{aN=O>-6i)E_SzCzY0}pz4)H7Wwj2| zF7{7CF;BX;lt`IQb`uWBv?(y)d)s95Bd%Wf>%IPiUy^LqvYs9DXD{Y|H$SzbqxMd? z+Dx_ZiPqL&)5QzEZCkqc z?@6VVUdAsQ+>LIYm>oZ<+2#7(08u-UE82QXnyW%Y;~3VNGEZ2k^jT(OZ_$cg(c>FE z>zOmPW@}VPxv!e|s+H+@Nq)D+vBb$`-PTg`Z7>G^a~>dnzy~ss5OJ zVq?fVGih5HVgJwvPsA$B#5^9XIQ_qTNo-=WmeU7ClMh?B-SvGT;dxt%t$LT#-DCfk zHdlqLI=swcDoX&7r%Q5YmqV=hmuh;kA=-R__`pnGoi_wQQGNe-u zDmm!#csuAGim&qYjo8(*OXP}Y%jsk3n_pg1y;bk@-#g>jqvlO)8re++|C`E{obFUE z6xW_r;W^8Cw@j5r_E`n(uHWp91z8))TqjM+5_{oyp)k^P3xn7%Zlh#p$GI&>EM~ed zKFNBmc22O8bAt*mS?vvyFN=q4HV^!#0s$2R^=Mcbc7= zR`y!`w}hClOxCQZz<}Z(cmP zdh!#$Sou070f9R&R!#m~>E1fc^2GN4x z#NR*T$zFP5>XP!6Hx~3vmebj9mt*tPh2`q=3}Lg9E%QVEnJPbP7P0!i%zRoyuH6eU zIjQ>>(xy2*R}d|ET6X)``xjTXuDN}(g=}q701c z)Xbx`mlPr&9C1u|XwDG4I80rehh23?e^-@PX{e&ZhjriV3bQMoIvnIpcvL%SeTv{3 zANRQtsWF%K*e!|YHj_H4wPHh&$ zEJrqMS?AK)IPc53+=K|8EHAw&+OlRL?3}EPd|xNA$uDV2eBJ!i;rdeZ2{&%3nM>Pt zu`K+n_tD|yi>MR*j*R)MQ`HrBY`c4WszjU1%luaY!SB_t^?YK8_YR3Y-$C)llUvwZ@^UxsjcNS&S5J%iXW#+#KW}uFC96DM^zHg}ll872 zcuRT0Z+{P;b3QZV$=$NWAKqqP40dIX*LDhNl2>CYat=J8Tl1G^S@N2@o^xluS+p~L z*@MY|eGv&+o%umC`pK_O30QeIovQ-LF0BhuED&#hRb0 zxUH^u{&<&K!7_)Jca}bqxLcd~Wy8)~c0LZx()xnwOP?>f>C4Zf9O$~Z!(jR zq-I)#y~@iUQ5k7}Zu^JNopLGm;%dFvZvtj=yd@6tt8?_k+oWfmo_lKdSLUkoNedsu z&AC`@Tda0I$hEcn?wXsvI#;qXOnoP+RrR_vKbk1M?&KHQ`%jnk-eTB4?d9I7Cs!TV zndf^T-`2#l?EDV9Q&M-_V*{qY+b6@s6y&#T-G;oPT{4UxrxbJ*{QBJWKzNy`<)&Ys zHcTiN&;GET5nYaYi@~qZItmQ;paj@xmDfgZk*=vUev^uBUEaTS;{>B zIA`W%vyywh8yQRQZ<1m3$(Xz2RaJ@2rV`WUE$w++%6mOj1wJjAwc*PIv9eho4=2sL z?RO+)eR1sUu=(eO7S6fyw(&@@n>h1}ndWN#GbJmdaBRm{ISNSd9E@G^x~I@AAj#Cad%JRog-4(_0pGA&bwF?M2V()^v{v{8pdsV+I3dz zxh>Vs`>!c}RPQooGMqc-NLao4p7s;Q;di0~#2f4dQkL{){Ym)vKKG7D;3HOL$AWm{ z-<_qQ#c9fpckiivOFpPP-Aq<$a#eQOk7dR=KJSubE=wPO!By>>=Kpo$)wX@SQTJcF zIhDnnikJ0r|7d@|y8H1e``|YMUl=zzPuhPg-;(A z;>)Q~wzd}E=gh6%oxkOOU^~;h7w7h_n_V1Zt?MuGRl)klOvSP}-4i=`-Bx}#2>!W@ zeW_vNZL{3Aoe#R^I9|BipQ?7hL(2b`-opi-D(q9=M{MEVB{R2a;r73i`h9Z3=HwbI z4cL%aCuHn5Z-YByc$oI)B^D3%yz|Y!efQpMxzOnK-k+>E9zS8L7U|geGS%;|m|slZ z8H<~X9ZqeYxA)D@e~%JAH(e_GdUeBkw%)r73S~d?ILkYKb?i~weD#rl^&Xk(_lfzP z{52`vQ{`=SpPS}?*=F|K;?)`jb<&vA6uj3QvWl*d> zrDRq@&;#`edoI23w&VB{S?CsNEpqR#=(0D>2FZW3U;Pu65NpgnoN(^stH37{&;9>j zRbZX%ujTscNMPR)QyHJM)kl>#C2n{uQMO1}xsZ4F=f|1$DfK&Zau4JM$VsVI_FTRH z^i%({KoZv2#Gw>QlqzcC5-?8FN0*Ce^(DbaZ*B zT-K{8`ZC{?7cPEu{7_$f%(b9|BWy3XoQ;grnDayCWl_S#jSWVV%meRjxb*$&fo)cc z`?sArS+d-1x=q>T^PgWmoO18w^;0Y5B^8_XUSv-H(a(Et(~`zW z{nyjdE*Qr?t&{jyV?OQu!R|t?ch*LiN^kzEUG&C!-L`CBCf$V}x}~C)EsJ|A|Gn_$ zpZbr}@6VUKJ!ze`>BVy<%Hi{ZKmMGRUN_7BS$p+qn~w(edMSTCAAa&vZKwb8<=orE zE6+dqbZ1TYb;qez-H-i6o=VD3>@N4X=AFdUT>hRTSZ?;=$K6~pNczH(99mrQ1y@#FsY1Yzb2-`>8gyd(Z*n{V$;Gh?31kH3}f=n$@26(B0kG`k@> zX^W8Y@nbWWepul4_-1GMF7*|GUVy zso(fr3vbS2l_x*4mZq1c{9UoUp?J=9?Hh9*FEOq=ksJO;|JCGK#?C6gW4w$#7jIFi zUfNSMb!SjfvSwwVTi%ql7qxH95%vt3Q|Qd(^i+Z?b5g^~Q#A!@haX(;cV|dHI#!@EeL?Jt$I)K|UE~j%RC5Ot zXSet4*6VeX|G)R^m-lUjzdCcmBaGHaTNU3cc=bK;)c^DKn#muxzp1)=C_(1#!SnCi zC3;c?RJ;DkHGHm@$>@4l&tRnZG`~FYPrUyhex`;8-Hz-fQWMzXYv-~Syog*F?b0!e zza!^w=H*xZiHqzR{!4cL2#{%IeDQ5ce(s&Py+1DBSK0F7H0#}qireIsmc?20dGgix ze7pI5!v2S>49p+aC_7KvTz2f*=1c20yr_0sTF`pQ>_x}ZP~R4-8!b27WwTVigmWJj zn0CR&d%1Y_b?cCJ^_ahQw_fp;yT97GP^Dc?^Y6`{flNztqj+B|YhGs*SX-YV5o#J^ zs(#{X(wxI>JKyDgVPws# z&@?qYvYnA9YEp6G{JuYHa_whl6zVMHTe`PI>t>MK-A_tA%bWEi4R`-KAEo~_-XwtM zu=CNQlIdSXRz8@rC3xb8ZJIMG?n-nV30uGI?VE&lONmz@a=e*Sa=vJn=@#i$T?t-U z&dDWYGv(rj8GR=GPeX1PrfT_oy>sbsMR@Uk*To(h0h*nBi|5UcOPMb!IYBanL5FeG zClw!tl)AIWjDJdhJ?Y~RS-a$&z$rPIiYvXZ&HhLoPpK6Nxi$4FM*>gCxev8jg42&Z zdL^Uq@nVKdxckDBzNY*xhotjlHcd$gne$g+e`e%4qlG^c0c%w_M^r)@8671qYU`%B6szO+$cA8+PbA&L@0f|w^7jPUkjzC z^i1l#mZFrk>FOGFra8-J)?2??deX(YvAyWQg(Q`y>7R6@?S=C;-t@}4vCcHx_k#bE zop##}7pQGk$*6SgZTqBRw?&#UeQ)>l`>y=KHEZ;Hza1%?&ev&KQS#;R_urmZG&TCy zPUpKGr(?$1H_;!5&?tuZs2b$$gj_=Y5ltaWr@-ZvxcmIsU4=Z8HTGVN93H=O=!8fEPI<8H!D zGfjc2*x-!EU!s26{|ZZW5j!4o#xO6jpLOGm_ic`w7r$0dIUBo7=5RUd>}kt8U+#AK zf5PDI@#$sJZb#YHN2-dm?mj$it5e98Z}WV<@0i%_tv>hjq$zp+O%I%fm|~L}X1||b zKHJMg{ijsakFG~ASEMhT5}xNK#>8EwvheC1*Ok``?w|7WR0!tT<8C}pFpsaHs76fo z`+xmApZc_NPFEYZJ&$ADvz$A9#^tJV-DUgFiL~>%7R_&UaJLrPZ4|GjS-V>_c=E55 zu7_^}kFKpO|NCQyMCpF>m?(3_bI-i&)X%?Ui9aGacT(!oeOEW~S?ta7P}p2+$71!y z!zX*b!IDk8s$NZDdDZ&xZ6NFU%I%glF+IE97HTqqH2I072 zm{)AS-`2MG;;%g zZAsDLu*Yt{ty4ZLJjtFDuf6E1guDpXgID*ukM&yH)W`na_h7R`LmsP|{F%U|!TpOA z_TKGgIhD~^{x;ydxWK&LQx+nb-xKAxtx&qTvSdO2^>0g@%}ZYA$>ddB;u1=GdHj*M z=6w4=xr(`;E8J{;|GR%Z^TO}is9Q2$_RDx357?{OP3)P6wF!C$F3L zy>i{Gmt488o-8tbHQ||K)A5Qk-YY*_uFrXLrfOC}&rIi1(KhLvRx1Jd8ApsN(oQ~F zYWLBu`~Shb>%ttKshgk9nR%(B+SJFtrP_a&;>MLnG48GvUO9V5_#o9*Jmw!@u_96)xp|J6XImgJd3?Q zBUY%I;fmMh9oFaPTl4%=WeJH~`SjBCL%zEouiq{zvmt5aRGny6gE^7!yB7c75wZA) z&)W|U5_QGijOKRrG0UcZ?k)RkH*b^w1Ci4QdM0J+#Km9V*z8;KDX<{x*6-E#PG-bA zeb)IHw`Q&VhcdN$ulx;Tm^Lge@!#9=^!kUuxqQAle{cSr+PX=0*{mtQOD@b!d;8jO zVPeIOhh3Vca~C{5dz|r`nU!?2*qf3}KlZ$jz0>~Mfoxe(%5nVjqQflTVwY-u@tCrJ zb@sU&FJ30`GjoofdfMQ)SKI&1t?tjy8=Yz_s^|D;mY@07B^B5h;jSlX-f-k}rp5Gc z)7D3~d7V0V;q*nrE%8yATirHa<5}}1zEgC~GcM(`(T+i@L)*A5PH69)a?6dgRBWlu z&HT>XOhv{i9}}jUJ^P*|e!2ToZ-Lbetv4Sdk|b9+op~GWvDI(C&D_Lmr`~$jHVB`c zxn$?F`?1~cLX%vtowB?4Q*mpKX?NwZ|ic-PNc?p=OwTl_a)1_q}1&C62%zPe!X{HH+8pN3A41#Ihc4T_dsMQrI5(@GHl)^<_oA6#V%s)~YUkWzOSo)6aBPgmG+N zQL|vj9-Fg5bJW#3f2o?OWZpZoB!|!FFwcRQ&5twnR#`k)dV|<1K2L>J7t-z+n2BvkPpIztwe^Km zpr|Qh)V+J%#!Ir+nE702{jku;E8|_%Io{k>ubH2}$7y%*Y`L8iUF5goZ{Uw@k2dtF zIjp{}H%n4(;*JT~9Vr?dXQSn$Z?-Pxe} z_jg_??z$*LLzKMM7t-N>BinFIx?#1^jwP-M( z*!fuCX+f>F;F616zG}j5H_ku4R({(vPJRdDgp!l%Lr)ejiD-Nz^H*W=Cgq>cCP}^$ z2x!#K3cRlN)z{rTcthD$mK~x+XZymhKEHDGIlp-7)|DrEI79uC{G6OCwH)Om)ZYEs z!PPr|!d1RS7F)T$&r+TBS$2D&tJ3Dl7vlW-UMikfUK;+nZ(erVHP(PLE_MsPamCzY z4%p}VLGZ4bbKjlLcTN2)EyvYDS+{0N)rBxS{1kE4vs&r7*+@-!mubd(&!u;!Mc!t8 z`E&gg)8}z{-uC(@nU{tJzh1bj{Ibr2yW-Dh8=c!_+nc)HY09EYS^g3xSE|(5w0?VB zc)fW}%Im_H9gmO9csXs(rZc-%UfWYN_kn1J%i#@Ijiy}MyY+p+PR&2HX9D)b=9~<9 zb*kdk^1bVfOb>78-7vLgzu>KvrjePFt(8a5a%srUH<&x6v&1z?XT=-6L-8!<-s?W} zJJIO!Sdlg8Z^6N~kXV&z;i{!On~$8$+V8Jt!Q@wlFY{Q&C947~0!x)nY1toKq`Pl!?`>tzzTU>* z(-%5V?Ef@1KK$w)hpb(sFLptbb!j+JJ%*QFRj*ENQPR!uuNc}Kb9oT+<70wR9LXlgHy+PwYb{`(#)npUnVezt2G z7sH1SMe|lzNqm_eyXBvc`8xTz>sC&Wn!lUHW~y2Eam}Td%C4WNb@eQ@NHdw{fBjj` zR+%+QJ~7hV&*$H|H(P9l$Gr=tR@ zoR_>~73;q_r^^n^jIXXe(zMFl=%LnTZKgG@D`hP!nX*s0&1r};-Lp4tNA!fOC2Mk? zv}pw~CN#af_oeIK9Fr$=pKEIOPRq<**ET`@b=9K{-(~8L>UnxbEmOL*XF{30Ve-XQ zTW7ErWu2L2z3wH$F3}CVQ>TV9T7R(-cB`fEDGU;o^ z{;dxAX_I<)e!b1o(;z9sD{P==+$rJ6YS^{yzznSeHy-ftrmD|78!wu4(TuxfZc}FF z(-QvO-;}DKxLoC`@~k;^d%x&`nN@tQ1+HxO!vopgb*#AXeUraRwdU(o#nm;wev@~t zPAV>%Gf_FtX`+bNUjMK+%X5}**c$SkXVww9pySy$uZCO?6Y4c9f4NNWNyYVo6PLo+ zoO2gluUUP&Mp4agmWGq-{uItPF$N|pS)ZHSc$Rqc#8daz%9|JJ|M@1Eblqnk+b4k) zoA(~3*r!g{7Z)3!5-Alwny^i0r%54=rRL2CMk**2%cS zYh7h;ZvSQJ-tb#f)|Fj+S~~k?PoP!IgqZ1Z%(3pv?6TXQ{Hja7y7`D)(;ns(%ngef z^ci+AIq=HMi!wfL`06!No$1k8Esob-+-ei1alT;di{(rfvD?i1AaHk?`lrx)b3dkD zcz0;QPL&lud>NWKSF@;v$}xBUp3EfWUdxf=^_o@h>_kVG;F>=No|hZ5^a(LdPcK+6 zrs#D3W=-Kc<~uX$f3h`x2-UgygCYIQ zx7i+$=PY}}CoaI|v~r*DCXThjv;XCmGxyx){m~y1|M!FRjzvLk47a8%^Sv{pBYHKD zF1PXoDYmnY?GyQJ{xrGe{3tpyH%EJ;`TMD>cifp(m2|#s?T^>L{Y0mTn$DT@*QV!|DN+*$+UFW@~YW}J4`LbE~(fS-fO)!x77C5 zLoNp1m%p^@jwjIjliR>4)PK3^*k=C_!wr33d2F}~-CL$zt$o8i%k&cO2ktW~J~+7BhS0Cj%JSXDY29^Uh!Cl(TGmp=$ zs-i?M6??1k<^?gWk(wtyZE|-ZZI@v38cE4VrwRYNa>6sQ& zUw_)Mc8BqUsy&Mr6$Mz#tjjuo<=))K9}{`fzT35g7OI`wsbha2(9|vIfA!C~R>kYq zELyef+|!S&P7~XfP21MDPEN`p^T}#EL(|9RwX3<$-BdGLlHsDwmeldz-{@<&*W4N1 ztr1=Tj?U7qNH-sciS1mSZVU zq`2_O$?ydM6O&YzmhFhiJjHavC_f=)!qiizC+KaS%=>1F*43;lRjbcgM|_ns`6j-2 z$?whAv@ajzGh>;%cJJ;!&JSj5r%$;Tuxo#t^tJuciBl$a6h`YuZc7s7oRa1{Z*F7Y z^QM&(u4QvM=0?>!xD`2=*&Fp5-iml^RrKb_O5^7eD>t)n8*}ftQzcWv6Zg)Sz05SA z=Hu)4tHmeghVGuN$@XUReYxtnWyb=K=WOW|-Th|X<3)3gT#M6QWcUOx zJmfg#SX=L(;_H)n6K8$svwS?)V9C_!l)S-0y@K0Y zJ6oD*qRTP{-!rETbZ=YoZeUbt&U^RMQDQ0I%m4Qy;~F+K-LLt5_q+X{AHhZ@Zwxcm zZBL5#*4=(7YsrbVTkp9|F}t0$dv4k7?EUxc-YR6(XYBhf{{O>#t2g;u{<*&IIRF0M zhs5Junu}Vh-)^0Kw8nOuMe=m!z8xnW+pS)1*?cZ}ilCsFplaKUq)xGDnZl!!J2XyB zU%?Wjv;B~lotNF}wHvQlt-N+SL3!`pw6(d{cHXU$&e?R-ZFa7&VdkaWX^m^Ha0b}8 z<}58ayd){eICI7pA1gK6$&DvZq&&KF=DKC~W}DRta#GfhtW#t%4|bm0YI@tVTyaJ_ zi{a18q6Sm(iVM|+j^Z+xorT@X8&nJZ{~UbNKJAAKpZhn1`nTqL*PPxr$2sPmB7bS+ z1L4PaEnUNFRIj_LEOsvWIK8%^?`UQ)gE!-E>X7o5(Yl^R))=_EKEgoW8pH3`Yl%k-h^_Q)8 zR#LKprexFxonuF!V8d#4wS&RFsaNcN*IzkyTwg&$WsR>(h);~urTPoJQcvH_eq1vx z=6~Vs&rkh3>%U3VY_e%!*zd0(&?O*p_~a^C(N=ebJZD-%Cpl>OqeR)IVCL7{re8}GseOl%T(Bz*Tl}AwAXD}0OvQ??M


IB)fJzwMSk%5!E+z5oAW+3y8yKkJ%>beAP&|G4FlSk2FIvtz-X*_=yWt~sr9 zzvY6!$|+n|*Lt#szs>7V+_L6v-J(G4Z@gI{J9~EaK1lr_D8RgLPEDBmovMEYdrXwy zO_&}1>D<~iIag?Q8z3hrs z`o_3WP*wkz^m!*`V>h7-7dOb(9)6XdsBvtzTi*T2&))mp+F_WsnR%Unr(3m4aUpwv zg!SZzr?N}ij=XbVUmW{0X~wc0X>5VFt6dCNYm`pjuM(qgz4x+)!lfPCZ6&$iSAO+$ zeZlxvy7YK^gV0yA#eSY!QrK2SX&R=-gw+b{>VBVczIv_km7^CpXRTXs^PXc=h1r2E z7xOP{nOJ{JGcbtjfpsVU&ZqO!pXC~Csrv7EOk>BUWj*=&$1F~pcgA@BiY;xL7xv{x zNx|IPnaswImQ3e98l-#m)YPnp)gO7q^jp1mghfx;^0UvFYkf#gBv)&a%R-QnrBzdP zSGHAtNDUWUEOuno=hVH~`+jeXzh3t@tn|{X_$xVCNyS1Y()a(}dhkU0%G;t7ML+)~ zZ<~HydfwY_S*kayuKs^JMYjCL`i7(b%wx{~S}XAQlH{|6?mctX&DGbgx}33o^4*_R zUgbu1Qu)t!`bIB#>g%yW#QW(j(Q1R0N2C6JKQu8X`B?6~{D4yJw^PsEm=pT@w8*;W z&x;O!-^==r-y-eZG_(ApRY(?~nf8QoTq2_sca? z`l^2xSjtWNS=B%P(p(c+!Sg{ir^HUB-k*8y+DrZmy$Um$R|vPp46@QQ@&g?`nV7 zT5>iYQ=Y)de0oM>lVYC%gAcDkFAH0PA)Cw0Z4+3uMH`%wn+wbsG)e+o7{2cQ{Q7ct zKEvSy$_!iv3}##g4h$TB`@`?tHJ#7)S$db<$xHF?BLpS??3UUmduh8;deijxH@992 zX8p5p8o%RX*T~yv1Rpw`KDowEX1z!4|Eg)PC&jq#k>U=`s9UsVMor`Q6LQ6h@8!>P z?*D&c&Z(2{HaBW6_URO7m-@FMEPQ7hF(UE0}KHS0u53J7#J92_p%+7 z>Ra4<#rz=i>6?KYMW-%xIJ(0)}l%Bn)OL5h{ncN!%TwDZ?Ite(sh{!JT zF6qj1WEFIs67w%rl_7)2fsw6&se$1N0~-Uw3TInhxs~ngR&yj1v>Ze~6;EPVV93BK z!NA496u>OOz_5Vtt4YNYIk^`FX$>nGLYHyfoOJo%VRIQ?hvNs196EOJ=wWt2mKK*I z0-TzXmXn0j^=md!14vg_DURJC{8 za?haOHBZ0&zuTSW_fA%JRmzxn7%b!>%A3o#zYsrG@pjUsdsohoiRc6Pvd*(@lxsf+c8f+F< zJ@vR(Nua;H?N5-Az+)E6GqT%4d4*RsUsU5ydcJkXgoSp=4b%U|#$>9Mhzp8xiq8~j z6`Lx0R!c9CC(T`NzR#cL&VO&z8L;y6+WTcr@0=4IRE~GPPrj*mDlJ>TyOXH_yUtNEP7_0|6(cf|Q65h5EsXQgD?85rdbs7F_1dM6dhTxYGE>_w{jB()|K_By z$G$hB@9&TEeEt5UpW_38#H66KLdB_TAD`q@ICNymnMY1q(Z?qiUhD*T?y+8ZxhOnDkOgeMzybFa*i_19w%R8vb8 z6A!v+HLr%rWyXvtkue^ruP>%@^(*;0oY~P5VI^SPDU)H;Cs{64ciHr+MDe2TYmNNh z_qXh1S;s$r|Mr8cufA)Fw=bIT$HyfsWF)p0 z{aYT}K8=bKwmrFU8~>%BcGnc_SDOD`D|tpMy>i-|#~(NOy-@xV*K@n-$$2j6@2?Af zh)h?Tpy#|y=VsB9Q8UB!k%rcRK2h$ksf}az=aDvkwGYsbd~t_ScdeJfQ|l|$BP1@ zK5t6Dm+?a4;q+(A_aus+R`t5D;PE6&u8^%pX|>{qB@}a8_)auVTJXo z+y$1NK}$SZH@Vb&^;)&?pd3%8V^&0!-1NC|D+4`ruE&>iM(O9B|I8@6dUf#Npq1x@Hs*(xwO?OLjO`9h|y(AyavmrKNpFZ9p5B<$cS>&#cyayI9n zzHyucfvRN}yKKxqaJkhhx-|%gnJkRHDD~Fs!o(T77T8xT(c*MHb*_vn zG3EL3HXr{5UAuYr3n}{<`JCOlqHB(6_2i|;V`b(q$aORKU0B;z;w5;wZ_1LGhbmk< zW0w59zh_SH@zu*GAJAm85A5vDdZEFp>|yBPVx^z{g~{pL5~q%*i~SO&Jyg7~$FS_6 z#D#)R3zt^2jK^FzJXdH5Hi=BU9rLz-Lh3ui8A?}!rWSJgeG>ii+GpLp;;#%GnlE%j z*qU{co=-kv7#dSE>3!}#^-FJfx<354Ss2hd{pq9?VfPb7w+b(3chc`HKgGI_-L~G( z?^Ws66p1R{iuZMf4Tpbkt>1rOvx)-ycW;vh#tj=Eo1NUh>(xn(DP21)X4QX7StWek zOto^^wM>DlEi1!UFYDGkDz?qeZR3QmC-1Fhji2dCzPPG* lJKw&S^Pezw#`0+&d2TcP=bSHzS#FOf&D`lVL6MPx0RXO}WN-ig literal 76180 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
");
     write_code(out, src, None, None);
-    write_footer(out, None);
+    write!(out, "
"); } /// Highlights `src` as a source code page, returning the HTML output. diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs index b0288d55c256..71cde1f964cd 100644 --- a/src/librustdoc/html/render/print_item.rs +++ b/src/librustdoc/html/render/print_item.rs @@ -530,26 +530,24 @@ fn item_function(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, f: &cle let notable_traits = f.decl.output.as_return().and_then(|output| notable_traits_button(output, cx)); - wrap_into_item_decl(w, |w| { - wrap_item(w, |w| { - render_attributes_in_pre(w, it, ""); - w.reserve(header_len); - write!( - w, - "{vis}{constness}{asyncness}{unsafety}{abi}fn \ - {name}{generics}{decl}{notable_traits}{where_clause}", - vis = visibility, - constness = constness, - asyncness = asyncness, - unsafety = unsafety, - abi = abi, - name = name, - generics = f.generics.print(cx), - where_clause = print_where_clause(&f.generics, cx, 0, Ending::Newline), - decl = f.decl.full_print(header_len, 0, cx), - notable_traits = notable_traits.unwrap_or_default(), - ); - }); + wrap_item(w, |w| { + render_attributes_in_pre(w, it, ""); + w.reserve(header_len); + write!( + w, + "{vis}{constness}{asyncness}{unsafety}{abi}fn \ + {name}{generics}{decl}{notable_traits}{where_clause}", + vis = visibility, + constness = constness, + asyncness = asyncness, + unsafety = unsafety, + abi = abi, + name = name, + generics = f.generics.print(cx), + where_clause = print_where_clause(&f.generics, cx, 0, Ending::Newline), + decl = f.decl.full_print(header_len, 0, cx), + notable_traits = notable_traits.unwrap_or_default(), + ); }); document(w, cx, it, None, HeadingOffset::H2); } @@ -569,145 +567,140 @@ fn item_trait(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &clean: let must_implement_one_of_functions = tcx.trait_def(t.def_id).must_implement_one_of.clone(); // Output the trait definition - wrap_into_item_decl(w, |w| { - wrap_item(w, |w| { - render_attributes_in_pre(w, it, ""); - write!( - w, - "{}{}{}trait {}{}{}", - visibility_print_with_space(it.visibility(tcx), it.item_id, cx), - t.unsafety(tcx).print_with_space(), - if t.is_auto(tcx) { "auto " } else { "" }, - it.name.unwrap(), - t.generics.print(cx), - bounds - ); + wrap_item(w, |w| { + render_attributes_in_pre(w, it, ""); + write!( + w, + "{}{}{}trait {}{}{}", + visibility_print_with_space(it.visibility(tcx), it.item_id, cx), + t.unsafety(tcx).print_with_space(), + if t.is_auto(tcx) { "auto " } else { "" }, + it.name.unwrap(), + t.generics.print(cx), + bounds + ); - if !t.generics.where_predicates.is_empty() { - write!(w, "{}", print_where_clause(&t.generics, cx, 0, Ending::Newline)); - } else { - w.write_str(" "); + if !t.generics.where_predicates.is_empty() { + write!(w, "{}", print_where_clause(&t.generics, cx, 0, Ending::Newline)); + } else { + w.write_str(" "); + } + + if t.items.is_empty() { + w.write_str("{ }"); + } else { + // FIXME: we should be using a derived_id for the Anchors here + w.write_str("{\n"); + let mut toggle = false; + + // If there are too many associated types, hide _everything_ + if should_hide_fields(count_types) { + toggle = true; + toggle_open( + w, + format_args!("{} associated items", count_types + count_consts + count_methods), + ); } - - if t.items.is_empty() { - w.write_str("{ }"); - } else { - // FIXME: we should be using a derived_id for the Anchors here - w.write_str("{\n"); - let mut toggle = false; - - // If there are too many associated types, hide _everything_ - if should_hide_fields(count_types) { - toggle = true; - toggle_open( - w, - format_args!( - "{} associated items", - count_types + count_consts + count_methods - ), - ); - } - for types in [&required_types, &provided_types] { - for t in types { - render_assoc_item( - w, - t, - AssocItemLink::Anchor(None), - ItemType::Trait, - cx, - RenderMode::Normal, - ); - w.write_str(";\n"); - } - } - // If there are too many associated constants, hide everything after them - // We also do this if the types + consts is large because otherwise we could - // render a bunch of types and _then_ a bunch of consts just because both were - // _just_ under the limit - if !toggle && should_hide_fields(count_types + count_consts) { - toggle = true; - toggle_open( - w, - format_args!( - "{} associated constant{} and {} method{}", - count_consts, - pluralize(count_consts), - count_methods, - pluralize(count_methods), - ), - ); - } - if count_types != 0 && (count_consts != 0 || count_methods != 0) { - w.write_str("\n"); - } - for consts in [&required_consts, &provided_consts] { - for c in consts { - render_assoc_item( - w, - c, - AssocItemLink::Anchor(None), - ItemType::Trait, - cx, - RenderMode::Normal, - ); - w.write_str(";\n"); - } - } - if !toggle && should_hide_fields(count_methods) { - toggle = true; - toggle_open(w, format_args!("{} methods", count_methods)); - } - if count_consts != 0 && count_methods != 0 { - w.write_str("\n"); - } - for (pos, m) in required_methods.iter().enumerate() { + for types in [&required_types, &provided_types] { + for t in types { render_assoc_item( w, - m, + t, AssocItemLink::Anchor(None), ItemType::Trait, cx, RenderMode::Normal, ); w.write_str(";\n"); - - if pos < required_methods.len() - 1 { - w.write_str(""); - } } - if !required_methods.is_empty() && !provided_methods.is_empty() { - w.write_str("\n"); - } - for (pos, m) in provided_methods.iter().enumerate() { + } + // If there are too many associated constants, hide everything after them + // We also do this if the types + consts is large because otherwise we could + // render a bunch of types and _then_ a bunch of consts just because both were + // _just_ under the limit + if !toggle && should_hide_fields(count_types + count_consts) { + toggle = true; + toggle_open( + w, + format_args!( + "{} associated constant{} and {} method{}", + count_consts, + pluralize(count_consts), + count_methods, + pluralize(count_methods), + ), + ); + } + if count_types != 0 && (count_consts != 0 || count_methods != 0) { + w.write_str("\n"); + } + for consts in [&required_consts, &provided_consts] { + for c in consts { render_assoc_item( w, - m, + c, AssocItemLink::Anchor(None), ItemType::Trait, cx, RenderMode::Normal, ); - match *m.kind { - clean::MethodItem(ref inner, _) - if !inner.generics.where_predicates.is_empty() => - { - w.write_str(",\n { ... }\n"); - } - _ => { - w.write_str(" { ... }\n"); - } - } - - if pos < provided_methods.len() - 1 { - w.write_str(""); - } + w.write_str(";\n"); } - if toggle { - toggle_close(w); - } - w.write_str("}"); } - }); + if !toggle && should_hide_fields(count_methods) { + toggle = true; + toggle_open(w, format_args!("{} methods", count_methods)); + } + if count_consts != 0 && count_methods != 0 { + w.write_str("\n"); + } + for (pos, m) in required_methods.iter().enumerate() { + render_assoc_item( + w, + m, + AssocItemLink::Anchor(None), + ItemType::Trait, + cx, + RenderMode::Normal, + ); + w.write_str(";\n"); + + if pos < required_methods.len() - 1 { + w.write_str(""); + } + } + if !required_methods.is_empty() && !provided_methods.is_empty() { + w.write_str("\n"); + } + for (pos, m) in provided_methods.iter().enumerate() { + render_assoc_item( + w, + m, + AssocItemLink::Anchor(None), + ItemType::Trait, + cx, + RenderMode::Normal, + ); + match *m.kind { + clean::MethodItem(ref inner, _) + if !inner.generics.where_predicates.is_empty() => + { + w.write_str(",\n { ... }\n"); + } + _ => { + w.write_str(" { ... }\n"); + } + } + + if pos < provided_methods.len() - 1 { + w.write_str(""); + } + } + if toggle { + toggle_close(w); + } + w.write_str("}"); + } }); // Trait documentation @@ -1050,18 +1043,16 @@ fn item_trait(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &clean: } fn item_trait_alias(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &clean::TraitAlias) { - wrap_into_item_decl(w, |w| { - wrap_item(w, |w| { - render_attributes_in_pre(w, it, ""); - write!( - w, - "trait {}{}{} = {};", - it.name.unwrap(), - t.generics.print(cx), - print_where_clause(&t.generics, cx, 0, Ending::Newline), - bounds(&t.bounds, true, cx) - ); - }); + wrap_item(w, |w| { + render_attributes_in_pre(w, it, ""); + write!( + w, + "trait {}{}{} = {};", + it.name.unwrap(), + t.generics.print(cx), + print_where_clause(&t.generics, cx, 0, Ending::Newline), + bounds(&t.bounds, true, cx) + ); }); document(w, cx, it, None, HeadingOffset::H2); @@ -1074,18 +1065,16 @@ fn item_trait_alias(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: & } fn item_opaque_ty(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &clean::OpaqueTy) { - wrap_into_item_decl(w, |w| { - wrap_item(w, |w| { - render_attributes_in_pre(w, it, ""); - write!( - w, - "type {}{}{where_clause} = impl {bounds};", - it.name.unwrap(), - t.generics.print(cx), - where_clause = print_where_clause(&t.generics, cx, 0, Ending::Newline), - bounds = bounds(&t.bounds, false, cx), - ); - }); + wrap_item(w, |w| { + render_attributes_in_pre(w, it, ""); + write!( + w, + "type {}{}{where_clause} = impl {bounds};", + it.name.unwrap(), + t.generics.print(cx), + where_clause = print_where_clause(&t.generics, cx, 0, Ending::Newline), + bounds = bounds(&t.bounds, false, cx), + ); }); document(w, cx, it, None, HeadingOffset::H2); @@ -1113,7 +1102,7 @@ fn item_typedef(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &clea }); } - wrap_into_item_decl(w, |w| write_content(w, cx, it, t)); + write_content(w, cx, it, t); document(w, cx, it, None, HeadingOffset::H2); @@ -1127,11 +1116,9 @@ fn item_typedef(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &clea } fn item_union(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, s: &clean::Union) { - wrap_into_item_decl(w, |w| { - wrap_item(w, |w| { - render_attributes_in_pre(w, it, ""); - render_union(w, it, Some(&s.generics), &s.fields, "", cx); - }); + wrap_item(w, |w| { + render_attributes_in_pre(w, it, ""); + render_union(w, it, Some(&s.generics), &s.fields, "", cx); }); document(w, cx, it, None, HeadingOffset::H2); @@ -1192,60 +1179,58 @@ fn print_tuple_struct_fields(w: &mut Buffer, cx: &Context<'_>, s: &[clean::Item] fn item_enum(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, e: &clean::Enum) { let tcx = cx.tcx(); let count_variants = e.variants().count(); - wrap_into_item_decl(w, |w| { - wrap_item(w, |w| { - render_attributes_in_pre(w, it, ""); - write!( - w, - "{}enum {}{}", - visibility_print_with_space(it.visibility(tcx), it.item_id, cx), - it.name.unwrap(), - e.generics.print(cx), - ); - if !print_where_clause_and_check(w, &e.generics, cx) { - // If there wasn't a `where` clause, we add a whitespace. - w.write_str(" "); + wrap_item(w, |w| { + render_attributes_in_pre(w, it, ""); + write!( + w, + "{}enum {}{}", + visibility_print_with_space(it.visibility(tcx), it.item_id, cx), + it.name.unwrap(), + e.generics.print(cx), + ); + if !print_where_clause_and_check(w, &e.generics, cx) { + // If there wasn't a `where` clause, we add a whitespace. + w.write_str(" "); + } + + let variants_stripped = e.has_stripped_entries(); + if count_variants == 0 && !variants_stripped { + w.write_str("{}"); + } else { + w.write_str("{\n"); + let toggle = should_hide_fields(count_variants); + if toggle { + toggle_open(w, format_args!("{} variants", count_variants)); + } + for v in e.variants() { + w.write_str(" "); + let name = v.name.unwrap(); + match *v.kind { + // FIXME(#101337): Show discriminant + clean::VariantItem(ref var) => match var.kind { + clean::VariantKind::CLike => write!(w, "{}", name), + clean::VariantKind::Tuple(ref s) => { + write!(w, "{}(", name); + print_tuple_struct_fields(w, cx, s); + w.write_str(")"); + } + clean::VariantKind::Struct(ref s) => { + render_struct(w, v, None, None, &s.fields, " ", false, cx); + } + }, + _ => unreachable!(), + } + w.write_str(",\n"); } - let variants_stripped = e.has_stripped_entries(); - if count_variants == 0 && !variants_stripped { - w.write_str("{}"); - } else { - w.write_str("{\n"); - let toggle = should_hide_fields(count_variants); - if toggle { - toggle_open(w, format_args!("{} variants", count_variants)); - } - for v in e.variants() { - w.write_str(" "); - let name = v.name.unwrap(); - match *v.kind { - // FIXME(#101337): Show discriminant - clean::VariantItem(ref var) => match var.kind { - clean::VariantKind::CLike => write!(w, "{}", name), - clean::VariantKind::Tuple(ref s) => { - write!(w, "{}(", name); - print_tuple_struct_fields(w, cx, s); - w.write_str(")"); - } - clean::VariantKind::Struct(ref s) => { - render_struct(w, v, None, None, &s.fields, " ", false, cx); - } - }, - _ => unreachable!(), - } - w.write_str(",\n"); - } - - if variants_stripped { - w.write_str(" // some variants omitted\n"); - } - if toggle { - toggle_close(w); - } - w.write_str("}"); + if variants_stripped { + w.write_str(" // some variants omitted\n"); } - }); + if toggle { + toggle_close(w); + } + w.write_str("}"); + } }); document(w, cx, it, None, HeadingOffset::H2); @@ -1346,38 +1331,30 @@ fn item_enum(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, e: &clean:: } fn item_macro(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &clean::Macro) { - wrap_into_item_decl(w, |w| { - highlight::render_macro_with_highlighting(&t.source, w); - }); + highlight::render_item_decl_with_highlighting(&t.source, w); document(w, cx, it, None, HeadingOffset::H2) } fn item_proc_macro(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, m: &clean::ProcMacro) { - wrap_into_item_decl(w, |w| { + wrap_item(w, |w| { let name = it.name.expect("proc-macros always have names"); match m.kind { MacroKind::Bang => { - wrap_item(w, |w| { - write!(w, "{}!() {{ /* proc-macro */ }}", name); - }); + write!(w, "{}!() {{ /* proc-macro */ }}", name); } MacroKind::Attr => { - wrap_item(w, |w| { - write!(w, "#[{}]", name); - }); + write!(w, "#[{}]", name); } MacroKind::Derive => { - wrap_item(w, |w| { - write!(w, "#[derive({})]", name); - if !m.helpers.is_empty() { - w.push_str("\n{\n"); - w.push_str(" // Attributes available to this derive:\n"); - for attr in &m.helpers { - writeln!(w, " #[{}]", attr); - } - w.push_str("}\n"); + write!(w, "#[derive({})]", name); + if !m.helpers.is_empty() { + w.push_str("\n{\n"); + w.push_str(" // Attributes available to this derive:\n"); + for attr in &m.helpers { + writeln!(w, " #[{}]", attr); } - }); + w.push_str("}\n"); + } } } }); @@ -1400,61 +1377,57 @@ fn item_primitive(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item) { } fn item_constant(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, c: &clean::Constant) { - wrap_into_item_decl(w, |w| { - wrap_item(w, |w| { - let tcx = cx.tcx(); - render_attributes_in_code(w, it); + wrap_item(w, |w| { + let tcx = cx.tcx(); + render_attributes_in_code(w, it); - write!( - w, - "{vis}const {name}: {typ}", - vis = visibility_print_with_space(it.visibility(tcx), it.item_id, cx), - name = it.name.unwrap(), - typ = c.type_.print(cx), - ); + write!( + w, + "{vis}const {name}: {typ}", + vis = visibility_print_with_space(it.visibility(tcx), it.item_id, cx), + name = it.name.unwrap(), + typ = c.type_.print(cx), + ); - // FIXME: The code below now prints - // ` = _; // 100i32` - // if the expression is - // `50 + 50` - // which looks just wrong. - // Should we print - // ` = 100i32;` - // instead? + // FIXME: The code below now prints + // ` = _; // 100i32` + // if the expression is + // `50 + 50` + // which looks just wrong. + // Should we print + // ` = 100i32;` + // instead? - let value = c.value(tcx); - let is_literal = c.is_literal(tcx); - let expr = c.expr(tcx); - if value.is_some() || is_literal { - write!(w, " = {expr};", expr = Escape(&expr)); - } else { - w.write_str(";"); - } + let value = c.value(tcx); + let is_literal = c.is_literal(tcx); + let expr = c.expr(tcx); + if value.is_some() || is_literal { + write!(w, " = {expr};", expr = Escape(&expr)); + } else { + w.write_str(";"); + } - if !is_literal { - if let Some(value) = &value { - let value_lowercase = value.to_lowercase(); - let expr_lowercase = expr.to_lowercase(); + if !is_literal { + if let Some(value) = &value { + let value_lowercase = value.to_lowercase(); + let expr_lowercase = expr.to_lowercase(); - if value_lowercase != expr_lowercase - && value_lowercase.trim_end_matches("i32") != expr_lowercase - { - write!(w, " // {value}", value = Escape(value)); - } + if value_lowercase != expr_lowercase + && value_lowercase.trim_end_matches("i32") != expr_lowercase + { + write!(w, " // {value}", value = Escape(value)); } } - }); + } }); document(w, cx, it, None, HeadingOffset::H2) } fn item_struct(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, s: &clean::Struct) { - wrap_into_item_decl(w, |w| { - wrap_item(w, |w| { - render_attributes_in_code(w, it); - render_struct(w, it, Some(&s.generics), s.ctor_kind, &s.fields, "", true, cx); - }); + wrap_item(w, |w| { + render_attributes_in_code(w, it); + render_struct(w, it, Some(&s.generics), s.ctor_kind, &s.fields, "", true, cx); }); document(w, cx, it, None, HeadingOffset::H2); @@ -1503,34 +1476,30 @@ fn item_struct(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, s: &clean } fn item_static(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, s: &clean::Static) { - wrap_into_item_decl(w, |w| { - wrap_item(w, |w| { - render_attributes_in_code(w, it); - write!( - w, - "{vis}static {mutability}{name}: {typ}", - vis = visibility_print_with_space(it.visibility(cx.tcx()), it.item_id, cx), - mutability = s.mutability.print_with_space(), - name = it.name.unwrap(), - typ = s.type_.print(cx) - ); - }); + wrap_item(w, |w| { + render_attributes_in_code(w, it); + write!( + w, + "{vis}static {mutability}{name}: {typ}", + vis = visibility_print_with_space(it.visibility(cx.tcx()), it.item_id, cx), + mutability = s.mutability.print_with_space(), + name = it.name.unwrap(), + typ = s.type_.print(cx) + ); }); document(w, cx, it, None, HeadingOffset::H2) } fn item_foreign_type(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item) { - wrap_into_item_decl(w, |w| { - wrap_item(w, |w| { - w.write_str("extern {\n"); - render_attributes_in_code(w, it); - write!( - w, - " {}type {};\n}}", - visibility_print_with_space(it.visibility(cx.tcx()), it.item_id, cx), - it.name.unwrap(), - ); - }); + wrap_item(w, |w| { + w.write_str("extern {\n"); + render_attributes_in_code(w, it); + write!( + w, + " {}type {};\n}}", + visibility_print_with_space(it.visibility(cx.tcx()), it.item_id, cx), + it.name.unwrap(), + ); }); document(w, cx, it, None, HeadingOffset::H2); @@ -1609,20 +1578,11 @@ fn bounds(t_bounds: &[clean::GenericBound], trait_alias: bool, cx: &Context<'_>) bounds } -fn wrap_into_item_decl(w: &mut Buffer, f: F) -where - F: FnOnce(&mut Buffer), -{ - w.write_str("
"); - f(w); - w.write_str("
") -} - fn wrap_item(w: &mut Buffer, f: F) where F: FnOnce(&mut Buffer), { - w.write_str(r#"
"#);
+    w.write_str(r#"
"#);
     f(w);
     w.write_str("
"); } diff --git a/src/librustdoc/html/static/css/rustdoc.css b/src/librustdoc/html/static/css/rustdoc.css index 8699508e4391..e9f0ae39f3ef 100644 --- a/src/librustdoc/html/static/css/rustdoc.css +++ b/src/librustdoc/html/static/css/rustdoc.css @@ -335,7 +335,7 @@ pre { padding: 14px; line-height: 1.5; /* https://github.com/rust-lang/rust/issues/105906 */ } -.item-decl pre { +pre.item-decl { overflow-x: auto; } /* This rule allows to have scrolling on the X axis. */ diff --git a/tests/rustdoc-gui/code-tags.goml b/tests/rustdoc-gui/code-tags.goml index 8561f537f3d3..ca337cbc323e 100644 --- a/tests/rustdoc-gui/code-tags.goml +++ b/tests/rustdoc-gui/code-tags.goml @@ -9,16 +9,16 @@ size: (1080, 600) // Check that their content is inside

 assert-count: (".example-wrap pre > code", 4)
 // Check that function signature is inside 

-assert: ".item-decl pre.rust > code"
+assert: "pre.rust.item-decl > code"
 
 goto: "file://" + |DOC_PATH| + "/test_docs/struct.Foo.html"
-assert: ".item-decl pre.rust > code"
+assert: "pre.rust.item-decl > code"
 
 goto: "file://" + |DOC_PATH| + "/test_docs/enum.AnEnum.html"
-assert: ".item-decl pre.rust > code"
+assert: "pre.rust.item-decl > code"
 
 goto: "file://" + |DOC_PATH| + "/test_docs/trait.AnotherOne.html"
-assert: ".item-decl pre.rust > code"
+assert: "pre.rust.item-decl > code"
 
 goto: "file://" + |DOC_PATH| + "/test_docs/type.SomeType.html"
-assert: ".item-decl pre.rust > code"
+assert: "pre.rust.item-decl > code"
diff --git a/tests/rustdoc-gui/font-weight.goml b/tests/rustdoc-gui/font-weight.goml
index fafb15631786..aad334d2bd29 100644
--- a/tests/rustdoc-gui/font-weight.goml
+++ b/tests/rustdoc-gui/font-weight.goml
@@ -1,6 +1,6 @@
 // This test checks that the font weight is correctly applied.
 goto: "file://" + |DOC_PATH| + "/lib2/struct.Foo.html"
-assert-css: ("//*[@class='item-decl']//a[text()='Alias']", {"font-weight": "400"})
+assert-css: ("//*[@class='rust item-decl']//a[text()='Alias']", {"font-weight": "400"})
 assert-css: (
     "//*[@class='structfield small-section-header']//a[text()='Alias']",
     {"font-weight": "400"},
@@ -19,8 +19,7 @@ goto: "file://" + |DOC_PATH| + "/lib2/trait.Trait.html"
 
 // This is a complex selector, so here's how it works:
 //
-// * //*[@class='item-decl'] — selects element of any tag with classes docblock and item-decl
-// * /pre[@class='rust'] — selects immediate child with tag pre and class rust
+// * //pre[@class='rust item-decl'] — selects item-decl code block
 // * /code — selects immediate child with tag code
 // * /a[@class='constant'] — selects immediate child with tag a and class constant
 // * //text() — selects child that is text node
@@ -29,11 +28,11 @@ goto: "file://" + |DOC_PATH| + "/lib2/trait.Trait.html"
 // This uses '/parent::*' as a proxy for the style of the text node.
 // We can't just select the '' because intermediate tags could be added.
 assert-count: (
-    "//*[@class='item-decl']/pre[@class='rust']/code/a[@class='constant']//text()/parent::*",
+    "//pre[@class='rust item-decl']/code/a[@class='constant']//text()/parent::*",
     1,
 )
 assert-css: (
-    "//*[@class='item-decl']/pre[@class='rust']/code/a[@class='constant']//text()/parent::*",
+    "//pre[@class='rust item-decl']/code/a[@class='constant']//text()/parent::*",
     {"font-weight": "400"},
 )
 
diff --git a/tests/rustdoc-gui/list_code_block.goml b/tests/rustdoc-gui/list_code_block.goml
index c527cfbfcbc5..4c477d70c895 100644
--- a/tests/rustdoc-gui/list_code_block.goml
+++ b/tests/rustdoc-gui/list_code_block.goml
@@ -1,4 +1,4 @@
 // This test checks that code blocks in list are supported.
 goto: "file://" + |DOC_PATH| + "/test_docs/index.html"
 goto: "./fn.check_list_code_block.html"
-assert: (".item-decl pre.rust")
+assert: ("pre.rust.item-decl")
diff --git a/tests/rustdoc-gui/type-declation-overflow.goml b/tests/rustdoc-gui/type-declation-overflow.goml
index 644429c014c1..708e9dca0ee7 100644
--- a/tests/rustdoc-gui/type-declation-overflow.goml
+++ b/tests/rustdoc-gui/type-declation-overflow.goml
@@ -12,7 +12,7 @@ size: (1100, 800)
 // Logically, the  scroll width should be the width of the window.
 assert-property: ("body", {"scrollWidth": "1100"})
 // However, since there is overflow in the type declaration, its scroll width is bigger.
-assert-property: (".item-decl pre", {"scrollWidth": "1324"})
+assert-property: ("pre.item-decl", {"scrollWidth": "1324"})
 
 // In the table-ish view on the module index, the name should not be wrapped more than necessary.
 goto: "file://" + |DOC_PATH| + "/lib2/too_long/index.html"
@@ -24,7 +24,7 @@ assert-property: ("body", {"scrollWidth": "1100"})
 // We now check that the section width hasn't grown because of it.
 assert-property: ("#main-content", {"scrollWidth": "840"})
 // And now checking that it has scrollable content.
-assert-property: (".item-decl pre", {"scrollWidth": "1103"})
+assert-property: ("pre.item-decl", {"scrollWidth": "1103"})
 
 // ... and constant.
 // On a sidenote, it also checks that the (very) long title isn't changing the docblock width.
@@ -33,7 +33,7 @@ assert-property: ("body", {"scrollWidth": "1100"})
 // We now check that the section width hasn't grown because of it.
 assert-property: ("#main-content", {"scrollWidth": "840"})
 // And now checking that it has scrollable content.
-assert-property: (".item-decl pre", {"scrollWidth": "950"})
+assert-property: ("pre.item-decl", {"scrollWidth": "950"})
 
 // On mobile:
 size: (600, 600)
@@ -65,12 +65,12 @@ compare-elements-position-false: (".main-heading h1", ".main-heading .out-of-ban
 goto: "file://" + |DOC_PATH| + "/lib2/scroll_traits/trait.Iterator.html"
 
 click: ".item-decl .type-contents-toggle"
-assert-property: (".item-decl > pre", {"scrollLeft": 0})
-scroll-to: "//*[@class='item-decl']//details/a[text()='String']"
-assert-property-false: (".item-decl > pre", {"scrollLeft": 0})
+assert-property: ("pre.item-decl", {"scrollLeft": 0})
+scroll-to: "//*[@class='rust item-decl']//details/a[text()='String']"
+assert-property-false: ("pre.item-decl", {"scrollLeft": 0})
 
 // Then on an item without "hidden methods".
 goto: "file://" + |DOC_PATH| + "/lib2/scroll_traits/trait.TraitWithLongItemsName.html"
-assert-property: (".item-decl > pre", {"scrollLeft": 0})
-scroll-to: "//*[@class='item-decl']//code/a[text()='String']"
-assert-property-false: (".item-decl > pre", {"scrollLeft": 0})
+assert-property: ("pre.item-decl", {"scrollLeft": 0})
+scroll-to: "//*[@class='rust item-decl']//code/a[text()='String']"
+assert-property-false: ("pre.item-decl", {"scrollLeft": 0})
diff --git a/tests/rustdoc/array-links.rs b/tests/rustdoc/array-links.rs
index e7c0ee2de1a7..8ee294daa963 100644
--- a/tests/rustdoc/array-links.rs
+++ b/tests/rustdoc/array-links.rs
@@ -4,25 +4,25 @@
 pub struct MyBox(*const T);
 
 // @has 'foo/fn.alpha.html'
-// @snapshot link_slice_u32 - '//div[@class="item-decl"]/pre[@class="rust"]/code'
+// @snapshot link_slice_u32 - '//pre[@class="rust item-decl"]/code'
 pub fn alpha() -> &'static [u32; 1] {
     loop {}
 }
 
 // @has 'foo/fn.beta.html'
-// @snapshot link_slice_generic - '//div[@class="item-decl"]/pre[@class="rust"]/code'
+// @snapshot link_slice_generic - '//pre[@class="rust item-decl"]/code'
 pub fn beta() -> &'static [T; 1] {
     loop {}
 }
 
 // @has 'foo/fn.gamma.html'
-// @snapshot link_box_u32 - '//div[@class="item-decl"]/pre[@class="rust"]/code'
+// @snapshot link_box_u32 - '//pre[@class="rust item-decl"]/code'
 pub fn gamma() -> MyBox<[u32; 1]> {
     loop {}
 }
 
 // @has 'foo/fn.delta.html'
-// @snapshot link_box_generic - '//div[@class="item-decl"]/pre[@class="rust"]/code'
+// @snapshot link_box_generic - '//pre[@class="rust item-decl"]/code'
 pub fn delta() -> MyBox<[T; 1]> {
     loop {}
 }
diff --git a/tests/rustdoc/assoc-consts.rs b/tests/rustdoc/assoc-consts.rs
index 77b139b644f3..68a11c57b529 100644
--- a/tests/rustdoc/assoc-consts.rs
+++ b/tests/rustdoc/assoc-consts.rs
@@ -1,5 +1,5 @@
 pub trait Foo {
-    // @has assoc_consts/trait.Foo.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+    // @has assoc_consts/trait.Foo.html '//pre[@class="rust item-decl"]' \
     //      'const FOO: usize = 13usize;'
     // @has - '//*[@id="associatedconstant.FOO"]' 'const FOO: usize'
     const FOO: usize = 12 + 1;
diff --git a/tests/rustdoc/assoc-item-cast.rs b/tests/rustdoc/assoc-item-cast.rs
index ab9702a24f46..ad8235985bcf 100644
--- a/tests/rustdoc/assoc-item-cast.rs
+++ b/tests/rustdoc/assoc-item-cast.rs
@@ -10,5 +10,5 @@ pub trait AsExpression {
 }
 
 // @has foo/type.AsExprOf.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'type AsExprOf = >::Expression;'
+// @has - '//pre[@class="rust item-decl"]' 'type AsExprOf = >::Expression;'
 pub type AsExprOf = >::Expression;
diff --git a/tests/rustdoc/assoc-types.rs b/tests/rustdoc/assoc-types.rs
index de36c8ffeff0..e74db7578d13 100644
--- a/tests/rustdoc/assoc-types.rs
+++ b/tests/rustdoc/assoc-types.rs
@@ -12,8 +12,8 @@ pub trait Index {
 }
 
 // @has assoc_types/fn.use_output.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' '-> &T::Output'
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]//a[@href="trait.Index.html#associatedtype.Output"]' 'Output'
+// @has - '//pre[@class="rust item-decl"]' '-> &T::Output'
+// @has - '//pre[@class="rust item-decl"]//a[@href="trait.Index.html#associatedtype.Output"]' 'Output'
 pub fn use_output>(obj: &T, index: usize) -> &T::Output {
     obj.index(index)
 }
@@ -23,13 +23,13 @@ pub trait Feed {
 }
 
 // @has assoc_types/fn.use_input.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'T::Input'
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]//a[@href="trait.Feed.html#associatedtype.Input"]' 'Input'
+// @has - '//pre[@class="rust item-decl"]' 'T::Input'
+// @has - '//pre[@class="rust item-decl"]//a[@href="trait.Feed.html#associatedtype.Input"]' 'Input'
 pub fn use_input(_feed: &T, _element: T::Input) { }
 
 // @has assoc_types/fn.cmp_input.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'where T::Input: PartialEq'
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]//a[@href="trait.Feed.html#associatedtype.Input"]' 'Input'
+// @has - '//pre[@class="rust item-decl"]' 'where T::Input: PartialEq'
+// @has - '//pre[@class="rust item-decl"]//a[@href="trait.Feed.html#associatedtype.Input"]' 'Input'
 pub fn cmp_input(a: &T::Input, b: &U::Input) -> bool
     where T::Input: PartialEq
 {
diff --git a/tests/rustdoc/async-fn.rs b/tests/rustdoc/async-fn.rs
index 8cafb5a2497a..3db344af6743 100644
--- a/tests/rustdoc/async-fn.rs
+++ b/tests/rustdoc/async-fn.rs
@@ -1,35 +1,35 @@
 // edition:2018
-// @has async_fn/fn.foo.html '//div[@class="item-decl"]/pre[@class="rust"]' 'pub async fn foo() -> Option'
+// @has async_fn/fn.foo.html '//pre[@class="rust item-decl"]' 'pub async fn foo() -> Option'
 pub async fn foo() -> Option {
     None
 }
 
-// @has async_fn/fn.bar.html '//div[@class="item-decl"]/pre[@class="rust"]' 'pub async fn bar(a: i32, b: i32) -> i32'
+// @has async_fn/fn.bar.html '//pre[@class="rust item-decl"]' 'pub async fn bar(a: i32, b: i32) -> i32'
 pub async fn bar(a: i32, b: i32) -> i32 {
     0
 }
 
-// @has async_fn/fn.baz.html '//div[@class="item-decl"]/pre[@class="rust"]' 'pub async fn baz(a: T) -> T'
+// @has async_fn/fn.baz.html '//pre[@class="rust item-decl"]' 'pub async fn baz(a: T) -> T'
 pub async fn baz(a: T) -> T {
     a
 }
 
-// @has async_fn/fn.qux.html '//div[@class="item-decl"]/pre[@class="rust"]' 'pub async unsafe fn qux() -> char'
+// @has async_fn/fn.qux.html '//pre[@class="rust item-decl"]' 'pub async unsafe fn qux() -> char'
 pub async unsafe fn qux() -> char {
     'âš '
 }
 
-// @has async_fn/fn.mut_args.html '//div[@class="item-decl"]/pre[@class="rust"]' 'pub async fn mut_args(a: usize)'
+// @has async_fn/fn.mut_args.html '//pre[@class="rust item-decl"]' 'pub async fn mut_args(a: usize)'
 pub async fn mut_args(mut a: usize) {}
 
-// @has async_fn/fn.mut_ref.html '//div[@class="item-decl"]/pre[@class="rust"]' 'pub async fn mut_ref(x: i32)'
+// @has async_fn/fn.mut_ref.html '//pre[@class="rust item-decl"]' 'pub async fn mut_ref(x: i32)'
 pub async fn mut_ref(ref mut x: i32) {}
 
 trait Bar {}
 
 impl Bar for () {}
 
-// @has async_fn/fn.quux.html '//div[@class="item-decl"]/pre[@class="rust"]' 'pub async fn quux() -> impl Bar'
+// @has async_fn/fn.quux.html '//pre[@class="rust item-decl"]' 'pub async fn quux() -> impl Bar'
 pub async fn quux() -> impl Bar {
     ()
 }
@@ -50,27 +50,27 @@ pub trait Pattern<'a> {}
 
 pub trait Trait {}
 // @has async_fn/fn.const_generics.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub async fn const_generics(_: impl Trait)'
+// @has - '//pre[@class="rust item-decl"]' 'pub async fn const_generics(_: impl Trait)'
 pub async fn const_generics(_: impl Trait) {}
 
 // test that elided lifetimes are properly elided and not displayed as `'_`
 // regression test for #63037
 // @has async_fn/fn.elided.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub async fn elided(foo: &str) -> &str'
+// @has - '//pre[@class="rust item-decl"]' 'pub async fn elided(foo: &str) -> &str'
 pub async fn elided(foo: &str) -> &str {}
 // This should really be shown as written, but for implementation reasons it's difficult.
 // See `impl Clean for TyKind::Ref`.
 // @has async_fn/fn.user_elided.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub async fn user_elided(foo: &str) -> &str'
+// @has - '//pre[@class="rust item-decl"]' 'pub async fn user_elided(foo: &str) -> &str'
 pub async fn user_elided(foo: &'_ str) -> &str {}
 // @has async_fn/fn.static_trait.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub async fn static_trait(foo: &str) -> Box'
+// @has - '//pre[@class="rust item-decl"]' 'pub async fn static_trait(foo: &str) -> Box'
 pub async fn static_trait(foo: &str) -> Box {}
 // @has async_fn/fn.lifetime_for_trait.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "pub async fn lifetime_for_trait(foo: &str) -> Box"
+// @has - '//pre[@class="rust item-decl"]' "pub async fn lifetime_for_trait(foo: &str) -> Box"
 pub async fn lifetime_for_trait(foo: &str) -> Box {}
 // @has async_fn/fn.elided_in_input_trait.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "pub async fn elided_in_input_trait(t: impl Pattern<'_>)"
+// @has - '//pre[@class="rust item-decl"]' "pub async fn elided_in_input_trait(t: impl Pattern<'_>)"
 pub async fn elided_in_input_trait(t: impl Pattern<'_>) {}
 
 struct AsyncFdReadyGuard<'a, T> { x: &'a T }
@@ -88,8 +88,8 @@ impl Foo {
 
 // test named lifetimes, just in case
 // @has async_fn/fn.named.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "pub async fn named<'a, 'b>(foo: &'a str) -> &'b str"
+// @has - '//pre[@class="rust item-decl"]' "pub async fn named<'a, 'b>(foo: &'a str) -> &'b str"
 pub async fn named<'a, 'b>(foo: &'a str) -> &'b str {}
 // @has async_fn/fn.named_trait.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "pub async fn named_trait<'a, 'b>(foo: impl Pattern<'a>) -> impl Pattern<'b>"
+// @has - '//pre[@class="rust item-decl"]' "pub async fn named_trait<'a, 'b>(foo: impl Pattern<'a>) -> impl Pattern<'b>"
 pub async fn named_trait<'a, 'b>(foo: impl Pattern<'a>) -> impl Pattern<'b> {}
diff --git a/tests/rustdoc/attribute-rendering.rs b/tests/rustdoc/attribute-rendering.rs
index 36e10923c853..a652fda1604c 100644
--- a/tests/rustdoc/attribute-rendering.rs
+++ b/tests/rustdoc/attribute-rendering.rs
@@ -1,7 +1,7 @@
 #![crate_name = "foo"]
 
 // @has 'foo/fn.f.html'
-// @has - //*[@'class="item-decl"]' '#[export_name = "f"] pub fn f()'
+// @has - //*[@'class="rust item-decl"]' '#[export_name = "f"] pub fn f()'
 #[export_name = "\
 f"]
 pub fn f() {}
diff --git a/tests/rustdoc/attributes.rs b/tests/rustdoc/attributes.rs
index 70e2e5c29508..86333c7534a3 100644
--- a/tests/rustdoc/attributes.rs
+++ b/tests/rustdoc/attributes.rs
@@ -1,13 +1,13 @@
 #![crate_name = "foo"]
 
-// @has foo/fn.f.html '//div[@class="item-decl"]/pre[@class="rust"]' '#[no_mangle]'
+// @has foo/fn.f.html '//pre[@class="rust item-decl"]' '#[no_mangle]'
 #[no_mangle]
 pub extern "C" fn f() {}
 
-// @has foo/fn.g.html '//div[@class="item-decl"]/pre[@class="rust"]' '#[export_name = "bar"]'
+// @has foo/fn.g.html '//pre[@class="rust item-decl"]' '#[export_name = "bar"]'
 #[export_name = "bar"]
 pub extern "C" fn g() {}
 
-// @has foo/struct.Repr.html '//div[@class="item-decl"]' '#[repr(C, align(8))]'
+// @has foo/struct.Repr.html '//pre[@class="rust item-decl"]' '#[repr(C, align(8))]'
 #[repr(C, align(8))]
 pub struct Repr;
diff --git a/tests/rustdoc/auxiliary/issue-85454.rs b/tests/rustdoc/auxiliary/issue-85454.rs
index 5143968bbd43..5db4fe053af6 100644
--- a/tests/rustdoc/auxiliary/issue-85454.rs
+++ b/tests/rustdoc/auxiliary/issue-85454.rs
@@ -1,5 +1,5 @@
 // @has issue_85454/trait.FromResidual.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub trait FromResidual::Residual> { fn from_residual(residual: R) -> Self; }'
+// @has - '//pre[@class="rust item-decl"]' 'pub trait FromResidual::Residual> { fn from_residual(residual: R) -> Self; }'
 pub trait FromResidual::Residual> {
     fn from_residual(residual: R) -> Self;
 }
diff --git a/tests/rustdoc/const-fn.rs b/tests/rustdoc/const-fn.rs
index 18863abaeacc..f66161856812 100644
--- a/tests/rustdoc/const-fn.rs
+++ b/tests/rustdoc/const-fn.rs
@@ -1,7 +1,7 @@
 #![crate_name = "foo"]
 
 // @has foo/fn.bar.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub const fn bar() -> '
+// @has - '//pre[@class="rust item-decl"]' 'pub const fn bar() -> '
 /// foo
 pub const fn bar() -> usize {
     2
diff --git a/tests/rustdoc/const-generics/add-impl.rs b/tests/rustdoc/const-generics/add-impl.rs
index b5226ad3f78b..195e47bc8ba8 100644
--- a/tests/rustdoc/const-generics/add-impl.rs
+++ b/tests/rustdoc/const-generics/add-impl.rs
@@ -2,7 +2,7 @@
 
 use std::ops::Add;
 
-// @has foo/struct.Simd.html '//div[@class="item-decl"]/pre[@class="rust"]' 'pub struct Simd'
+// @has foo/struct.Simd.html '//pre[@class="rust item-decl"]' 'pub struct Simd'
 pub struct Simd {
     inner: T,
 }
diff --git a/tests/rustdoc/const-generics/const-generic-defaults.rs b/tests/rustdoc/const-generics/const-generic-defaults.rs
index acc3b853e567..f781c6a62f24 100644
--- a/tests/rustdoc/const-generics/const-generic-defaults.rs
+++ b/tests/rustdoc/const-generics/const-generic-defaults.rs
@@ -1,5 +1,5 @@
 #![crate_name = "foo"]
 
-// @has foo/struct.Foo.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/struct.Foo.html '//pre[@class="rust item-decl"]' \
 //      'pub struct Foo(_);'
 pub struct Foo(T);
diff --git a/tests/rustdoc/const-generics/const-generics-docs.rs b/tests/rustdoc/const-generics/const-generics-docs.rs
index 543332d2c320..ade70bbe80d9 100644
--- a/tests/rustdoc/const-generics/const-generics-docs.rs
+++ b/tests/rustdoc/const-generics/const-generics-docs.rs
@@ -3,21 +3,21 @@
 #![crate_name = "foo"]
 
 extern crate extern_crate;
-// @has foo/fn.extern_fn.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/fn.extern_fn.html '//pre[@class="rust item-decl"]' \
 //      'pub fn extern_fn() -> impl Iterator'
 pub use extern_crate::extern_fn;
-// @has foo/struct.ExternTy.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/struct.ExternTy.html '//pre[@class="rust item-decl"]' \
 //      'pub struct ExternTy {'
 pub use extern_crate::ExternTy;
-// @has foo/type.TyAlias.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/type.TyAlias.html '//pre[@class="rust item-decl"]' \
 //      'type TyAlias = ExternTy;'
 pub use extern_crate::TyAlias;
-// @has foo/trait.WTrait.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/trait.WTrait.html '//pre[@class="rust item-decl"]' \
 //      'pub trait WTrait'
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'fn hey() -> usize'
+// @has - '//pre[@class="rust item-decl"]' 'fn hey() -> usize'
 pub use extern_crate::WTrait;
 
-// @has foo/trait.Trait.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/trait.Trait.html '//pre[@class="rust item-decl"]' \
 //      'pub trait Trait'
 // @has - '//*[@id="impl-Trait%3C1%3E-for-u8"]//h3[@class="code-header"]' 'impl Trait<1> for u8'
 // @has - '//*[@id="impl-Trait%3C2%3E-for-u8"]//h3[@class="code-header"]' 'impl Trait<2> for u8'
@@ -30,10 +30,10 @@ impl Trait<2> for u8 {}
 impl Trait<{1 + 2}> for u8 {}
 impl Trait for [u8; N] {}
 
-// @has foo/struct.Foo.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/struct.Foo.html '//pre[@class="rust item-decl"]' \
 //      'pub struct Foowhere u8: Trait'
 pub struct Foo where u8: Trait;
-// @has foo/struct.Bar.html '//div[@class="item-decl"]/pre[@class="rust"]' 'pub struct Bar(_)'
+// @has foo/struct.Bar.html '//pre[@class="rust item-decl"]' 'pub struct Bar(_)'
 pub struct Bar([T; N]);
 
 // @has foo/struct.Foo.html '//*[@id="impl-Foo%3CM%3E"]/h3[@class="code-header"]' 'impl Foowhere u8: Trait'
@@ -56,32 +56,32 @@ impl Bar {
     }
 }
 
-// @has foo/fn.test.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/fn.test.html '//pre[@class="rust item-decl"]' \
 //      'pub fn test() -> impl Traitwhere u8: Trait'
 pub fn test() -> impl Trait where u8: Trait {
     2u8
 }
 
-// @has foo/fn.a_sink.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/fn.a_sink.html '//pre[@class="rust item-decl"]' \
 //      'pub async fn a_sink(v: [u8; N]) -> impl Trait'
 pub async fn a_sink(v: [u8; N]) -> impl Trait {
     v
 }
 
-// @has foo/fn.b_sink.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/fn.b_sink.html '//pre[@class="rust item-decl"]' \
 //      'pub async fn b_sink(_: impl Trait)'
 pub async fn b_sink(_: impl Trait) {}
 
-// @has foo/fn.concrete.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/fn.concrete.html '//pre[@class="rust item-decl"]' \
 //      'pub fn concrete() -> [u8; 22]'
 pub fn concrete() -> [u8; 3 + std::mem::size_of::() << 1] {
     Default::default()
 }
 
-// @has foo/type.Faz.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/type.Faz.html '//pre[@class="rust item-decl"]' \
 //      'type Faz = [u8; N];'
 pub type Faz = [u8; N];
-// @has foo/type.Fiz.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/type.Fiz.html '//pre[@class="rust item-decl"]' \
 //      'type Fiz = [[u8; N]; 48];'
 pub type Fiz = [[u8; N]; 3 << 4];
 
@@ -91,7 +91,7 @@ macro_rules! define_me {
     }
 }
 
-// @has foo/struct.Foz.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/struct.Foz.html '//pre[@class="rust item-decl"]' \
 //      'pub struct Foz(_);'
 define_me!(Foz);
 
@@ -103,13 +103,13 @@ impl Q for [u8; N] {
     const ASSOC: usize = N;
 }
 
-// @has foo/fn.q_user.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/fn.q_user.html '//pre[@class="rust item-decl"]' \
 //      'pub fn q_user() -> [u8; 13]'
 pub fn q_user() -> [u8; <[u8; 13] as Q>::ASSOC] {
     [0; <[u8; 13] as Q>::ASSOC]
 }
 
-// @has foo/union.Union.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/union.Union.html '//pre[@class="rust item-decl"]' \
 //      'pub union Union'
 pub union Union {
     // @has - //pre "pub arr: [u8; N]"
@@ -118,7 +118,7 @@ pub union Union {
     pub another_arr: [(); N],
 }
 
-// @has foo/enum.Enum.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/enum.Enum.html '//pre[@class="rust item-decl"]' \
 //      'pub enum Enum'
 pub enum Enum {
     // @has - //pre "Variant([u8; N])"
diff --git a/tests/rustdoc/const-generics/const-impl.rs b/tests/rustdoc/const-generics/const-impl.rs
index 726fb8f0c341..91866b7d890c 100644
--- a/tests/rustdoc/const-generics/const-impl.rs
+++ b/tests/rustdoc/const-generics/const-impl.rs
@@ -8,7 +8,7 @@ pub enum Order {
     Unsorted,
 }
 
-// @has foo/struct.VSet.html '//div[@class="item-decl"]/pre[@class="rust"]' 'pub struct VSet'
+// @has foo/struct.VSet.html '//pre[@class="rust item-decl"]' 'pub struct VSet'
 // @has foo/struct.VSet.html '//*[@id="impl-Send-for-VSet%3CT%2C%20ORDER%3E"]/h3[@class="code-header"]' 'impl Send for VSet'
 // @has foo/struct.VSet.html '//*[@id="impl-Sync-for-VSet%3CT%2C%20ORDER%3E"]/h3[@class="code-header"]' 'impl Sync for VSet'
 pub struct VSet {
diff --git a/tests/rustdoc/const-generics/generic_const_exprs.rs b/tests/rustdoc/const-generics/generic_const_exprs.rs
index c53cf6dcd057..e23b3006da6c 100644
--- a/tests/rustdoc/const-generics/generic_const_exprs.rs
+++ b/tests/rustdoc/const-generics/generic_const_exprs.rs
@@ -2,6 +2,6 @@
 #![feature(generic_const_exprs)]
 #![allow(incomplete_features)]
 // make sure that `ConstEvaluatable` predicates dont cause rustdoc to ICE #77647
-// @has foo/struct.Ice.html '//div[@class="item-decl"]/pre[@class="rust"]' \
+// @has foo/struct.Ice.html '//pre[@class="rust item-decl"]' \
 //      'pub struct Ice;'
 pub struct Ice where [(); N + 1]:;
diff --git a/tests/rustdoc/const-generics/type-alias.rs b/tests/rustdoc/const-generics/type-alias.rs
index 72473a112440..4b93e72d2737 100644
--- a/tests/rustdoc/const-generics/type-alias.rs
+++ b/tests/rustdoc/const-generics/type-alias.rs
@@ -1,4 +1,4 @@
 #![crate_name = "foo"]
 
-// @has foo/type.CellIndex.html '//div[@class="item-decl"]/pre[@class="rust"]' 'type CellIndex = [i64; D];'
+// @has foo/type.CellIndex.html '//pre[@class="rust item-decl"]' 'type CellIndex = [i64; D];'
 pub type CellIndex = [i64; D];
diff --git a/tests/rustdoc/const-intrinsic.rs b/tests/rustdoc/const-intrinsic.rs
index 42f6ac7923bf..6d2c6cce29c2 100644
--- a/tests/rustdoc/const-intrinsic.rs
+++ b/tests/rustdoc/const-intrinsic.rs
@@ -6,20 +6,20 @@
 
 extern "rust-intrinsic" {
     // @has 'foo/fn.transmute.html'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub const unsafe extern "rust-intrinsic" fn transmute(_: T) -> U'
+    // @has - '//pre[@class="rust item-decl"]' 'pub const unsafe extern "rust-intrinsic" fn transmute(_: T) -> U'
     #[stable(since="1.0.0", feature="rust1")]
     #[rustc_const_stable(feature = "const_transmute", since = "1.56.0")]
     pub fn transmute(_: T) -> U;
 
     // @has 'foo/fn.unreachable.html'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub unsafe extern "rust-intrinsic" fn unreachable() -> !'
+    // @has - '//pre[@class="rust item-decl"]' 'pub unsafe extern "rust-intrinsic" fn unreachable() -> !'
     #[stable(since="1.0.0", feature="rust1")]
     pub fn unreachable() -> !;
 }
 
 extern "C" {
     // @has 'foo/fn.needs_drop.html'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub unsafe extern "C" fn needs_drop() -> !'
+    // @has - '//pre[@class="rust item-decl"]' 'pub unsafe extern "C" fn needs_drop() -> !'
     #[stable(since="1.0.0", feature="rust1")]
     pub fn needs_drop() -> !;
 }
diff --git a/tests/rustdoc/const-value-display.rs b/tests/rustdoc/const-value-display.rs
index 8d95f0de9d09..a7548ad2cc46 100644
--- a/tests/rustdoc/const-value-display.rs
+++ b/tests/rustdoc/const-value-display.rs
@@ -1,9 +1,9 @@
 #![crate_name = "foo"]
 
 // @has 'foo/constant.HOUR_IN_SECONDS.html'
-// @has - '//*[@class="item-decl"]//code' 'pub const HOUR_IN_SECONDS: u64 = _; // 3_600u64'
+// @has - '//*[@class="rust item-decl"]//code' 'pub const HOUR_IN_SECONDS: u64 = _; // 3_600u64'
 pub const HOUR_IN_SECONDS: u64 = 60 * 60;
 
 // @has 'foo/constant.NEGATIVE.html'
-// @has - '//*[@class="item-decl"]//code' 'pub const NEGATIVE: i64 = _; // -3_600i64'
+// @has - '//*[@class="rust item-decl"]//code' 'pub const NEGATIVE: i64 = _; // -3_600i64'
 pub const NEGATIVE: i64 = -60 * 60;
diff --git a/tests/rustdoc/decl-trailing-whitespace.rs b/tests/rustdoc/decl-trailing-whitespace.rs
index e47edc132185..d2a12435d8f2 100644
--- a/tests/rustdoc/decl-trailing-whitespace.rs
+++ b/tests/rustdoc/decl-trailing-whitespace.rs
@@ -7,7 +7,7 @@ pub struct Error;
 // @has 'foo/trait.Write.html'
 
 pub trait Write {
-    // @snapshot 'declaration' - '//*[@class="item-decl"]//code'
+    // @snapshot 'declaration' - '//*[@class="rust item-decl"]//code'
     fn poll_write(
         self: Option,
         cx: &mut Option,
diff --git a/tests/rustdoc/fn-pointer-arg-name.rs b/tests/rustdoc/fn-pointer-arg-name.rs
index 96c64ac4e021..359ca64ee8d6 100644
--- a/tests/rustdoc/fn-pointer-arg-name.rs
+++ b/tests/rustdoc/fn-pointer-arg-name.rs
@@ -1,5 +1,5 @@
 #![crate_name = "foo"]
 
 // @has foo/fn.f.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub fn f(callback: fn(len: usize, foo: u32))'
+// @has - '//pre[@class="rust item-decl"]' 'pub fn f(callback: fn(len: usize, foo: u32))'
 pub fn f(callback: fn(len: usize, foo: u32)) {}
diff --git a/tests/rustdoc/hide-complex-unevaluated-const-arguments.rs b/tests/rustdoc/hide-complex-unevaluated-const-arguments.rs
index 406157ce26c8..d368db909fa0 100644
--- a/tests/rustdoc/hide-complex-unevaluated-const-arguments.rs
+++ b/tests/rustdoc/hide-complex-unevaluated-const-arguments.rs
@@ -63,7 +63,7 @@ impl Helper for St {
 // this test as long as one can ensure that private fields are not leaked!
 //
 // @has hide_complex_unevaluated_const_arguments/trait.Sub.html \
-//      '//div[@class="item-decl"]/pre[@class="rust"]' \
+//      '//pre[@class="rust item-decl"]' \
 //      'pub trait Sub: Sup<{ _ }, { _ }> { }'
 pub trait Sub: Sup<{ 90 * 20 * 4 }, { Struct { private: () } }> {}
 
diff --git a/tests/rustdoc/inline-default-methods.rs b/tests/rustdoc/inline-default-methods.rs
index a4ca928f3331..e6468316f583 100644
--- a/tests/rustdoc/inline-default-methods.rs
+++ b/tests/rustdoc/inline-default-methods.rs
@@ -4,6 +4,6 @@
 extern crate inline_default_methods;
 
 // @has inline_default_methods/trait.Foo.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'fn bar(&self);'
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'fn foo(&mut self) { ... }'
+// @has - '//pre[@class="rust item-decl"]' 'fn bar(&self);'
+// @has - '//pre[@class="rust item-decl"]' 'fn foo(&mut self) { ... }'
 pub use inline_default_methods::Foo;
diff --git a/tests/rustdoc/inline_cross/dyn_trait.rs b/tests/rustdoc/inline_cross/dyn_trait.rs
index 0da8bfc3a9ae..649d98f71396 100644
--- a/tests/rustdoc/inline_cross/dyn_trait.rs
+++ b/tests/rustdoc/inline_cross/dyn_trait.rs
@@ -4,28 +4,28 @@
 // edition:2021
 
 // @has user/type.Ty0.html
-// @has - '//*[@class="item-decl"]//code' "dyn for<'any> FnOnce(&'any str) -> bool + 'static"
+// @has - '//*[@class="rust item-decl"]//code' "dyn for<'any> FnOnce(&'any str) -> bool + 'static"
 // FIXME(fmease): Hide default lifetime bound `'static`
 pub use dyn_trait::Ty0;
 
 // @has user/type.Ty1.html
-// @has - '//*[@class="item-decl"]//code' "dyn Display + 'obj"
+// @has - '//*[@class="rust item-decl"]//code' "dyn Display + 'obj"
 pub use dyn_trait::Ty1;
 
 // @has user/type.Ty2.html
-// @has - '//*[@class="item-decl"]//code' "dyn for<'a, 'r> Container<'r, Item<'a, 'static> = ()>"
+// @has - '//*[@class="rust item-decl"]//code' "dyn for<'a, 'r> Container<'r, Item<'a, 'static> = ()>"
 pub use dyn_trait::Ty2;
 
 // @has user/type.Ty3.html
-// @has - '//*[@class="item-decl"]//code' "&'s (dyn ToString + 's)"
+// @has - '//*[@class="rust item-decl"]//code' "&'s (dyn ToString + 's)"
 // FIXME(fmease): Hide default lifetime bound, render "&'s dyn ToString"
 pub use dyn_trait::Ty3;
 
 // @has user/fn.func0.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "func0(_: &dyn Fn())"
+// @has - '//pre[@class="rust item-decl"]' "func0(_: &dyn Fn())"
 // FIXME(fmease): Show placeholder-lifetime bound, render "func0(_: &(dyn Fn() + '_))"
 pub use dyn_trait::func0;
 
 // @has user/fn.func1.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "func1<'func>(_: &(dyn Fn() + 'func))"
+// @has - '//pre[@class="rust item-decl"]' "func1<'func>(_: &(dyn Fn() + 'func))"
 pub use dyn_trait::func1;
diff --git a/tests/rustdoc/inline_cross/impl_trait.rs b/tests/rustdoc/inline_cross/impl_trait.rs
index e8587209b616..7d810ab48137 100644
--- a/tests/rustdoc/inline_cross/impl_trait.rs
+++ b/tests/rustdoc/inline_cross/impl_trait.rs
@@ -4,37 +4,37 @@
 extern crate impl_trait_aux;
 
 // @has impl_trait/fn.func.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "pub fn func<'a>(_x: impl Clone + Into> + 'a)"
-// @!has - '//div[@class="item-decl"]/pre[@class="rust"]' 'where'
+// @has - '//pre[@class="rust item-decl"]' "pub fn func<'a>(_x: impl Clone + Into> + 'a)"
+// @!has - '//pre[@class="rust item-decl"]' 'where'
 pub use impl_trait_aux::func;
 
 // @has impl_trait/fn.func2.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "func2("
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "_x: impl Deref> + Iterator,"
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "_y: impl Iterator)"
-// @!has - '//div[@class="item-decl"]/pre[@class="rust"]' 'where'
+// @has - '//pre[@class="rust item-decl"]' "func2("
+// @has - '//pre[@class="rust item-decl"]' "_x: impl Deref> + Iterator,"
+// @has - '//pre[@class="rust item-decl"]' "_y: impl Iterator)"
+// @!has - '//pre[@class="rust item-decl"]' 'where'
 pub use impl_trait_aux::func2;
 
 // @has impl_trait/fn.func3.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "func3("
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "_x: impl Iterator> + Clone)"
-// @!has - '//div[@class="item-decl"]/pre[@class="rust"]' 'where'
+// @has - '//pre[@class="rust item-decl"]' "func3("
+// @has - '//pre[@class="rust item-decl"]' "_x: impl Iterator> + Clone)"
+// @!has - '//pre[@class="rust item-decl"]' 'where'
 pub use impl_trait_aux::func3;
 
 // @has impl_trait/fn.func4.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "func4("
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "T: Iterator,"
+// @has - '//pre[@class="rust item-decl"]' "func4("
+// @has - '//pre[@class="rust item-decl"]' "T: Iterator,"
 pub use impl_trait_aux::func4;
 
 // @has impl_trait/fn.func5.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "func5("
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "_f: impl for<'any> Fn(&'any str, &'any str) -> bool + for<'r> Other = ()>,"
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "_a: impl for<'alpha, 'beta> Auxiliary<'alpha, Item<'beta> = fn(_: &'beta ())>"
-// @!has - '//div[@class="item-decl"]/pre[@class="rust"]' 'where'
+// @has - '//pre[@class="rust item-decl"]' "func5("
+// @has - '//pre[@class="rust item-decl"]' "_f: impl for<'any> Fn(&'any str, &'any str) -> bool + for<'r> Other = ()>,"
+// @has - '//pre[@class="rust item-decl"]' "_a: impl for<'alpha, 'beta> Auxiliary<'alpha, Item<'beta> = fn(_: &'beta ())>"
+// @!has - '//pre[@class="rust item-decl"]' 'where'
 pub use impl_trait_aux::func5;
 
 // @has impl_trait/fn.async_fn.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "pub async fn async_fn()"
+// @has - '//pre[@class="rust item-decl"]' "pub async fn async_fn()"
 pub use impl_trait_aux::async_fn;
 
 // @has impl_trait/struct.Foo.html
diff --git a/tests/rustdoc/inline_cross/issue-24183.rs b/tests/rustdoc/inline_cross/issue-24183.rs
index d11b6955f3c0..751a32385e81 100644
--- a/tests/rustdoc/inline_cross/issue-24183.rs
+++ b/tests/rustdoc/inline_cross/issue-24183.rs
@@ -5,7 +5,7 @@
 // edition: 2021
 
 // @has usr/trait.U.html
-// @has - '//*[@class="item-decl"]' "pub trait U {"
+// @has - '//*[@class="rust item-decl"]' "pub trait U {"
 // @has - '//*[@id="method.modified"]' \
 // "fn modified(self) -> Self\
 // where \
@@ -14,5 +14,5 @@
 pub use issue_24183::U;
 
 // @has usr/trait.S.html
-// @has - '//*[@class="item-decl"]' 'pub trait S: Sized {'
+// @has - '//*[@class="rust item-decl"]' 'pub trait S: Sized {'
 pub use issue_24183::S;
diff --git a/tests/rustdoc/issue-20646.rs b/tests/rustdoc/issue-20646.rs
index a774b0ca7cd7..b2ee9c26014b 100644
--- a/tests/rustdoc/issue-20646.rs
+++ b/tests/rustdoc/issue-20646.rs
@@ -13,7 +13,7 @@ pub trait Trait {
 }
 
 // @has issue_20646/fn.fun.html \
-//      '//div[@class="item-decl"]/pre[@class="rust"]' 'where T: Trait'
+//      '//pre[@class="rust item-decl"]' 'where T: Trait'
 pub fn fun(_: T) where T: Trait {}
 
 pub mod reexport {
@@ -21,6 +21,6 @@ pub mod reexport {
     //      '//*[@id="associatedtype.Output"]' \
     //      'type Output'
     // @has issue_20646/reexport/fn.fun.html \
-    //      '//div[@class="item-decl"]/pre[@class="rust"]' 'where T: Trait'
+    //      '//pre[@class="rust item-decl"]' 'where T: Trait'
     pub use issue_20646::{Trait, fun};
 }
diff --git a/tests/rustdoc/issue-20727-2.rs b/tests/rustdoc/issue-20727-2.rs
index 026b4f5acc91..c1aa9617b2e2 100644
--- a/tests/rustdoc/issue-20727-2.rs
+++ b/tests/rustdoc/issue-20727-2.rs
@@ -5,18 +5,18 @@ extern crate issue_20727;
 
 // @has issue_20727_2/trait.Add.html
 pub trait Add {
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'trait Add {'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'type Output;'
+    // @has - '//pre[@class="rust item-decl"]' 'trait Add {'
+    // @has - '//pre[@class="rust item-decl"]' 'type Output;'
     type Output;
 
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'fn add(self, rhs: RHS) -> Self::Output;'
+    // @has - '//pre[@class="rust item-decl"]' 'fn add(self, rhs: RHS) -> Self::Output;'
     fn add(self, rhs: RHS) -> Self::Output;
 }
 
 // @has issue_20727_2/reexport/trait.Add.html
 pub mod reexport {
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'trait Add {'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'type Output;'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'fn add(self, rhs: RHS) -> Self::Output;'
+    // @has - '//pre[@class="rust item-decl"]' 'trait Add {'
+    // @has - '//pre[@class="rust item-decl"]' 'type Output;'
+    // @has - '//pre[@class="rust item-decl"]' 'fn add(self, rhs: RHS) -> Self::Output;'
     pub use issue_20727::Add;
 }
diff --git a/tests/rustdoc/issue-20727-3.rs b/tests/rustdoc/issue-20727-3.rs
index 741ce8023d7e..2f9d91fc5f72 100644
--- a/tests/rustdoc/issue-20727-3.rs
+++ b/tests/rustdoc/issue-20727-3.rs
@@ -7,18 +7,18 @@ pub trait Bar {}
 
 // @has issue_20727_3/trait.Deref2.html
 pub trait Deref2 {
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'trait Deref2 {'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'type Target: Bar;'
+    // @has - '//pre[@class="rust item-decl"]' 'trait Deref2 {'
+    // @has - '//pre[@class="rust item-decl"]' 'type Target: Bar;'
     type Target: Bar;
 
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'fn deref(&self) -> Self::Target;'
+    // @has - '//pre[@class="rust item-decl"]' 'fn deref(&self) -> Self::Target;'
     fn deref(&self) -> Self::Target;
 }
 
 // @has issue_20727_3/reexport/trait.Deref2.html
 pub mod reexport {
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'trait Deref2 {'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'type Target: Bar;'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'fn deref(&self) -> Self::Target;'
+    // @has - '//pre[@class="rust item-decl"]' 'trait Deref2 {'
+    // @has - '//pre[@class="rust item-decl"]' 'type Target: Bar;'
+    // @has - '//pre[@class="rust item-decl"]' 'fn deref(&self) -> Self::Target;'
     pub use issue_20727::Deref2;
 }
diff --git a/tests/rustdoc/issue-20727-4.rs b/tests/rustdoc/issue-20727-4.rs
index b8fac4da6ead..ec9f18fc3feb 100644
--- a/tests/rustdoc/issue-20727-4.rs
+++ b/tests/rustdoc/issue-20727-4.rs
@@ -5,36 +5,36 @@ extern crate issue_20727;
 
 // @has issue_20727_4/trait.Index.html
 pub trait Index {
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'trait Index {'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'type Output: ?Sized'
+    // @has - '//pre[@class="rust item-decl"]' 'trait Index {'
+    // @has - '//pre[@class="rust item-decl"]' 'type Output: ?Sized'
     type Output: ?Sized;
 
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' \
+    // @has - '//pre[@class="rust item-decl"]' \
     //        'fn index(&self, index: Idx) -> &Self::Output'
     fn index(&self, index: Idx) -> &Self::Output;
 }
 
 // @has issue_20727_4/trait.IndexMut.html
 pub trait IndexMut: Index {
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' \
+    // @has - '//pre[@class="rust item-decl"]' \
     //        'trait IndexMut: Index {'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' \
+    // @has - '//pre[@class="rust item-decl"]' \
     //        'fn index_mut(&mut self, index: Idx) -> &mut Self::Output;'
     fn index_mut(&mut self, index: Idx) -> &mut Self::Output;
 }
 
 pub mod reexport {
     // @has issue_20727_4/reexport/trait.Index.html
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'trait Indexwhere Idx: ?Sized,{'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'type Output: ?Sized'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' \
+    // @has - '//pre[@class="rust item-decl"]' 'trait Indexwhere Idx: ?Sized,{'
+    // @has - '//pre[@class="rust item-decl"]' 'type Output: ?Sized'
+    // @has - '//pre[@class="rust item-decl"]' \
     //        'fn index(&self, index: Idx) -> &Self::Output'
     pub use issue_20727::Index;
 
     // @has issue_20727_4/reexport/trait.IndexMut.html
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' \
+    // @has - '//pre[@class="rust item-decl"]' \
     //        'trait IndexMut: Indexwhere Idx: ?Sized,{'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' \
+    // @has - '//pre[@class="rust item-decl"]' \
     //        'fn index_mut(&mut self, index: Idx) -> &mut Self::Output;'
     pub use issue_20727::IndexMut;
 }
diff --git a/tests/rustdoc/issue-20727.rs b/tests/rustdoc/issue-20727.rs
index df334821cccc..266848beef93 100644
--- a/tests/rustdoc/issue-20727.rs
+++ b/tests/rustdoc/issue-20727.rs
@@ -5,20 +5,20 @@ extern crate issue_20727;
 
 // @has issue_20727/trait.Deref.html
 pub trait Deref {
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'trait Deref {'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'type Target: ?Sized;'
+    // @has - '//pre[@class="rust item-decl"]' 'trait Deref {'
+    // @has - '//pre[@class="rust item-decl"]' 'type Target: ?Sized;'
     type Target: ?Sized;
 
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' \
+    // @has - '//pre[@class="rust item-decl"]' \
     //        "fn deref<'a>(&'a self) -> &'a Self::Target;"
     fn deref<'a>(&'a self) -> &'a Self::Target;
 }
 
 // @has issue_20727/reexport/trait.Deref.html
 pub mod reexport {
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'trait Deref {'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'type Target: ?Sized;'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' \
+    // @has - '//pre[@class="rust item-decl"]' 'trait Deref {'
+    // @has - '//pre[@class="rust item-decl"]' 'type Target: ?Sized;'
+    // @has - '//pre[@class="rust item-decl"]' \
     //      "fn deref<'a>(&'a self) -> &'a Self::Target;"
     pub use issue_20727::Deref;
 }
diff --git a/tests/rustdoc/issue-22038.rs b/tests/rustdoc/issue-22038.rs
index 19e626ba1323..de6cc78707c6 100644
--- a/tests/rustdoc/issue-22038.rs
+++ b/tests/rustdoc/issue-22038.rs
@@ -1,19 +1,19 @@
 extern "C" {
     // @has issue_22038/fn.foo1.html \
-    //      '//div[@class="item-decl"]/pre[@class="rust"]' 'pub unsafe extern "C" fn foo1()'
+    //      '//pre[@class="rust item-decl"]' 'pub unsafe extern "C" fn foo1()'
     pub fn foo1();
 }
 
 extern "system" {
     // @has issue_22038/fn.foo2.html \
-    //      '//div[@class="item-decl"]/pre[@class="rust"]' 'pub unsafe extern "system" fn foo2()'
+    //      '//pre[@class="rust item-decl"]' 'pub unsafe extern "system" fn foo2()'
     pub fn foo2();
 }
 
 // @has issue_22038/fn.bar.html \
-//      '//div[@class="item-decl"]/pre[@class="rust"]' 'pub extern "C" fn bar()'
+//      '//pre[@class="rust item-decl"]' 'pub extern "C" fn bar()'
 pub extern "C" fn bar() {}
 
 // @has issue_22038/fn.baz.html \
-//      '//div[@class="item-decl"]/pre[@class="rust"]' 'pub extern "system" fn baz()'
+//      '//pre[@class="rust item-decl"]' 'pub extern "system" fn baz()'
 pub extern "system" fn baz() {}
diff --git a/tests/rustdoc/issue-33302.rs b/tests/rustdoc/issue-33302.rs
index 7af00c778361..a316f3ad99bc 100644
--- a/tests/rustdoc/issue-33302.rs
+++ b/tests/rustdoc/issue-33302.rs
@@ -6,17 +6,17 @@ macro_rules! make {
         pub struct S;
 
         // @has issue_33302/constant.CST.html \
-        //        '//div[@class="item-decl"]/pre[@class="rust"]' 'pub const CST: i32'
+        //        '//pre[@class="rust item-decl"]' 'pub const CST: i32'
         pub const CST: i32 = ($n * $n);
         // @has issue_33302/static.ST.html \
-        //        '//div[@class="item-decl"]/pre[@class="rust"]' 'pub static ST: i32'
+        //        '//pre[@class="rust item-decl"]' 'pub static ST: i32'
         pub static ST: i32 = ($n * $n);
 
         pub trait T {
             fn ignore(_: &X) {}
             const C: X;
             // @has issue_33302/trait.T.html \
-            //        '//div[@class="item-decl"]/pre[@class="rust"]' 'const D: i32'
+            //        '//pre[@class="rust item-decl"]' 'const D: i32'
             // @has - '//*[@id="associatedconstant.D"]' 'const D: i32'
             const D: i32 = ($n * $n);
         }
diff --git a/tests/rustdoc/issue-85454.rs b/tests/rustdoc/issue-85454.rs
index 74fc22b31dc0..2d410a5974af 100644
--- a/tests/rustdoc/issue-85454.rs
+++ b/tests/rustdoc/issue-85454.rs
@@ -5,7 +5,7 @@
 extern crate issue_85454;
 
 // @has foo/trait.FromResidual.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub trait FromResidual::Residual> { fn from_residual(residual: R) -> Self; }'
+// @has - '//pre[@class="rust item-decl"]' 'pub trait FromResidual::Residual> { fn from_residual(residual: R) -> Self; }'
 pub trait FromResidual::Residual> {
     fn from_residual(residual: R) -> Self;
 }
@@ -24,6 +24,6 @@ pub enum ControlFlow {
 
 pub mod reexport {
     // @has foo/reexport/trait.FromResidual.html
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub trait FromResidual::Residual> { fn from_residual(residual: R) -> Self; }'
+    // @has - '//pre[@class="rust item-decl"]' 'pub trait FromResidual::Residual> { fn from_residual(residual: R) -> Self; }'
     pub use issue_85454::*;
 }
diff --git a/tests/rustdoc/issue-98697.rs b/tests/rustdoc/issue-98697.rs
index 884b63ac97ff..5d5aee1fe1df 100644
--- a/tests/rustdoc/issue-98697.rs
+++ b/tests/rustdoc/issue-98697.rs
@@ -8,8 +8,8 @@
 
 extern crate issue_98697_reexport_with_anonymous_lifetime;
 
-// @has issue_98697/fn.repro.html '//div[@class="item-decl"]/pre[@class="rust"]/code' 'fn repro()where F: Fn(&str)'
-// @!has issue_98697/fn.repro.html '//div[@class="item-decl"]/pre[@class="rust"]/code' 'for<'
+// @has issue_98697/fn.repro.html '//pre[@class="rust item-decl"]/code' 'fn repro()where F: Fn(&str)'
+// @!has issue_98697/fn.repro.html '//pre[@class="rust item-decl"]/code' 'for<'
 pub use issue_98697_reexport_with_anonymous_lifetime::repro;
 
 // @has issue_98697/struct.Extra.html '//div[@id="trait-implementations-list"]//h3[@class="code-header"]' 'impl MyTrait<&Extra> for Extra'
diff --git a/tests/rustdoc/legacy-const-generic.rs b/tests/rustdoc/legacy-const-generic.rs
index 14533624e448..3a488bdd2088 100644
--- a/tests/rustdoc/legacy-const-generic.rs
+++ b/tests/rustdoc/legacy-const-generic.rs
@@ -2,14 +2,14 @@
 #![feature(rustc_attrs)]
 
 // @has 'foo/fn.foo.html'
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'fn foo(x: usize, const Y: usize, z: usize) -> [usize; 3]'
+// @has - '//pre[@class="rust item-decl"]' 'fn foo(x: usize, const Y: usize, z: usize) -> [usize; 3]'
 #[rustc_legacy_const_generics(1)]
 pub fn foo(x: usize, z: usize) -> [usize; 3] {
     [x, Y, z]
 }
 
 // @has 'foo/fn.bar.html'
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'fn bar(x: usize, const Y: usize, const Z: usize) -> [usize; 3]'
+// @has - '//pre[@class="rust item-decl"]' 'fn bar(x: usize, const Y: usize, const Z: usize) -> [usize; 3]'
 #[rustc_legacy_const_generics(1, 2)]
 pub fn bar(x: usize) -> [usize; 3] {
     [x, Y, z]
diff --git a/tests/rustdoc/lifetime-name.rs b/tests/rustdoc/lifetime-name.rs
index 0fb660591090..15e09f5165a2 100644
--- a/tests/rustdoc/lifetime-name.rs
+++ b/tests/rustdoc/lifetime-name.rs
@@ -1,5 +1,5 @@
 #![crate_name = "foo"]
 
 // @has 'foo/type.Resolutions.html'
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "pub type Resolutions<'tcx> = &'tcx u8;"
+// @has - '//pre[@class="rust item-decl"]' "pub type Resolutions<'tcx> = &'tcx u8;"
 pub type Resolutions<'tcx> = &'tcx u8;
diff --git a/tests/rustdoc/macro-higher-kinded-function.rs b/tests/rustdoc/macro-higher-kinded-function.rs
index b8c52b7b791d..a45ef37a7fce 100644
--- a/tests/rustdoc/macro-higher-kinded-function.rs
+++ b/tests/rustdoc/macro-higher-kinded-function.rs
@@ -11,8 +11,8 @@ macro_rules! gen {
 }
 
 // @has 'foo/struct.Providers.html'
-// @has - '//*[@class="item-decl"]//code' "pub a: for<'tcx> fn(_: TyCtxt<'tcx>, _: u8) -> i8,"
-// @has - '//*[@class="item-decl"]//code' "pub b: for<'tcx> fn(_: TyCtxt<'tcx>, _: u16) -> i16,"
+// @has - '//*[@class="rust item-decl"]//code' "pub a: for<'tcx> fn(_: TyCtxt<'tcx>, _: u8) -> i8,"
+// @has - '//*[@class="rust item-decl"]//code' "pub b: for<'tcx> fn(_: TyCtxt<'tcx>, _: u16) -> i16,"
 // @has - '//*[@id="structfield.a"]/code' "a: for<'tcx> fn(_: TyCtxt<'tcx>, _: u8) -> i8"
 // @has - '//*[@id="structfield.b"]/code' "b: for<'tcx> fn(_: TyCtxt<'tcx>, _: u16) -> i16"
 gen! {
diff --git a/tests/rustdoc/mut-params.rs b/tests/rustdoc/mut-params.rs
index 431db51d95f7..e403b7b78c9e 100644
--- a/tests/rustdoc/mut-params.rs
+++ b/tests/rustdoc/mut-params.rs
@@ -13,6 +13,6 @@ impl Foo {
     pub fn bar(mut bar: ()) {}
 }
 
-// @count foo/fn.baz.html '//div[@class="item-decl"]/pre[@class="rust"]' 1
-// @!has - '//div[@class="item-decl"]/pre[@class="rust"]' 'mut'
+// @count foo/fn.baz.html '//pre[@class="rust item-decl"]' 1
+// @!has - '//pre[@class="rust item-decl"]' 'mut'
 pub fn baz(mut foo: Foo) {}
diff --git a/tests/rustdoc/normalize-assoc-item.rs b/tests/rustdoc/normalize-assoc-item.rs
index 659480479fd1..af7b2f955fd4 100644
--- a/tests/rustdoc/normalize-assoc-item.rs
+++ b/tests/rustdoc/normalize-assoc-item.rs
@@ -19,12 +19,12 @@ impl Trait for isize {
     type X = <() as Trait>::X;
 }
 
-// @has 'normalize_assoc_item/fn.f.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub fn f() -> isize'
+// @has 'normalize_assoc_item/fn.f.html' '//pre[@class="rust item-decl"]' 'pub fn f() -> isize'
 pub fn f() -> ::X {
     0
 }
 
-// @has 'normalize_assoc_item/fn.f2.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub fn f2() -> fn() -> i32'
+// @has 'normalize_assoc_item/fn.f2.html' '//pre[@class="rust item-decl"]' 'pub fn f2() -> fn() -> i32'
 pub fn f2() -> ::X {
     todo!()
 }
@@ -49,10 +49,10 @@ impl Trait for Generic {
 // These can't be normalized because they depend on a generic parameter.
 // However the user can choose whether the text should be displayed as `Inner::X` or `::X`.
 
-// @has 'normalize_assoc_item/struct.Unknown.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub struct Unknown(pub ::X);'
+// @has 'normalize_assoc_item/struct.Unknown.html' '//pre[@class="rust item-decl"]' 'pub struct Unknown(pub ::X);'
 pub struct Unknown(pub ::X);
 
-// @has 'normalize_assoc_item/struct.Unknown2.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub struct Unknown2(pub Inner::X);'
+// @has 'normalize_assoc_item/struct.Unknown2.html' '//pre[@class="rust item-decl"]' 'pub struct Unknown2(pub Inner::X);'
 pub struct Unknown2(pub Inner::X);
 
 trait Lifetimes<'a> {
@@ -63,20 +63,20 @@ impl<'a> Lifetimes<'a> for usize {
     type Y = &'a isize;
 }
 
-// @has 'normalize_assoc_item/fn.g.html' '//div[@class="item-decl"]/pre[@class="rust"]' "pub fn g() -> &isize"
+// @has 'normalize_assoc_item/fn.g.html' '//pre[@class="rust item-decl"]' "pub fn g() -> &isize"
 pub fn g() -> >::Y {
     &0
 }
 
-// @has 'normalize_assoc_item/constant.A.html' '//div[@class="item-decl"]/pre[@class="rust"]' "pub const A: &isize"
+// @has 'normalize_assoc_item/constant.A.html' '//pre[@class="rust item-decl"]' "pub const A: &isize"
 pub const A: >::Y = &0;
 
 // test cross-crate re-exports
 extern crate inner;
-// @has 'normalize_assoc_item/fn.foo.html' '//div[@class="item-decl"]/pre[@class="rust"]' "pub fn foo() -> i32"
+// @has 'normalize_assoc_item/fn.foo.html' '//pre[@class="rust item-decl"]' "pub fn foo() -> i32"
 pub use inner::foo;
 
-// @has 'normalize_assoc_item/fn.h.html' '//div[@class="item-decl"]/pre[@class="rust"]' "pub fn h() -> IntoIter"
+// @has 'normalize_assoc_item/fn.h.html' '//pre[@class="rust item-decl"]' "pub fn h() -> IntoIter"
 pub fn h() ->  as IntoIterator>::IntoIter {
     vec![].into_iter()
 }
diff --git a/tests/rustdoc/pub-method.rs b/tests/rustdoc/pub-method.rs
index 7115a01d079f..ea4791579cd6 100644
--- a/tests/rustdoc/pub-method.rs
+++ b/tests/rustdoc/pub-method.rs
@@ -3,7 +3,7 @@
 #![crate_name = "foo"]
 
 // @has foo/fn.bar.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub fn bar() -> '
+// @has - '//pre[@class="rust item-decl"]' 'pub fn bar() -> '
 /// foo
 pub fn bar() -> usize {
     2
diff --git a/tests/rustdoc/range-arg-pattern.rs b/tests/rustdoc/range-arg-pattern.rs
index bdbcc47c9f28..d0d9111bb408 100644
--- a/tests/rustdoc/range-arg-pattern.rs
+++ b/tests/rustdoc/range-arg-pattern.rs
@@ -1,5 +1,5 @@
 #![crate_name = "foo"]
 
 // @has foo/fn.f.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub fn f(_: u8)'
+// @has - '//pre[@class="rust item-decl"]' 'pub fn f(_: u8)'
 pub fn f(0u8..=255: u8) {}
diff --git a/tests/rustdoc/reexport-dep-foreign-fn.rs b/tests/rustdoc/reexport-dep-foreign-fn.rs
index 6694c91d1044..e7f5720d583c 100644
--- a/tests/rustdoc/reexport-dep-foreign-fn.rs
+++ b/tests/rustdoc/reexport-dep-foreign-fn.rs
@@ -8,5 +8,5 @@
 extern crate all_item_types;
 
 // @has 'foo/fn.foo_ffn.html'
-// @has - '//*[@class="item-decl"]//code' 'pub unsafe extern "C" fn foo_ffn()'
+// @has - '//*[@class="rust item-decl"]//code' 'pub unsafe extern "C" fn foo_ffn()'
 pub use all_item_types::foo_ffn;
diff --git a/tests/rustdoc/reexports-priv.rs b/tests/rustdoc/reexports-priv.rs
index 35c90ba5d7b8..84ea4ad2c9ef 100644
--- a/tests/rustdoc/reexports-priv.rs
+++ b/tests/rustdoc/reexports-priv.rs
@@ -5,7 +5,7 @@
 
 extern crate reexports;
 
-// @has 'foo/macro.addr_of.html' '//*[@class="item-decl"]' 'pub macro addr_of($place:expr) {'
+// @has 'foo/macro.addr_of.html' '//*[@class="rust item-decl"]' 'pub macro addr_of($place:expr) {'
 pub use reexports::addr_of;
 // @!has 'foo/macro.addr_of_crate.html'
 pub(crate) use reexports::addr_of_crate;
@@ -14,7 +14,7 @@ pub(self) use reexports::addr_of_self;
 // @!has 'foo/macro.addr_of_local.html'
 use reexports::addr_of_local;
 
-// @has 'foo/struct.Foo.html' '//*[@class="item-decl"]' 'pub struct Foo;'
+// @has 'foo/struct.Foo.html' '//*[@class="rust item-decl"]' 'pub struct Foo;'
 pub use reexports::Foo;
 // @!has 'foo/struct.FooCrate.html'
 pub(crate) use reexports::FooCrate;
@@ -23,7 +23,7 @@ pub(self) use reexports::FooSelf;
 // @!has 'foo/struct.FooLocal.html'
 use reexports::FooLocal;
 
-// @has 'foo/enum.Bar.html' '//*[@class="item-decl"]' 'pub enum Bar {'
+// @has 'foo/enum.Bar.html' '//*[@class="rust item-decl"]' 'pub enum Bar {'
 pub use reexports::Bar;
 // @!has 'foo/enum.BarCrate.html'
 pub(crate) use reexports::BarCrate;
@@ -32,7 +32,7 @@ pub(self) use reexports::BarSelf;
 // @!has 'foo/enum.BarLocal.html'
 use reexports::BarLocal;
 
-// @has 'foo/fn.foo.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub fn foo()'
+// @has 'foo/fn.foo.html' '//pre[@class="rust item-decl"]' 'pub fn foo()'
 pub use reexports::foo;
 // @!has 'foo/fn.foo_crate.html'
 pub(crate) use reexports::foo_crate;
@@ -41,7 +41,7 @@ pub(self) use reexports::foo_self;
 // @!has 'foo/fn.foo_local.html'
 use reexports::foo_local;
 
-// @has 'foo/type.Type.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub type Type ='
+// @has 'foo/type.Type.html' '//pre[@class="rust item-decl"]' 'pub type Type ='
 pub use reexports::Type;
 // @!has 'foo/type.TypeCrate.html'
 pub(crate) use reexports::TypeCrate;
@@ -50,7 +50,7 @@ pub(self) use reexports::TypeSelf;
 // @!has 'foo/type.TypeLocal.html'
 use reexports::TypeLocal;
 
-// @has 'foo/union.Union.html' '//*[@class="item-decl"]' 'pub union Union {'
+// @has 'foo/union.Union.html' '//*[@class="rust item-decl"]' 'pub union Union {'
 pub use reexports::Union;
 // @!has 'foo/union.UnionCrate.html'
 pub(crate) use reexports::UnionCrate;
@@ -61,66 +61,66 @@ use reexports::UnionLocal;
 
 pub mod outer {
     pub mod inner {
-        // @has 'foo/outer/inner/macro.addr_of.html' '//*[@class="item-decl"]' 'pub macro addr_of($place:expr) {'
+        // @has 'foo/outer/inner/macro.addr_of.html' '//*[@class="rust item-decl"]' 'pub macro addr_of($place:expr) {'
         pub use reexports::addr_of;
-        // @has 'foo/outer/inner/macro.addr_of_crate.html' '//*[@class="item-decl"]' 'pub(crate) macro addr_of_crate($place:expr) {'
+        // @has 'foo/outer/inner/macro.addr_of_crate.html' '//*[@class="rust item-decl"]' 'pub(crate) macro addr_of_crate($place:expr) {'
         pub(crate) use reexports::addr_of_crate;
-        // @has 'foo/outer/inner/macro.addr_of_super.html' '//*[@class="item-decl"]' 'pub(in outer) macro addr_of_super($place:expr) {'
+        // @has 'foo/outer/inner/macro.addr_of_super.html' '//*[@class="rust item-decl"]' 'pub(in outer) macro addr_of_super($place:expr) {'
         pub(super) use reexports::addr_of_super;
         // @!has 'foo/outer/inner/macro.addr_of_self.html'
         pub(self) use reexports::addr_of_self;
         // @!has 'foo/outer/inner/macro.addr_of_local.html'
         use reexports::addr_of_local;
 
-        // @has 'foo/outer/inner/struct.Foo.html' '//*[@class="item-decl"]' 'pub struct Foo;'
+        // @has 'foo/outer/inner/struct.Foo.html' '//*[@class="rust item-decl"]' 'pub struct Foo;'
         pub use reexports::Foo;
-        // @has 'foo/outer/inner/struct.FooCrate.html' '//*[@class="item-decl"]' 'pub(crate) struct FooCrate;'
+        // @has 'foo/outer/inner/struct.FooCrate.html' '//*[@class="rust item-decl"]' 'pub(crate) struct FooCrate;'
         pub(crate) use reexports::FooCrate;
-        // @has 'foo/outer/inner/struct.FooSuper.html' '//*[@class="item-decl"]' 'pub(in outer) struct FooSuper;'
+        // @has 'foo/outer/inner/struct.FooSuper.html' '//*[@class="rust item-decl"]' 'pub(in outer) struct FooSuper;'
         pub(super) use reexports::FooSuper;
         // @!has 'foo/outer/inner/struct.FooSelf.html'
         pub(self) use reexports::FooSelf;
         // @!has 'foo/outer/inner/struct.FooLocal.html'
         use reexports::FooLocal;
 
-        // @has 'foo/outer/inner/enum.Bar.html' '//*[@class="item-decl"]' 'pub enum Bar {'
+        // @has 'foo/outer/inner/enum.Bar.html' '//*[@class="rust item-decl"]' 'pub enum Bar {'
         pub use reexports::Bar;
-        // @has 'foo/outer/inner/enum.BarCrate.html' '//*[@class="item-decl"]' 'pub(crate) enum BarCrate {'
+        // @has 'foo/outer/inner/enum.BarCrate.html' '//*[@class="rust item-decl"]' 'pub(crate) enum BarCrate {'
         pub(crate) use reexports::BarCrate;
-        // @has 'foo/outer/inner/enum.BarSuper.html' '//*[@class="item-decl"]' 'pub(in outer) enum BarSuper {'
+        // @has 'foo/outer/inner/enum.BarSuper.html' '//*[@class="rust item-decl"]' 'pub(in outer) enum BarSuper {'
         pub(super) use reexports::BarSuper;
         // @!has 'foo/outer/inner/enum.BarSelf.html'
         pub(self) use reexports::BarSelf;
         // @!has 'foo/outer/inner/enum.BarLocal.html'
         use reexports::BarLocal;
 
-        // @has 'foo/outer/inner/fn.foo.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub fn foo()'
+        // @has 'foo/outer/inner/fn.foo.html' '//pre[@class="rust item-decl"]' 'pub fn foo()'
         pub use reexports::foo;
-        // @has 'foo/outer/inner/fn.foo_crate.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub(crate) fn foo_crate()'
+        // @has 'foo/outer/inner/fn.foo_crate.html' '//pre[@class="rust item-decl"]' 'pub(crate) fn foo_crate()'
         pub(crate) use reexports::foo_crate;
-        // @has 'foo/outer/inner/fn.foo_super.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub(in outer) fn foo_super()'
+        // @has 'foo/outer/inner/fn.foo_super.html' '//pre[@class="rust item-decl"]' 'pub(in outer) fn foo_super()'
         pub(super) use::reexports::foo_super;
         // @!has 'foo/outer/inner/fn.foo_self.html'
         pub(self) use reexports::foo_self;
         // @!has 'foo/outer/inner/fn.foo_local.html'
         use reexports::foo_local;
 
-        // @has 'foo/outer/inner/type.Type.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub type Type ='
+        // @has 'foo/outer/inner/type.Type.html' '//pre[@class="rust item-decl"]' 'pub type Type ='
         pub use reexports::Type;
-        // @has 'foo/outer/inner/type.TypeCrate.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub(crate) type TypeCrate ='
+        // @has 'foo/outer/inner/type.TypeCrate.html' '//pre[@class="rust item-decl"]' 'pub(crate) type TypeCrate ='
         pub(crate) use reexports::TypeCrate;
-        // @has 'foo/outer/inner/type.TypeSuper.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub(in outer) type TypeSuper ='
+        // @has 'foo/outer/inner/type.TypeSuper.html' '//pre[@class="rust item-decl"]' 'pub(in outer) type TypeSuper ='
         pub(super) use reexports::TypeSuper;
         // @!has 'foo/outer/inner/type.TypeSelf.html'
         pub(self) use reexports::TypeSelf;
         // @!has 'foo/outer/inner/type.TypeLocal.html'
         use reexports::TypeLocal;
 
-        // @has 'foo/outer/inner/union.Union.html' '//*[@class="item-decl"]' 'pub union Union {'
+        // @has 'foo/outer/inner/union.Union.html' '//*[@class="rust item-decl"]' 'pub union Union {'
         pub use reexports::Union;
-        // @has 'foo/outer/inner/union.UnionCrate.html' '//*[@class="item-decl"]' 'pub(crate) union UnionCrate {'
+        // @has 'foo/outer/inner/union.UnionCrate.html' '//*[@class="rust item-decl"]' 'pub(crate) union UnionCrate {'
         pub(crate) use reexports::UnionCrate;
-        // @has 'foo/outer/inner/union.UnionSuper.html' '//*[@class="item-decl"]' 'pub(in outer) union UnionSuper {'
+        // @has 'foo/outer/inner/union.UnionSuper.html' '//*[@class="rust item-decl"]' 'pub(in outer) union UnionSuper {'
         pub(super) use reexports::UnionSuper;
         // @!has 'foo/outer/inner/union.UnionSelf.html'
         pub(self) use reexports::UnionSelf;
diff --git a/tests/rustdoc/reexports.rs b/tests/rustdoc/reexports.rs
index 65d305c6d2c4..3c51ac395afc 100644
--- a/tests/rustdoc/reexports.rs
+++ b/tests/rustdoc/reexports.rs
@@ -4,7 +4,7 @@
 
 extern crate reexports;
 
-// @has 'foo/macro.addr_of.html' '//*[@class="item-decl"]' 'pub macro addr_of($place:expr) {'
+// @has 'foo/macro.addr_of.html' '//*[@class="rust item-decl"]' 'pub macro addr_of($place:expr) {'
 pub use reexports::addr_of;
 // @!has 'foo/macro.addr_of_crate.html'
 pub(crate) use reexports::addr_of_crate;
@@ -13,7 +13,7 @@ pub(self) use reexports::addr_of_self;
 // @!has 'foo/macro.addr_of_local.html'
 use reexports::addr_of_local;
 
-// @has 'foo/struct.Foo.html' '//*[@class="item-decl"]' 'pub struct Foo;'
+// @has 'foo/struct.Foo.html' '//*[@class="rust item-decl"]' 'pub struct Foo;'
 pub use reexports::Foo;
 // @!has 'foo/struct.FooCrate.html'
 pub(crate) use reexports::FooCrate;
@@ -22,7 +22,7 @@ pub(self) use reexports::FooSelf;
 // @!has 'foo/struct.FooLocal.html'
 use reexports::FooLocal;
 
-// @has 'foo/enum.Bar.html' '//*[@class="item-decl"]' 'pub enum Bar {'
+// @has 'foo/enum.Bar.html' '//*[@class="rust item-decl"]' 'pub enum Bar {'
 pub use reexports::Bar;
 // @!has 'foo/enum.BarCrate.html'
 pub(crate) use reexports::BarCrate;
@@ -31,7 +31,7 @@ pub(self) use reexports::BarSelf;
 // @!has 'foo/enum.BarLocal.html'
 use reexports::BarLocal;
 
-// @has 'foo/fn.foo.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub fn foo()'
+// @has 'foo/fn.foo.html' '//pre[@class="rust item-decl"]' 'pub fn foo()'
 pub use reexports::foo;
 // @!has 'foo/fn.foo_crate.html'
 pub(crate) use reexports::foo_crate;
@@ -40,7 +40,7 @@ pub(self) use reexports::foo_self;
 // @!has 'foo/fn.foo_local.html'
 use reexports::foo_local;
 
-// @has 'foo/type.Type.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub type Type ='
+// @has 'foo/type.Type.html' '//pre[@class="rust item-decl"]' 'pub type Type ='
 pub use reexports::Type;
 // @!has 'foo/type.TypeCrate.html'
 pub(crate) use reexports::TypeCrate;
@@ -49,7 +49,7 @@ pub(self) use reexports::TypeSelf;
 // @!has 'foo/type.TypeLocal.html'
 use reexports::TypeLocal;
 
-// @has 'foo/union.Union.html' '//*[@class="item-decl"]' 'pub union Union {'
+// @has 'foo/union.Union.html' '//*[@class="rust item-decl"]' 'pub union Union {'
 pub use reexports::Union;
 // @!has 'foo/union.UnionCrate.html'
 pub(crate) use reexports::UnionCrate;
@@ -60,7 +60,7 @@ use reexports::UnionLocal;
 
 pub mod outer {
     pub mod inner {
-        // @has 'foo/outer/inner/macro.addr_of.html' '//*[@class="item-decl"]' 'pub macro addr_of($place:expr) {'
+        // @has 'foo/outer/inner/macro.addr_of.html' '//*[@class="rust item-decl"]' 'pub macro addr_of($place:expr) {'
         pub use reexports::addr_of;
         // @!has 'foo/outer/inner/macro.addr_of_crate.html'
         pub(crate) use reexports::addr_of_crate;
@@ -71,7 +71,7 @@ pub mod outer {
         // @!has 'foo/outer/inner/macro.addr_of_local.html'
         use reexports::addr_of_local;
 
-        // @has 'foo/outer/inner/struct.Foo.html' '//*[@class="item-decl"]' 'pub struct Foo;'
+        // @has 'foo/outer/inner/struct.Foo.html' '//*[@class="rust item-decl"]' 'pub struct Foo;'
         pub use reexports::Foo;
         // @!has 'foo/outer/inner/struct.FooCrate.html'
         pub(crate) use reexports::FooCrate;
@@ -82,7 +82,7 @@ pub mod outer {
         // @!has 'foo/outer/inner/struct.FooLocal.html'
         use reexports::FooLocal;
 
-        // @has 'foo/outer/inner/enum.Bar.html' '//*[@class="item-decl"]' 'pub enum Bar {'
+        // @has 'foo/outer/inner/enum.Bar.html' '//*[@class="rust item-decl"]' 'pub enum Bar {'
         pub use reexports::Bar;
         // @!has 'foo/outer/inner/enum.BarCrate.html'
         pub(crate) use reexports::BarCrate;
@@ -93,7 +93,7 @@ pub mod outer {
         // @!has 'foo/outer/inner/enum.BarLocal.html'
         use reexports::BarLocal;
 
-        // @has 'foo/outer/inner/fn.foo.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub fn foo()'
+        // @has 'foo/outer/inner/fn.foo.html' '//pre[@class="rust item-decl"]' 'pub fn foo()'
         pub use reexports::foo;
         // @!has 'foo/outer/inner/fn.foo_crate.html'
         pub(crate) use reexports::foo_crate;
@@ -104,7 +104,7 @@ pub mod outer {
         // @!has 'foo/outer/inner/fn.foo_local.html'
         use reexports::foo_local;
 
-        // @has 'foo/outer/inner/type.Type.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub type Type ='
+        // @has 'foo/outer/inner/type.Type.html' '//pre[@class="rust item-decl"]' 'pub type Type ='
         pub use reexports::Type;
         // @!has 'foo/outer/inner/type.TypeCrate.html'
         pub(crate) use reexports::TypeCrate;
@@ -115,7 +115,7 @@ pub mod outer {
         // @!has 'foo/outer/inner/type.TypeLocal.html'
         use reexports::TypeLocal;
 
-        // @has 'foo/outer/inner/union.Union.html' '//*[@class="item-decl"]' 'pub union Union {'
+        // @has 'foo/outer/inner/union.Union.html' '//*[@class="rust item-decl"]' 'pub union Union {'
         pub use reexports::Union;
         // @!has 'foo/outer/inner/union.UnionCrate.html'
         pub(crate) use reexports::UnionCrate;
diff --git a/tests/rustdoc/rfc-2632-const-trait-impl.rs b/tests/rustdoc/rfc-2632-const-trait-impl.rs
index a229a4e29fef..1120302ac7ea 100644
--- a/tests/rustdoc/rfc-2632-const-trait-impl.rs
+++ b/tests/rustdoc/rfc-2632-const-trait-impl.rs
@@ -12,10 +12,10 @@ use std::marker::Destruct;
 
 pub struct S(T);
 
-// @!has foo/trait.Tr.html '//div[@class="item-decl"]/pre[@class="rust"]/code/a[@class="trait"]' '~const'
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]/code/a[@class="trait"]' 'Clone'
-// @!has - '//div[@class="item-decl"]/pre[@class="rust"]/code/span[@class="where"]' '~const'
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]/code/span[@class="where"]' ': Clone'
+// @!has foo/trait.Tr.html '//pre[@class="rust item-decl"]/code/a[@class="trait"]' '~const'
+// @has - '//pre[@class="rust item-decl"]/code/a[@class="trait"]' 'Clone'
+// @!has - '//pre[@class="rust item-decl"]/code/span[@class="where"]' '~const'
+// @has - '//pre[@class="rust item-decl"]/code/span[@class="where"]' ': Clone'
 #[const_trait]
 pub trait Tr {
     // @!has - '//section[@id="method.a"]/h4[@class="code-header"]' '~const'
@@ -45,10 +45,10 @@ where
     }
 }
 
-// @!has foo/fn.foo.html '//div[@class="item-decl"]/pre[@class="rust"]/code/a[@class="trait"]' '~const'
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]/code/a[@class="trait"]' 'Clone'
-// @!has - '//div[@class="item-decl"]/pre[@class="rust"]/code/span[@class="where fmt-newline"]' '~const'
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]/code/span[@class="where fmt-newline"]' ': Clone'
+// @!has foo/fn.foo.html '//pre[@class="rust item-decl"]/code/a[@class="trait"]' '~const'
+// @has - '//pre[@class="rust item-decl"]/code/a[@class="trait"]' 'Clone'
+// @!has - '//pre[@class="rust item-decl"]/code/span[@class="where fmt-newline"]' '~const'
+// @has - '//pre[@class="rust item-decl"]/code/span[@class="where fmt-newline"]' ': Clone'
 pub const fn foo()
 where
     Option: ~const Clone + ~const Destruct,
diff --git a/tests/rustdoc/safe-intrinsic.rs b/tests/rustdoc/safe-intrinsic.rs
index 0b65bf1dfed0..c508909f9aaf 100644
--- a/tests/rustdoc/safe-intrinsic.rs
+++ b/tests/rustdoc/safe-intrinsic.rs
@@ -7,16 +7,16 @@
 
 extern "rust-intrinsic" {
     // @has 'foo/fn.abort.html'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub extern "rust-intrinsic" fn abort() -> !'
+    // @has - '//pre[@class="rust item-decl"]' 'pub extern "rust-intrinsic" fn abort() -> !'
     #[rustc_safe_intrinsic]
     pub fn abort() -> !;
     // @has 'foo/fn.unreachable.html'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub unsafe extern "rust-intrinsic" fn unreachable() -> !'
+    // @has - '//pre[@class="rust item-decl"]' 'pub unsafe extern "rust-intrinsic" fn unreachable() -> !'
     pub fn unreachable() -> !;
 }
 
 extern "C" {
     // @has 'foo/fn.needs_drop.html'
-    // @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub unsafe extern "C" fn needs_drop() -> !'
+    // @has - '//pre[@class="rust item-decl"]' 'pub unsafe extern "C" fn needs_drop() -> !'
     pub fn needs_drop() -> !;
 }
diff --git a/tests/rustdoc/slice-links.rs b/tests/rustdoc/slice-links.rs
index 67137fdcab27..6dea3b74ea3e 100644
--- a/tests/rustdoc/slice-links.rs
+++ b/tests/rustdoc/slice-links.rs
@@ -4,25 +4,25 @@
 pub struct MyBox(*const T);
 
 // @has 'foo/fn.alpha.html'
-// @snapshot link_slice_u32 - '//div[@class="item-decl"]/pre[@class="rust"]/code'
+// @snapshot link_slice_u32 - '//pre[@class="rust item-decl"]/code'
 pub fn alpha() -> &'static [u32] {
     loop {}
 }
 
 // @has 'foo/fn.beta.html'
-// @snapshot link_slice_generic - '//div[@class="item-decl"]/pre[@class="rust"]/code'
+// @snapshot link_slice_generic - '//pre[@class="rust item-decl"]/code'
 pub fn beta() -> &'static [T] {
     loop {}
 }
 
 // @has 'foo/fn.gamma.html'
-// @snapshot link_box_u32 - '//div[@class="item-decl"]/pre[@class="rust"]/code'
+// @snapshot link_box_u32 - '//pre[@class="rust item-decl"]/code'
 pub fn gamma() -> MyBox<[u32]> {
     loop {}
 }
 
 // @has 'foo/fn.delta.html'
-// @snapshot link_box_generic - '//div[@class="item-decl"]/pre[@class="rust"]/code'
+// @snapshot link_box_generic - '//pre[@class="rust item-decl"]/code'
 pub fn delta() -> MyBox<[T]> {
     loop {}
 }
diff --git a/tests/rustdoc/struct-arg-pattern.rs b/tests/rustdoc/struct-arg-pattern.rs
index 3bfb43a0bef2..6f06c8c9c499 100644
--- a/tests/rustdoc/struct-arg-pattern.rs
+++ b/tests/rustdoc/struct-arg-pattern.rs
@@ -4,7 +4,7 @@ struct BodyId {
     hir_id: usize,
 }
 
-// @has 'foo/fn.body_owner.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub fn body_owner(_: BodyId)'
+// @has 'foo/fn.body_owner.html' '//pre[@class="rust item-decl"]' 'pub fn body_owner(_: BodyId)'
 pub fn body_owner(BodyId { hir_id }: BodyId) {
     // ...
 }
diff --git a/tests/rustdoc/test-parens.rs b/tests/rustdoc/test-parens.rs
index f5fdb1f52bf8..9640b96b6b54 100644
--- a/tests/rustdoc/test-parens.rs
+++ b/tests/rustdoc/test-parens.rs
@@ -1,5 +1,5 @@
 #![crate_name = "foo"]
 
 // @has foo/fn.foo.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' "_: &(dyn ToString + 'static)"
+// @has - '//pre[@class="rust item-decl"]' "_: &(dyn ToString + 'static)"
 pub fn foo(_: &(ToString + 'static)) {}
diff --git a/tests/rustdoc/toggle-item-contents.rs b/tests/rustdoc/toggle-item-contents.rs
index 5d34ec09b66d..1f745043894e 100644
--- a/tests/rustdoc/toggle-item-contents.rs
+++ b/tests/rustdoc/toggle-item-contents.rs
@@ -55,7 +55,7 @@ pub union Union {
 
 // @has 'toggle_item_contents/struct.PrivStruct.html'
 // @count - '//details[@class="toggle type-contents-toggle"]' 0
-// @has - '//div[@class="item-decl"]' '/* private fields */'
+// @has - '//pre[@class="rust item-decl"]' '/* private fields */'
 pub struct PrivStruct {
     a: usize,
     b: usize,
@@ -81,8 +81,8 @@ pub enum EnumStructVariant {
 }
 
 // @has 'toggle_item_contents/enum.LargeEnum.html'
-// @count - '//div[@class="item-decl"]/pre//details[@class="toggle type-contents-toggle"]' 1
-// @has - '//div[@class="item-decl"]/pre//details[@class="toggle type-contents-toggle"]' 'Show 13 variants'
+// @count - '//pre[@class="rust item-decl"]//details[@class="toggle type-contents-toggle"]' 1
+// @has - '//pre[@class="rust item-decl"]//details[@class="toggle type-contents-toggle"]' 'Show 13 variants'
 pub enum LargeEnum {
     A, B, C, D, E, F(u8), G, H, I, J, K, L, M
 }
diff --git a/tests/rustdoc/trait_alias.rs b/tests/rustdoc/trait_alias.rs
index 791c099cc523..5c3f82c6b3cf 100644
--- a/tests/rustdoc/trait_alias.rs
+++ b/tests/rustdoc/trait_alias.rs
@@ -14,13 +14,13 @@ use std::fmt::Debug;
 // @has foo/index.html '//a[@class="traitalias"]' 'Foo'
 
 // @has foo/traitalias.CopyAlias.html
-// @has - '//section[@id="main-content"]/div[@class="item-decl"]/pre' 'trait CopyAlias = Copy;'
+// @has - '//section[@id="main-content"]/pre[@class="rust item-decl"]' 'trait CopyAlias = Copy;'
 pub trait CopyAlias = Copy;
 // @has foo/traitalias.Alias2.html
-// @has - '//section[@id="main-content"]/div[@class="item-decl"]/pre' 'trait Alias2 = Copy + Debug;'
+// @has - '//section[@id="main-content"]/pre[@class="rust item-decl"]' 'trait Alias2 = Copy + Debug;'
 pub trait Alias2 = Copy + Debug;
 // @has foo/traitalias.Foo.html
-// @has - '//section[@id="main-content"]/div[@class="item-decl"]/pre' 'trait Foo = Into + Debug;'
+// @has - '//section[@id="main-content"]/pre[@class="rust item-decl"]' 'trait Foo = Into + Debug;'
 pub trait Foo = Into + Debug;
 // @has foo/fn.bar.html '//a[@href="traitalias.Alias2.html"]' 'Alias2'
 pub fn bar() where T: Alias2 {}
diff --git a/tests/rustdoc/tuple-struct-fields-doc.rs b/tests/rustdoc/tuple-struct-fields-doc.rs
index d72c10f2b254..2836ddedc2b2 100644
--- a/tests/rustdoc/tuple-struct-fields-doc.rs
+++ b/tests/rustdoc/tuple-struct-fields-doc.rs
@@ -19,7 +19,7 @@ pub struct Foo(
 );
 
 // @has foo/enum.Bar.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'BarVariant(String),'
+// @has - '//pre[@class="rust item-decl"]' 'BarVariant(String),'
 // @matches - '//*[@id="variant.BarVariant.fields"]/h4' '^Tuple Fields$'
 // @has - '//*[@id="variant.BarVariant.field.0"]' '0: String'
 // @has - '//*[@id="variant.BarVariant.fields"]//*[@class="docblock"]' 'Hello docs'
diff --git a/tests/rustdoc/tuples.rs b/tests/rustdoc/tuples.rs
index e716de8b55c8..0ea5b5bfac90 100644
--- a/tests/rustdoc/tuples.rs
+++ b/tests/rustdoc/tuples.rs
@@ -1,20 +1,20 @@
 #![crate_name = "foo"]
 
 // @has foo/fn.tuple0.html //pre 'pub fn tuple0(x: ())'
-// @snapshot link_unit - '//div[@class="item-decl"]/pre[@class="rust"]/code'
+// @snapshot link_unit - '//pre[@class="rust item-decl"]/code'
 pub fn tuple0(x: ()) -> () { x }
 // @has foo/fn.tuple1.html //pre 'pub fn tuple1(x: (i32,)) -> (i32,)'
-// @snapshot link1_i32 - '//div[@class="item-decl"]/pre[@class="rust"]/code'
+// @snapshot link1_i32 - '//pre[@class="rust item-decl"]/code'
 pub fn tuple1(x: (i32,)) -> (i32,) { x }
 // @has foo/fn.tuple2.html //pre 'pub fn tuple2(x: (i32, i32)) -> (i32, i32)'
-// @snapshot link2_i32 - '//div[@class="item-decl"]/pre[@class="rust"]/code'
+// @snapshot link2_i32 - '//pre[@class="rust item-decl"]/code'
 pub fn tuple2(x: (i32, i32)) -> (i32, i32) { x }
 // @has foo/fn.tuple1_t.html //pre 'pub fn tuple1_t(x: (T,)) -> (T,)'
-// @snapshot link1_t - '//div[@class="item-decl"]/pre[@class="rust"]/code'
+// @snapshot link1_t - '//pre[@class="rust item-decl"]/code'
 pub fn tuple1_t(x: (T,)) -> (T,) { x }
 // @has foo/fn.tuple2_t.html //pre 'pub fn tuple2_t(x: (T, T)) -> (T, T)'
-// @snapshot link2_t - '//div[@class="item-decl"]/pre[@class="rust"]/code'
+// @snapshot link2_t - '//pre[@class="rust item-decl"]/code'
 pub fn tuple2_t(x: (T, T)) -> (T, T) { x }
 // @has foo/fn.tuple2_tu.html //pre 'pub fn tuple2_tu(x: (T, U)) -> (T, U)'
-// @snapshot link2_tu - '//div[@class="item-decl"]/pre[@class="rust"]/code'
+// @snapshot link2_tu - '//pre[@class="rust item-decl"]/code'
 pub fn tuple2_tu(x: (T, U)) -> (T, U) { x }
diff --git a/tests/rustdoc/unit-return.rs b/tests/rustdoc/unit-return.rs
index 353cd1c47724..6ddfa0c4d5ca 100644
--- a/tests/rustdoc/unit-return.rs
+++ b/tests/rustdoc/unit-return.rs
@@ -4,14 +4,14 @@
 
 extern crate unit_return;
 
-// @has 'foo/fn.f0.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'F: FnMut(u8) + Clone'
+// @has 'foo/fn.f0.html' '//pre[@class="rust item-decl"]' 'F: FnMut(u8) + Clone'
 pub fn f0(f: F) {}
 
-// @has 'foo/fn.f1.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'F: FnMut(u16) + Clone'
+// @has 'foo/fn.f1.html' '//pre[@class="rust item-decl"]' 'F: FnMut(u16) + Clone'
 pub fn f1 () + Clone>(f: F) {}
 
-// @has 'foo/fn.f2.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'F: FnMut(u32) + Clone'
+// @has 'foo/fn.f2.html' '//pre[@class="rust item-decl"]' 'F: FnMut(u32) + Clone'
 pub use unit_return::f2;
 
-// @has 'foo/fn.f3.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'F: FnMut(u64) + Clone'
+// @has 'foo/fn.f3.html' '//pre[@class="rust item-decl"]' 'F: FnMut(u64) + Clone'
 pub use unit_return::f3;
diff --git a/tests/rustdoc/where-sized.rs b/tests/rustdoc/where-sized.rs
index c0c085e6ac72..c1ac834b2fcb 100644
--- a/tests/rustdoc/where-sized.rs
+++ b/tests/rustdoc/where-sized.rs
@@ -1,6 +1,6 @@
 #![crate_name = "foo"]
 
 // @has foo/fn.foo.html
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'pub fn foo(_: &X)'
-// @has - '//div[@class="item-decl"]/pre[@class="rust"]' 'where X: ?Sized,'
+// @has - '//pre[@class="rust item-decl"]' 'pub fn foo(_: &X)'
+// @has - '//pre[@class="rust item-decl"]' 'where X: ?Sized,'
 pub fn foo(_: &X) where X: ?Sized {}
diff --git a/tests/rustdoc/where.SWhere_Simd_item-decl.html b/tests/rustdoc/where.SWhere_Simd_item-decl.html
index f84cb3753cb9..6f151f2328e4 100644
--- a/tests/rustdoc/where.SWhere_Simd_item-decl.html
+++ b/tests/rustdoc/where.SWhere_Simd_item-decl.html
@@ -1 +1 @@
-
\ No newline at end of file
+
pub struct Simd<T>(_)
where
    T: MyTrait
;
\ No newline at end of file diff --git a/tests/rustdoc/where.SWhere_TraitWhere_item-decl.html b/tests/rustdoc/where.SWhere_TraitWhere_item-decl.html index 85b626674274..11df902f3720 100644 --- a/tests/rustdoc/where.SWhere_TraitWhere_item-decl.html +++ b/tests/rustdoc/where.SWhere_TraitWhere_item-decl.html @@ -1,8 +1,8 @@ -
pub trait TraitWhere {
+
pub trait TraitWhere {
     type Item<'a>
    where
        Self: 'a
; fn func(self)
    where
        Self: Sized
, { ... } fn lines(self) -> Lines<Self>
    where
        Self: Sized
, { ... } -}
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/rustdoc/where.rs b/tests/rustdoc/where.rs index 644a00582445..4c34c7e51d93 100644 --- a/tests/rustdoc/where.rs +++ b/tests/rustdoc/where.rs @@ -22,13 +22,13 @@ impl Delta where D: MyTrait { pub struct Echo(E); // @has 'foo/struct.Simd.html' -// @snapshot SWhere_Simd_item-decl - '//div[@class="item-decl"]' +// @snapshot SWhere_Simd_item-decl - '//pre[@class="rust item-decl"]' pub struct Simd([T; 1]) where T: MyTrait; // @has 'foo/trait.TraitWhere.html' -// @snapshot SWhere_TraitWhere_item-decl - '//div[@class="item-decl"]' +// @snapshot SWhere_TraitWhere_item-decl - '//pre[@class="rust item-decl"]' pub trait TraitWhere { type Item<'a> where Self: 'a; @@ -57,6 +57,6 @@ pub enum Foxtrot { Foxtrot1(F) } // "impl MyTrait for Foxtrotwhere F: MyTrait" impl MyTrait for Foxtrotwhere F: MyTrait {} -// @has foo/type.Golf.html '//div[@class="item-decl"]/pre[@class="rust"]' \ +// @has foo/type.Golf.html '//pre[@class="rust item-decl"]' \ // "type Golfwhere T: Clone, = (T, T)" pub type Golf where T: Clone = (T, T); diff --git a/tests/rustdoc/whitespace-after-where-clause.enum.html b/tests/rustdoc/whitespace-after-where-clause.enum.html index eeb22878f3c6..904d46110361 100644 --- a/tests/rustdoc/whitespace-after-where-clause.enum.html +++ b/tests/rustdoc/whitespace-after-where-clause.enum.html @@ -1,4 +1,4 @@ -
pub enum Cow<'a, B>where
    B: ToOwned<dyn Clone> + ?Sized + 'a,
{ +
pub enum Cow<'a, B>where
    B: ToOwned<dyn Clone> + ?Sized + 'a,
{ Borrowed(&'a B), Whatever(u32), -}
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/rustdoc/whitespace-after-where-clause.enum2.html b/tests/rustdoc/whitespace-after-where-clause.enum2.html index c8037c2a8df5..7bc9b780197b 100644 --- a/tests/rustdoc/whitespace-after-where-clause.enum2.html +++ b/tests/rustdoc/whitespace-after-where-clause.enum2.html @@ -1,4 +1,4 @@ -
pub enum Cow2<'a, B: ?Sized + ToOwned<dyn Clone> + 'a> {
+
pub enum Cow2<'a, B: ?Sized + ToOwned<dyn Clone> + 'a> {
     Borrowed(&'a B),
     Whatever(u32),
-}
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/rustdoc/whitespace-after-where-clause.rs b/tests/rustdoc/whitespace-after-where-clause.rs index 4b740b970fc2..b540c7c97c1f 100644 --- a/tests/rustdoc/whitespace-after-where-clause.rs +++ b/tests/rustdoc/whitespace-after-where-clause.rs @@ -4,7 +4,7 @@ #![crate_name = "foo"] // @has 'foo/trait.ToOwned.html' -// @snapshot trait - '//*[@class="item-decl"]' +// @snapshot trait - '//*[@class="rust item-decl"]' pub trait ToOwned where T: Clone { @@ -14,7 +14,7 @@ where T: Clone } // @has 'foo/trait.ToOwned2.html' -// @snapshot trait2 - '//*[@class="item-decl"]' +// @snapshot trait2 - '//*[@class="rust item-decl"]' // There should be a whitespace before `{` in this case! pub trait ToOwned2 { type Owned; @@ -23,7 +23,7 @@ pub trait ToOwned2 { } // @has 'foo/enum.Cow.html' -// @snapshot enum - '//*[@class="item-decl"]' +// @snapshot enum - '//*[@class="rust item-decl"]' pub enum Cow<'a, B: ?Sized + 'a> where B: ToOwned, @@ -33,7 +33,7 @@ where } // @has 'foo/enum.Cow2.html' -// @snapshot enum2 - '//*[@class="item-decl"]' +// @snapshot enum2 - '//*[@class="rust item-decl"]' // There should be a whitespace before `{` in this case! pub enum Cow2<'a, B: ?Sized + ToOwned + 'a> { Borrowed(&'a B), @@ -41,7 +41,7 @@ pub enum Cow2<'a, B: ?Sized + ToOwned + 'a> { } // @has 'foo/struct.Struct.html' -// @snapshot struct - '//*[@class="item-decl"]' +// @snapshot struct - '//*[@class="rust item-decl"]' pub struct Struct<'a, B: ?Sized + 'a> where B: ToOwned, @@ -51,7 +51,7 @@ where } // @has 'foo/struct.Struct2.html' -// @snapshot struct2 - '//*[@class="item-decl"]' +// @snapshot struct2 - '//*[@class="rust item-decl"]' // There should be a whitespace before `{` in this case! pub struct Struct2<'a, B: ?Sized + ToOwned + 'a> { pub a: &'a B, @@ -59,7 +59,7 @@ pub struct Struct2<'a, B: ?Sized + ToOwned + 'a> { } // @has 'foo/union.Union.html' -// @snapshot union - '//*[@class="item-decl"]' +// @snapshot union - '//*[@class="rust item-decl"]' pub union Union<'a, B: ?Sized + 'a> where B: ToOwned, @@ -69,7 +69,7 @@ where } // @has 'foo/union.Union2.html' -// @snapshot union2 - '//*[@class="item-decl"]' +// @snapshot union2 - '//*[@class="rust item-decl"]' // There should be a whitespace before `{` in this case! pub union Union2<'a, B: ?Sized + ToOwned + 'a> { a: &'a B, diff --git a/tests/rustdoc/whitespace-after-where-clause.struct.html b/tests/rustdoc/whitespace-after-where-clause.struct.html index 5892270b2f93..54faee9e4052 100644 --- a/tests/rustdoc/whitespace-after-where-clause.struct.html +++ b/tests/rustdoc/whitespace-after-where-clause.struct.html @@ -1,4 +1,4 @@ -
pub struct Struct<'a, B>where
    B: ToOwned<dyn Clone> + ?Sized + 'a,
{ +
pub struct Struct<'a, B>where
    B: ToOwned<dyn Clone> + ?Sized + 'a,
{ pub a: &'a B, pub b: u32, -}
\ No newline at end of file +} \ No newline at end of file diff --git a/tests/rustdoc/whitespace-after-where-clause.struct2.html b/tests/rustdoc/whitespace-after-where-clause.struct2.html index d3952b0c5669..d872d516c094 100644 --- a/tests/rustdoc/whitespace-after-where-clause.struct2.html +++ b/tests/rustdoc/whitespace-after-where-clause.struct2.html @@ -1,4 +1,4 @@ -
pub struct Struct2<'a, B: ?Sized + ToOwned<dyn Clone> + 'a> {
+
pub struct Struct2<'a, B: ?Sized + ToOwned<dyn Clone> + 'a> {
     pub a: &'a B,
     pub b: u32,
-}
\ No newline at end of file +} \ No newline at end of file diff --git a/tests/rustdoc/whitespace-after-where-clause.trait.html b/tests/rustdoc/whitespace-after-where-clause.trait.html index a2df06e7736a..bc3653de52d1 100644 --- a/tests/rustdoc/whitespace-after-where-clause.trait.html +++ b/tests/rustdoc/whitespace-after-where-clause.trait.html @@ -1,6 +1,6 @@ -
pub trait ToOwned<T>where
    T: Clone,
{ +
pub trait ToOwned<T>where
    T: Clone,
{ type Owned; fn to_owned(&self) -> Self::Owned; fn whatever(&self) -> T; -}
\ No newline at end of file +} \ No newline at end of file diff --git a/tests/rustdoc/whitespace-after-where-clause.trait2.html b/tests/rustdoc/whitespace-after-where-clause.trait2.html index 2bfd6f7685a6..eda4ca72acc1 100644 --- a/tests/rustdoc/whitespace-after-where-clause.trait2.html +++ b/tests/rustdoc/whitespace-after-where-clause.trait2.html @@ -1,6 +1,6 @@ -
pub trait ToOwned2<T: Clone> {
+
pub trait ToOwned2<T: Clone> {
     type Owned;
 
     fn to_owned(&self) -> Self::Owned;
     fn whatever(&self) -> T;
-}
\ No newline at end of file +} \ No newline at end of file diff --git a/tests/rustdoc/whitespace-after-where-clause.union.html b/tests/rustdoc/whitespace-after-where-clause.union.html index 066f8f87b160..03a26280ba2c 100644 --- a/tests/rustdoc/whitespace-after-where-clause.union.html +++ b/tests/rustdoc/whitespace-after-where-clause.union.html @@ -1,3 +1,3 @@ -
pub union Union<'a, B>where
    B: ToOwned<dyn Clone> + ?Sized + 'a,
{ +
pub union Union<'a, B>where
    B: ToOwned<dyn Clone> + ?Sized + 'a,
{ /* private fields */ -}
\ No newline at end of file +} \ No newline at end of file diff --git a/tests/rustdoc/whitespace-after-where-clause.union2.html b/tests/rustdoc/whitespace-after-where-clause.union2.html index 6b48c5dbd3e2..fc78e9b6039b 100644 --- a/tests/rustdoc/whitespace-after-where-clause.union2.html +++ b/tests/rustdoc/whitespace-after-where-clause.union2.html @@ -1,3 +1,3 @@ -
pub union Union2<'a, B: ?Sized + ToOwned<dyn Clone> + 'a> {
+
pub union Union2<'a, B: ?Sized + ToOwned<dyn Clone> + 'a> {
     /* private fields */
-}
\ No newline at end of file +} \ No newline at end of file diff --git a/tests/rustdoc/wrapping.rs b/tests/rustdoc/wrapping.rs index 178b8adc3f04..dd5c700329f1 100644 --- a/tests/rustdoc/wrapping.rs +++ b/tests/rustdoc/wrapping.rs @@ -1,5 +1,5 @@ use std::fmt::Debug; -// @has 'wrapping/fn.foo.html' '//div[@class="item-decl"]/pre[@class="rust"]' 'pub fn foo() -> impl Debug' -// @count - '//div[@class="item-decl"]/pre[@class="rust"]/br' 0 +// @has 'wrapping/fn.foo.html' '//pre[@class="rust item-decl"]' 'pub fn foo() -> impl Debug' +// @count - '//pre[@class="rust item-decl"]/br' 0 pub fn foo() -> impl Debug {} From 5b08c9f39754039ef9c6cbde157ac9eb8c252a58 Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Wed, 25 Jan 2023 09:48:32 -0500 Subject: [PATCH 25/69] stage-step cfgs --- library/core/src/cmp.rs | 40 +++--------------------------- library/core/src/intrinsics.rs | 2 -- library/core/src/intrinsics/mir.rs | 6 ++--- library/core/src/lib.rs | 3 +-- library/core/src/mem/mod.rs | 1 - library/core/src/panicking.rs | 5 ++-- library/core/src/task/wake.rs | 2 +- 7 files changed, 9 insertions(+), 50 deletions(-) diff --git a/library/core/src/cmp.rs b/library/core/src/cmp.rs index a7d6fec7d3dc..b75ae996e485 100644 --- a/library/core/src/cmp.rs +++ b/library/core/src/cmp.rs @@ -798,16 +798,7 @@ pub trait Ord: Eq + PartialOrd { Self: Sized, Self: ~const Destruct, { - #[cfg(not(bootstrap))] - { - max_by(self, other, Ord::cmp) - } - - #[cfg(bootstrap)] - match self.cmp(&other) { - Ordering::Less | Ordering::Equal => other, - Ordering::Greater => self, - } + max_by(self, other, Ord::cmp) } /// Compares and returns the minimum of two values. @@ -828,16 +819,7 @@ pub trait Ord: Eq + PartialOrd { Self: Sized, Self: ~const Destruct, { - #[cfg(not(bootstrap))] - { - min_by(self, other, Ord::cmp) - } - - #[cfg(bootstrap)] - match self.cmp(&other) { - Ordering::Less | Ordering::Equal => self, - Ordering::Greater => other, - } + min_by(self, other, Ord::cmp) } /// Restrict a value to a certain interval. @@ -1234,23 +1216,7 @@ where F: ~const Destruct, K: ~const Destruct, { - cfg_if! { - if #[cfg(bootstrap)] { - const fn imp K, K: ~const Ord>( - f: &mut F, - (v1, v2): (&T, &T), - ) -> Ordering - where - T: ~const Destruct, - K: ~const Destruct, - { - f(v1).cmp(&f(v2)) - } - min_by(v1, v2, ConstFnMutClosure::new(&mut f, imp)) - } else { - min_by(v1, v2, const |v1, v2| f(v1).cmp(&f(v2))) - } - } + min_by(v1, v2, const |v1, v2| f(v1).cmp(&f(v2))) } /// Compares and returns the maximum of two values. diff --git a/library/core/src/intrinsics.rs b/library/core/src/intrinsics.rs index a315a28fb0d9..b1ed3b31e430 100644 --- a/library/core/src/intrinsics.rs +++ b/library/core/src/intrinsics.rs @@ -58,7 +58,6 @@ use crate::marker::DiscriminantKind; use crate::marker::Tuple; use crate::mem; -#[cfg(not(bootstrap))] pub mod mir; // These imports are used for simplifying intra-doc links @@ -963,7 +962,6 @@ extern "rust-intrinsic" { /// This intrinsic does not have a stable counterpart. #[rustc_const_unstable(feature = "const_assert_type2", issue = "none")] #[rustc_safe_intrinsic] - #[cfg(not(bootstrap))] pub fn assert_mem_uninitialized_valid(); /// Gets a reference to a static `Location` indicating where it was called. diff --git a/library/core/src/intrinsics/mir.rs b/library/core/src/intrinsics/mir.rs index e3157b66902e..c0fd71ebae8a 100644 --- a/library/core/src/intrinsics/mir.rs +++ b/library/core/src/intrinsics/mir.rs @@ -60,8 +60,7 @@ //! //! # Examples //! -#![cfg_attr(bootstrap, doc = "```rust,compile_fail")] -#![cfg_attr(not(bootstrap), doc = "```rust")] +//! ```rust //! #![feature(core_intrinsics, custom_mir)] //! //! extern crate core; @@ -294,8 +293,7 @@ define!( /// /// # Examples /// - #[cfg_attr(bootstrap, doc = "```rust,compile_fail")] - #[cfg_attr(not(bootstrap), doc = "```rust")] + /// ```rust /// #![feature(custom_mir, core_intrinsics)] /// /// extern crate core; diff --git a/library/core/src/lib.rs b/library/core/src/lib.rs index 8790649abe6f..80cd53790673 100644 --- a/library/core/src/lib.rs +++ b/library/core/src/lib.rs @@ -191,7 +191,7 @@ #![feature(cfg_sanitize)] #![feature(cfg_target_has_atomic)] #![feature(cfg_target_has_atomic_equal_alignment)] -#![cfg_attr(not(bootstrap), feature(const_closures))] +#![feature(const_closures)] #![feature(const_fn_floating_point_arithmetic)] #![feature(const_mut_refs)] #![feature(const_precise_live_drops)] @@ -248,7 +248,6 @@ #![feature(sse4a_target_feature)] #![feature(tbm_target_feature)] #![feature(wasm_target_feature)] -#![cfg_attr(bootstrap, feature(f16c_target_feature))] // allow using `core::` in intra-doc links #[allow(unused_extern_crates)] diff --git a/library/core/src/mem/mod.rs b/library/core/src/mem/mod.rs index 5e01ccc07d8f..a67df7ed557a 100644 --- a/library/core/src/mem/mod.rs +++ b/library/core/src/mem/mod.rs @@ -682,7 +682,6 @@ pub unsafe fn zeroed() -> T { pub unsafe fn uninitialized() -> T { // SAFETY: the caller must guarantee that an uninitialized value is valid for `T`. unsafe { - #[cfg(not(bootstrap))] // If the compiler hits this itself then it deserves the UB. intrinsics::assert_mem_uninitialized_valid::(); let mut val = MaybeUninit::::uninit(); diff --git a/library/core/src/panicking.rs b/library/core/src/panicking.rs index 48e90e6d7940..805a1e51ae9c 100644 --- a/library/core/src/panicking.rs +++ b/library/core/src/panicking.rs @@ -117,7 +117,7 @@ pub const fn panic(expr: &'static str) -> ! { /// Like `panic`, but without unwinding and track_caller to reduce the impact on codesize. #[cfg_attr(not(feature = "panic_immediate_abort"), inline(never), cold)] #[cfg_attr(feature = "panic_immediate_abort", inline)] -#[cfg_attr(not(bootstrap), lang = "panic_nounwind")] // needed by codegen for non-unwinding panics +#[lang = "panic_nounwind"] // needed by codegen for non-unwinding panics #[rustc_nounwind] pub fn panic_nounwind(expr: &'static str) -> ! { panic_nounwind_fmt(fmt::Arguments::new_v1(&[expr], &[])); @@ -165,8 +165,7 @@ fn panic_bounds_check(index: usize, len: usize) -> ! { /// any extra arguments (including those synthesized by track_caller). #[cfg_attr(not(feature = "panic_immediate_abort"), inline(never), cold)] #[cfg_attr(feature = "panic_immediate_abort", inline)] -#[cfg_attr(bootstrap, lang = "panic_no_unwind")] // needed by codegen for panic in nounwind function -#[cfg_attr(not(bootstrap), lang = "panic_cannot_unwind")] // needed by codegen for panic in nounwind function +#[lang = "panic_cannot_unwind"] // needed by codegen for panic in nounwind function #[rustc_nounwind] fn panic_cannot_unwind() -> ! { panic_nounwind("panic in a function that cannot unwind") diff --git a/library/core/src/task/wake.rs b/library/core/src/task/wake.rs index 89adfccd9013..808825326aef 100644 --- a/library/core/src/task/wake.rs +++ b/library/core/src/task/wake.rs @@ -174,7 +174,7 @@ impl RawWakerVTable { /// Currently, `Context` only serves to provide access to a [`&Waker`](Waker) /// which can be used to wake the current task. #[stable(feature = "futures_api", since = "1.36.0")] -#[cfg_attr(not(bootstrap), lang = "Context")] +#[lang = "Context"] pub struct Context<'a> { waker: &'a Waker, // Ensure we future-proof against variance changes by forcing From e9f56300676fd94639283ad86b93c048b6837ed6 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Mon, 30 Jan 2023 19:28:47 +0100 Subject: [PATCH 26/69] Migrate last part of CSS themes to CSS variables --- src/librustdoc/html/static/css/rustdoc.css | 8 ++++++++ src/librustdoc/html/static/css/themes/ayu.css | 17 +++++------------ src/librustdoc/html/static/css/themes/dark.css | 14 ++++---------- src/librustdoc/html/static/css/themes/light.css | 14 ++++---------- 4 files changed, 21 insertions(+), 32 deletions(-) diff --git a/src/librustdoc/html/static/css/rustdoc.css b/src/librustdoc/html/static/css/rustdoc.css index 8699508e4391..81d8d3f7c328 100644 --- a/src/librustdoc/html/static/css/rustdoc.css +++ b/src/librustdoc/html/static/css/rustdoc.css @@ -1262,6 +1262,14 @@ a.test-arrow:hover { line-height: 1.5; color: inherit; } +#search-tabs button:not(.selected) { + background-color: var(--search-tab-button-not-selected-background); + border-top-color: var(--search-tab-button-not-selected-border-top-color); +} +#search-tabs button:hover, #search-tabs button.selected { + background-color: var(--search-tab-button-selected-background); + border-top-color: var(--search-tab-button-selected-border-top-color); +} #search-tabs .count { font-size: 1rem; diff --git a/src/librustdoc/html/static/css/themes/ayu.css b/src/librustdoc/html/static/css/themes/ayu.css index ed779bf6166e..d20d13ab36d2 100644 --- a/src/librustdoc/html/static/css/themes/ayu.css +++ b/src/librustdoc/html/static/css/themes/ayu.css @@ -46,6 +46,10 @@ Original by Dempfi (https://github.com/dempfi/ayu) --search-results-alias-color: #c5c5c5; --search-results-grey-color: #999; --search-tab-title-count-color: #888; + --search-tab-button-not-selected-border-top-color: none; + --search-tab-button-not-selected-background: transparent !important; + --search-tab-button-selected-border-top-color: none; + --search-tab-button-selected-background: #141920 !important; --stab-background-color: #314559; --stab-code-color: #e6e1cf; --code-highlight-kw-color: #ff7733; @@ -171,28 +175,17 @@ pre, .rustdoc.source .example-wrap { } #search-tabs > button.selected { - background-color: #141920 !important; border-bottom: 1px solid #ffb44c !important; border-top: none; } - #search-tabs > button:not(.selected) { - background-color: transparent !important; border: none; + background-color: transparent !important; } - #search-tabs > button:hover { border-bottom: 1px solid rgba(242, 151, 24, 0.3); } -/* rules that this theme does not need to set, here to satisfy the rule checker */ -/* note that a lot of these are partially set in some way (meaning they are set -individually rather than as a group) */ -/* FIXME: these rules should be at the bottom of the file but currently must be -above the `@media (max-width: 700px)` rules due to a bug in the css checker */ -/* see https://github.com/rust-lang/rust/pull/71237#issuecomment-618170143 */ -#search-tabs > button:hover, #search-tabs > button.selected {} - #settings-menu > a img { filter: invert(100); } diff --git a/src/librustdoc/html/static/css/themes/dark.css b/src/librustdoc/html/static/css/themes/dark.css index 3766f0daa42f..b84d87c4a54f 100644 --- a/src/librustdoc/html/static/css/themes/dark.css +++ b/src/librustdoc/html/static/css/themes/dark.css @@ -41,6 +41,10 @@ --search-results-alias-color: #fff; --search-results-grey-color: #ccc; --search-tab-title-count-color: #888; + --search-tab-button-not-selected-border-top-color: #252525; + --search-tab-button-not-selected-background: #252525; + --search-tab-button-selected-border-top-color: #0089ff; + --search-tab-button-selected-background: #353535; --stab-background-color: #314559; --stab-code-color: #e6e1cf; --code-highlight-kw-color: #ab8ac1; @@ -95,13 +99,3 @@ --scrape-example-code-wrapper-background-start: rgba(53, 53, 53, 1); --scrape-example-code-wrapper-background-end: rgba(53, 53, 53, 0); } - -#search-tabs > button:not(.selected) { - background-color: #252525; - border-top-color: #252525; -} - -#search-tabs > button:hover, #search-tabs > button.selected { - border-top-color: #0089ff; - background-color: #353535; -} diff --git a/src/librustdoc/html/static/css/themes/light.css b/src/librustdoc/html/static/css/themes/light.css index 8a7f6abcf8d8..342274e67671 100644 --- a/src/librustdoc/html/static/css/themes/light.css +++ b/src/librustdoc/html/static/css/themes/light.css @@ -41,6 +41,10 @@ --search-results-alias-color: #000; --search-results-grey-color: #999; --search-tab-title-count-color: #888; + --search-tab-button-not-selected-border-top-color: #e6e6e6; + --search-tab-button-not-selected-background: #e6e6e6; + --search-tab-button-selected-border-top-color: #0089ff; + --search-tab-button-selected-background: #ffffff; --stab-background-color: #fff5d6; --stab-code-color: #000; --code-highlight-kw-color: #8959a8; @@ -92,13 +96,3 @@ --scrape-example-code-wrapper-background-start: rgba(255, 255, 255, 1); --scrape-example-code-wrapper-background-end: rgba(255, 255, 255, 0); } - -#search-tabs > button:not(.selected) { - background-color: #e6e6e6; - border-top-color: #e6e6e6; -} - -#search-tabs > button:hover, #search-tabs > button.selected { - background-color: #ffffff; - border-top-color: #0089ff; -} From 343a359109a48f4ece657831bf0331e22d108800 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Mon, 30 Jan 2023 19:04:55 +0000 Subject: [PATCH 27/69] Use ObligationCtxt::new_in_snapshot in satisfied_from_param_env --- .../src/traits/const_evaluatable.rs | 2 +- ...m-with-associated-const-in-where-clause.rs | 17 ++++++++ ...gle-satisfied-ConstEvaluatable-in-probe.rs | 39 +++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 tests/rustdoc/document-item-with-associated-const-in-where-clause.rs create mode 100644 tests/ui/const-generics/generic_const_exprs/single-satisfied-ConstEvaluatable-in-probe.rs diff --git a/compiler/rustc_trait_selection/src/traits/const_evaluatable.rs b/compiler/rustc_trait_selection/src/traits/const_evaluatable.rs index f779d9dd8d93..786473457ae4 100644 --- a/compiler/rustc_trait_selection/src/traits/const_evaluatable.rs +++ b/compiler/rustc_trait_selection/src/traits/const_evaluatable.rs @@ -219,7 +219,7 @@ fn satisfied_from_param_env<'tcx>( } if let Some(Ok(c)) = single_match { - let ocx = ObligationCtxt::new(infcx); + let ocx = ObligationCtxt::new_in_snapshot(infcx); assert!(ocx.eq(&ObligationCause::dummy(), param_env, c.ty(), ct.ty()).is_ok()); assert!(ocx.eq(&ObligationCause::dummy(), param_env, c, ct).is_ok()); assert!(ocx.select_all_or_error().is_empty()); diff --git a/tests/rustdoc/document-item-with-associated-const-in-where-clause.rs b/tests/rustdoc/document-item-with-associated-const-in-where-clause.rs new file mode 100644 index 000000000000..c9408ef3360b --- /dev/null +++ b/tests/rustdoc/document-item-with-associated-const-in-where-clause.rs @@ -0,0 +1,17 @@ +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] + +pub trait Enumerable { + const N: usize; +} + +#[derive(Clone)] +pub struct SymmetricGroup +where + S: Enumerable, + [(); S::N]: Sized, +{ + _phantom: std::marker::PhantomData, +} + +fn main() {} diff --git a/tests/ui/const-generics/generic_const_exprs/single-satisfied-ConstEvaluatable-in-probe.rs b/tests/ui/const-generics/generic_const_exprs/single-satisfied-ConstEvaluatable-in-probe.rs new file mode 100644 index 000000000000..0ba0c5a72efb --- /dev/null +++ b/tests/ui/const-generics/generic_const_exprs/single-satisfied-ConstEvaluatable-in-probe.rs @@ -0,0 +1,39 @@ +// check-pass + +#![allow(incomplete_features)] +#![feature(generic_const_exprs)] + +use std::marker::PhantomData; + +pub trait Bytes { + const BYTES: usize; +} + +#[derive(Clone, Debug)] +pub struct Conster +where + OT: Bytes, + [(); OT::BYTES]: Sized, +{ + _offset_type: PhantomData OT>, +} + +impl Conster +where + OT: Bytes, + [(); OT::BYTES]: Sized, +{ + pub fn new() -> Self { + Conster { _offset_type: PhantomData } + } +} + +pub fn make_conster() -> Conster +where + COT: Bytes, + [(); COT::BYTES]: Sized, +{ + Conster::new() +} + +fn main() {} From 085a48e7983d2b3b1f6d6fbeb127dd90b2a1377c Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Mon, 23 Jan 2023 22:33:59 +0000 Subject: [PATCH 28/69] Implement unsizing in the new trait solver --- .../src/solve/assembly.rs | 10 + .../src/solve/project_goals.rs | 7 + .../src/solve/trait_goals.rs | 175 ++++++++++++++++++ tests/ui/traits/new-solver/unsize-good.rs | 25 +++ 4 files changed, 217 insertions(+) create mode 100644 tests/ui/traits/new-solver/unsize-good.rs diff --git a/compiler/rustc_trait_selection/src/solve/assembly.rs b/compiler/rustc_trait_selection/src/solve/assembly.rs index e44fd82ba223..e6c36d37ffbf 100644 --- a/compiler/rustc_trait_selection/src/solve/assembly.rs +++ b/compiler/rustc_trait_selection/src/solve/assembly.rs @@ -173,6 +173,14 @@ pub(super) trait GoalKind<'tcx>: TypeFoldable<'tcx> + Copy + Eq { ecx: &mut EvalCtxt<'_, 'tcx>, goal: Goal<'tcx, Self>, ) -> QueryResult<'tcx>; + + // Implement unsizing. The most common forms of unsizing are array to slice, + // and concrete (Sized) type into a `dyn Trait`. ADTs and Tuples can also + // have their final field unsized if it's generic. + fn consider_builtin_unsize_candidate( + ecx: &mut EvalCtxt<'_, 'tcx>, + goal: Goal<'tcx, Self>, + ) -> QueryResult<'tcx>; } impl<'tcx> EvalCtxt<'_, 'tcx> { @@ -303,6 +311,8 @@ impl<'tcx> EvalCtxt<'_, 'tcx> { G::consider_builtin_future_candidate(self, goal) } else if lang_items.gen_trait() == Some(trait_def_id) { G::consider_builtin_generator_candidate(self, goal) + } else if lang_items.unsize_trait() == Some(trait_def_id) { + G::consider_builtin_unsize_candidate(self, goal) } else { Err(NoSolution) }; diff --git a/compiler/rustc_trait_selection/src/solve/project_goals.rs b/compiler/rustc_trait_selection/src/solve/project_goals.rs index b175a6dde179..00b4fa67d68c 100644 --- a/compiler/rustc_trait_selection/src/solve/project_goals.rs +++ b/compiler/rustc_trait_selection/src/solve/project_goals.rs @@ -554,6 +554,13 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> { .to_predicate(tcx), ) } + + fn consider_builtin_unsize_candidate( + _ecx: &mut EvalCtxt<'_, 'tcx>, + goal: Goal<'tcx, Self>, + ) -> QueryResult<'tcx> { + bug!("`Unsize` does not have an associated type: {:?}", goal); + } } /// This behavior is also implemented in `rustc_ty_utils` and in the old `project` code. diff --git a/compiler/rustc_trait_selection/src/solve/trait_goals.rs b/compiler/rustc_trait_selection/src/solve/trait_goals.rs index 1ea8fb8fd3dc..28144da1b1e9 100644 --- a/compiler/rustc_trait_selection/src/solve/trait_goals.rs +++ b/compiler/rustc_trait_selection/src/solve/trait_goals.rs @@ -8,6 +8,7 @@ use super::{Certainty, EvalCtxt, Goal, QueryResult}; use rustc_hir::def_id::DefId; use rustc_infer::infer::InferCtxt; use rustc_infer::traits::query::NoSolution; +use rustc_infer::traits::util::supertraits; use rustc_middle::ty::fast_reject::{DeepRejectCtxt, TreatParams}; use rustc_middle::ty::{self, ToPredicate, Ty, TyCtxt}; use rustc_middle::ty::{TraitPredicate, TypeVisitable}; @@ -238,6 +239,180 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> { .to_predicate(tcx), ) } + + fn consider_builtin_unsize_candidate( + ecx: &mut EvalCtxt<'_, 'tcx>, + goal: Goal<'tcx, Self>, + ) -> QueryResult<'tcx> { + let tcx = ecx.tcx(); + let a_ty = goal.predicate.self_ty(); + let b_ty = goal.predicate.trait_ref.substs.type_at(1); + if b_ty.is_ty_var() { + return ecx.make_canonical_response(Certainty::AMBIGUOUS); + } + ecx.infcx.probe(|_| { + match (a_ty.kind(), b_ty.kind()) { + // Trait upcasting, or `dyn Trait + Auto + 'a` -> `dyn Trait + 'b` + ( + &ty::Dynamic(a_data, a_region, ty::Dyn), + &ty::Dynamic(b_data, b_region, ty::Dyn), + ) => { + // All of a's auto traits need to be in b's auto traits. + let auto_traits_compatible = b_data + .auto_traits() + .all(|b| a_data.auto_traits().any(|a| a == b)); + if !auto_traits_compatible { + return Err(NoSolution); + } + + // If the principal def ids match (or are both none), then we're not doing + // trait upcasting. We're just removing auto traits (or shortening the lifetime). + if a_data.principal_def_id() == b_data.principal_def_id() { + // Require that all of the trait predicates from A match B, except for + // the auto traits. We do this by constructing a new A type with B's + // auto traits, and equating these types. + let new_a_data = a_data + .iter() + .filter(|a| { + matches!( + a.skip_binder(), + ty::ExistentialPredicate::Trait(_) | ty::ExistentialPredicate::Projection(_) + ) + }) + .chain( + b_data + .auto_traits() + .map(ty::ExistentialPredicate::AutoTrait) + .map(ty::Binder::dummy), + ); + let new_a_data = tcx.mk_poly_existential_predicates(new_a_data); + let new_a_ty = tcx.mk_dynamic(new_a_data, b_region, ty::Dyn); + + // We also require that A's lifetime outlives B's lifetime. + let mut nested_obligations = ecx.infcx.eq(goal.param_env, new_a_ty, b_ty)?; + nested_obligations.push(goal.with(tcx, ty::Binder::dummy(ty::OutlivesPredicate(a_region, b_region)))); + + ecx.evaluate_all_and_make_canonical_response(nested_obligations) + } else if let Some(a_principal) = a_data.principal() + && let Some(b_principal) = b_data.principal() + && supertraits(tcx, a_principal.with_self_ty(tcx, a_ty)) + .any(|trait_ref| trait_ref.def_id() == b_principal.def_id()) + { + // FIXME: Intentionally ignoring `need_migrate_deref_output_trait_object` here for now. + // Confirm upcasting candidate + todo!() + } else { + Err(NoSolution) + } + } + // `T` -> `dyn Trait` unsizing + (_, &ty::Dynamic(data, region, ty::Dyn)) => { + // Can only unsize to an object-safe type + // FIXME: Can auto traits be *not* object safe? + if data + .auto_traits() + .chain(data.principal_def_id()) + .any(|def_id| !tcx.is_object_safe(def_id)) + { + return Err(NoSolution); + } + + let Some(sized_def_id) = tcx.lang_items().sized_trait() else { + return Err(NoSolution); + }; + let nested_goals: Vec<_> = data + .iter() + // Check that the type implements all of the predicates of the def-id. + // (i.e. the principal, all of the associated types match, and any auto traits) + .map(|pred| goal.with(tcx, pred.with_self_ty(tcx, a_ty))) + .chain([ + // The type must be Sized to be unsized. + goal.with( + tcx, + ty::Binder::dummy(tcx.mk_trait_ref(sized_def_id, [a_ty])), + ), + // The type must outlive the lifetime of the `dyn` we're unsizing into. + goal.with( + tcx, + ty::Binder::dummy(ty::OutlivesPredicate(a_ty, region)), + ), + ]) + .collect(); + + ecx.evaluate_all_and_make_canonical_response(nested_goals) + } + // `[T; n]` -> `[T]` unsizing + (&ty::Array(a_elem_ty, ..), &ty::Slice(b_elem_ty)) => { + // We just require that the element type stays the same + let nested_goals = ecx.infcx.eq(goal.param_env, a_elem_ty, b_elem_ty)?; + ecx.evaluate_all_and_make_canonical_response(nested_goals) + } + // Struct unsizing `Struct` -> `Struct` where `T: Unsize` + (&ty::Adt(a_def, a_substs), &ty::Adt(b_def, b_substs)) + if a_def.is_struct() && a_def.did() == b_def.did() => + { + let unsizing_params = tcx.unsizing_params_for_adt(a_def.did()); + // We must be unsizing some type parameters. This also implies + // that the struct has a tail field. + if unsizing_params.is_empty() { + return Err(NoSolution); + } + + let tail_field = a_def + .non_enum_variant() + .fields + .last() + .expect("expected unsized ADT to have a tail field"); + let tail_field_ty = tcx.bound_type_of(tail_field.did); + + let a_tail_ty = tail_field_ty.subst(tcx, a_substs); + let b_tail_ty = tail_field_ty.subst(tcx, b_substs); + + // Substitute just the unsizing params from B into A. The type after + // this substitution must be equal to B. This is so we don't unsize + // unrelated type parameters. + let new_a_substs = tcx.mk_substs(a_substs.iter().enumerate().map(|(i, a)| { + if unsizing_params.contains(i as u32) { b_substs[i] } else { a } + })); + let unsized_a_ty = tcx.mk_adt(a_def, new_a_substs); + + // Finally, we require that `TailA: Unsize` for the tail field + // types. + let mut nested_goals = ecx.infcx.eq(goal.param_env, unsized_a_ty, b_ty)?; + nested_goals.push(goal.with( + tcx, + ty::Binder::dummy( + tcx.mk_trait_ref(goal.predicate.def_id(), [a_tail_ty, b_tail_ty]), + ), + )); + + ecx.evaluate_all_and_make_canonical_response(nested_goals) + } + // Tuple unsizing `(.., T)` -> `(.., U)` where `T: Unsize` + (&ty::Tuple(a_tys), &ty::Tuple(b_tys)) + if a_tys.len() == b_tys.len() && !a_tys.is_empty() => + { + let (a_last_ty, a_rest_tys) = a_tys.split_last().unwrap(); + let b_last_ty = b_tys.last().unwrap(); + + // Substitute just the tail field of B., and require that they're equal. + let unsized_a_ty = tcx.mk_tup(a_rest_tys.iter().chain([b_last_ty])); + let mut nested_goals = ecx.infcx.eq(goal.param_env, unsized_a_ty, b_ty)?; + + // Similar to ADTs, require that the rest of the fields are equal. + nested_goals.push(goal.with( + tcx, + ty::Binder::dummy( + tcx.mk_trait_ref(goal.predicate.def_id(), [*a_last_ty, *b_last_ty]), + ), + )); + + ecx.evaluate_all_and_make_canonical_response(nested_goals) + } + _ => Err(NoSolution), + } + }) + } } impl<'tcx> EvalCtxt<'_, 'tcx> { diff --git a/tests/ui/traits/new-solver/unsize-good.rs b/tests/ui/traits/new-solver/unsize-good.rs new file mode 100644 index 000000000000..87ed9cfd10ae --- /dev/null +++ b/tests/ui/traits/new-solver/unsize-good.rs @@ -0,0 +1,25 @@ +// compile-flags: -Ztrait-solver=next +// check-pass + +#![feature(unsized_tuple_coercion)] + +trait Foo {} + +impl Foo for i32 {} + +fn main() { + // Unsizing via struct + let _: Box = Box::new(1i32); + + // Slice unsizing + let y = [1, 2, 3]; + let _: &[i32] = &y; + + // Tuple unsizing + let hi = (1i32,); + let _: &(dyn Foo,) = &hi; + + // Dropping auto traits + let a: &(dyn Foo + Send) = &1; + let _: &dyn Foo = a; +} From c24844048ff023aeaf47080634507677ffbe7001 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Mon, 23 Jan 2023 23:56:54 +0000 Subject: [PATCH 29/69] Trait upcasting support in new solver --- .../src/solve/assembly.rs | 21 ++- .../src/solve/project_goals.rs | 7 + .../src/solve/trait_goals.rs | 138 +++++++++++------- .../traits/new-solver/upcast-right-substs.rs | 14 ++ .../traits/new-solver/upcast-wrong-substs.rs | 13 ++ .../new-solver/upcast-wrong-substs.stderr | 14 ++ 6 files changed, 148 insertions(+), 59 deletions(-) create mode 100644 tests/ui/traits/new-solver/upcast-right-substs.rs create mode 100644 tests/ui/traits/new-solver/upcast-wrong-substs.rs create mode 100644 tests/ui/traits/new-solver/upcast-wrong-substs.stderr diff --git a/compiler/rustc_trait_selection/src/solve/assembly.rs b/compiler/rustc_trait_selection/src/solve/assembly.rs index e6c36d37ffbf..1c4e498c57e4 100644 --- a/compiler/rustc_trait_selection/src/solve/assembly.rs +++ b/compiler/rustc_trait_selection/src/solve/assembly.rs @@ -174,13 +174,20 @@ pub(super) trait GoalKind<'tcx>: TypeFoldable<'tcx> + Copy + Eq { goal: Goal<'tcx, Self>, ) -> QueryResult<'tcx>; - // Implement unsizing. The most common forms of unsizing are array to slice, - // and concrete (Sized) type into a `dyn Trait`. ADTs and Tuples can also - // have their final field unsized if it's generic. + // The most common forms of unsizing are array to slice, and concrete (Sized) + // type into a `dyn Trait`. ADTs and Tuples can also have their final field + // unsized if it's generic. fn consider_builtin_unsize_candidate( ecx: &mut EvalCtxt<'_, 'tcx>, goal: Goal<'tcx, Self>, ) -> QueryResult<'tcx>; + + // `dyn Trait1` can be unsized to `dyn Trait2` if they are the same trait, or + // if `Trait2` is a (transitive) supertrait of `Trait2`. + fn consider_builtin_dyn_unsize_candidates( + ecx: &mut EvalCtxt<'_, 'tcx>, + goal: Goal<'tcx, Self>, + ) -> Vec>; } impl<'tcx> EvalCtxt<'_, 'tcx> { @@ -323,6 +330,14 @@ impl<'tcx> EvalCtxt<'_, 'tcx> { } Err(NoSolution) => (), } + + // There may be multiple unsize candidates for a trait with several supertraits: + // `trait Foo: Bar + Bar` and `dyn Foo: Unsize>` + if lang_items.unsize_trait() == Some(trait_def_id) { + for result in G::consider_builtin_dyn_unsize_candidates(self, goal) { + candidates.push(Candidate { source: CandidateSource::BuiltinImpl, result }); + } + } } fn assemble_param_env_candidates>( diff --git a/compiler/rustc_trait_selection/src/solve/project_goals.rs b/compiler/rustc_trait_selection/src/solve/project_goals.rs index 00b4fa67d68c..f9506446aba6 100644 --- a/compiler/rustc_trait_selection/src/solve/project_goals.rs +++ b/compiler/rustc_trait_selection/src/solve/project_goals.rs @@ -561,6 +561,13 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> { ) -> QueryResult<'tcx> { bug!("`Unsize` does not have an associated type: {:?}", goal); } + + fn consider_builtin_dyn_unsize_candidates( + _ecx: &mut EvalCtxt<'_, 'tcx>, + goal: Goal<'tcx, Self>, + ) -> Vec> { + bug!("`Unsize` does not have an associated type: {:?}", goal); + } } /// This behavior is also implemented in `rustc_ty_utils` and in the old `project` code. diff --git a/compiler/rustc_trait_selection/src/solve/trait_goals.rs b/compiler/rustc_trait_selection/src/solve/trait_goals.rs index 28144da1b1e9..c79f1f055122 100644 --- a/compiler/rustc_trait_selection/src/solve/trait_goals.rs +++ b/compiler/rustc_trait_selection/src/solve/trait_goals.rs @@ -4,7 +4,7 @@ use std::iter; use super::assembly::{self, Candidate, CandidateSource}; use super::infcx_ext::InferCtxtExt; -use super::{Certainty, EvalCtxt, Goal, QueryResult}; +use super::{CanonicalResponse, Certainty, EvalCtxt, Goal, QueryResult}; use rustc_hir::def_id::DefId; use rustc_infer::infer::InferCtxt; use rustc_infer::traits::query::NoSolution; @@ -253,57 +253,11 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> { ecx.infcx.probe(|_| { match (a_ty.kind(), b_ty.kind()) { // Trait upcasting, or `dyn Trait + Auto + 'a` -> `dyn Trait + 'b` - ( - &ty::Dynamic(a_data, a_region, ty::Dyn), - &ty::Dynamic(b_data, b_region, ty::Dyn), - ) => { - // All of a's auto traits need to be in b's auto traits. - let auto_traits_compatible = b_data - .auto_traits() - .all(|b| a_data.auto_traits().any(|a| a == b)); - if !auto_traits_compatible { - return Err(NoSolution); - } - - // If the principal def ids match (or are both none), then we're not doing - // trait upcasting. We're just removing auto traits (or shortening the lifetime). - if a_data.principal_def_id() == b_data.principal_def_id() { - // Require that all of the trait predicates from A match B, except for - // the auto traits. We do this by constructing a new A type with B's - // auto traits, and equating these types. - let new_a_data = a_data - .iter() - .filter(|a| { - matches!( - a.skip_binder(), - ty::ExistentialPredicate::Trait(_) | ty::ExistentialPredicate::Projection(_) - ) - }) - .chain( - b_data - .auto_traits() - .map(ty::ExistentialPredicate::AutoTrait) - .map(ty::Binder::dummy), - ); - let new_a_data = tcx.mk_poly_existential_predicates(new_a_data); - let new_a_ty = tcx.mk_dynamic(new_a_data, b_region, ty::Dyn); - - // We also require that A's lifetime outlives B's lifetime. - let mut nested_obligations = ecx.infcx.eq(goal.param_env, new_a_ty, b_ty)?; - nested_obligations.push(goal.with(tcx, ty::Binder::dummy(ty::OutlivesPredicate(a_region, b_region)))); - - ecx.evaluate_all_and_make_canonical_response(nested_obligations) - } else if let Some(a_principal) = a_data.principal() - && let Some(b_principal) = b_data.principal() - && supertraits(tcx, a_principal.with_self_ty(tcx, a_ty)) - .any(|trait_ref| trait_ref.def_id() == b_principal.def_id()) - { - // FIXME: Intentionally ignoring `need_migrate_deref_output_trait_object` here for now. - // Confirm upcasting candidate - todo!() - } else { - Err(NoSolution) - } + (&ty::Dynamic(_, _, ty::Dyn), &ty::Dynamic(_, _, ty::Dyn)) => { + // Dyn upcasting is handled separately, since due to upcasting, + // when there are two supertraits that differ by substs, we + // may return more than one query response. + return Err(NoSolution); } // `T` -> `dyn Trait` unsizing (_, &ty::Dynamic(data, region, ty::Dyn)) => { @@ -332,10 +286,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> { ty::Binder::dummy(tcx.mk_trait_ref(sized_def_id, [a_ty])), ), // The type must outlive the lifetime of the `dyn` we're unsizing into. - goal.with( - tcx, - ty::Binder::dummy(ty::OutlivesPredicate(a_ty, region)), - ), + goal.with(tcx, ty::Binder::dummy(ty::OutlivesPredicate(a_ty, region))), ]) .collect(); @@ -413,6 +364,81 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> { } }) } + + fn consider_builtin_dyn_unsize_candidates( + ecx: &mut EvalCtxt<'_, 'tcx>, + goal: Goal<'tcx, Self>, + ) -> Vec> { + let tcx = ecx.tcx(); + + let a_ty = goal.predicate.self_ty(); + let b_ty = goal.predicate.trait_ref.substs.type_at(1); + let ty::Dynamic(a_data, a_region, ty::Dyn) = *a_ty.kind() else { + return vec![]; + }; + let ty::Dynamic(b_data, b_region, ty::Dyn) = *b_ty.kind() else { + return vec![]; + }; + + // All of a's auto traits need to be in b's auto traits. + let auto_traits_compatible = + b_data.auto_traits().all(|b| a_data.auto_traits().any(|a| a == b)); + if !auto_traits_compatible { + return vec![]; + } + + let mut responses = vec![]; + let mut unsize_dyn_to_principal = |principal: Option>| { + let _ = ecx.infcx.probe(|_| -> Result<(), NoSolution> { + // Require that all of the trait predicates from A match B, except for + // the auto traits. We do this by constructing a new A type with B's + // auto traits, and equating these types. + let new_a_data = principal + .into_iter() + .map(|trait_ref| trait_ref.map_bound(ty::ExistentialPredicate::Trait)) + .chain(a_data.iter().filter(|a| { + matches!(a.skip_binder(), ty::ExistentialPredicate::Projection(_)) + })) + .chain( + b_data + .auto_traits() + .map(ty::ExistentialPredicate::AutoTrait) + .map(ty::Binder::dummy), + ); + let new_a_data = tcx.mk_poly_existential_predicates(new_a_data); + let new_a_ty = tcx.mk_dynamic(new_a_data, b_region, ty::Dyn); + + // We also require that A's lifetime outlives B's lifetime. + let mut nested_obligations = ecx.infcx.eq(goal.param_env, new_a_ty, b_ty)?; + nested_obligations.push( + goal.with(tcx, ty::Binder::dummy(ty::OutlivesPredicate(a_region, b_region))), + ); + + responses.push(ecx.evaluate_all_and_make_canonical_response(nested_obligations)?); + + Ok(()) + }); + }; + + // If the principal def ids match (or are both none), then we're not doing + // trait upcasting. We're just removing auto traits (or shortening the lifetime). + if a_data.principal_def_id() == b_data.principal_def_id() { + unsize_dyn_to_principal(a_data.principal()); + } else if let Some(a_principal) = a_data.principal() + && let Some(b_principal) = b_data.principal() + { + for super_trait_ref in supertraits(tcx, a_principal.with_self_ty(tcx, a_ty)) { + if super_trait_ref.def_id() != b_principal.def_id() { + continue; + } + let erased_trait_ref = super_trait_ref + .map_bound(|trait_ref| ty::ExistentialTraitRef::erase_self_ty(tcx, trait_ref)); + unsize_dyn_to_principal(Some(erased_trait_ref)); + } + } + + responses + } } impl<'tcx> EvalCtxt<'_, 'tcx> { diff --git a/tests/ui/traits/new-solver/upcast-right-substs.rs b/tests/ui/traits/new-solver/upcast-right-substs.rs new file mode 100644 index 000000000000..c19c82acf24f --- /dev/null +++ b/tests/ui/traits/new-solver/upcast-right-substs.rs @@ -0,0 +1,14 @@ +// compile-flags: -Ztrait-solver=next +// check-pass + +#![feature(trait_upcasting)] + +trait Foo: Bar + Bar {} + +trait Bar {} + +fn main() { + let x: &dyn Foo = todo!(); + let y: &dyn Bar = x; + let z: &dyn Bar = x; +} diff --git a/tests/ui/traits/new-solver/upcast-wrong-substs.rs b/tests/ui/traits/new-solver/upcast-wrong-substs.rs new file mode 100644 index 000000000000..f2d04d932bbc --- /dev/null +++ b/tests/ui/traits/new-solver/upcast-wrong-substs.rs @@ -0,0 +1,13 @@ +// compile-flags: -Ztrait-solver=next + +#![feature(trait_upcasting)] + +trait Foo: Bar + Bar {} + +trait Bar {} + +fn main() { + let x: &dyn Foo = todo!(); + let y: &dyn Bar = x; + //~^ ERROR mismatched types +} diff --git a/tests/ui/traits/new-solver/upcast-wrong-substs.stderr b/tests/ui/traits/new-solver/upcast-wrong-substs.stderr new file mode 100644 index 000000000000..8623f395f597 --- /dev/null +++ b/tests/ui/traits/new-solver/upcast-wrong-substs.stderr @@ -0,0 +1,14 @@ +error[E0308]: mismatched types + --> $DIR/upcast-wrong-substs.rs:11:30 + | +LL | let y: &dyn Bar = x; + | --------------- ^ expected trait `Bar`, found trait `Foo` + | | + | expected due to this + | + = note: expected reference `&dyn Bar` + found reference `&dyn Foo` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. From f7fc0b712103d8832b305efa72e4c9851161bbdf Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Wed, 25 Jan 2023 17:02:16 +0000 Subject: [PATCH 30/69] nits --- .../src/solve/assembly.rs | 4 +-- .../src/solve/project_goals.rs | 2 +- .../src/solve/trait_goals.rs | 26 +++++++++---------- compiler/rustc_ty_utils/src/ty.rs | 4 --- 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/compiler/rustc_trait_selection/src/solve/assembly.rs b/compiler/rustc_trait_selection/src/solve/assembly.rs index 1c4e498c57e4..5690b6536bbc 100644 --- a/compiler/rustc_trait_selection/src/solve/assembly.rs +++ b/compiler/rustc_trait_selection/src/solve/assembly.rs @@ -184,7 +184,7 @@ pub(super) trait GoalKind<'tcx>: TypeFoldable<'tcx> + Copy + Eq { // `dyn Trait1` can be unsized to `dyn Trait2` if they are the same trait, or // if `Trait2` is a (transitive) supertrait of `Trait2`. - fn consider_builtin_dyn_unsize_candidates( + fn consider_builtin_dyn_upcast_candidates( ecx: &mut EvalCtxt<'_, 'tcx>, goal: Goal<'tcx, Self>, ) -> Vec>; @@ -334,7 +334,7 @@ impl<'tcx> EvalCtxt<'_, 'tcx> { // There may be multiple unsize candidates for a trait with several supertraits: // `trait Foo: Bar + Bar` and `dyn Foo: Unsize>` if lang_items.unsize_trait() == Some(trait_def_id) { - for result in G::consider_builtin_dyn_unsize_candidates(self, goal) { + for result in G::consider_builtin_dyn_upcast_candidates(self, goal) { candidates.push(Candidate { source: CandidateSource::BuiltinImpl, result }); } } diff --git a/compiler/rustc_trait_selection/src/solve/project_goals.rs b/compiler/rustc_trait_selection/src/solve/project_goals.rs index f9506446aba6..879f18843c91 100644 --- a/compiler/rustc_trait_selection/src/solve/project_goals.rs +++ b/compiler/rustc_trait_selection/src/solve/project_goals.rs @@ -562,7 +562,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> { bug!("`Unsize` does not have an associated type: {:?}", goal); } - fn consider_builtin_dyn_unsize_candidates( + fn consider_builtin_dyn_upcast_candidates( _ecx: &mut EvalCtxt<'_, 'tcx>, goal: Goal<'tcx, Self>, ) -> Vec> { diff --git a/compiler/rustc_trait_selection/src/solve/trait_goals.rs b/compiler/rustc_trait_selection/src/solve/trait_goals.rs index c79f1f055122..29ee9da38e08 100644 --- a/compiler/rustc_trait_selection/src/solve/trait_goals.rs +++ b/compiler/rustc_trait_selection/src/solve/trait_goals.rs @@ -262,11 +262,9 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> { // `T` -> `dyn Trait` unsizing (_, &ty::Dynamic(data, region, ty::Dyn)) => { // Can only unsize to an object-safe type - // FIXME: Can auto traits be *not* object safe? if data - .auto_traits() - .chain(data.principal_def_id()) - .any(|def_id| !tcx.is_object_safe(def_id)) + .principal_def_id() + .map_or(false, |def_id| !tcx.check_is_object_safe(def_id)) { return Err(NoSolution); } @@ -365,7 +363,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> { }) } - fn consider_builtin_dyn_unsize_candidates( + fn consider_builtin_dyn_upcast_candidates( ecx: &mut EvalCtxt<'_, 'tcx>, goal: Goal<'tcx, Self>, ) -> Vec> { @@ -387,9 +385,8 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> { return vec![]; } - let mut responses = vec![]; let mut unsize_dyn_to_principal = |principal: Option>| { - let _ = ecx.infcx.probe(|_| -> Result<(), NoSolution> { + ecx.infcx.probe(|_| -> Result<_, NoSolution> { // Require that all of the trait predicates from A match B, except for // the auto traits. We do this by constructing a new A type with B's // auto traits, and equating these types. @@ -414,16 +411,17 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> { goal.with(tcx, ty::Binder::dummy(ty::OutlivesPredicate(a_region, b_region))), ); - responses.push(ecx.evaluate_all_and_make_canonical_response(nested_obligations)?); - - Ok(()) - }); + ecx.evaluate_all_and_make_canonical_response(nested_obligations) + }) }; + let mut responses = vec![]; // If the principal def ids match (or are both none), then we're not doing // trait upcasting. We're just removing auto traits (or shortening the lifetime). if a_data.principal_def_id() == b_data.principal_def_id() { - unsize_dyn_to_principal(a_data.principal()); + if let Ok(response) = unsize_dyn_to_principal(a_data.principal()) { + responses.push(response); + } } else if let Some(a_principal) = a_data.principal() && let Some(b_principal) = b_data.principal() { @@ -433,7 +431,9 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> { } let erased_trait_ref = super_trait_ref .map_bound(|trait_ref| ty::ExistentialTraitRef::erase_self_ty(tcx, trait_ref)); - unsize_dyn_to_principal(Some(erased_trait_ref)); + if let Ok(response) = unsize_dyn_to_principal(Some(erased_trait_ref)) { + responses.push(response); + } } } diff --git a/compiler/rustc_ty_utils/src/ty.rs b/compiler/rustc_ty_utils/src/ty.rs index b5005c1d8d80..41e837e8b754 100644 --- a/compiler/rustc_ty_utils/src/ty.rs +++ b/compiler/rustc_ty_utils/src/ty.rs @@ -426,10 +426,6 @@ fn unsizing_params_for_adt<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> BitSet Date: Mon, 30 Jan 2023 12:20:06 -0700 Subject: [PATCH 31/69] rustdoc: remove meta keywords from HTML Discussed in --- src/librustdoc/html/layout.rs | 1 - src/librustdoc/html/render/context.rs | 9 +-------- src/librustdoc/html/render/mod.rs | 2 -- src/librustdoc/html/render/write_shared.rs | 3 +-- src/librustdoc/html/sources.rs | 3 +-- src/librustdoc/html/templates/page.html | 1 - 6 files changed, 3 insertions(+), 16 deletions(-) diff --git a/src/librustdoc/html/layout.rs b/src/librustdoc/html/layout.rs index a60e7cb10fa5..6ab849c92a07 100644 --- a/src/librustdoc/html/layout.rs +++ b/src/librustdoc/html/layout.rs @@ -30,7 +30,6 @@ pub(crate) struct Page<'a> { pub(crate) root_path: &'a str, pub(crate) static_root_path: Option<&'a str>, pub(crate) description: &'a str, - pub(crate) keywords: &'a str, pub(crate) resource_suffix: &'a str, } diff --git a/src/librustdoc/html/render/context.rs b/src/librustdoc/html/render/context.rs index 15258a467a22..b59645ec2e2d 100644 --- a/src/librustdoc/html/render/context.rs +++ b/src/librustdoc/html/render/context.rs @@ -18,7 +18,7 @@ use super::search_index::build_index; use super::write_shared::write_shared; use super::{ collect_spans_and_sources, print_sidebar, scrape_examples_help, sidebar_module_like, AllTypes, - LinkFromSrc, NameDoc, StylePath, BASIC_KEYWORDS, + LinkFromSrc, NameDoc, StylePath, }; use crate::clean::{self, types::ExternalLocation, ExternalCrate}; @@ -195,7 +195,6 @@ impl<'tcx> Context<'tcx> { self.shared.layout.krate ) }; - let keywords = make_item_keywords(it); let name; let tyname_s = if it.is_crate() { name = format!("{} crate", tyname); @@ -212,7 +211,6 @@ impl<'tcx> Context<'tcx> { static_root_path: clone_shared.static_root_path.as_deref(), title: &title, description: &desc, - keywords: &keywords, resource_suffix: &clone_shared.resource_suffix, }; let mut page_buffer = Buffer::html(); @@ -598,7 +596,6 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> { root_path: "../", static_root_path: shared.static_root_path.as_deref(), description: "List of all items in this crate", - keywords: BASIC_KEYWORDS, resource_suffix: &shared.resource_suffix, }; let all = shared.all.replace(AllTypes::new()); @@ -828,7 +825,3 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> { &self.shared.cache } } - -fn make_item_keywords(it: &clean::Item) -> String { - format!("{}, {}", BASIC_KEYWORDS, it.name.as_ref().unwrap()) -} diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index be6de231854b..816a8f4e274c 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -2743,8 +2743,6 @@ fn sidebar_foreign_type(cx: &Context<'_>, buf: &mut Buffer, it: &clean::Item) { } } -pub(crate) const BASIC_KEYWORDS: &str = "rust, rustlang, rust-lang"; - /// Returns a list of all paths used in the type. /// This is used to help deduplicate imported impls /// for reexported types. If any of the contained diff --git a/src/librustdoc/html/render/write_shared.rs b/src/librustdoc/html/render/write_shared.rs index bc8badad38eb..6b71ecc24bde 100644 --- a/src/librustdoc/html/render/write_shared.rs +++ b/src/librustdoc/html/render/write_shared.rs @@ -11,7 +11,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use serde::ser::SerializeSeq; use serde::{Serialize, Serializer}; -use super::{collect_paths_for_type, ensure_trailing_slash, Context, BASIC_KEYWORDS}; +use super::{collect_paths_for_type, ensure_trailing_slash, Context}; use crate::clean::Crate; use crate::config::{EmitType, RenderOptions}; use crate::docfs::PathError; @@ -340,7 +340,6 @@ if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex}; root_path: "./", static_root_path: shared.static_root_path.as_deref(), description: "List of crates", - keywords: BASIC_KEYWORDS, resource_suffix: &shared.resource_suffix, }; diff --git a/src/librustdoc/html/sources.rs b/src/librustdoc/html/sources.rs index 799c497d1370..2c90bf4fadc0 100644 --- a/src/librustdoc/html/sources.rs +++ b/src/librustdoc/html/sources.rs @@ -4,7 +4,7 @@ use crate::error::Error; use crate::html::format::Buffer; use crate::html::highlight; use crate::html::layout; -use crate::html::render::{Context, BASIC_KEYWORDS}; +use crate::html::render::Context; use crate::visit::DocVisitor; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; @@ -228,7 +228,6 @@ impl SourceCollector<'_, '_> { root_path: &root_path, static_root_path: shared.static_root_path.as_deref(), description: &desc, - keywords: BASIC_KEYWORDS, resource_suffix: &shared.resource_suffix, }; let v = layout::render( diff --git a/src/librustdoc/html/templates/page.html b/src/librustdoc/html/templates/page.html index fddda293b9a8..8540ee663193 100644 --- a/src/librustdoc/html/templates/page.html +++ b/src/librustdoc/html/templates/page.html @@ -5,7 +5,6 @@ {#- -#} {#- -#} {#- -#} - {#- -#} {{page.title}} {#- -#} {#- -#} {#- -#} From 8d7b092a11df9b0e885f9af93b56759f8012e3ba Mon Sep 17 00:00:00 2001 From: Matthias Kaak Date: Mon, 30 Jan 2023 19:54:33 +0000 Subject: [PATCH 32/69] Improved wording of error messages of missing remainder implementations --- compiler/rustc_hir_typeck/src/op.rs | 2 +- library/core/src/ops/arith.rs | 4 ++-- tests/ui/binop/binary-op-on-double-ref.fixed | 2 +- tests/ui/binop/binary-op-on-double-ref.rs | 2 +- tests/ui/binop/binary-op-on-double-ref.stderr | 2 +- tests/ui/binop/issue-28837.rs | 2 +- tests/ui/binop/issue-28837.stderr | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_hir_typeck/src/op.rs b/compiler/rustc_hir_typeck/src/op.rs index 60c8c0f64fe2..278f720b62eb 100644 --- a/compiler/rustc_hir_typeck/src/op.rs +++ b/compiler/rustc_hir_typeck/src/op.rs @@ -335,7 +335,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { format!("cannot divide `{lhs_ty}` by `{rhs_ty}`") } hir::BinOpKind::Rem => { - format!("cannot rem `{lhs_ty}` by `{rhs_ty}`") + format!("cannot calculate the remainder of `{lhs_ty}` divided by `{rhs_ty}`") } hir::BinOpKind::BitAnd => { format!("no implementation for `{lhs_ty} & {rhs_ty}`") diff --git a/library/core/src/ops/arith.rs b/library/core/src/ops/arith.rs index b9803c957b16..cc13db5c9565 100644 --- a/library/core/src/ops/arith.rs +++ b/library/core/src/ops/arith.rs @@ -545,7 +545,7 @@ div_impl_float! { f32 f64 } #[lang = "rem"] #[stable(feature = "rust1", since = "1.0.0")] #[rustc_on_unimplemented( - message = "cannot rem `{Self}` by `{Rhs}`", + message = "cannot calculate the remainder of `{Self}` divided by `{Rhs}`", label = "no implementation for `{Self} % {Rhs}`" )] #[doc(alias = "%")] @@ -981,7 +981,7 @@ div_assign_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 } #[lang = "rem_assign"] #[stable(feature = "op_assign_traits", since = "1.8.0")] #[rustc_on_unimplemented( - message = "cannot rem-assign `{Self}` by `{Rhs}``", + message = "cannot calculate and assign the remainder of `{Self}` divided by `{Rhs}`", label = "no implementation for `{Self} %= {Rhs}`" )] #[doc(alias = "%")] diff --git a/tests/ui/binop/binary-op-on-double-ref.fixed b/tests/ui/binop/binary-op-on-double-ref.fixed index 89829efeaeb3..586d2568c306 100644 --- a/tests/ui/binop/binary-op-on-double-ref.fixed +++ b/tests/ui/binop/binary-op-on-double-ref.fixed @@ -3,7 +3,7 @@ fn main() { let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9]; let vr = v.iter().filter(|x| { *x % 2 == 0 - //~^ ERROR cannot rem `&&{integer}` by `{integer}` + //~^ ERROR cannot calculate the remainder of `&&{integer}` divided by `{integer}` }); println!("{:?}", vr); } diff --git a/tests/ui/binop/binary-op-on-double-ref.rs b/tests/ui/binop/binary-op-on-double-ref.rs index 57c5d8b52c8d..48ee445466e3 100644 --- a/tests/ui/binop/binary-op-on-double-ref.rs +++ b/tests/ui/binop/binary-op-on-double-ref.rs @@ -3,7 +3,7 @@ fn main() { let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9]; let vr = v.iter().filter(|x| { x % 2 == 0 - //~^ ERROR cannot rem `&&{integer}` by `{integer}` + //~^ ERROR cannot calculate the remainder of `&&{integer}` divided by `{integer}` }); println!("{:?}", vr); } diff --git a/tests/ui/binop/binary-op-on-double-ref.stderr b/tests/ui/binop/binary-op-on-double-ref.stderr index e597e1b27e0c..2e8aeebc681d 100644 --- a/tests/ui/binop/binary-op-on-double-ref.stderr +++ b/tests/ui/binop/binary-op-on-double-ref.stderr @@ -1,4 +1,4 @@ -error[E0369]: cannot rem `&&{integer}` by `{integer}` +error[E0369]: cannot calculate the remainder of `&&{integer}` divided by `{integer}` --> $DIR/binary-op-on-double-ref.rs:5:11 | LL | x % 2 == 0 diff --git a/tests/ui/binop/issue-28837.rs b/tests/ui/binop/issue-28837.rs index 002a5b94565b..54c8838e48f1 100644 --- a/tests/ui/binop/issue-28837.rs +++ b/tests/ui/binop/issue-28837.rs @@ -11,7 +11,7 @@ fn main() { a / a; //~ ERROR cannot divide `A` by `A` - a % a; //~ ERROR cannot rem `A` by `A` + a % a; //~ ERROR cannot calculate the remainder of `A` divided by `A` a & a; //~ ERROR no implementation for `A & A` diff --git a/tests/ui/binop/issue-28837.stderr b/tests/ui/binop/issue-28837.stderr index 2d4849ca5cb8..cca1da3b6ac4 100644 --- a/tests/ui/binop/issue-28837.stderr +++ b/tests/ui/binop/issue-28837.stderr @@ -62,7 +62,7 @@ LL | struct A; note: the trait `Div` must be implemented --> $SRC_DIR/core/src/ops/arith.rs:LL:COL -error[E0369]: cannot rem `A` by `A` +error[E0369]: cannot calculate the remainder of `A` divided by `A` --> $DIR/issue-28837.rs:14:7 | LL | a % a; From af9671fd28601c95c4770aa47c733f81ad6ab607 Mon Sep 17 00:00:00 2001 From: Matthias Kaak Date: Mon, 30 Jan 2023 20:04:33 +0000 Subject: [PATCH 33/69] Ran rustfmt --- compiler/rustc_hir_typeck/src/op.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_hir_typeck/src/op.rs b/compiler/rustc_hir_typeck/src/op.rs index 278f720b62eb..67769fe4478a 100644 --- a/compiler/rustc_hir_typeck/src/op.rs +++ b/compiler/rustc_hir_typeck/src/op.rs @@ -335,7 +335,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { format!("cannot divide `{lhs_ty}` by `{rhs_ty}`") } hir::BinOpKind::Rem => { - format!("cannot calculate the remainder of `{lhs_ty}` divided by `{rhs_ty}`") + format!( + "cannot calculate the remainder of `{lhs_ty}` divided by `{rhs_ty}`" + ) } hir::BinOpKind::BitAnd => { format!("no implementation for `{lhs_ty} & {rhs_ty}`") From 62ba3e70a1f01d801d068b84a097e38bd82a8c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Mon, 2 Jan 2023 18:00:33 -0800 Subject: [PATCH 34/69] Modify primary span label for E0308 The previous output was unintuitive to users. --- .../rustc_hir_analysis/src/check/check.rs | 5 +- .../src/infer/error_reporting/mod.rs | 22 +- .../infer/error_reporting/note_and_explain.rs | 12 +- compiler/rustc_middle/src/ty/error.rs | 191 ++++++------------ .../src/traits/select/mod.rs | 4 +- .../clippy/tests/ui/track-diagnostics.stderr | 2 +- .../type-mismatch-same-crate-name/Makefile | 2 +- tests/rustdoc-ui/track-diagnostics.stderr | 2 +- ...alloc-error-handler-bad-signature-1.stderr | 2 +- ...alloc-error-handler-bad-signature-2.stderr | 8 +- .../formal-and-expected-differ.stderr | 4 +- .../invalid_arguments.stderr | 48 ++--- .../argument-suggestions/issue-100478.stderr | 2 +- .../argument-suggestions/issue-101097.stderr | 2 +- .../argument-suggestions/issue-97484.stderr | 2 +- .../argument-suggestions/mixed_cases.stderr | 4 +- .../two-mismatch-notes.stderr | 4 +- tests/ui/array-slice-vec/array-not-vector.rs | 4 +- .../array-slice-vec/array-not-vector.stderr | 4 +- .../slice-to-vec-comparison.stderr | 2 +- ...ssociated-const-generic-obligations.stderr | 2 +- .../ui/associated-type-bounds/elision.stderr | 2 +- .../issue-71443-1.stderr | 2 +- ...ted-type-projection-from-supertrait.stderr | 8 +- .../associated-types/associated-types-eq-3.rs | 2 +- .../associated-types-eq-3.stderr | 2 +- ...block-control-flow-static-semantics.stderr | 4 +- ...nc-example-desugared-boxed-in-trait.stderr | 2 +- .../in-trait/return-type-suggestion.stderr | 2 +- tests/ui/async-await/issue-61076.rs | 2 +- tests/ui/async-await/issue-61076.stderr | 2 +- tests/ui/async-await/issue-98634.stderr | 6 +- .../ui/async-await/issues/issue-102206.stderr | 2 +- .../proper-span-for-type-error.stderr | 2 +- .../async-await/suggest-missing-await.stderr | 4 +- tests/ui/autoref-autoderef/issue-38940.stderr | 2 +- tests/ui/blind/blind-item-block-middle.stderr | 2 +- .../consider-removing-last-semi.stderr | 4 +- tests/ui/block-result/issue-13428.stderr | 4 +- tests/ui/block-result/issue-13624.rs | 4 +- tests/ui/block-result/issue-13624.stderr | 4 +- tests/ui/block-result/issue-22645.stderr | 2 +- tests/ui/block-result/issue-5500.rs | 2 +- tests/ui/block-result/issue-5500.stderr | 2 +- tests/ui/box/issue-82446.stderr | 2 +- tests/ui/closures/issue-78720.stderr | 2 +- .../coercion/coerce-block-tail-26978.stderr | 2 +- .../coercion/coerce-block-tail-57749.stderr | 2 +- .../coercion/coerce-block-tail-83783.stderr | 2 +- .../coercion/coerce-block-tail-83850.stderr | 2 +- tests/ui/coercion/coerce-block-tail.stderr | 2 +- .../coerce-expect-unsized-ascribed.stderr | 28 +-- tests/ui/coercion/coerce-to-bang.stderr | 2 +- ...coercion-missing-tail-expected-type.stderr | 2 +- tests/ui/coercion/coercion-slice.rs | 2 +- tests/ui/coercion/coercion-slice.stderr | 2 +- tests/ui/compare-method/bad-self-type.stderr | 6 +- .../const-generics/defaults/mismatch.stderr | 10 +- ...-default_trait_method_normalization.stderr | 2 +- .../issues/issue-67945-1.full.stderr | 2 +- tests/ui/const-generics/type_mismatch.stderr | 2 +- .../const-generics/type_not_in_scope.stderr | 2 +- .../types-mismatch-const-args.full.stderr | 4 +- .../types-mismatch-const-args.min.stderr | 4 +- tests/ui/consts/const-eval/const-eval-span.rs | 2 +- .../consts/const-eval/const-eval-span.stderr | 2 +- tests/ui/consts/const-tup-index-span.rs | 2 +- tests/ui/consts/const-tup-index-span.stderr | 2 +- tests/ui/consts/nested_erroneous_ctfe.stderr | 2 +- tests/ui/cross/cross-borrow-trait.stderr | 2 +- tests/ui/deref-patterns/gate.stderr | 2 +- tests/ui/destructure-trait-ref.stderr | 6 +- .../default-match-bindings-forbidden.stderr | 2 +- tests/ui/diagnostic-width/long-E0308.stderr | 8 +- .../brackets-to-braces-single-element.stderr | 6 +- .../compatible-variants-in-pat.stderr | 6 +- .../did_you_mean/compatible-variants.stderr | 26 +-- tests/ui/did_you_mean/issue-42764.stderr | 4 +- .../did_you_mean/recursion_limit_deref.stderr | 2 +- tests/ui/disambiguate-identical-names.stderr | 2 +- tests/ui/diverging-fn-tail-35849.stderr | 2 +- tests/ui/dst/dst-bad-assign-3.rs | 2 +- tests/ui/dst/dst-bad-assign-3.stderr | 2 +- tests/ui/dst/dst-bad-assign.rs | 2 +- tests/ui/dst/dst-bad-assign.stderr | 2 +- tests/ui/dst/dst-bad-coerce1.stderr | 4 +- tests/ui/dst/dst-bad-coerce4.rs | 4 +- tests/ui/dst/dst-bad-coerce4.stderr | 4 +- tests/ui/dyn-star/no-implicit-dyn-star.stderr | 2 +- tests/ui/empty/issue-37026.stderr | 4 +- tests/ui/error-codes/E0071.rs | 2 +- tests/ui/error-codes/E0071.stderr | 2 +- .../extern/extern-types-distinct-types.stderr | 2 +- tests/ui/fmt/ifmt-bad-arg.stderr | 4 +- tests/ui/fn/fn-item-type.rs | 3 +- tests/ui/fn/fn-item-type.stderr | 6 +- tests/ui/fn/fn-pointer-mismatch.stderr | 6 +- tests/ui/fn/fn-trait-formatting.stderr | 6 +- ...signature-error-reporting-under-verbose.rs | 2 +- ...ature-error-reporting-under-verbose.stderr | 2 +- .../fully-qualified-type-name1.rs | 2 +- .../fully-qualified-type-name1.stderr | 2 +- .../fully-qualified-type-name2.rs | 2 +- .../fully-qualified-type-name2.stderr | 8 +- .../fully-qualified-type-name4.rs | 2 +- .../fully-qualified-type-name4.stderr | 2 +- .../type-mismatch-signature-deduction.stderr | 4 +- .../constraint-assoc-type-suggestion.stderr | 2 +- .../generics/generic-type-params-name-repr.rs | 12 +- .../generic-type-params-name-repr.stderr | 12 +- ...sive_range_pattern_syntax_collision.stderr | 2 +- ...ive_range_pattern_syntax_collision2.stderr | 2 +- ...ive_range_pattern_syntax_collision3.stderr | 6 +- .../pat-tuple-5.stderr | 2 +- .../hang-on-deeply-nested-dyn.stderr | 2 +- .../issue-62203-hrtb-ice.stderr | 2 +- ...n-trait-return-should-be-impl-trait.stderr | 22 +- .../ui/impl-trait/in-trait/deep-match.stderr | 2 +- .../in-trait/default-body-type-err-2.stderr | 2 +- .../in-trait/default-body-type-err.stderr | 2 +- tests/ui/impl-trait/issue-102605.stderr | 2 +- tests/ui/impl-trait/issue-99914.stderr | 2 +- tests/ui/impl-trait/issues/issue-74282.stderr | 4 +- ...trait-in-return-position-impl-trait.stderr | 4 +- ...s-impl-trait-declaration-too-subtle.stderr | 4 +- .../universal-mismatched-type.stderr | 2 +- .../ui/include-macros/mismatched-types.stderr | 4 +- tests/ui/inference/deref-suggestion.stderr | 6 +- tests/ui/issues/issue-100605.stderr | 4 +- tests/ui/issues/issue-102964.stderr | 2 +- tests/ui/issues/issue-11374.stderr | 2 +- tests/ui/issues/issue-11844.stderr | 2 +- tests/ui/issues/issue-13446.stderr | 2 +- tests/ui/issues/issue-13466.rs | 4 +- tests/ui/issues/issue-13466.stderr | 4 +- tests/ui/issues/issue-14541.rs | 2 +- tests/ui/issues/issue-14541.stderr | 2 +- tests/ui/issues/issue-15783.rs | 2 +- tests/ui/issues/issue-15783.stderr | 2 +- tests/ui/issues/issue-15896.stderr | 2 +- tests/ui/issues/issue-16338.stderr | 2 +- tests/ui/issues/issue-16401.rs | 2 +- tests/ui/issues/issue-16401.stderr | 2 +- tests/ui/issues/issue-18819.stderr | 2 +- tests/ui/issues/issue-20225.stderr | 6 +- tests/ui/issues/issue-21332.rs | 2 +- tests/ui/issues/issue-21332.stderr | 2 +- tests/ui/issues/issue-24322.stderr | 2 +- tests/ui/issues/issue-24819.rs | 2 +- tests/ui/issues/issue-24819.stderr | 2 +- tests/ui/issues/issue-27008.rs | 2 +- tests/ui/issues/issue-27008.stderr | 2 +- tests/ui/issues/issue-32122-1.stderr | 2 +- tests/ui/issues/issue-32122-2.stderr | 2 +- tests/ui/issues/issue-33504.stderr | 2 +- tests/ui/issues/issue-33941.stderr | 6 +- tests/ui/issues/issue-35241.stderr | 2 +- tests/ui/issues/issue-3680.rs | 2 +- tests/ui/issues/issue-3680.stderr | 2 +- tests/ui/issues/issue-40749.stderr | 2 +- .../issues/issue-43420-no-over-suggest.stderr | 2 +- tests/ui/issues/issue-4517.rs | 2 +- tests/ui/issues/issue-4517.stderr | 2 +- tests/ui/issues/issue-48364.stderr | 2 +- tests/ui/issues/issue-4968.rs | 2 +- tests/ui/issues/issue-4968.stderr | 2 +- tests/ui/issues/issue-5100.rs | 4 +- tests/ui/issues/issue-5100.stderr | 6 +- ...1632-try-desugar-incompatible-types.stderr | 2 +- tests/ui/issues/issue-53348.rs | 2 +- tests/ui/issues/issue-53348.stderr | 2 +- tests/ui/issues/issue-5358-1.rs | 2 +- tests/ui/issues/issue-5358-1.stderr | 2 +- tests/ui/issues/issue-56943.stderr | 2 +- tests/ui/issues/issue-57741-1.stderr | 4 +- tests/ui/issues/issue-57741.stderr | 8 +- tests/ui/issues/issue-59488.stderr | 4 +- tests/ui/issues/issue-61106.stderr | 2 +- tests/ui/issues/issue-6458-4.stderr | 2 +- .../issue-67039-unsound-pin-partialeq.stderr | 2 +- tests/ui/issues/issue-69306.stderr | 6 +- tests/ui/issues/issue-7061.stderr | 2 +- tests/ui/issues/issue-7092.rs | 2 +- tests/ui/issues/issue-7092.stderr | 2 +- tests/ui/issues/issue-71676-1.stderr | 6 +- tests/ui/issues/issue-74236/main.stderr | 2 +- tests/ui/issues/issue-76191.stderr | 4 +- tests/ui/issues/issue-7867.rs | 2 +- tests/ui/issues/issue-7867.stderr | 2 +- .../json/json-bom-plus-crlf-multifile.stderr | 8 +- tests/ui/json/json-bom-plus-crlf.stderr | 8 +- tests/ui/let-else/issue-94176.stderr | 2 +- .../let-else/let-else-deref-coercion.stderr | 4 +- .../ui/let-else/let-else-non-diverging.stderr | 6 +- .../ui/let-else/let-else-ref-bindings.stderr | 16 +- tests/ui/lifetimes/issue-17728.stderr | 2 +- tests/ui/lifetimes/issue-26638.stderr | 4 +- .../must_not_suspend/tuple-mismatch.stderr | 2 +- tests/ui/loops/loop-break-value.stderr | 2 +- tests/ui/match/issue-12552.stderr | 4 +- tests/ui/match/issue-91058.stderr | 2 +- tests/ui/match/match-struct.rs | 2 +- tests/ui/match/match-struct.stderr | 2 +- tests/ui/match/match-tag-nullary.stderr | 2 +- tests/ui/match/match-tag-unary.stderr | 2 +- tests/ui/methods/issues/issue-61525.stderr | 2 +- tests/ui/methods/issues/issue-90315.stderr | 10 +- tests/ui/methods/method-self-arg-1.rs | 4 +- tests/ui/methods/method-self-arg-1.stderr | 4 +- tests/ui/mismatched_types/abridged.stderr | 16 +- ...trait-objects-instead-of-impl-trait.stderr | 4 +- tests/ui/mismatched_types/issue-106182.stderr | 2 +- .../issue-38371-unfixable.stderr | 2 +- tests/ui/mismatched_types/issue-38371.stderr | 4 +- .../non_zero_assigned_something.stderr | 4 +- .../mismatched_types/normalize-fn-sig.stderr | 2 +- .../ref-pat-suggestions.stderr | 18 +- tests/ui/mismatched_types/show_module.stderr | 8 +- .../ui/mismatched_types/similar_paths.stderr | 8 +- .../similar_paths_primitive.stderr | 6 +- ...trait-objects-instead-of-impl-trait.stderr | 4 +- ...suggest-removing-tuple-struct-field.stderr | 4 +- .../wrap-suggestion-privacy.stderr | 6 +- tests/ui/mut/mut-cross-borrowing.stderr | 2 +- .../diverging-tuple-parts-39485.stderr | 4 +- tests/ui/never_type/issue-10176.rs | 2 +- tests/ui/never_type/issue-10176.stderr | 2 +- tests/ui/never_type/issue-52443.stderr | 2 +- tests/ui/never_type/issue-96335.stderr | 2 +- tests/ui/noexporttypeexe.rs | 2 +- tests/ui/noexporttypeexe.stderr | 2 +- .../ui/or-patterns/already-bound-name.stderr | 2 +- .../nested-undelimited-precedence.stderr | 8 +- .../ui/parser/issues/issue-87812-path.stderr | 2 +- tests/ui/parser/recover-range-pats.stderr | 6 +- .../parser/unclosed-delimiter-in-dep.stderr | 2 +- tests/ui/pattern/for-loop-bad-item.stderr | 2 +- ...7-pat-tup-scrut-ty-diff-less-fields.stderr | 2 +- .../pat-struct-field-expr-has-type.stderr | 2 +- .../pattern/pat-type-err-formal-param.stderr | 2 +- tests/ui/pattern/pat-type-err-let-stmt.stderr | 8 +- tests/ui/pattern/pattern-error-continue.rs | 2 +- .../ui/pattern/pattern-error-continue.stderr | 2 +- .../pattern-ident-path-generics.stderr | 2 +- tests/ui/pattern/pattern-tyvar.stderr | 2 +- ...pe-err-cause-on-impl-trait-return-2.stderr | 2 +- tests/ui/proc-macro/break-token-spans.stderr | 2 +- tests/ui/proc-macro/issue-37788.stderr | 2 +- .../ui/proc-macro/resolved-located-at.stderr | 2 +- tests/ui/range/issue-54505-no-literals.stderr | 24 +-- tests/ui/range/issue-54505-no-std.stderr | 12 +- tests/ui/range/issue-54505.stderr | 12 +- ...issue-73553-misinterp-range-literal.stderr | 4 +- tests/ui/repeat-expr/repeat_count.rs | 2 +- tests/ui/repeat-expr/repeat_count.stderr | 2 +- tests/ui/resolve/name-clash-nullary.stderr | 2 +- tests/ui/resolve/privacy-enum-ctor.stderr | 6 +- .../resolve/resolve-inconsistent-names.stderr | 2 +- tests/ui/return/return-type.stderr | 2 +- .../tail-expr-as-potential-return.stderr | 4 +- .../const.stderr | 2 +- .../rfc-2005-default-binding-mode/lit.stderr | 4 +- .../uninhabited/coercions.stderr | 8 +- .../uninhabited/coercions_same_crate.stderr | 8 +- tests/ui/rfc-2294-if-let-guard/typeck.stderr | 4 +- .../disallowed-positions.stderr | 46 ++--- ...e-does-not-interact-with-let-chains.stderr | 8 +- .../feature-gate.stderr | 2 +- ...sue-92010-trait-bound-not-satisfied.stderr | 2 +- .../type-generic-update.stderr | 4 +- tests/ui/self/issue-61882.stderr | 2 +- .../slightly-nice-generic-literal-messages.rs | 2 +- ...ghtly-nice-generic-literal-messages.stderr | 2 +- tests/ui/span/coerce-suggestions.stderr | 6 +- tests/ui/span/issue-33884.stderr | 2 +- tests/ui/span/issue-39018.stderr | 2 +- .../specialization-default-types.stderr | 4 +- tests/ui/static/bad-const-type.rs | 2 +- tests/ui/static/bad-const-type.stderr | 2 +- tests/ui/static/issue-5216.stderr | 4 +- .../ui/static/static-reference-to-fn-1.stderr | 2 +- tests/ui/str/str-lit-type-mismatch.stderr | 6 +- .../ui/structs/struct-base-wrong-type.stderr | 8 +- .../struct-path-self-type-mismatch.stderr | 2 +- .../structs/struct-record-suggestion.stderr | 2 +- ...structure-constructor-type-mismatch.stderr | 6 +- .../args-instead-of-tuple-errors.stderr | 8 +- .../suggestions/args-instead-of-tuple.stderr | 4 +- tests/ui/suggestions/as-ref.stderr | 22 +- .../ui/suggestions/boxed-variant-field.stderr | 2 +- tests/ui/suggestions/call-boxed.stderr | 2 +- ...chain-method-call-mutation-in-place.stderr | 2 +- ...n-unconstrained-borrowed-type-param.stderr | 2 +- .../ui/suggestions/const-in-struct-pat.stderr | 2 +- tests/ui/suggestions/copied-and-cloned.stderr | 8 +- ...gest-deref-inside-macro-issue-58298.stderr | 2 +- .../hidden-child.stderr | 2 +- .../hidden-parent.stderr | 2 +- .../expected-boxed-future-isnt-pinned.stderr | 8 +- tests/ui/suggestions/field-access.stderr | 8 +- .../fn-or-tuple-struct-without-args.stderr | 6 +- tests/ui/suggestions/format-borrow.stderr | 8 +- tests/ui/suggestions/into-convert.stderr | 6 +- tests/ui/suggestions/issue-101065.stderr | 2 +- tests/ui/suggestions/issue-101465.stderr | 2 +- tests/ui/suggestions/issue-101984.stderr | 2 +- tests/ui/suggestions/issue-102892.stderr | 6 +- tests/ui/suggestions/issue-105494.stderr | 8 +- .../issue-106443-sugg-clone-for-arg.stderr | 4 +- tests/ui/suggestions/issue-52820.stderr | 4 +- tests/ui/suggestions/issue-53692.stderr | 4 +- tests/ui/suggestions/issue-59819.stderr | 4 +- tests/ui/suggestions/issue-83943.stderr | 2 +- .../issue-86100-tuple-paren-comma.stderr | 6 +- ...e-90213-expected-boxfuture-self-ice.stderr | 2 +- tests/ui/suggestions/match-ergonomics.stderr | 6 +- ...t-arm-types-as-stmt-instead-of-expr.stderr | 4 +- ...method-access-to-range-literal-typo.stderr | 4 +- .../suggestions/mut-ref-reassignment.stderr | 8 +- tests/ui/suggestions/option-to-bool.stderr | 2 +- ...ecover-from-semicolon-trailing-item.stderr | 4 +- tests/ui/suggestions/return-bindings.stderr | 12 +- .../shadowed-lplace-method-2.stderr | 2 +- .../suggestions/shadowed-lplace-method.stderr | 2 +- tests/ui/suggestions/suggest-box.stderr | 2 +- ...-full-enum-variant-for-local-module.stderr | 2 +- .../suggestions/suggest-remove-deref.stderr | 4 +- ...sary_dot_for_floating_point_literal.stderr | 8 +- tests/ui/suppressed-error.rs | 2 +- tests/ui/suppressed-error.stderr | 2 +- tests/ui/switched-expectations.stderr | 2 +- tests/ui/tag-that-dare-not-speak-its-name.rs | 2 +- .../tag-that-dare-not-speak-its-name.stderr | 2 +- tests/ui/terr-in-field.rs | 2 +- tests/ui/terr-in-field.stderr | 2 +- tests/ui/terr-sorts.stderr | 2 +- tests/ui/traits/issue-52893.stderr | 2 +- tests/ui/traits/issue-68295.stderr | 2 +- .../ui/transmutability/issue-101739-1.stderr | 2 +- .../tuple/add-tuple-within-arguments.stderr | 2 +- tests/ui/tuple/wrong_argument_ice-3.stderr | 2 +- ...priority-higher-than-other-inherent.stderr | 2 +- .../type-alias-impl-trait/issue-98604.stderr | 2 +- .../type-alias-impl-trait/issue-98608.stderr | 2 +- .../unnameable_type.stderr | 2 +- tests/ui/type-inference/issue-30225.stderr | 2 +- .../ui/type/type-ascription-precedence.stderr | 12 +- .../ui/type/type-ascription-soundness.stderr | 8 +- .../coerce-result-return-value-2.stderr | 6 +- .../coerce-result-return-value.stderr | 8 +- .../type-check/point-at-inference-2.stderr | 6 +- .../type/type-check/point-at-inference.stderr | 2 +- .../ui/type/type-mismatch-same-crate-name.rs | 2 +- .../type/type-mismatch-same-crate-name.stderr | 8 +- tests/ui/type/type-mismatch.stderr | 94 ++++----- .../ui/typeck/assign-non-lval-derefmut.stderr | 2 +- tests/ui/typeck/bad-type-in-vec-push.stderr | 2 +- tests/ui/typeck/conversion-methods.stderr | 8 +- tests/ui/typeck/deref-multi.stderr | 2 +- tests/ui/typeck/explain_clone_autoref.rs | 2 +- tests/ui/typeck/explain_clone_autoref.stderr | 2 +- tests/ui/typeck/issue-100246.stderr | 2 +- tests/ui/typeck/issue-13853.stderr | 4 +- tests/ui/typeck/issue-31173.stderr | 2 +- tests/ui/typeck/issue-46112.stderr | 2 +- .../typeck/issue-50687-ice-on-borrow.stderr | 2 +- ...e-57673-ice-on-deref-of-boxed-trait.stderr | 2 +- tests/ui/typeck/issue-67971.stderr | 2 +- tests/ui/typeck/issue-84160.stderr | 2 +- tests/ui/typeck/issue-84768.stderr | 2 +- tests/ui/typeck/issue-89856.stderr | 2 +- .../typeck/issue-91450-inner-ty-error.stderr | 2 +- tests/ui/typeck/issue-92481.stderr | 2 +- tests/ui/typeck/issue-96530.stderr | 2 +- .../typeck/return_type_containing_closure.rs | 2 +- .../return_type_containing_closure.stderr | 2 +- .../typeck_type_placeholder_mismatch.rs | 4 +- .../typeck_type_placeholder_mismatch.stderr | 4 +- tests/ui/unsized-locals/suggest-borrow.stderr | 4 +- tests/ui/unsized/box-instead-of-dyn-fn.stderr | 2 +- .../param-mentioned-by-different-field.stderr | 2 +- tests/ui/wf/wf-unsafe-trait-obj-match.stderr | 2 +- tests/ui/wrong-mul-method-signature.stderr | 6 +- 383 files changed, 889 insertions(+), 926 deletions(-) diff --git a/compiler/rustc_hir_analysis/src/check/check.rs b/compiler/rustc_hir_analysis/src/check/check.rs index 6f4ebc987e6a..ccd75ad0ec5a 100644 --- a/compiler/rustc_hir_analysis/src/check/check.rs +++ b/compiler/rustc_hir_analysis/src/check/check.rs @@ -444,7 +444,10 @@ fn check_opaque_meets_bounds<'tcx>( Err(ty_err) => { tcx.sess.delay_span_bug( span, - &format!("could not unify `{hidden_ty}` with revealed type:\n{ty_err}"), + &format!( + "could not unify `{hidden_ty}` with revealed type:\n{}", + ty_err.to_string(tcx) + ), ); } } diff --git a/compiler/rustc_infer/src/infer/error_reporting/mod.rs b/compiler/rustc_infer/src/infer/error_reporting/mod.rs index b11db8396c92..d58a5ceef966 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/mod.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/mod.rs @@ -67,6 +67,7 @@ use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::lang_items::LangItem; use rustc_hir::Node; use rustc_middle::dep_graph::DepContext; +use rustc_middle::ty::print::with_forced_trimmed_paths; use rustc_middle::ty::relate::{self, RelateResult, TypeRelation}; use rustc_middle::ty::{ self, error::TypeError, List, Region, Ty, TyCtxt, TypeFoldable, TypeSuperVisitable, @@ -1612,16 +1613,31 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> { { format!("expected this to be `{}`", expected) } else { - terr.to_string() + terr.to_string(self.tcx) }; label_or_note(sp, &terr); label_or_note(span, &msg); } else { - label_or_note(span, &terr.to_string()); + label_or_note(span, &terr.to_string(self.tcx)); label_or_note(sp, &msg); } } else { - label_or_note(span, &terr.to_string()); + if let Some(values) = values + && let Some((e, f)) = values.ty() + && let TypeError::ArgumentSorts(..) | TypeError::Sorts(_) = terr + { + let e = self.tcx.erase_regions(e); + let f = self.tcx.erase_regions(f); + let expected = with_forced_trimmed_paths!(e.sort_string(self.tcx)); + let found = with_forced_trimmed_paths!(f.sort_string(self.tcx)); + if expected == found { + label_or_note(span, &terr.to_string(self.tcx)); + } else { + label_or_note(span, &format!("expected {expected}, found {found}")); + } + } else { + label_or_note(span, &terr.to_string(self.tcx)); + } } if let Some((expected, found, exp_p, found_p)) = expected_found { diff --git a/compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs b/compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs index 34e8edd6140b..e18cfb93bedd 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs @@ -137,25 +137,25 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> { diag.help( "given a type parameter `T` and a method `foo`: ``` -trait Trait { fn foo(&tcx) -> T; } +trait Trait { fn foo(&self) -> T; } ``` the only ways to implement method `foo` are: - constrain `T` with an explicit type: ``` impl Trait for X { - fn foo(&tcx) -> String { String::new() } + fn foo(&self) -> String { String::new() } } ``` - add a trait bound to `T` and call a method on that trait that returns `Self`: ``` impl Trait for X { - fn foo(&tcx) -> T { ::default() } + fn foo(&self) -> T { ::default() } } ``` - change `foo` to return an argument of type `T`: ``` impl Trait for X { - fn foo(&tcx, x: T) -> T { x } + fn foo(&self, x: T) -> T { x } } ```", ); @@ -389,14 +389,14 @@ impl Trait for X { ``` trait Trait { type T; -fn foo(&tcx) -> Self::T; +fn foo(&self) -> Self::T; } ``` the only way of implementing method `foo` is to constrain `T` with an explicit associated type: ``` impl Trait for X { type T = String; -fn foo(&tcx) -> Self::T { String::new() } +fn foo(&self) -> Self::T { String::new() } } ```", ); diff --git a/compiler/rustc_middle/src/ty/error.rs b/compiler/rustc_middle/src/ty/error.rs index d83fc95ac4ee..bb87b0eea378 100644 --- a/compiler/rustc_middle/src/ty/error.rs +++ b/compiler/rustc_middle/src/ty/error.rs @@ -8,9 +8,7 @@ use rustc_span::symbol::Symbol; use rustc_target::spec::abi; use std::borrow::Cow; use std::collections::hash_map::DefaultHasher; -use std::fmt; -use std::hash::Hash; -use std::hash::Hasher; +use std::hash::{Hash, Hasher}; use std::path::PathBuf; #[derive(Clone, Copy, Debug, PartialEq, Eq, TypeFoldable, TypeVisitable, Lift)] @@ -87,20 +85,16 @@ impl TypeError<'_> { /// in parentheses after some larger message. You should also invoke `note_and_explain_type_err()` /// afterwards to present additional details, particularly when it comes to lifetime-related /// errors. -impl<'tcx> fmt::Display for TypeError<'tcx> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +impl<'tcx> TypeError<'tcx> { + pub fn to_string(self, tcx: TyCtxt<'tcx>) -> String { use self::TypeError::*; - fn report_maybe_different( - f: &mut fmt::Formatter<'_>, - expected: &str, - found: &str, - ) -> fmt::Result { + fn report_maybe_different(expected: &str, found: &str) -> String { // A naive approach to making sure that we're not reporting silly errors such as: // (expected closure, found closure). if expected == found { - write!(f, "expected {}, found a different {}", expected, found) + format!("expected {}, found a different {}", expected, found) } else { - write!(f, "expected {}, found {}", expected, found) + format!("expected {}, found {}", expected, found) } } @@ -109,64 +103,59 @@ impl<'tcx> fmt::Display for TypeError<'tcx> { _ => String::new(), }; - match *self { - CyclicTy(_) => write!(f, "cyclic type of infinite size"), - CyclicConst(_) => write!(f, "encountered a self-referencing constant"), - Mismatch => write!(f, "types differ"), + match self { + CyclicTy(_) => format!("cyclic type of infinite size"), + CyclicConst(_) => format!("encountered a self-referencing constant"), + Mismatch => format!("types differ"), ConstnessMismatch(values) => { - write!(f, "expected {} bound, found {} bound", values.expected, values.found) + format!("expected {} bound, found {} bound", values.expected, values.found) } PolarityMismatch(values) => { - write!(f, "expected {} polarity, found {} polarity", values.expected, values.found) + format!("expected {} polarity, found {} polarity", values.expected, values.found) } UnsafetyMismatch(values) => { - write!(f, "expected {} fn, found {} fn", values.expected, values.found) + format!("expected {} fn, found {} fn", values.expected, values.found) } AbiMismatch(values) => { - write!(f, "expected {} fn, found {} fn", values.expected, values.found) + format!("expected {} fn, found {} fn", values.expected, values.found) } - ArgumentMutability(_) | Mutability => write!(f, "types differ in mutability"), - TupleSize(values) => write!( - f, + ArgumentMutability(_) | Mutability => format!("types differ in mutability"), + TupleSize(values) => format!( "expected a tuple with {} element{}, found one with {} element{}", values.expected, pluralize!(values.expected), values.found, pluralize!(values.found) ), - FixedArraySize(values) => write!( - f, + FixedArraySize(values) => format!( "expected an array with a fixed size of {} element{}, found one with {} element{}", values.expected, pluralize!(values.expected), values.found, pluralize!(values.found) ), - ArgCount => write!(f, "incorrect number of function parameters"), - FieldMisMatch(adt, field) => write!(f, "field type mismatch: {}.{}", adt, field), - RegionsDoesNotOutlive(..) => write!(f, "lifetime mismatch"), + ArgCount => format!("incorrect number of function parameters"), + FieldMisMatch(adt, field) => format!("field type mismatch: {}.{}", adt, field), + RegionsDoesNotOutlive(..) => format!("lifetime mismatch"), // Actually naming the region here is a bit confusing because context is lacking RegionsInsufficientlyPolymorphic(..) => { - write!(f, "one type is more general than the other") + format!("one type is more general than the other") } - RegionsOverlyPolymorphic(br, _) => write!( - f, + RegionsOverlyPolymorphic(br, _) => format!( "expected concrete lifetime, found bound lifetime parameter{}", br_string(br) ), - RegionsPlaceholderMismatch => write!(f, "one type is more general than the other"), - ArgumentSorts(values, _) | Sorts(values) => ty::tls::with(|tcx| { - let (mut expected, mut found) = with_forced_trimmed_paths!(( - values.expected.sort_string(tcx), - values.found.sort_string(tcx), - )); + RegionsPlaceholderMismatch => format!("one type is more general than the other"), + ArgumentSorts(values, _) | Sorts(values) => { + let mut expected = values.expected.sort_string(tcx); + let mut found = values.found.sort_string(tcx); if expected == found { expected = values.expected.sort_string(tcx); found = values.found.sort_string(tcx); } - report_maybe_different(f, &expected, &found) - }), - Traits(values) => ty::tls::with(|tcx| { + report_maybe_different(&expected, &found) + } + Traits(values) => { let (mut expected, mut found) = with_forced_trimmed_paths!(( tcx.def_path_str(values.expected), tcx.def_path_str(values.found), @@ -175,12 +164,8 @@ impl<'tcx> fmt::Display for TypeError<'tcx> { expected = tcx.def_path_str(values.expected); found = tcx.def_path_str(values.found); } - report_maybe_different( - f, - &format!("trait `{expected}`"), - &format!("trait `{found}`"), - ) - }), + report_maybe_different(&format!("trait `{expected}`"), &format!("trait `{found}`")) + } IntMismatch(ref values) => { let expected = match values.expected { ty::IntVarValue::IntType(ty) => ty.name_str(), @@ -190,41 +175,34 @@ impl<'tcx> fmt::Display for TypeError<'tcx> { ty::IntVarValue::IntType(ty) => ty.name_str(), ty::IntVarValue::UintType(ty) => ty.name_str(), }; - write!(f, "expected `{}`, found `{}`", expected, found) + format!("expected `{}`, found `{}`", expected, found) } FloatMismatch(ref values) => { - write!( - f, + format!( "expected `{}`, found `{}`", values.expected.name_str(), values.found.name_str() ) } - VariadicMismatch(ref values) => write!( - f, + VariadicMismatch(ref values) => format!( "expected {} fn, found {} function", if values.expected { "variadic" } else { "non-variadic" }, if values.found { "variadic" } else { "non-variadic" } ), - ProjectionMismatched(ref values) => ty::tls::with(|tcx| { - write!( - f, - "expected {}, found {}", - tcx.def_path_str(values.expected), - tcx.def_path_str(values.found) - ) - }), + ProjectionMismatched(ref values) => format!( + "expected {}, found {}", + tcx.def_path_str(values.expected), + tcx.def_path_str(values.found) + ), ExistentialMismatch(ref values) => report_maybe_different( - f, &format!("trait `{}`", values.expected), &format!("trait `{}`", values.found), ), ConstMismatch(ref values) => { - write!(f, "expected `{}`, found `{}`", values.expected, values.found) + format!("expected `{}`, found `{}`", values.expected, values.found) } - IntrinsicCast => write!(f, "cannot coerce intrinsics to function pointers"), - TargetFeatureCast(_) => write!( - f, + IntrinsicCast => format!("cannot coerce intrinsics to function pointers"), + TargetFeatureCast(_) => format!( "cannot coerce functions with `#[target_feature]` to safe function pointers" ), } @@ -259,60 +237,9 @@ impl<'tcx> TypeError<'tcx> { } impl<'tcx> Ty<'tcx> { - pub fn sort_string(self, tcx: TyCtxt<'_>) -> Cow<'static, str> { + pub fn sort_string(self, tcx: TyCtxt<'tcx>) -> String { match *self.kind() { - ty::Bool | ty::Char | ty::Int(_) | ty::Uint(_) | ty::Float(_) | ty::Str | ty::Never => { - format!("`{}`", self).into() - } - ty::Tuple(ref tys) if tys.is_empty() => format!("`{}`", self).into(), - - ty::Adt(def, _) => format!("{} `{}`", def.descr(), tcx.def_path_str(def.did())).into(), ty::Foreign(def_id) => format!("extern type `{}`", tcx.def_path_str(def_id)).into(), - ty::Array(t, n) => { - if t.is_simple_ty() { - return format!("array `{}`", self).into(); - } - - let n = tcx.lift(n).unwrap(); - if let ty::ConstKind::Value(v) = n.kind() { - if let Some(n) = v.try_to_machine_usize(tcx) { - return format!("array of {} element{}", n, pluralize!(n)).into(); - } - } - "array".into() - } - ty::Slice(ty) if ty.is_simple_ty() => format!("slice `{}`", self).into(), - ty::Slice(_) => "slice".into(), - ty::RawPtr(tymut) => { - let tymut_string = match tymut.mutbl { - hir::Mutability::Mut => tymut.to_string(), - hir::Mutability::Not => format!("const {}", tymut.ty), - }; - - if tymut_string != "_" && (tymut.ty.is_simple_text() || tymut_string.len() < "const raw pointer".len()) { - format!("`*{}`", tymut_string).into() - } else { - // Unknown type name, it's long or has type arguments - "raw pointer".into() - } - }, - ty::Ref(_, ty, mutbl) => { - let tymut = ty::TypeAndMut { ty, mutbl }; - let tymut_string = tymut.to_string(); - - if tymut_string != "_" - && (ty.is_simple_text() || tymut_string.len() < "mutable reference".len()) - { - format!("`&{}`", tymut_string).into() - } else { - // Unknown type name, it's long or has type arguments - match mutbl { - hir::Mutability::Mut => "mutable reference", - _ => "reference", - } - .into() - } - } ty::FnDef(def_id, ..) => match tcx.def_kind(def_id) { DefKind::Ctor(CtorOf::Struct, _) => "struct constructor".into(), DefKind::Ctor(CtorOf::Variant, _) => "enum constructor".into(), @@ -320,14 +247,13 @@ impl<'tcx> Ty<'tcx> { }, ty::FnPtr(_) => "fn pointer".into(), ty::Dynamic(ref inner, ..) if let Some(principal) = inner.principal() => { - format!("trait object `dyn {}`", tcx.def_path_str(principal.def_id())).into() + format!("`dyn {}`", tcx.def_path_str(principal.def_id())) } ty::Dynamic(..) => "trait object".into(), ty::Closure(..) => "closure".into(), ty::Generator(def_id, ..) => tcx.generator_kind(def_id).unwrap().descr().into(), ty::GeneratorWitness(..) | ty::GeneratorWitnessMIR(..) => "generator witness".into(), - ty::Tuple(..) => "tuple".into(), ty::Infer(ty::TyVar(_)) => "inferred type".into(), ty::Infer(ty::IntVar(_)) => "integer".into(), ty::Infer(ty::FloatVar(_)) => "floating-point number".into(), @@ -337,9 +263,14 @@ impl<'tcx> Ty<'tcx> { ty::Infer(ty::FreshIntTy(_)) => "fresh integral type".into(), ty::Infer(ty::FreshFloatTy(_)) => "fresh floating-point type".into(), ty::Alias(ty::Projection, _) => "associated type".into(), - ty::Param(p) => format!("type parameter `{}`", p).into(), + ty::Param(p) => format!("type parameter `{p}`").into(), ty::Alias(ty::Opaque, ..) => "opaque type".into(), ty::Error(_) => "type error".into(), + _ => { + let width = tcx.sess.diagnostic_width(); + let length_limit = std::cmp::max(width / 4, 15); + format!("`{}`", tcx.ty_string_with_limit(self, length_limit)) + } } } @@ -386,16 +317,14 @@ impl<'tcx> Ty<'tcx> { } impl<'tcx> TyCtxt<'tcx> { - pub fn short_ty_string(self, ty: Ty<'tcx>) -> (String, Option) { - let width = self.sess.diagnostic_width(); - let length_limit = width.saturating_sub(30); + pub fn ty_string_with_limit(self, ty: Ty<'tcx>, length_limit: usize) -> String { let mut type_limit = 50; let regular = FmtPrinter::new(self, hir::def::Namespace::TypeNS) .pretty_print_type(ty) .expect("could not write to `String`") .into_buffer(); - if regular.len() <= width { - return (regular, None); + if regular.len() <= length_limit { + return regular; } let mut short; loop { @@ -415,6 +344,20 @@ impl<'tcx> TyCtxt<'tcx> { } type_limit -= 1; } + short + } + + pub fn short_ty_string(self, ty: Ty<'tcx>) -> (String, Option) { + let width = self.sess.diagnostic_width(); + let length_limit = width.saturating_sub(30); + let regular = FmtPrinter::new(self, hir::def::Namespace::TypeNS) + .pretty_print_type(ty) + .expect("could not write to `String`") + .into_buffer(); + if regular.len() <= width { + return (regular, None); + } + let short = self.ty_string_with_limit(ty, length_limit); if regular == short { return (regular, None); } diff --git a/compiler/rustc_trait_selection/src/traits/select/mod.rs b/compiler/rustc_trait_selection/src/traits/select/mod.rs index b8f5aeee2d59..ad7d479896fd 100644 --- a/compiler/rustc_trait_selection/src/traits/select/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/select/mod.rs @@ -2454,7 +2454,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { .at(&cause, obligation.param_env) .define_opaque_types(false) .eq(placeholder_obligation_trait_ref, impl_trait_ref) - .map_err(|e| debug!("match_impl: failed eq_trait_refs due to `{e}`"))?; + .map_err(|e| { + debug!("match_impl: failed eq_trait_refs due to `{}`", e.to_string(self.tcx())) + })?; nested_obligations.extend(obligations); if !self.is_intercrate() diff --git a/src/tools/clippy/tests/ui/track-diagnostics.stderr b/src/tools/clippy/tests/ui/track-diagnostics.stderr index ec3031862531..39418d359288 100644 --- a/src/tools/clippy/tests/ui/track-diagnostics.stderr +++ b/src/tools/clippy/tests/ui/track-diagnostics.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/track-diagnostics.rs:LL:CC | LL | const S: A = B; - | ^ expected struct `A`, found struct `B` + | ^ expected `A`, found `B` -Ztrack-diagnostics: created at compiler/rustc_infer/src/infer/error_reporting/mod.rs:LL:CC error: aborting due to previous error diff --git a/tests/run-make-fulldeps/type-mismatch-same-crate-name/Makefile b/tests/run-make-fulldeps/type-mismatch-same-crate-name/Makefile index 9f4be7126346..a2a2a41c7a5a 100644 --- a/tests/run-make-fulldeps/type-mismatch-same-crate-name/Makefile +++ b/tests/run-make-fulldeps/type-mismatch-same-crate-name/Makefile @@ -11,7 +11,7 @@ all: tr -d '\r\n' | $(CGREP) -e \ "mismatched types.*\ crateB::try_foo\(foo2\);.*\ - expected struct \`crateA::foo::Foo\`, found struct \`Foo\`.*\ + expected \`crateA::foo::Foo\`, found \`Foo\`.*\ different versions of crate \`crateA\`.*\ mismatched types.*\ crateB::try_bar\(bar2\);.*\ diff --git a/tests/rustdoc-ui/track-diagnostics.stderr b/tests/rustdoc-ui/track-diagnostics.stderr index ec3031862531..39418d359288 100644 --- a/tests/rustdoc-ui/track-diagnostics.stderr +++ b/tests/rustdoc-ui/track-diagnostics.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/track-diagnostics.rs:LL:CC | LL | const S: A = B; - | ^ expected struct `A`, found struct `B` + | ^ expected `A`, found `B` -Ztrack-diagnostics: created at compiler/rustc_infer/src/infer/error_reporting/mod.rs:LL:CC error: aborting due to previous error diff --git a/tests/ui/alloc-error/alloc-error-handler-bad-signature-1.stderr b/tests/ui/alloc-error/alloc-error-handler-bad-signature-1.stderr index 59192a1ecc3f..de92841d7f18 100644 --- a/tests/ui/alloc-error/alloc-error-handler-bad-signature-1.stderr +++ b/tests/ui/alloc-error/alloc-error-handler-bad-signature-1.stderr @@ -10,7 +10,7 @@ LL | || ) -> () LL | | { LL | | loop {} LL | | } - | |__^ expected `&Layout`, found struct `Layout` + | |__^ expected `&Layout`, found `Layout` | note: function defined here --> $DIR/alloc-error-handler-bad-signature-1.rs:10:4 diff --git a/tests/ui/alloc-error/alloc-error-handler-bad-signature-2.stderr b/tests/ui/alloc-error/alloc-error-handler-bad-signature-2.stderr index 7d23c2fc05ac..7a495380f2ba 100644 --- a/tests/ui/alloc-error/alloc-error-handler-bad-signature-2.stderr +++ b/tests/ui/alloc-error/alloc-error-handler-bad-signature-2.stderr @@ -9,12 +9,12 @@ LL | || ) { | ||_- arguments to this function are incorrect LL | | loop {} LL | | } - | |__^ expected struct `Layout`, found struct `core::alloc::Layout` + | |__^ expected `Layout`, found `core::alloc::Layout` | - = note: struct `core::alloc::Layout` and struct `Layout` have similar names, but are actually distinct types -note: struct `core::alloc::Layout` is defined in crate `core` + = note: `core::alloc::Layout` and `Layout` have similar names, but are actually distinct types +note: `core::alloc::Layout` is defined in crate `core` --> $SRC_DIR/core/src/alloc/layout.rs:LL:COL -note: struct `Layout` is defined in the current crate +note: `Layout` is defined in the current crate --> $DIR/alloc-error-handler-bad-signature-2.rs:7:1 | LL | struct Layout; diff --git a/tests/ui/argument-suggestions/formal-and-expected-differ.stderr b/tests/ui/argument-suggestions/formal-and-expected-differ.stderr index 905875b52776..6076b7ccb8ff 100644 --- a/tests/ui/argument-suggestions/formal-and-expected-differ.stderr +++ b/tests/ui/argument-suggestions/formal-and-expected-differ.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/formal-and-expected-differ.rs:22:29 | LL | let _: U<_, u32> = U(1, S(3u32)); - | - ^^^^^^^ expected `f32`, found `u32` + | - ^^^^^^^ expected `S`, found `S` | | | arguments to this struct are incorrect | @@ -18,7 +18,7 @@ error[E0308]: mismatched types --> $DIR/formal-and-expected-differ.rs:22:24 | LL | let _: U<_, u32> = U(1, S(3u32)); - | --------- ^^^^^^^^^^^^^ expected `u32`, found `f32` + | --------- ^^^^^^^^^^^^^ expected `U<_, u32>`, found `U` | | | expected due to this | diff --git a/tests/ui/argument-suggestions/invalid_arguments.stderr b/tests/ui/argument-suggestions/invalid_arguments.stderr index 303f08695785..d26f33d098be 100644 --- a/tests/ui/argument-suggestions/invalid_arguments.stderr +++ b/tests/ui/argument-suggestions/invalid_arguments.stderr @@ -100,7 +100,7 @@ error[E0308]: mismatched types --> $DIR/invalid_arguments.rs:24:18 | LL | three_arg_diff(X{}, 1.0, ""); - | -------------- ^^^ expected `i32`, found struct `X` + | -------------- ^^^ expected `i32`, found `X` | | | arguments to this function are incorrect | @@ -114,7 +114,7 @@ error[E0308]: mismatched types --> $DIR/invalid_arguments.rs:25:21 | LL | three_arg_diff(1, X {}, ""); - | -------------- ^^^^ expected `f32`, found struct `X` + | -------------- ^^^^ expected `f32`, found `X` | | | arguments to this function are incorrect | @@ -128,7 +128,7 @@ error[E0308]: mismatched types --> $DIR/invalid_arguments.rs:26:26 | LL | three_arg_diff(1, 1.0, X {}); - | -------------- ^^^^ expected `&str`, found struct `X` + | -------------- ^^^^ expected `&str`, found `X` | | | arguments to this function are incorrect | @@ -142,9 +142,9 @@ error[E0308]: arguments to this function are incorrect --> $DIR/invalid_arguments.rs:28:3 | LL | three_arg_diff(X {}, X {}, ""); - | ^^^^^^^^^^^^^^ ---- ---- expected `f32`, found struct `X` + | ^^^^^^^^^^^^^^ ---- ---- expected `f32`, found `X` | | - | expected `i32`, found struct `X` + | expected `i32`, found `X` | note: function defined here --> $DIR/invalid_arguments.rs:8:4 @@ -156,9 +156,9 @@ error[E0308]: arguments to this function are incorrect --> $DIR/invalid_arguments.rs:29:3 | LL | three_arg_diff(X {}, 1.0, X {}); - | ^^^^^^^^^^^^^^ ---- ---- expected `&str`, found struct `X` + | ^^^^^^^^^^^^^^ ---- ---- expected `&str`, found `X` | | - | expected `i32`, found struct `X` + | expected `i32`, found `X` | note: function defined here --> $DIR/invalid_arguments.rs:8:4 @@ -170,9 +170,9 @@ error[E0308]: arguments to this function are incorrect --> $DIR/invalid_arguments.rs:30:3 | LL | three_arg_diff(1, X {}, X {}); - | ^^^^^^^^^^^^^^ ---- ---- expected `&str`, found struct `X` + | ^^^^^^^^^^^^^^ ---- ---- expected `&str`, found `X` | | - | expected `f32`, found struct `X` + | expected `f32`, found `X` | note: function defined here --> $DIR/invalid_arguments.rs:8:4 @@ -184,10 +184,10 @@ error[E0308]: arguments to this function are incorrect --> $DIR/invalid_arguments.rs:32:3 | LL | three_arg_diff(X {}, X {}, X {}); - | ^^^^^^^^^^^^^^ ---- ---- ---- expected `&str`, found struct `X` + | ^^^^^^^^^^^^^^ ---- ---- ---- expected `&str`, found `X` | | | - | | expected `f32`, found struct `X` - | expected `i32`, found struct `X` + | | expected `f32`, found `X` + | expected `i32`, found `X` | note: function defined here --> $DIR/invalid_arguments.rs:8:4 @@ -199,7 +199,7 @@ error[E0308]: mismatched types --> $DIR/invalid_arguments.rs:34:20 | LL | three_arg_repeat(X {}, 1, ""); - | ---------------- ^^^^ expected `i32`, found struct `X` + | ---------------- ^^^^ expected `i32`, found `X` | | | arguments to this function are incorrect | @@ -213,7 +213,7 @@ error[E0308]: mismatched types --> $DIR/invalid_arguments.rs:35:23 | LL | three_arg_repeat(1, X {}, ""); - | ---------------- ^^^^ expected `i32`, found struct `X` + | ---------------- ^^^^ expected `i32`, found `X` | | | arguments to this function are incorrect | @@ -227,7 +227,7 @@ error[E0308]: mismatched types --> $DIR/invalid_arguments.rs:36:26 | LL | three_arg_repeat(1, 1, X {}); - | ---------------- ^^^^ expected `&str`, found struct `X` + | ---------------- ^^^^ expected `&str`, found `X` | | | arguments to this function are incorrect | @@ -241,9 +241,9 @@ error[E0308]: arguments to this function are incorrect --> $DIR/invalid_arguments.rs:38:3 | LL | three_arg_repeat(X {}, X {}, ""); - | ^^^^^^^^^^^^^^^^ ---- ---- expected `i32`, found struct `X` + | ^^^^^^^^^^^^^^^^ ---- ---- expected `i32`, found `X` | | - | expected `i32`, found struct `X` + | expected `i32`, found `X` | note: function defined here --> $DIR/invalid_arguments.rs:9:4 @@ -255,9 +255,9 @@ error[E0308]: arguments to this function are incorrect --> $DIR/invalid_arguments.rs:39:3 | LL | three_arg_repeat(X {}, 1, X {}); - | ^^^^^^^^^^^^^^^^ ---- ---- expected `&str`, found struct `X` + | ^^^^^^^^^^^^^^^^ ---- ---- expected `&str`, found `X` | | - | expected `i32`, found struct `X` + | expected `i32`, found `X` | note: function defined here --> $DIR/invalid_arguments.rs:9:4 @@ -269,9 +269,9 @@ error[E0308]: arguments to this function are incorrect --> $DIR/invalid_arguments.rs:40:3 | LL | three_arg_repeat(1, X {}, X{}); - | ^^^^^^^^^^^^^^^^ ---- --- expected `&str`, found struct `X` + | ^^^^^^^^^^^^^^^^ ---- --- expected `&str`, found `X` | | - | expected `i32`, found struct `X` + | expected `i32`, found `X` | note: function defined here --> $DIR/invalid_arguments.rs:9:4 @@ -283,10 +283,10 @@ error[E0308]: arguments to this function are incorrect --> $DIR/invalid_arguments.rs:42:3 | LL | three_arg_repeat(X {}, X {}, X {}); - | ^^^^^^^^^^^^^^^^ ---- ---- ---- expected `&str`, found struct `X` + | ^^^^^^^^^^^^^^^^ ---- ---- ---- expected `&str`, found `X` | | | - | | expected `i32`, found struct `X` - | expected `i32`, found struct `X` + | | expected `i32`, found `X` + | expected `i32`, found `X` | note: function defined here --> $DIR/invalid_arguments.rs:9:4 diff --git a/tests/ui/argument-suggestions/issue-100478.stderr b/tests/ui/argument-suggestions/issue-100478.stderr index df02a312cf11..e4304988f9be 100644 --- a/tests/ui/argument-suggestions/issue-100478.stderr +++ b/tests/ui/argument-suggestions/issue-100478.stderr @@ -41,7 +41,7 @@ error[E0308]: arguments to this function are incorrect --> $DIR/issue-100478.rs:36:5 | LL | four_shuffle(T3::default(), T2::default(), T1::default(), T3::default()); - | ^^^^^^^^^^^^ ------------- ------------- ------------- expected struct `T4`, found struct `T3` + | ^^^^^^^^^^^^ ------------- ------------- ------------- expected `T4`, found `T3` | | | | | expected `T3`, found `T1` | expected `T1`, found `T3` diff --git a/tests/ui/argument-suggestions/issue-101097.stderr b/tests/ui/argument-suggestions/issue-101097.stderr index 096f8c226f2a..7582082ac72a 100644 --- a/tests/ui/argument-suggestions/issue-101097.stderr +++ b/tests/ui/argument-suggestions/issue-101097.stderr @@ -128,7 +128,7 @@ LL | f(C, C, A, B, A, A); | ^ - - - - - expected `C`, found `A` | | | | | | | | | expected `C`, found `A` - | | | expected struct `B`, found struct `A` + | | | expected `B`, found `A` | | expected `A`, found `C` | expected `A`, found `C` | diff --git a/tests/ui/argument-suggestions/issue-97484.stderr b/tests/ui/argument-suggestions/issue-97484.stderr index caa50f14b43e..c2e6e001b179 100644 --- a/tests/ui/argument-suggestions/issue-97484.stderr +++ b/tests/ui/argument-suggestions/issue-97484.stderr @@ -4,7 +4,7 @@ error[E0061]: this function takes 4 arguments but 7 arguments were supplied LL | foo(&&A, B, C, D, E, F, G); | ^^^ - - - - argument of type `F` unexpected | | | | - | | | expected `&E`, found struct `E` + | | | expected `&E`, found `E` | | argument of type `C` unexpected | argument of type `B` unexpected | diff --git a/tests/ui/argument-suggestions/mixed_cases.stderr b/tests/ui/argument-suggestions/mixed_cases.stderr index 8c525db1ac66..8cf48060a635 100644 --- a/tests/ui/argument-suggestions/mixed_cases.stderr +++ b/tests/ui/argument-suggestions/mixed_cases.stderr @@ -41,7 +41,7 @@ error[E0061]: this function takes 3 arguments but 2 arguments were supplied LL | three_args(1, X {}); | ^^^^^^^^^^--------- | | | - | | expected `f32`, found struct `X` + | | expected `f32`, found `X` | an argument of type `&str` is missing | note: function defined here @@ -78,7 +78,7 @@ error[E0308]: arguments to this function are incorrect LL | three_args("", X {}, 1); | ^^^^^^^^^^ -- ---- - expected `&str`, found `{integer}` | | | - | | expected `f32`, found struct `X` + | | expected `f32`, found `X` | expected `i32`, found `&'static str` | note: function defined here diff --git a/tests/ui/argument-suggestions/two-mismatch-notes.stderr b/tests/ui/argument-suggestions/two-mismatch-notes.stderr index 7873cf964cbb..70cc60255c71 100644 --- a/tests/ui/argument-suggestions/two-mismatch-notes.stderr +++ b/tests/ui/argument-suggestions/two-mismatch-notes.stderr @@ -4,14 +4,14 @@ error[E0308]: arguments to this function are incorrect LL | foo(f, w); | ^^^ | -note: expected `i32`, found `u32` +note: expected fn pointer, found fn item --> $DIR/two-mismatch-notes.rs:10:9 | LL | foo(f, w); | ^ = note: expected fn pointer `fn(i32)` found fn item `fn(u32) {f}` -note: expected `i32`, found `isize` +note: expected `Wrapper`, found `Wrapper` --> $DIR/two-mismatch-notes.rs:10:12 | LL | foo(f, w); diff --git a/tests/ui/array-slice-vec/array-not-vector.rs b/tests/ui/array-slice-vec/array-not-vector.rs index 5e46f015baf6..d8b5b10d5914 100644 --- a/tests/ui/array-slice-vec/array-not-vector.rs +++ b/tests/ui/array-slice-vec/array-not-vector.rs @@ -1,12 +1,12 @@ fn main() { let _x: i32 = [1, 2, 3]; //~^ ERROR mismatched types - //~| expected `i32`, found array + //~| expected `i32`, found `[{integer}; 3]` let x: &[i32] = &[1, 2, 3]; let _y: &i32 = x; //~^ ERROR mismatched types //~| expected reference `&i32` //~| found reference `&[i32]` - //~| expected `i32`, found slice + //~| expected `&i32`, found `&[i32]` } diff --git a/tests/ui/array-slice-vec/array-not-vector.stderr b/tests/ui/array-slice-vec/array-not-vector.stderr index 0e187d9072a8..f20d99524dcc 100644 --- a/tests/ui/array-slice-vec/array-not-vector.stderr +++ b/tests/ui/array-slice-vec/array-not-vector.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/array-not-vector.rs:2:19 | LL | let _x: i32 = [1, 2, 3]; - | --- ^^^^^^^^^ expected `i32`, found array `[{integer}; 3]` + | --- ^^^^^^^^^ expected `i32`, found `[{integer}; 3]` | | | expected due to this @@ -10,7 +10,7 @@ error[E0308]: mismatched types --> $DIR/array-not-vector.rs:7:20 | LL | let _y: &i32 = x; - | ---- ^ expected `i32`, found slice `[i32]` + | ---- ^ expected `&i32`, found `&[i32]` | | | expected due to this | diff --git a/tests/ui/array-slice-vec/slice-to-vec-comparison.stderr b/tests/ui/array-slice-vec/slice-to-vec-comparison.stderr index e3b3b040f664..47008e1d9994 100644 --- a/tests/ui/array-slice-vec/slice-to-vec-comparison.stderr +++ b/tests/ui/array-slice-vec/slice-to-vec-comparison.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/slice-to-vec-comparison.rs:4:9 | LL | a > b; - | ^ expected array of 0 elements, found struct `Vec` + | ^ expected `&[_; 0]`, found `&Vec` | = note: expected reference `&[_; 0]` found reference `&Vec` diff --git a/tests/ui/associated-consts/associated-const-generic-obligations.stderr b/tests/ui/associated-consts/associated-const-generic-obligations.stderr index f45fa0ad55cd..d45868151b16 100644 --- a/tests/ui/associated-consts/associated-const-generic-obligations.stderr +++ b/tests/ui/associated-consts/associated-const-generic-obligations.stderr @@ -2,7 +2,7 @@ error[E0326]: implemented const `FROM` has an incompatible type for trait --> $DIR/associated-const-generic-obligations.rs:14:17 | LL | const FROM: &'static str = "foo"; - | ^^^^^^^^^^^^ expected associated type, found `&str` + | ^^^^^^^^^^^^ expected associated type, found `&'static str` | note: type in trait --> $DIR/associated-const-generic-obligations.rs:10:17 diff --git a/tests/ui/associated-type-bounds/elision.stderr b/tests/ui/associated-type-bounds/elision.stderr index ea3024627496..b64a4dab2065 100644 --- a/tests/ui/associated-type-bounds/elision.stderr +++ b/tests/ui/associated-type-bounds/elision.stderr @@ -14,7 +14,7 @@ error[E0308]: mismatched types --> $DIR/elision.rs:5:79 | LL | fn f(x: &mut dyn Iterator>) -> Option<&'_ ()> { x.next() } - | ----------------------------- -------------- ^^^^^^^^ expected `&()`, found type parameter `impl Iterator` + | ----------------------------- -------------- ^^^^^^^^ expected `Option<&()>`, found `Option>` | | | | | expected `Option<&'static ()>` because of return type | this type parameter diff --git a/tests/ui/associated-type-bounds/issue-71443-1.stderr b/tests/ui/associated-type-bounds/issue-71443-1.stderr index a9459ee74328..15cc9646b2c8 100644 --- a/tests/ui/associated-type-bounds/issue-71443-1.stderr +++ b/tests/ui/associated-type-bounds/issue-71443-1.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn hello Iterator>() { | - help: try adding a return type: `-> Incorrect` LL | Incorrect - | ^^^^^^^^^ expected `()`, found struct `Incorrect` + | ^^^^^^^^^ expected `()`, found `Incorrect` error: aborting due to previous error diff --git a/tests/ui/associated-types/associated-type-projection-from-supertrait.stderr b/tests/ui/associated-types/associated-type-projection-from-supertrait.stderr index d6b18d4ed32e..5fe53a27eb85 100644 --- a/tests/ui/associated-types/associated-type-projection-from-supertrait.stderr +++ b/tests/ui/associated-types/associated-type-projection-from-supertrait.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/associated-type-projection-from-supertrait.rs:27:23 | LL | fn b() { dent(ModelT, Blue); } - | ---- ^^^^ expected struct `Black`, found struct `Blue` + | ---- ^^^^ expected `Black`, found `Blue` | | | arguments to this function are incorrect | @@ -16,7 +16,7 @@ error[E0308]: mismatched types --> $DIR/associated-type-projection-from-supertrait.rs:28:23 | LL | fn c() { dent(ModelU, Black); } - | ---- ^^^^^ expected struct `Blue`, found struct `Black` + | ---- ^^^^^ expected `Blue`, found `Black` | | | arguments to this function are incorrect | @@ -30,7 +30,7 @@ error[E0308]: mismatched types --> $DIR/associated-type-projection-from-supertrait.rs:32:28 | LL | fn f() { ModelT.chip_paint(Blue); } - | ---------- ^^^^ expected struct `Black`, found struct `Blue` + | ---------- ^^^^ expected `Black`, found `Blue` | | | arguments to this method are incorrect | @@ -44,7 +44,7 @@ error[E0308]: mismatched types --> $DIR/associated-type-projection-from-supertrait.rs:33:28 | LL | fn g() { ModelU.chip_paint(Black); } - | ---------- ^^^^^ expected struct `Blue`, found struct `Black` + | ---------- ^^^^^ expected `Blue`, found `Black` | | | arguments to this method are incorrect | diff --git a/tests/ui/associated-types/associated-types-eq-3.rs b/tests/ui/associated-types/associated-types-eq-3.rs index f6988dcf65eb..380d0e95c13f 100644 --- a/tests/ui/associated-types/associated-types-eq-3.rs +++ b/tests/ui/associated-types/associated-types-eq-3.rs @@ -23,7 +23,7 @@ fn foo2(x: I) { let _: Bar = x.boo(); //~^ ERROR mismatched types //~| found associated type `::A` - //~| expected struct `Bar`, found associated type + //~| expected `Bar`, found //~| expected struct `Bar` } diff --git a/tests/ui/associated-types/associated-types-eq-3.stderr b/tests/ui/associated-types/associated-types-eq-3.stderr index fbe1a1ee8bcd..15ce4fc91cb3 100644 --- a/tests/ui/associated-types/associated-types-eq-3.stderr +++ b/tests/ui/associated-types/associated-types-eq-3.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/associated-types-eq-3.rs:23:18 | LL | let _: Bar = x.boo(); - | --- ^^^^^^^ expected struct `Bar`, found associated type + | --- ^^^^^^^ expected `Bar`, found associated type | | | expected due to this | diff --git a/tests/ui/async-await/async-block-control-flow-static-semantics.stderr b/tests/ui/async-await/async-block-control-flow-static-semantics.stderr index c4487eb840ab..a6dbb0716143 100644 --- a/tests/ui/async-await/async-block-control-flow-static-semantics.stderr +++ b/tests/ui/async-await/async-block-control-flow-static-semantics.stderr @@ -57,7 +57,7 @@ error[E0308]: mismatched types --> $DIR/async-block-control-flow-static-semantics.rs:49:44 | LL | fn rethrow_targets_async_block_not_fn() -> Result { - | ---------------------------------- ^^^^^^^^^^^^^^^^^ expected enum `Result`, found `()` + | ---------------------------------- ^^^^^^^^^^^^^^^^^ expected `Result`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression | @@ -68,7 +68,7 @@ error[E0308]: mismatched types --> $DIR/async-block-control-flow-static-semantics.rs:58:50 | LL | fn rethrow_targets_async_block_not_async_fn() -> Result { - | ---------------------------------------- ^^^^^^^^^^^^^^^^^ expected enum `Result`, found `()` + | ---------------------------------------- ^^^^^^^^^^^^^^^^^ expected `Result`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression | diff --git a/tests/ui/async-await/in-trait/async-example-desugared-boxed-in-trait.stderr b/tests/ui/async-await/in-trait/async-example-desugared-boxed-in-trait.stderr index 13e7222551aa..3c01fca2f4d8 100644 --- a/tests/ui/async-await/in-trait/async-example-desugared-boxed-in-trait.stderr +++ b/tests/ui/async-await/in-trait/async-example-desugared-boxed-in-trait.stderr @@ -2,7 +2,7 @@ error[E0053]: method `foo` has an incompatible type for trait --> $DIR/async-example-desugared-boxed-in-trait.rs:15:28 | LL | async fn foo(&self) -> i32 { - | ^^^ expected struct `Pin`, found opaque type + | ^^^ expected `Pin>>`, found opaque type | note: type in trait --> $DIR/async-example-desugared-boxed-in-trait.rs:11:22 diff --git a/tests/ui/async-await/in-trait/return-type-suggestion.stderr b/tests/ui/async-await/in-trait/return-type-suggestion.stderr index 5a9b15e54a00..b8d83d0f28a3 100644 --- a/tests/ui/async-await/in-trait/return-type-suggestion.stderr +++ b/tests/ui/async-await/in-trait/return-type-suggestion.stderr @@ -13,7 +13,7 @@ error[E0308]: mismatched types LL | Ok(()) | ^^^^^^- help: consider using a semicolon here: `;` | | - | expected `()`, found enum `Result` + | expected `()`, found `Result<(), _>` | = note: expected unit type `()` found enum `Result<(), _>` diff --git a/tests/ui/async-await/issue-61076.rs b/tests/ui/async-await/issue-61076.rs index 750fad8393bb..3cde5cca3c3c 100644 --- a/tests/ui/async-await/issue-61076.rs +++ b/tests/ui/async-await/issue-61076.rs @@ -89,7 +89,7 @@ async fn match_() { match tuple() { //~ HELP consider `await`ing on the `Future` //~^ NOTE this expression has type `impl Future` Tuple(_) => {} //~ ERROR mismatched types - //~^ NOTE expected opaque type, found struct `Tuple` + //~^ NOTE expected opaque type, found `Tuple` //~| NOTE expected opaque type `impl Future` } } diff --git a/tests/ui/async-await/issue-61076.stderr b/tests/ui/async-await/issue-61076.stderr index 33839ea59392..5a7316edd01f 100644 --- a/tests/ui/async-await/issue-61076.stderr +++ b/tests/ui/async-await/issue-61076.stderr @@ -62,7 +62,7 @@ LL | match tuple() { | ------- this expression has type `impl Future` LL | LL | Tuple(_) => {} - | ^^^^^^^^ expected opaque type, found struct `Tuple` + | ^^^^^^^^ expected opaque type, found `Tuple` | note: while checking the return type of the `async fn` --> $DIR/issue-61076.rs:56:21 diff --git a/tests/ui/async-await/issue-98634.stderr b/tests/ui/async-await/issue-98634.stderr index 5160e48d88af..85fa04446ccc 100644 --- a/tests/ui/async-await/issue-98634.stderr +++ b/tests/ui/async-await/issue-98634.stderr @@ -2,7 +2,7 @@ error[E0271]: expected `fn() -> impl Future {callback}` to be a fn --> $DIR/issue-98634.rs:45:23 | LL | StructAsync { callback }.await; - | ^^^^^^^^ expected struct `Pin`, found opaque type + | ^^^^^^^^ expected `Pin>>`, found opaque type | note: while checking the return type of the `async fn` --> $DIR/issue-98634.rs:24:21 @@ -21,7 +21,7 @@ error[E0271]: expected `fn() -> impl Future {callback}` to be a fn --> $DIR/issue-98634.rs:45:9 | LL | StructAsync { callback }.await; - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `Pin`, found opaque type + | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `Pin>>`, found opaque type | note: while checking the return type of the `async fn` --> $DIR/issue-98634.rs:24:21 @@ -40,7 +40,7 @@ error[E0271]: expected `fn() -> impl Future {callback}` to be a fn --> $DIR/issue-98634.rs:45:33 | LL | StructAsync { callback }.await; - | ^^^^^^ expected struct `Pin`, found opaque type + | ^^^^^^ expected `Pin>>`, found opaque type | note: while checking the return type of the `async fn` --> $DIR/issue-98634.rs:24:21 diff --git a/tests/ui/async-await/issues/issue-102206.stderr b/tests/ui/async-await/issues/issue-102206.stderr index 2ab790ac761a..eef711910a1a 100644 --- a/tests/ui/async-await/issues/issue-102206.stderr +++ b/tests/ui/async-await/issues/issue-102206.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | std::mem::size_of_val(foo()); | --------------------- ^^^^^ | | | - | | expected reference, found opaque type + | | expected `&_`, found opaque type | | help: consider borrowing here: `&foo()` | arguments to this function are incorrect | diff --git a/tests/ui/async-await/proper-span-for-type-error.stderr b/tests/ui/async-await/proper-span-for-type-error.stderr index 25f05156ce2b..592ef7faf813 100644 --- a/tests/ui/async-await/proper-span-for-type-error.stderr +++ b/tests/ui/async-await/proper-span-for-type-error.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/proper-span-for-type-error.rs:8:5 | LL | a().await - | ^^^^^^^^^ expected enum `Result`, found `()` + | ^^^^^^^^^ expected `Result<(), i32>`, found `()` | = note: expected enum `Result<(), i32>` found unit type `()` diff --git a/tests/ui/async-await/suggest-missing-await.stderr b/tests/ui/async-await/suggest-missing-await.stderr index 1196601ace09..2db0666f1ae6 100644 --- a/tests/ui/async-await/suggest-missing-await.stderr +++ b/tests/ui/async-await/suggest-missing-await.stderr @@ -127,7 +127,7 @@ LL | match dummy_result() { | -------------- this expression has type `impl Future>` ... LL | Ok(_) => {} - | ^^^^^ expected opaque type, found enum `Result` + | ^^^^^ expected opaque type, found `Result<_, _>` | note: while checking the return type of the `async fn` --> $DIR/suggest-missing-await.rs:57:28 @@ -148,7 +148,7 @@ LL | match dummy_result() { | -------------- this expression has type `impl Future>` ... LL | Err(_) => {} - | ^^^^^^ expected opaque type, found enum `Result` + | ^^^^^^ expected opaque type, found `Result<_, _>` | note: while checking the return type of the `async fn` --> $DIR/suggest-missing-await.rs:57:28 diff --git a/tests/ui/autoref-autoderef/issue-38940.stderr b/tests/ui/autoref-autoderef/issue-38940.stderr index f0b8405770e8..8e98bfcd90fb 100644 --- a/tests/ui/autoref-autoderef/issue-38940.stderr +++ b/tests/ui/autoref-autoderef/issue-38940.stderr @@ -10,7 +10,7 @@ error[E0308]: mismatched types --> $DIR/issue-38940.rs:49:22 | LL | let x: &Bottom = &t; - | ------- ^^ expected struct `Bottom`, found struct `Top` + | ------- ^^ expected `&Bottom`, found `&Top` | | | expected due to this | diff --git a/tests/ui/blind/blind-item-block-middle.stderr b/tests/ui/blind/blind-item-block-middle.stderr index eb64fea94339..63e6d76843d1 100644 --- a/tests/ui/blind/blind-item-block-middle.stderr +++ b/tests/ui/blind/blind-item-block-middle.stderr @@ -7,7 +7,7 @@ LL | mod foo { pub struct bar; } LL | let bar = 5; | ^^^ - this expression has type `{integer}` | | - | expected integer, found struct `bar` + | expected integer, found `bar` | `bar` is interpreted as a unit struct, not a new binding | help: introduce a new binding instead: `other_bar` diff --git a/tests/ui/block-result/consider-removing-last-semi.stderr b/tests/ui/block-result/consider-removing-last-semi.stderr index 9be0367ae383..d30ab1293431 100644 --- a/tests/ui/block-result/consider-removing-last-semi.stderr +++ b/tests/ui/block-result/consider-removing-last-semi.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/consider-removing-last-semi.rs:3:15 | LL | pub fn f() -> String { - | - ^^^^^^ expected struct `String`, found `()` + | - ^^^^^^ expected `String`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression LL | 0u8; @@ -13,7 +13,7 @@ error[E0308]: mismatched types --> $DIR/consider-removing-last-semi.rs:8:15 | LL | pub fn g() -> String { - | - ^^^^^^ expected struct `String`, found `()` + | - ^^^^^^ expected `String`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression LL | "this won't work".to_string(); diff --git a/tests/ui/block-result/issue-13428.stderr b/tests/ui/block-result/issue-13428.stderr index 2b386d10c53c..c119b69da229 100644 --- a/tests/ui/block-result/issue-13428.stderr +++ b/tests/ui/block-result/issue-13428.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-13428.rs:3:13 | LL | fn foo() -> String { - | --- ^^^^^^ expected struct `String`, found `()` + | --- ^^^^^^ expected `String`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression @@ -10,7 +10,7 @@ error[E0308]: mismatched types --> $DIR/issue-13428.rs:11:13 | LL | fn bar() -> String { - | --- ^^^^^^ expected struct `String`, found `()` + | --- ^^^^^^ expected `String`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression LL | "foobar".to_string() diff --git a/tests/ui/block-result/issue-13624.rs b/tests/ui/block-result/issue-13624.rs index 4d2844cc5aec..8f93e5a356fa 100644 --- a/tests/ui/block-result/issue-13624.rs +++ b/tests/ui/block-result/issue-13624.rs @@ -6,7 +6,7 @@ mod a { pub fn get_enum_struct_variant() -> () { Enum::EnumStructVariant { x: 1, y: 2, z: 3 } //~^ ERROR mismatched types - //~| expected `()`, found enum `Enum` + //~| expected `()`, found `Enum` } } @@ -19,7 +19,7 @@ mod b { match enum_struct_variant { a::Enum::EnumStructVariant { x, y, z } => { //~^ ERROR mismatched types - //~| expected `()`, found enum `Enum` + //~| expected `()`, found `Enum` } } } diff --git a/tests/ui/block-result/issue-13624.stderr b/tests/ui/block-result/issue-13624.stderr index 13070b4e8213..d41bd057f824 100644 --- a/tests/ui/block-result/issue-13624.stderr +++ b/tests/ui/block-result/issue-13624.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | pub fn get_enum_struct_variant() -> () { | -- expected `()` because of return type LL | Enum::EnumStructVariant { x: 1, y: 2, z: 3 } - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found enum `Enum` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found `Enum` error[E0308]: mismatched types --> $DIR/issue-13624.rs:20:9 @@ -12,7 +12,7 @@ error[E0308]: mismatched types LL | match enum_struct_variant { | ------------------- this expression has type `()` LL | a::Enum::EnumStructVariant { x, y, z } => { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found enum `Enum` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found `Enum` error: aborting due to 2 previous errors diff --git a/tests/ui/block-result/issue-22645.stderr b/tests/ui/block-result/issue-22645.stderr index 24341c0f58a8..677b40aaa9da 100644 --- a/tests/ui/block-result/issue-22645.stderr +++ b/tests/ui/block-result/issue-22645.stderr @@ -20,7 +20,7 @@ LL | fn main() { | - expected `()` because of default return type LL | let b = Bob + 3.5; LL | b + 3 - | ^^^^^ expected `()`, found struct `Bob` + | ^^^^^ expected `()`, found `Bob` error: aborting due to 2 previous errors diff --git a/tests/ui/block-result/issue-5500.rs b/tests/ui/block-result/issue-5500.rs index 577987a4596c..de7fd39a20ca 100644 --- a/tests/ui/block-result/issue-5500.rs +++ b/tests/ui/block-result/issue-5500.rs @@ -3,5 +3,5 @@ fn main() { //~^ ERROR mismatched types //~| expected unit type `()` //~| found reference `&_` - //~| expected `()`, found reference + //~| expected `()`, found `&_` } diff --git a/tests/ui/block-result/issue-5500.stderr b/tests/ui/block-result/issue-5500.stderr index 211a6052864e..8cd4bd65871a 100644 --- a/tests/ui/block-result/issue-5500.stderr +++ b/tests/ui/block-result/issue-5500.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn main() { | - expected `()` because of default return type LL | &panic!() - | ^^^^^^^^^ expected `()`, found reference + | ^^^^^^^^^ expected `()`, found `&_` | = note: expected unit type `()` found reference `&_` diff --git a/tests/ui/box/issue-82446.stderr b/tests/ui/box/issue-82446.stderr index 0374737957e4..c03f35884b8a 100644 --- a/tests/ui/box/issue-82446.stderr +++ b/tests/ui/box/issue-82446.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-82446.rs:11:9 | LL | val - | ^^^ expected struct `Box`, found reference + | ^^^ expected `Box`, found `&Box` | = note: expected struct `Box<(dyn MyTrait + 'static)>` found reference `&Box<(dyn MyTrait + 'static)>` diff --git a/tests/ui/closures/issue-78720.stderr b/tests/ui/closures/issue-78720.stderr index 1e860d32b2a0..5d65c87b0fd6 100644 --- a/tests/ui/closures/issue-78720.stderr +++ b/tests/ui/closures/issue-78720.stderr @@ -26,7 +26,7 @@ error[E0308]: mismatched types --> $DIR/issue-78720.rs:7:39 | LL | fn map2(self, f: F) -> Map2 {} - | ^^ expected struct `Map2`, found `()` + | ^^ expected `Map2`, found `()` | = note: expected struct `Map2` found unit type `()` diff --git a/tests/ui/coercion/coerce-block-tail-26978.stderr b/tests/ui/coercion/coerce-block-tail-26978.stderr index 384debd487c5..90eb75f2bdfd 100644 --- a/tests/ui/coercion/coerce-block-tail-26978.stderr +++ b/tests/ui/coercion/coerce-block-tail-26978.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/coerce-block-tail-26978.rs:9:9 | LL | f(&{x}); - | ^ expected `i32`, found struct `Box` + | ^ expected `i32`, found `Box` | = note: expected type `i32` found struct `Box` diff --git a/tests/ui/coercion/coerce-block-tail-57749.stderr b/tests/ui/coercion/coerce-block-tail-57749.stderr index d5660c81dbd3..7e14f42eaafc 100644 --- a/tests/ui/coercion/coerce-block-tail-57749.stderr +++ b/tests/ui/coercion/coerce-block-tail-57749.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/coerce-block-tail-57749.rs:33:14 | LL | reset(&{ Homura }); - | ^^^^^^ expected `u32`, found struct `Homura` + | ^^^^^^ expected `u32`, found `Homura` | help: consider dereferencing the type | diff --git a/tests/ui/coercion/coerce-block-tail-83783.stderr b/tests/ui/coercion/coerce-block-tail-83783.stderr index 5f53606ce222..d556d013bb58 100644 --- a/tests/ui/coercion/coerce-block-tail-83783.stderr +++ b/tests/ui/coercion/coerce-block-tail-83783.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/coerce-block-tail-83783.rs:7:32 | LL | _consume_reference::(&async { Box::new(7_i32) }.await); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found struct `Box` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found `Box` | = note: expected type `i32` found struct `Box` diff --git a/tests/ui/coercion/coerce-block-tail-83850.stderr b/tests/ui/coercion/coerce-block-tail-83850.stderr index bbf607543704..3cfebb8a5437 100644 --- a/tests/ui/coercion/coerce-block-tail-83850.stderr +++ b/tests/ui/coercion/coerce-block-tail-83850.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/coerce-block-tail-83850.rs:5:7 | LL | f(&Box::new([1, 2])); - | - ^^^^^^^^^^^^^^^^^ expected slice `[i32]`, found struct `Box` + | - ^^^^^^^^^^^^^^^^^ expected `&[i32]`, found `&Box<[{integer}; 2]>` | | | arguments to this function are incorrect | diff --git a/tests/ui/coercion/coerce-block-tail.stderr b/tests/ui/coercion/coerce-block-tail.stderr index 318cf75867b4..7044fc3cefc4 100644 --- a/tests/ui/coercion/coerce-block-tail.stderr +++ b/tests/ui/coercion/coerce-block-tail.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/coerce-block-tail.rs:4:23 | LL | let _: &i32 = & { Box::new(1i32) }; - | ^^^^^^^^^^^^^^ expected `i32`, found struct `Box` + | ^^^^^^^^^^^^^^ expected `i32`, found `Box` | = note: expected type `i32` found struct `Box` diff --git a/tests/ui/coercion/coerce-expect-unsized-ascribed.stderr b/tests/ui/coercion/coerce-expect-unsized-ascribed.stderr index 44968244c4d0..f94422a92698 100644 --- a/tests/ui/coercion/coerce-expect-unsized-ascribed.stderr +++ b/tests/ui/coercion/coerce-expect-unsized-ascribed.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:9:27 | LL | let _ = type_ascribe!(box { [1, 2, 3] }, Box<[i32]>); - | ^^^^^^^^^^^^^^^^^ expected slice `[i32]`, found array `[i32; 3]` + | ^^^^^^^^^^^^^^^^^ expected `Box<[i32]>`, found `Box<[i32; 3]>` | = note: expected struct `Box<[i32]>` found struct `Box<[i32; 3]>` @@ -11,7 +11,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:10:27 | LL | let _ = type_ascribe!(box if true { [1, 2, 3] } else { [1, 3, 4] }, Box<[i32]>); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected slice `[i32]`, found array `[i32; 3]` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Box<[i32]>`, found `Box<[i32; 3]>` | = note: expected struct `Box<[i32]>` found struct `Box<[i32; 3]>` @@ -20,7 +20,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:11:27 | LL | let _ = type_ascribe!(box match true { true => [1, 2, 3], false => [1, 3, 4] }, Box<[i32]>); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected slice `[i32]`, found array `[i32; 3]` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Box<[i32]>`, found `Box<[i32; 3]>` | = note: expected struct `Box<[i32]>` found struct `Box<[i32; 3]>` @@ -29,7 +29,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:13:27 | LL | let _ = type_ascribe!(box { |x| (x as u8) }, Box _>); - | ^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn Fn`, found closure + | ^^^^^^^^^^^^^^^^^^^^^ expected `Box u8>`, found `Box<[closure@coerce-expect-unsized-ascribed.rs:13:33]>` | = note: expected struct `Box u8>` found struct `Box<[closure@$DIR/coerce-expect-unsized-ascribed.rs:13:33: 13:36]>` @@ -38,7 +38,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:14:27 | LL | let _ = type_ascribe!(box if true { false } else { true }, Box); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn Debug`, found `bool` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Box`, found `Box` | = note: expected struct `Box` found struct `Box` @@ -47,7 +47,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:15:27 | LL | let _ = type_ascribe!(box match true { true => 'a', false => 'b' }, Box); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn Debug`, found `char` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Box`, found `Box` | = note: expected struct `Box` found struct `Box` @@ -56,7 +56,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:17:27 | LL | let _ = type_ascribe!(&{ [1, 2, 3] }, &[i32]); - | ^^^^^^^^^^^^^^ expected slice `[i32]`, found array `[i32; 3]` + | ^^^^^^^^^^^^^^ expected `&[i32]`, found `&[i32; 3]` | = note: expected reference `&[i32]` found reference `&[i32; 3]` @@ -65,7 +65,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:18:27 | LL | let _ = type_ascribe!(&if true { [1, 2, 3] } else { [1, 3, 4] }, &[i32]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected slice `[i32]`, found array `[i32; 3]` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&[i32]`, found `&[i32; 3]` | = note: expected reference `&[i32]` found reference `&[i32; 3]` @@ -74,7 +74,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:19:27 | LL | let _ = type_ascribe!(&match true { true => [1, 2, 3], false => [1, 3, 4] }, &[i32]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected slice `[i32]`, found array `[i32; 3]` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&[i32]`, found `&[i32; 3]` | = note: expected reference `&[i32]` found reference `&[i32; 3]` @@ -83,7 +83,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:21:27 | LL | let _ = type_ascribe!(&{ |x| (x as u8) }, &dyn Fn(i32) -> _); - | ^^^^^^^^^^^^^^^^^^ expected trait object `dyn Fn`, found closure + | ^^^^^^^^^^^^^^^^^^ expected `&dyn Fn(i32) -> u8`, found `&[closure@coerce-expect-unsized-ascribed.rs:21:30]` | = note: expected reference `&dyn Fn(i32) -> u8` found reference `&[closure@$DIR/coerce-expect-unsized-ascribed.rs:21:30: 21:33]` @@ -92,7 +92,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:22:27 | LL | let _ = type_ascribe!(&if true { false } else { true }, &dyn Debug); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn Debug`, found `bool` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&dyn Debug`, found `&bool` | = note: expected reference `&dyn Debug` found reference `&bool` @@ -101,7 +101,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:23:27 | LL | let _ = type_ascribe!(&match true { true => 'a', false => 'b' }, &dyn Debug); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn Debug`, found `char` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&dyn Debug`, found `&char` | = note: expected reference `&dyn Debug` found reference `&char` @@ -110,7 +110,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:25:27 | LL | let _ = type_ascribe!(Box::new([1, 2, 3]), Box<[i32]>); - | ^^^^^^^^^^^^^^^^^^^ expected slice `[i32]`, found array `[i32; 3]` + | ^^^^^^^^^^^^^^^^^^^ expected `Box<[i32]>`, found `Box<[i32; 3]>` | = note: expected struct `Box<[i32]>` found struct `Box<[i32; 3]>` @@ -119,7 +119,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:26:27 | LL | let _ = type_ascribe!(Box::new(|x| (x as u8)), Box _>); - | ^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn Fn`, found closure + | ^^^^^^^^^^^^^^^^^^^^^^^ expected `Box u8>`, found `Box<[closure@coerce-expect-unsized-ascribed.rs:26:36]>` | = note: expected struct `Box u8>` found struct `Box<[closure@$DIR/coerce-expect-unsized-ascribed.rs:26:36: 26:39]>` diff --git a/tests/ui/coercion/coerce-to-bang.stderr b/tests/ui/coercion/coerce-to-bang.stderr index 1207dc7e7a2f..3c737358adc7 100644 --- a/tests/ui/coercion/coerce-to-bang.stderr +++ b/tests/ui/coercion/coerce-to-bang.stderr @@ -82,7 +82,7 @@ error[E0308]: mismatched types --> $DIR/coerce-to-bang.rs:50:21 | LL | let x: [!; 2] = [return, 22]; - | ------ ^^^^^^^^^^^^ expected `!`, found integer + | ------ ^^^^^^^^^^^^ expected `[!; 2]`, found `[{integer}; 2]` | | | expected due to this | diff --git a/tests/ui/coercion/coercion-missing-tail-expected-type.stderr b/tests/ui/coercion/coercion-missing-tail-expected-type.stderr index 4c04bb113516..288e945f1f8d 100644 --- a/tests/ui/coercion/coercion-missing-tail-expected-type.stderr +++ b/tests/ui/coercion/coercion-missing-tail-expected-type.stderr @@ -12,7 +12,7 @@ error[E0308]: mismatched types --> $DIR/coercion-missing-tail-expected-type.rs:8:13 | LL | fn foo() -> Result { - | --- ^^^^^^^^^^^^^^^ expected enum `Result`, found `()` + | --- ^^^^^^^^^^^^^^^ expected `Result`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression LL | Ok(1); diff --git a/tests/ui/coercion/coercion-slice.rs b/tests/ui/coercion/coercion-slice.rs index b756c8f8203a..b99235dd37f8 100644 --- a/tests/ui/coercion/coercion-slice.rs +++ b/tests/ui/coercion/coercion-slice.rs @@ -3,5 +3,5 @@ fn main() { let _: &[i32] = [0]; //~^ ERROR mismatched types - //~| expected `&[i32]`, found array `[{integer}; 1]` + //~| expected `&[i32]`, found `[{integer}; 1]` } diff --git a/tests/ui/coercion/coercion-slice.stderr b/tests/ui/coercion/coercion-slice.stderr index 42dc954ffd5e..c7b856a57ebc 100644 --- a/tests/ui/coercion/coercion-slice.stderr +++ b/tests/ui/coercion/coercion-slice.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let _: &[i32] = [0]; | ------ ^^^ | | | - | | expected `&[i32]`, found array `[{integer}; 1]` + | | expected `&[i32]`, found `[{integer}; 1]` | | help: consider borrowing here: `&[0]` | expected due to this diff --git a/tests/ui/compare-method/bad-self-type.stderr b/tests/ui/compare-method/bad-self-type.stderr index cad942e646e3..f632a53f264e 100644 --- a/tests/ui/compare-method/bad-self-type.stderr +++ b/tests/ui/compare-method/bad-self-type.stderr @@ -4,7 +4,7 @@ error[E0053]: method `poll` has an incompatible type for trait LL | fn poll(self, _: &mut Context<'_>) -> Poll<()> { | ^^^^ | | - | expected struct `Pin`, found struct `MyFuture` + | expected `Pin<&mut MyFuture>`, found `MyFuture` | help: change the self-receiver type to match the trait: `self: Pin<&mut MyFuture>` | = note: expected signature `fn(Pin<&mut MyFuture>, &mut Context<'_>) -> Poll<_>` @@ -16,7 +16,7 @@ error[E0053]: method `foo` has an incompatible type for trait LL | fn foo(self: Box) {} | ------^^^^^^^^^ | | | - | | expected struct `MyFuture`, found struct `Box` + | | expected `MyFuture`, found `Box` | help: change the self-receiver type to match the trait: `self` | note: type in trait @@ -31,7 +31,7 @@ error[E0053]: method `bar` has an incompatible type for trait --> $DIR/bad-self-type.rs:24:18 | LL | fn bar(self) {} - | ^ expected enum `Option`, found `()` + | ^ expected `Option<()>`, found `()` | note: type in trait --> $DIR/bad-self-type.rs:18:21 diff --git a/tests/ui/const-generics/defaults/mismatch.stderr b/tests/ui/const-generics/defaults/mismatch.stderr index 52c54aace5f1..9c4f0bc950b2 100644 --- a/tests/ui/const-generics/defaults/mismatch.stderr +++ b/tests/ui/const-generics/defaults/mismatch.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/mismatch.rs:7:26 | LL | let e: Example<13> = (); - | ----------- ^^ expected struct `Example`, found `()` + | ----------- ^^ expected `Example`, found `()` | | | expected due to this | @@ -13,7 +13,7 @@ error[E0308]: mismatched types --> $DIR/mismatch.rs:10:32 | LL | let e: Example2 = (); - | ----------------- ^^ expected struct `Example2`, found `()` + | ----------------- ^^ expected `Example2`, found `()` | | | expected due to this | @@ -24,7 +24,7 @@ error[E0308]: mismatched types --> $DIR/mismatch.rs:13:32 | LL | let e: Example3<13, u32> = (); - | ----------------- ^^ expected struct `Example3`, found `()` + | ----------------- ^^ expected `Example3`, found `()` | | | expected due to this | @@ -35,7 +35,7 @@ error[E0308]: mismatched types --> $DIR/mismatch.rs:16:26 | LL | let e: Example3<7> = (); - | ----------- ^^ expected struct `Example3`, found `()` + | ----------- ^^ expected `Example3<7>`, found `()` | | | expected due to this | @@ -46,7 +46,7 @@ error[E0308]: mismatched types --> $DIR/mismatch.rs:19:26 | LL | let e: Example4<7> = (); - | ----------- ^^ expected struct `Example4`, found `()` + | ----------- ^^ expected `Example4<7>`, found `()` | | | expected due to this | diff --git a/tests/ui/const-generics/generic_const_exprs/issue-79518-default_trait_method_normalization.stderr b/tests/ui/const-generics/generic_const_exprs/issue-79518-default_trait_method_normalization.stderr index 9baf9790e19b..511ae58a1dcd 100644 --- a/tests/ui/const-generics/generic_const_exprs/issue-79518-default_trait_method_normalization.stderr +++ b/tests/ui/const-generics/generic_const_exprs/issue-79518-default_trait_method_normalization.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-79518-default_trait_method_normalization.rs:16:32 | LL | Self::AssocInstance == [(); std::mem::size_of::()]; - | ------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected associated type, found array `[(); std::mem::size_of::()]` + | ------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected associated type, found `[(); std::mem::size_of::()]` | | | expected because this is `::Assoc` | diff --git a/tests/ui/const-generics/issues/issue-67945-1.full.stderr b/tests/ui/const-generics/issues/issue-67945-1.full.stderr index 8e18fcdffab7..8879aec35e59 100644 --- a/tests/ui/const-generics/issues/issue-67945-1.full.stderr +++ b/tests/ui/const-generics/issues/issue-67945-1.full.stderr @@ -5,7 +5,7 @@ LL | struct Bug { | - this type parameter ... LL | let x: S = MaybeUninit::uninit(); - | - ^^^^^^^^^^^^^^^^^^^^^ expected type parameter `S`, found union `MaybeUninit` + | - ^^^^^^^^^^^^^^^^^^^^^ expected type parameter `S`, found `MaybeUninit<_>` | | | expected due to this | diff --git a/tests/ui/const-generics/type_mismatch.stderr b/tests/ui/const-generics/type_mismatch.stderr index 8d779bee265c..b28ae8f7e710 100644 --- a/tests/ui/const-generics/type_mismatch.stderr +++ b/tests/ui/const-generics/type_mismatch.stderr @@ -8,7 +8,7 @@ error[E0308]: mismatched types --> $DIR/type_mismatch.rs:5:26 | LL | fn bar() -> [u8; N] {} - | --- ^^^^^^^ expected array `[u8; N]`, found `()` + | --- ^^^^^^^ expected `[u8; N]`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression diff --git a/tests/ui/const-generics/type_not_in_scope.stderr b/tests/ui/const-generics/type_not_in_scope.stderr index 16796acb3d28..5f45550a6279 100644 --- a/tests/ui/const-generics/type_not_in_scope.stderr +++ b/tests/ui/const-generics/type_not_in_scope.stderr @@ -14,7 +14,7 @@ error[E0308]: mismatched types --> $DIR/type_not_in_scope.rs:7:33 | LL | fn getn() -> [u8; N] {} - | ---- ^^^^^^^ expected array `[u8; N]`, found `()` + | ---- ^^^^^^^ expected `[u8; N]`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression diff --git a/tests/ui/const-generics/types-mismatch-const-args.full.stderr b/tests/ui/const-generics/types-mismatch-const-args.full.stderr index b6a22df74369..13cd5d17d412 100644 --- a/tests/ui/const-generics/types-mismatch-const-args.full.stderr +++ b/tests/ui/const-generics/types-mismatch-const-args.full.stderr @@ -11,7 +11,7 @@ error[E0308]: mismatched types --> $DIR/types-mismatch-const-args.rs:16:41 | LL | let _: A<'a, u16, {2u32}, {3u32}> = A::<'b, u32, {2u32}, {3u32}> { data: PhantomData }; - | -------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `u16`, found `u32` + | -------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `A<'_, u16, 2, 3>`, found `A<'_, u32, 2, 3>` | | | expected due to this | @@ -22,7 +22,7 @@ error[E0308]: mismatched types --> $DIR/types-mismatch-const-args.rs:18:41 | LL | let _: A<'a, u16, {4u32}, {3u32}> = A::<'b, u32, {2u32}, {3u32}> { data: PhantomData }; - | -------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `u16`, found `u32` + | -------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `A<'_, u16, 4, 3>`, found `A<'_, u32, 2, 3>` | | | expected due to this | diff --git a/tests/ui/const-generics/types-mismatch-const-args.min.stderr b/tests/ui/const-generics/types-mismatch-const-args.min.stderr index 6ac93a08d5d6..cae3adfa128d 100644 --- a/tests/ui/const-generics/types-mismatch-const-args.min.stderr +++ b/tests/ui/const-generics/types-mismatch-const-args.min.stderr @@ -13,7 +13,7 @@ error[E0308]: mismatched types --> $DIR/types-mismatch-const-args.rs:16:41 | LL | let _: A<'a, u16, {2u32}, {3u32}> = A::<'b, u32, {2u32}, {3u32}> { data: PhantomData }; - | -------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `u16`, found `u32` + | -------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `A<'_, u16, 2, 3>`, found `A<'_, u32, 2, 3>` | | | expected due to this | @@ -24,7 +24,7 @@ error[E0308]: mismatched types --> $DIR/types-mismatch-const-args.rs:18:41 | LL | let _: A<'a, u16, {4u32}, {3u32}> = A::<'b, u32, {2u32}, {3u32}> { data: PhantomData }; - | -------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `u16`, found `u32` + | -------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `A<'_, u16, 4, 3>`, found `A<'_, u32, 2, 3>` | | | expected due to this | diff --git a/tests/ui/consts/const-eval/const-eval-span.rs b/tests/ui/consts/const-eval/const-eval-span.rs index 82f101b47cfe..1667c77d124c 100644 --- a/tests/ui/consts/const-eval/const-eval-span.rs +++ b/tests/ui/consts/const-eval/const-eval-span.rs @@ -8,7 +8,7 @@ const CONSTANT: S = S(0); enum E { V = CONSTANT, //~^ ERROR mismatched types - //~| expected `isize`, found struct `S` + //~| expected `isize`, found `S` } fn main() {} diff --git a/tests/ui/consts/const-eval/const-eval-span.stderr b/tests/ui/consts/const-eval/const-eval-span.stderr index c5b001899ff9..fe33ad4905a5 100644 --- a/tests/ui/consts/const-eval/const-eval-span.stderr +++ b/tests/ui/consts/const-eval/const-eval-span.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/const-eval-span.rs:9:9 | LL | V = CONSTANT, - | ^^^^^^^^ expected `isize`, found struct `S` + | ^^^^^^^^ expected `isize`, found `S` error: aborting due to previous error diff --git a/tests/ui/consts/const-tup-index-span.rs b/tests/ui/consts/const-tup-index-span.rs index 778a212249c1..18f4f59d3785 100644 --- a/tests/ui/consts/const-tup-index-span.rs +++ b/tests/ui/consts/const-tup-index-span.rs @@ -2,7 +2,7 @@ const TUP: (usize,) = 5usize << 64; //~^ ERROR mismatched types -//~| expected tuple, found `usize` +//~| expected `(usize,)`, found `usize` const ARR: [i32; TUP.0] = []; //~^ constant diff --git a/tests/ui/consts/const-tup-index-span.stderr b/tests/ui/consts/const-tup-index-span.stderr index ad8468056172..65f0520f8a46 100644 --- a/tests/ui/consts/const-tup-index-span.stderr +++ b/tests/ui/consts/const-tup-index-span.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/const-tup-index-span.rs:3:23 | LL | const TUP: (usize,) = 5usize << 64; - | ^^^^^^^^^^^^ expected tuple, found `usize` + | ^^^^^^^^^^^^ expected `(usize,)`, found `usize` | = note: expected tuple `(usize,)` found type `usize` diff --git a/tests/ui/consts/nested_erroneous_ctfe.stderr b/tests/ui/consts/nested_erroneous_ctfe.stderr index d579a54e9836..b6a1725076bc 100644 --- a/tests/ui/consts/nested_erroneous_ctfe.stderr +++ b/tests/ui/consts/nested_erroneous_ctfe.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/nested_erroneous_ctfe.rs:2:16 | LL | [9; || [9; []]]; - | ^^ expected `usize`, found array of 0 elements + | ^^ expected `usize`, found `[_; 0]` | = note: expected type `usize` found array `[_; 0]` diff --git a/tests/ui/cross/cross-borrow-trait.stderr b/tests/ui/cross/cross-borrow-trait.stderr index 81f309eae087..4f5af106613f 100644 --- a/tests/ui/cross/cross-borrow-trait.stderr +++ b/tests/ui/cross/cross-borrow-trait.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/cross-borrow-trait.rs:10:26 | LL | let _y: &dyn Trait = x; - | ---------- ^ expected `&dyn Trait`, found struct `Box` + | ---------- ^ expected `&dyn Trait`, found `Box` | | | expected due to this | diff --git a/tests/ui/deref-patterns/gate.stderr b/tests/ui/deref-patterns/gate.stderr index 993468b5e826..b5b79ed3771c 100644 --- a/tests/ui/deref-patterns/gate.stderr +++ b/tests/ui/deref-patterns/gate.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match String::new() { | ------------- this expression has type `String` LL | "" | _ => {} - | ^^ expected struct `String`, found `&str` + | ^^ expected `String`, found `&str` error: aborting due to previous error diff --git a/tests/ui/destructure-trait-ref.stderr b/tests/ui/destructure-trait-ref.stderr index 18a889837dfd..38d201888272 100644 --- a/tests/ui/destructure-trait-ref.stderr +++ b/tests/ui/destructure-trait-ref.stderr @@ -22,7 +22,7 @@ error[E0308]: mismatched types LL | let &&x = &1isize as &dyn T; | ^^ ----------------- this expression has type `&dyn T` | | - | expected trait object `dyn T`, found reference + | expected `dyn T`, found `&_` | = note: expected trait object `dyn T` found reference `&_` @@ -38,7 +38,7 @@ error[E0308]: mismatched types LL | let &&&x = &(&1isize as &dyn T); | ^^ -------------------- this expression has type `&&dyn T` | | - | expected trait object `dyn T`, found reference + | expected `dyn T`, found `&_` | = note: expected trait object `dyn T` found reference `&_` @@ -54,7 +54,7 @@ error[E0308]: mismatched types LL | let box box x = Box::new(1isize) as Box; | ^^^^^ ------------------------------ this expression has type `Box` | | - | expected trait object `dyn T`, found struct `Box` + | expected `dyn T`, found `Box<_>` | = note: expected trait object `dyn T` found struct `Box<_>` diff --git a/tests/ui/destructuring-assignment/default-match-bindings-forbidden.stderr b/tests/ui/destructuring-assignment/default-match-bindings-forbidden.stderr index 950e0223e220..b285ee1f3048 100644 --- a/tests/ui/destructuring-assignment/default-match-bindings-forbidden.stderr +++ b/tests/ui/destructuring-assignment/default-match-bindings-forbidden.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | (x, y) = &(1, 2); | ^^^^^^ ------- this expression has type `&({integer}, {integer})` | | - | expected reference, found tuple + | expected `&({integer}, {integer})`, found `(_, _)` | = note: expected reference `&({integer}, {integer})` found tuple `(_, _)` diff --git a/tests/ui/diagnostic-width/long-E0308.stderr b/tests/ui/diagnostic-width/long-E0308.stderr index 1c99898bc832..20b018b9f772 100644 --- a/tests/ui/diagnostic-width/long-E0308.stderr +++ b/tests/ui/diagnostic-width/long-E0308.stderr @@ -16,7 +16,7 @@ LL | | Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok... LL | | Ok("") LL | | )))))))))))))))))))))))))))))) LL | | )))))))))))))))))))))))))))))); - | |__________________________________^ expected struct `Atype`, found enum `Result` + | |__________________________________^ expected `Atype, ...>`, found `Result, ...>` | = note: expected struct `Atype, ...>` the full type name has been written to '$TEST_BUILD_DIR/diagnostic-width/long-E0308/long-E0308.long-type-hash.txt' @@ -32,7 +32,7 @@ LL | | Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(... LL | | Ok(Ok(Ok(Ok(Ok(Ok(Ok(""))))))) LL | | )))))))))))))))))))))))))))))) LL | | )))))))))))))))))))))))); - | |____________________________^ expected enum `Option`, found enum `Result` + | |____________________________^ expected `Option>`, found `Result, ...>` | = note: expected enum `Option>` the full type name has been written to '$TEST_BUILD_DIR/diagnostic-width/long-E0308/long-E0308.long-type-hash.txt' @@ -50,7 +50,7 @@ LL | | Atype< ... | LL | | i32 LL | | > = (); - | | - ^^ expected struct `Atype`, found `()` + | | - ^^ expected `Atype, ...>`, found `()` | |_____| | expected due to this | @@ -69,7 +69,7 @@ LL | | Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(Ok(... LL | | Ok(Ok(Ok(Ok(Ok(Ok(Ok(""))))))) LL | | )))))))))))))))))))))))))))))) LL | | )))))))))))))))))))))))); - | |____________________________^ expected `()`, found enum `Result` + | |____________________________^ expected `()`, found `Result, ...>` | = note: expected unit type `()` found enum `Result, ...>` diff --git a/tests/ui/did_you_mean/brackets-to-braces-single-element.stderr b/tests/ui/did_you_mean/brackets-to-braces-single-element.stderr index 6ded03e45b55..a7ec192592e0 100644 --- a/tests/ui/did_you_mean/brackets-to-braces-single-element.stderr +++ b/tests/ui/did_you_mean/brackets-to-braces-single-element.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/brackets-to-braces-single-element.rs:1:24 | LL | const A: [&str; 1] = { "hello" }; - | ^^^^^^^ expected array `[&'static str; 1]`, found `&str` + | ^^^^^^^ expected `[&str; 1]`, found `&str` | help: to create an array, use square brackets instead of curly braces | @@ -13,7 +13,7 @@ error[E0308]: mismatched types --> $DIR/brackets-to-braces-single-element.rs:4:19 | LL | const B: &[u32] = &{ 1 }; - | ^^^^^^ expected slice `[u32]`, found integer + | ^^^^^^ expected `&[u32]`, found `&{integer}` | = note: expected reference `&'static [u32]` found reference `&{integer}` @@ -26,7 +26,7 @@ error[E0308]: mismatched types --> $DIR/brackets-to-braces-single-element.rs:7:27 | LL | const C: &&[u32; 1] = &&{ 1 }; - | ^ expected array `[u32; 1]`, found integer + | ^ expected `[u32; 1]`, found integer | help: to create an array, use square brackets instead of curly braces | diff --git a/tests/ui/did_you_mean/compatible-variants-in-pat.stderr b/tests/ui/did_you_mean/compatible-variants-in-pat.stderr index 473468af6eef..5e48871bb01b 100644 --- a/tests/ui/did_you_mean/compatible-variants-in-pat.stderr +++ b/tests/ui/did_you_mean/compatible-variants-in-pat.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match f { | - this expression has type `Foo` LL | Bar { x } => { - | ^^^^^^^^^ expected enum `Foo`, found struct `Bar` + | ^^^^^^^^^ expected `Foo`, found `Bar` | help: try wrapping the pattern in `Foo::Bar` | @@ -22,7 +22,7 @@ LL | match s { LL | S => { | ^ | | - | expected enum `Option`, found struct `S` + | expected `Option`, found `S` | `S` is interpreted as a unit struct, not a new binding | = note: expected enum `Option` @@ -47,7 +47,7 @@ LL | match s { LL | S => { | ^ | | - | expected enum `Result`, found struct `S` + | expected `Result`, found `S` | `S` is interpreted as a unit struct, not a new binding | = note: expected enum `Result` diff --git a/tests/ui/did_you_mean/compatible-variants.stderr b/tests/ui/did_you_mean/compatible-variants.stderr index fe81da19833a..7b88d93ead11 100644 --- a/tests/ui/did_you_mean/compatible-variants.stderr +++ b/tests/ui/did_you_mean/compatible-variants.stderr @@ -7,7 +7,7 @@ LL | / while false { LL | | LL | | f(); LL | | } - | |_____^ expected enum `Option`, found `()` + | |_____^ expected `Option<()>`, found `()` | = note: expected enum `Option<()>` found unit type `()` @@ -26,7 +26,7 @@ error[E0308]: mismatched types LL | fn b() -> Result<(), ()> { | -------------- expected `Result<(), ()>` because of return type LL | f() - | ^^^ expected enum `Result`, found `()` + | ^^^ expected `Result<(), ()>`, found `()` | = note: expected enum `Result<(), ()>` found unit type `()` @@ -45,7 +45,7 @@ LL | / for _ in [1, 2] { LL | | LL | | f(); LL | | } - | |_____^ expected enum `Option`, found `()` + | |_____^ expected `Option<()>`, found `()` | = note: expected enum `Option<()>` found unit type `()` @@ -62,7 +62,7 @@ error[E0308]: `?` operator has incompatible types --> $DIR/compatible-variants.rs:35:5 | LL | c()? - | ^^^^ expected enum `Option`, found `()` + | ^^^^ expected `Option<()>`, found `()` | = note: `?` operator cannot convert from `()` to `Option<()>` = note: expected enum `Option<()>` @@ -85,7 +85,7 @@ error[E0308]: mismatched types --> $DIR/compatible-variants.rs:42:25 | LL | let _: Option<()> = while false {}; - | ---------- ^^^^^^^^^^^^^^ expected enum `Option`, found `()` + | ---------- ^^^^^^^^^^^^^^ expected `Option<()>`, found `()` | | | expected due to this | @@ -100,7 +100,7 @@ error[E0308]: mismatched types --> $DIR/compatible-variants.rs:46:9 | LL | while false {} - | ^^^^^^^^^^^^^^ expected enum `Option`, found `()` + | ^^^^^^^^^^^^^^ expected `Option<()>`, found `()` | = note: expected enum `Option<()>` found unit type `()` @@ -117,7 +117,7 @@ error[E0308]: mismatched types --> $DIR/compatible-variants.rs:50:31 | LL | let _: Result = 1; - | ---------------- ^ expected enum `Result`, found integer + | ---------------- ^ expected `Result`, found integer | | | expected due to this | @@ -134,7 +134,7 @@ error[E0308]: mismatched types --> $DIR/compatible-variants.rs:53:26 | LL | let _: Option = 1; - | ----------- ^ expected enum `Option`, found integer + | ----------- ^ expected `Option`, found integer | | | expected due to this | @@ -149,7 +149,7 @@ error[E0308]: mismatched types --> $DIR/compatible-variants.rs:56:28 | LL | let _: Hey = 1; - | ------------- ^ expected enum `Hey`, found integer + | ------------- ^ expected `Hey`, found integer | | | expected due to this | @@ -166,7 +166,7 @@ error[E0308]: mismatched types --> $DIR/compatible-variants.rs:59:29 | LL | let _: Hey = false; - | -------------- ^^^^^ expected enum `Hey`, found `bool` + | -------------- ^^^^^ expected `Hey`, found `bool` | | | expected due to this | @@ -181,7 +181,7 @@ error[E0308]: mismatched types --> $DIR/compatible-variants.rs:63:19 | LL | let _ = Foo { bar }; - | ^^^ expected enum `Option`, found `i32` + | ^^^ expected `Option`, found `i32` | = note: expected enum `Option` found type `i32` @@ -194,7 +194,7 @@ error[E0308]: mismatched types --> $DIR/compatible-variants.rs:80:16 | LL | let a: A = B::Fst; - | - ^^^^^^ expected enum `A`, found enum `B` + | - ^^^^^^ expected `A`, found `B` | | | expected due to this | @@ -207,7 +207,7 @@ error[E0308]: mismatched types --> $DIR/compatible-variants.rs:86:17 | LL | let a: A2 = B::Fst; - | -- ^^^^^^ expected struct `A2`, found enum `B` + | -- ^^^^^^ expected `A2`, found `B` | | | expected due to this | diff --git a/tests/ui/did_you_mean/issue-42764.stderr b/tests/ui/did_you_mean/issue-42764.stderr index 6a7fd8fe251d..3819a5a187f9 100644 --- a/tests/ui/did_you_mean/issue-42764.stderr +++ b/tests/ui/did_you_mean/issue-42764.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-42764.rs:11:43 | LL | this_function_expects_a_double_option(n); - | ------------------------------------- ^ expected enum `DoubleOption`, found `usize` + | ------------------------------------- ^ expected `DoubleOption<_>`, found `usize` | | | arguments to this function are incorrect | @@ -24,7 +24,7 @@ error[E0308]: mismatched types --> $DIR/issue-42764.rs:27:33 | LL | let _c = Context { wrapper: Payload{} }; - | ^^^^^^^^^ expected struct `Wrapper`, found struct `Payload` + | ^^^^^^^^^ expected `Wrapper`, found `Payload` | help: try wrapping the expression in `Wrapper` | diff --git a/tests/ui/did_you_mean/recursion_limit_deref.stderr b/tests/ui/did_you_mean/recursion_limit_deref.stderr index a6b5681a68cb..32fb628c4707 100644 --- a/tests/ui/did_you_mean/recursion_limit_deref.stderr +++ b/tests/ui/did_you_mean/recursion_limit_deref.stderr @@ -10,7 +10,7 @@ error[E0308]: mismatched types --> $DIR/recursion_limit_deref.rs:51:22 | LL | let x: &Bottom = &t; - | ------- ^^ expected struct `Bottom`, found struct `Top` + | ------- ^^ expected `&Bottom`, found `&Top` | | | expected due to this | diff --git a/tests/ui/disambiguate-identical-names.stderr b/tests/ui/disambiguate-identical-names.stderr index 87560c4c7973..7d8293018d27 100644 --- a/tests/ui/disambiguate-identical-names.stderr +++ b/tests/ui/disambiguate-identical-names.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/disambiguate-identical-names.rs:13:10 | LL | test(&v); - | ---- ^^ expected struct `Vec`, found struct `HashMap` + | ---- ^^ expected `&Vec>`, found `&HashMap` | | | arguments to this function are incorrect | diff --git a/tests/ui/diverging-fn-tail-35849.stderr b/tests/ui/diverging-fn-tail-35849.stderr index 21361489a2c3..f5b5a4cccad2 100644 --- a/tests/ui/diverging-fn-tail-35849.stderr +++ b/tests/ui/diverging-fn-tail-35849.stderr @@ -5,7 +5,7 @@ LL | fn assert_sizeof() -> ! { | - expected `!` because of return type LL | unsafe { LL | ::std::mem::transmute::(panic!()) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `!`, found array `[u8; 8]` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `!`, found `[u8; 8]` | = note: expected type `!` found array `[u8; 8]` diff --git a/tests/ui/dst/dst-bad-assign-3.rs b/tests/ui/dst/dst-bad-assign-3.rs index d05b3937c998..d199864d99c2 100644 --- a/tests/ui/dst/dst-bad-assign-3.rs +++ b/tests/ui/dst/dst-bad-assign-3.rs @@ -32,7 +32,7 @@ pub fn main() { let z: Box = Box::new(Bar1 {f: 36}); f5.2 = Bar1 {f: 36}; //~^ ERROR mismatched types - //~| expected trait object `dyn ToBar`, found struct `Bar1` + //~| expected `dyn ToBar`, found `Bar1` //~| expected trait object `dyn ToBar` //~| found struct `Bar1` //~| ERROR the size for values of type diff --git a/tests/ui/dst/dst-bad-assign-3.stderr b/tests/ui/dst/dst-bad-assign-3.stderr index b326dbbbc140..6dd3434fd21b 100644 --- a/tests/ui/dst/dst-bad-assign-3.stderr +++ b/tests/ui/dst/dst-bad-assign-3.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/dst-bad-assign-3.rs:33:12 | LL | f5.2 = Bar1 {f: 36}; - | ---- ^^^^^^^^^^^^ expected trait object `dyn ToBar`, found struct `Bar1` + | ---- ^^^^^^^^^^^^ expected `dyn ToBar`, found `Bar1` | | | expected due to the type of this binding | diff --git a/tests/ui/dst/dst-bad-assign.rs b/tests/ui/dst/dst-bad-assign.rs index 496e01ae0053..c55fb2c3e570 100644 --- a/tests/ui/dst/dst-bad-assign.rs +++ b/tests/ui/dst/dst-bad-assign.rs @@ -34,7 +34,7 @@ pub fn main() { let z: Box = Box::new(Bar1 {f: 36}); f5.ptr = Bar1 {f: 36}; //~^ ERROR mismatched types - //~| expected trait object `dyn ToBar`, found struct `Bar1` + //~| expected `dyn ToBar`, found `Bar1` //~| expected trait object `dyn ToBar` //~| found struct `Bar1` //~| ERROR the size for values of type diff --git a/tests/ui/dst/dst-bad-assign.stderr b/tests/ui/dst/dst-bad-assign.stderr index 614f21387512..d8d1057876f4 100644 --- a/tests/ui/dst/dst-bad-assign.stderr +++ b/tests/ui/dst/dst-bad-assign.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/dst-bad-assign.rs:35:14 | LL | f5.ptr = Bar1 {f: 36}; - | ------ ^^^^^^^^^^^^ expected trait object `dyn ToBar`, found struct `Bar1` + | ------ ^^^^^^^^^^^^ expected `dyn ToBar`, found `Bar1` | | | expected due to the type of this binding | diff --git a/tests/ui/dst/dst-bad-coerce1.stderr b/tests/ui/dst/dst-bad-coerce1.stderr index 594acff853a0..ff77bd4cef88 100644 --- a/tests/ui/dst/dst-bad-coerce1.stderr +++ b/tests/ui/dst/dst-bad-coerce1.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/dst-bad-coerce1.rs:16:29 | LL | let f3: &Fat<[usize]> = f2; - | ------------- ^^ expected slice `[usize]`, found array `[isize; 3]` + | ------------- ^^ expected `&Fat<[usize]>`, found `&Fat<[isize; 3]>` | | | expected due to this | @@ -21,7 +21,7 @@ error[E0308]: mismatched types --> $DIR/dst-bad-coerce1.rs:28:27 | LL | let f3: &([usize],) = f2; - | ----------- ^^ expected slice `[usize]`, found array `[isize; 3]` + | ----------- ^^ expected `&([usize],)`, found `&([isize; 3],)` | | | expected due to this | diff --git a/tests/ui/dst/dst-bad-coerce4.rs b/tests/ui/dst/dst-bad-coerce4.rs index f63da60d281d..9f297915e58c 100644 --- a/tests/ui/dst/dst-bad-coerce4.rs +++ b/tests/ui/dst/dst-bad-coerce4.rs @@ -11,7 +11,7 @@ pub fn main() { let f1: &Fat<[isize]> = &Fat { ptr: [1, 2, 3] }; let f2: &Fat<[isize; 3]> = f1; //~^ ERROR mismatched types - //~| expected array `[isize; 3]`, found slice `[isize]` + //~| expected `&Fat<[isize; 3]>`, found `&Fat<[isize]>` //~| expected reference `&Fat<[isize; 3]>` //~| found reference `&Fat<[isize]>` @@ -19,7 +19,7 @@ pub fn main() { let f1: &([isize],) = &([1, 2, 3],); let f2: &([isize; 3],) = f1; //~^ ERROR mismatched types - //~| expected array `[isize; 3]`, found slice `[isize]` + //~| expected `&([isize; 3],)`, found `&([isize],)` //~| expected reference `&([isize; 3],)` //~| found reference `&([isize],)` } diff --git a/tests/ui/dst/dst-bad-coerce4.stderr b/tests/ui/dst/dst-bad-coerce4.stderr index 4c9954f35208..46e7dba817c8 100644 --- a/tests/ui/dst/dst-bad-coerce4.stderr +++ b/tests/ui/dst/dst-bad-coerce4.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/dst-bad-coerce4.rs:12:32 | LL | let f2: &Fat<[isize; 3]> = f1; - | ---------------- ^^ expected array `[isize; 3]`, found slice `[isize]` + | ---------------- ^^ expected `&Fat<[isize; 3]>`, found `&Fat<[isize]>` | | | expected due to this | @@ -13,7 +13,7 @@ error[E0308]: mismatched types --> $DIR/dst-bad-coerce4.rs:20:30 | LL | let f2: &([isize; 3],) = f1; - | -------------- ^^ expected array `[isize; 3]`, found slice `[isize]` + | -------------- ^^ expected `&([isize; 3],)`, found `&([isize],)` | | | expected due to this | diff --git a/tests/ui/dyn-star/no-implicit-dyn-star.stderr b/tests/ui/dyn-star/no-implicit-dyn-star.stderr index a3f4d21ca94b..66e1b9a092c3 100644 --- a/tests/ui/dyn-star/no-implicit-dyn-star.stderr +++ b/tests/ui/dyn-star/no-implicit-dyn-star.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/no-implicit-dyn-star.rs:6:48 | LL | dyn_star_foreign::require_dyn_star_display(1usize); - | ------------------------------------------ ^^^^^^ expected trait object `dyn Display`, found `usize` + | ------------------------------------------ ^^^^^^ expected `dyn Display`, found `usize` | | | arguments to this function are incorrect | diff --git a/tests/ui/empty/issue-37026.stderr b/tests/ui/empty/issue-37026.stderr index 48a4a5bcad2b..75c3ab13cacc 100644 --- a/tests/ui/empty/issue-37026.stderr +++ b/tests/ui/empty/issue-37026.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let empty_struct::XEmpty2 = (); | ^^^^^^^^^^^^^^^^^^^^^ -- this expression has type `()` | | - | expected `()`, found struct `XEmpty2` + | expected `()`, found `XEmpty2` error[E0308]: mismatched types --> $DIR/issue-37026.rs:7:9 @@ -12,7 +12,7 @@ error[E0308]: mismatched types LL | let empty_struct::XEmpty6(..) = (); | ^^^^^^^^^^^^^^^^^^^^^^^^^ -- this expression has type `()` | | - | expected `()`, found struct `XEmpty6` + | expected `()`, found `XEmpty6` error: aborting due to 2 previous errors diff --git a/tests/ui/error-codes/E0071.rs b/tests/ui/error-codes/E0071.rs index bd8469de75da..678502ba3288 100644 --- a/tests/ui/error-codes/E0071.rs +++ b/tests/ui/error-codes/E0071.rs @@ -3,5 +3,5 @@ type FooAlias = Foo; fn main() { let u = FooAlias { value: 0 }; - //~^ ERROR expected struct, variant or union type, found enum `Foo` [E0071] + //~^ ERROR expected struct, variant or union type, found `Foo` [E0071] } diff --git a/tests/ui/error-codes/E0071.stderr b/tests/ui/error-codes/E0071.stderr index ae312fc400af..7bd4ddaf26be 100644 --- a/tests/ui/error-codes/E0071.stderr +++ b/tests/ui/error-codes/E0071.stderr @@ -1,4 +1,4 @@ -error[E0071]: expected struct, variant or union type, found enum `Foo` +error[E0071]: expected struct, variant or union type, found `Foo` --> $DIR/E0071.rs:5:13 | LL | let u = FooAlias { value: 0 }; diff --git a/tests/ui/extern/extern-types-distinct-types.stderr b/tests/ui/extern/extern-types-distinct-types.stderr index ca25aa64eb8b..3e6dc5cefadf 100644 --- a/tests/ui/extern/extern-types-distinct-types.stderr +++ b/tests/ui/extern/extern-types-distinct-types.stderr @@ -9,7 +9,7 @@ LL | type B; LL | fn foo(r: &A) -> &B { | -- expected `&B` because of return type LL | r - | ^ expected extern type `B`, found extern type `A` + | ^ expected `&B`, found `&A` | = note: expected reference `&B` found reference `&A` diff --git a/tests/ui/fmt/ifmt-bad-arg.stderr b/tests/ui/fmt/ifmt-bad-arg.stderr index c2619d6df58b..d716bbe51aff 100644 --- a/tests/ui/fmt/ifmt-bad-arg.stderr +++ b/tests/ui/fmt/ifmt-bad-arg.stderr @@ -302,7 +302,7 @@ error[E0308]: mismatched types LL | println!("{} {:.*} {}", 1, 3.2, 4); | ^^^ | | - | expected `usize`, found floating-point number + | expected `&usize`, found `&{float}` | arguments to this function are incorrect | = note: expected reference `&usize` @@ -317,7 +317,7 @@ error[E0308]: mismatched types LL | println!("{} {:07$.*} {}", 1, 3.2, 4); | ^^^ | | - | expected `usize`, found floating-point number + | expected `&usize`, found `&{float}` | arguments to this function are incorrect | = note: expected reference `&usize` diff --git a/tests/ui/fn/fn-item-type.rs b/tests/ui/fn/fn-item-type.rs index b6ebc867d284..c094a34b207d 100644 --- a/tests/ui/fn/fn-item-type.rs +++ b/tests/ui/fn/fn-item-type.rs @@ -34,8 +34,7 @@ fn main() { eq(bar::, bar::>); //~^ ERROR mismatched types //~| found fn item `fn(_) -> _ {bar::>}` - //~| expected struct `String`, found struct `Vec` - //~| different fn items have unique types, even if their signatures are the same + //~| expected `String`, found `Vec` // Make sure we distinguish between trait methods correctly. eq(::foo, ::foo); diff --git a/tests/ui/fn/fn-item-type.stderr b/tests/ui/fn/fn-item-type.stderr index 9d41243ef119..da90b8b81c85 100644 --- a/tests/ui/fn/fn-item-type.stderr +++ b/tests/ui/fn/fn-item-type.stderr @@ -38,7 +38,7 @@ error[E0308]: mismatched types --> $DIR/fn-item-type.rs:34:23 | LL | eq(bar::, bar::>); - | -- ^^^^^^^^^^^^^^ expected struct `String`, found struct `Vec` + | -- ^^^^^^^^^^^^^^ expected `String`, found `Vec` | | | arguments to this function are incorrect | @@ -53,7 +53,7 @@ LL | fn eq(x: T, y: T) {} = help: consider casting both fn items to fn pointers using `as fn(isize) -> isize` error[E0308]: mismatched types - --> $DIR/fn-item-type.rs:41:26 + --> $DIR/fn-item-type.rs:40:26 | LL | eq(::foo, ::foo); | -- ^^^^^^^^^^^^^^^^^ expected `u8`, found `u16` @@ -71,7 +71,7 @@ LL | fn eq(x: T, y: T) {} = help: consider casting both fn items to fn pointers using `as fn()` error[E0308]: mismatched types - --> $DIR/fn-item-type.rs:46:19 + --> $DIR/fn-item-type.rs:45:19 | LL | eq(foo::, bar:: as fn(isize) -> isize); | -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected fn item, found fn pointer diff --git a/tests/ui/fn/fn-pointer-mismatch.stderr b/tests/ui/fn/fn-pointer-mismatch.stderr index e0bd60fbc0b5..74f79f6df5ab 100644 --- a/tests/ui/fn/fn-pointer-mismatch.stderr +++ b/tests/ui/fn/fn-pointer-mismatch.stderr @@ -2,7 +2,7 @@ error[E0308]: `if` and `else` have incompatible types --> $DIR/fn-pointer-mismatch.rs:11:43 | LL | let g = if n % 2 == 0 { &foo } else { &bar }; - | ---- ^^^^ expected fn item, found a different fn item + | ---- ^^^^ expected `&fn(u32) -> u32 {foo}`, found `&fn(u32) -> u32 {bar}` | | | expected because of this | @@ -45,7 +45,7 @@ error[E0308]: mismatched types LL | let c: fn(u32) -> u32 = &foo; | -------------- ^^^^ | | | - | | expected fn pointer, found reference + | | expected fn pointer, found `&fn(u32) -> u32 {foo}` | | help: consider removing the reference: `foo` | expected due to this | @@ -71,7 +71,7 @@ error[E0308]: mismatched types LL | let e: &fn(u32) -> u32 = &foo; | --------------- ^^^^ | | | - | | expected fn pointer, found fn item + | | expected `&fn(u32) -> u32`, found `&fn(u32) -> u32 {foo}` | | help: consider casting to a fn pointer: `&(foo as fn(u32) -> u32)` | expected due to this | diff --git a/tests/ui/fn/fn-trait-formatting.stderr b/tests/ui/fn/fn-trait-formatting.stderr index 2a674d3c1d23..45d543bda532 100644 --- a/tests/ui/fn/fn-trait-formatting.stderr +++ b/tests/ui/fn/fn-trait-formatting.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/fn-trait-formatting.rs:6:17 | LL | let _: () = Box::new(|_: isize| {}) as Box; - | -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found struct `Box` + | -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found `Box` | | | expected due to this | @@ -17,7 +17,7 @@ error[E0308]: mismatched types --> $DIR/fn-trait-formatting.rs:10:17 | LL | let _: () = Box::new(|_: isize, isize| {}) as Box; - | -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found struct `Box` + | -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found `Box` | | | expected due to this | @@ -32,7 +32,7 @@ error[E0308]: mismatched types --> $DIR/fn-trait-formatting.rs:14:17 | LL | let _: () = Box::new(|| -> isize { unimplemented!() }) as Box isize>; - | -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found struct `Box` + | -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found `Box isize>` | | | expected due to this | diff --git a/tests/ui/fn/signature-error-reporting-under-verbose.rs b/tests/ui/fn/signature-error-reporting-under-verbose.rs index d7a8c95e8b2a..d00cbd8a0f24 100644 --- a/tests/ui/fn/signature-error-reporting-under-verbose.rs +++ b/tests/ui/fn/signature-error-reporting-under-verbose.rs @@ -9,7 +9,7 @@ fn needs_ptr(_: fn(i32, u32)) {} fn main() { needs_ptr(foo); //~^ ERROR mismatched types - //~| NOTE expected `u32`, found `i32` + //~| NOTE expected fn pointer, found fn item //~| NOTE expected fn pointer `fn(i32, u32)` //~| NOTE arguments to this function are incorrect } diff --git a/tests/ui/fn/signature-error-reporting-under-verbose.stderr b/tests/ui/fn/signature-error-reporting-under-verbose.stderr index 6260fc8dcec5..067ee824d5d8 100644 --- a/tests/ui/fn/signature-error-reporting-under-verbose.stderr +++ b/tests/ui/fn/signature-error-reporting-under-verbose.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/signature-error-reporting-under-verbose.rs:10:15 | LL | needs_ptr(foo); - | --------- ^^^ expected `u32`, found `i32` + | --------- ^^^ expected fn pointer, found fn item | | | arguments to this function are incorrect | diff --git a/tests/ui/fully-qualified-type/fully-qualified-type-name1.rs b/tests/ui/fully-qualified-type/fully-qualified-type-name1.rs index 229c174daa86..bbca22ad2e69 100644 --- a/tests/ui/fully-qualified-type/fully-qualified-type-name1.rs +++ b/tests/ui/fully-qualified-type/fully-qualified-type-name1.rs @@ -6,5 +6,5 @@ fn main() { x = 5; //~^ ERROR mismatched types //~| NOTE expected enum `Option` - //~| NOTE expected enum `Option`, found integer + //~| NOTE expected `Option`, found integer } diff --git a/tests/ui/fully-qualified-type/fully-qualified-type-name1.stderr b/tests/ui/fully-qualified-type/fully-qualified-type-name1.stderr index 4750c5ccdf70..258a8d163936 100644 --- a/tests/ui/fully-qualified-type/fully-qualified-type-name1.stderr +++ b/tests/ui/fully-qualified-type/fully-qualified-type-name1.stderr @@ -6,7 +6,7 @@ LL | let x: LL | Option; | ------------- expected due to this type LL | x = 5; - | ^ expected enum `Option`, found integer + | ^ expected `Option`, found integer | = note: expected enum `Option` found type `{integer}` diff --git a/tests/ui/fully-qualified-type/fully-qualified-type-name2.rs b/tests/ui/fully-qualified-type/fully-qualified-type-name2.rs index 94a9f4e5692a..f26d3be66303 100644 --- a/tests/ui/fully-qualified-type/fully-qualified-type-name2.rs +++ b/tests/ui/fully-qualified-type/fully-qualified-type-name2.rs @@ -11,7 +11,7 @@ mod y { fn bar(x: x::Foo) -> y::Foo { return x; //~^ ERROR mismatched types - //~| expected enum `y::Foo`, found enum `x::Foo` + //~| expected `y::Foo`, found `x::Foo` } fn main() { diff --git a/tests/ui/fully-qualified-type/fully-qualified-type-name2.stderr b/tests/ui/fully-qualified-type/fully-qualified-type-name2.stderr index a8f23f81dea0..c7c0846595d5 100644 --- a/tests/ui/fully-qualified-type/fully-qualified-type-name2.stderr +++ b/tests/ui/fully-qualified-type/fully-qualified-type-name2.stderr @@ -4,15 +4,15 @@ error[E0308]: mismatched types LL | fn bar(x: x::Foo) -> y::Foo { | ------ expected `y::Foo` because of return type LL | return x; - | ^ expected enum `y::Foo`, found enum `x::Foo` + | ^ expected `y::Foo`, found `x::Foo` | - = note: enum `x::Foo` and enum `y::Foo` have similar names, but are actually distinct types -note: enum `x::Foo` is defined in module `crate::x` of the current crate + = note: `x::Foo` and `y::Foo` have similar names, but are actually distinct types +note: `x::Foo` is defined in module `crate::x` of the current crate --> $DIR/fully-qualified-type-name2.rs:4:5 | LL | pub enum Foo { } | ^^^^^^^^^^^^ -note: enum `y::Foo` is defined in module `crate::y` of the current crate +note: `y::Foo` is defined in module `crate::y` of the current crate --> $DIR/fully-qualified-type-name2.rs:8:5 | LL | pub enum Foo { } diff --git a/tests/ui/fully-qualified-type/fully-qualified-type-name4.rs b/tests/ui/fully-qualified-type/fully-qualified-type-name4.rs index 2486ae009c1e..41f07bab8096 100644 --- a/tests/ui/fully-qualified-type/fully-qualified-type-name4.rs +++ b/tests/ui/fully-qualified-type/fully-qualified-type-name4.rs @@ -7,7 +7,7 @@ fn bar(x: usize) -> Option { //~^ ERROR mismatched types //~| expected enum `Option` //~| found type `usize` - //~| expected enum `Option`, found `usize` + //~| expected `Option`, found `usize` } fn main() { diff --git a/tests/ui/fully-qualified-type/fully-qualified-type-name4.stderr b/tests/ui/fully-qualified-type/fully-qualified-type-name4.stderr index 778b13f24cf5..6b312202bfed 100644 --- a/tests/ui/fully-qualified-type/fully-qualified-type-name4.stderr +++ b/tests/ui/fully-qualified-type/fully-qualified-type-name4.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn bar(x: usize) -> Option { | ------------- expected `Option` because of return type LL | return x; - | ^ expected enum `Option`, found `usize` + | ^ expected `Option`, found `usize` | = note: expected enum `Option` found type `usize` diff --git a/tests/ui/generator/type-mismatch-signature-deduction.stderr b/tests/ui/generator/type-mismatch-signature-deduction.stderr index b98da1ed8be6..ef6d896f8afa 100644 --- a/tests/ui/generator/type-mismatch-signature-deduction.stderr +++ b/tests/ui/generator/type-mismatch-signature-deduction.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch-signature-deduction.rs:14:9 | LL | 5 - | ^ expected enum `Result`, found integer + | ^ expected `Result<{integer}, _>`, found integer | = note: expected enum `Result<{integer}, _>` found type `{integer}` @@ -22,7 +22,7 @@ error[E0271]: type mismatch resolving `<[generator@$DIR/type-mismatch-signature- --> $DIR/type-mismatch-signature-deduction.rs:5:13 | LL | fn foo() -> impl Generator { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `Result`, found `i32` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Result<{integer}, _>`, found `i32` | = note: expected enum `Result<{integer}, _>` found type `i32` diff --git a/tests/ui/generic-associated-types/constraint-assoc-type-suggestion.stderr b/tests/ui/generic-associated-types/constraint-assoc-type-suggestion.stderr index 96c4330fec02..3b65b32f45d9 100644 --- a/tests/ui/generic-associated-types/constraint-assoc-type-suggestion.stderr +++ b/tests/ui/generic-associated-types/constraint-assoc-type-suggestion.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/constraint-assoc-type-suggestion.rs:10:23 | LL | let b: Vec = a; - | -------- ^ expected struct `Vec`, found associated type + | -------- ^ expected `Vec`, found associated type | | | expected due to this | diff --git a/tests/ui/generics/generic-type-params-name-repr.rs b/tests/ui/generics/generic-type-params-name-repr.rs index 6e0beec66340..d60856b8904b 100644 --- a/tests/ui/generics/generic-type-params-name-repr.rs +++ b/tests/ui/generics/generic-type-params-name-repr.rs @@ -12,40 +12,40 @@ fn main() { // Ensure that the printed type doesn't include the default type params... let _: Foo = (); //~^ ERROR mismatched types - //~| expected struct `Foo`, found `()` + //~| expected `Foo`, found `()` //~| expected struct `Foo` //~| found unit type `()` // ...even when they're present, but the same types as the defaults. let _: Foo = (); //~^ ERROR mismatched types - //~| expected struct `Foo`, found `()` + //~| expected `Foo`, found `()` //~| expected struct `Foo` //~| found unit type `()` // Including cases where the default is using previous type params. let _: HashMap = (); //~^ ERROR mismatched types - //~| expected struct `HashMap`, found `()` + //~| expected `HashMap`, found `()` //~| expected struct `HashMap` //~| found unit type `()` let _: HashMap> = (); //~^ ERROR mismatched types - //~| expected struct `HashMap`, found `()` + //~| expected `HashMap`, found `()` //~| expected struct `HashMap` //~| found unit type `()` // But not when there's a different type in between. let _: Foo = (); //~^ ERROR mismatched types - //~| expected struct `Foo`, found `()` + //~| expected `Foo`, found `()` //~| expected struct `Foo` //~| found unit type `()` // And don't print <> at all when there's just defaults. let _: Foo = (); //~^ ERROR mismatched types - //~| expected struct `Foo`, found `()` + //~| expected `Foo`, found `()` //~| expected struct `Foo` //~| found unit type `()` } diff --git a/tests/ui/generics/generic-type-params-name-repr.stderr b/tests/ui/generics/generic-type-params-name-repr.stderr index 4c3c003965c1..946f14cc1c63 100644 --- a/tests/ui/generics/generic-type-params-name-repr.stderr +++ b/tests/ui/generics/generic-type-params-name-repr.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/generic-type-params-name-repr.rs:13:25 | LL | let _: Foo = (); - | ---------- ^^ expected struct `Foo`, found `()` + | ---------- ^^ expected `Foo`, found `()` | | | expected due to this | @@ -13,7 +13,7 @@ error[E0308]: mismatched types --> $DIR/generic-type-params-name-repr.rs:20:31 | LL | let _: Foo = (); - | ---------------- ^^ expected struct `Foo`, found `()` + | ---------------- ^^ expected `Foo`, found `()` | | | expected due to this | @@ -24,7 +24,7 @@ error[E0308]: mismatched types --> $DIR/generic-type-params-name-repr.rs:27:37 | LL | let _: HashMap = (); - | ---------------------- ^^ expected struct `HashMap`, found `()` + | ---------------------- ^^ expected `HashMap`, found `()` | | | expected due to this | @@ -35,7 +35,7 @@ error[E0308]: mismatched types --> $DIR/generic-type-params-name-repr.rs:32:51 | LL | let _: HashMap> = (); - | ------------------------------------ ^^ expected struct `HashMap`, found `()` + | ------------------------------------ ^^ expected `HashMap`, found `()` | | | expected due to this | @@ -46,7 +46,7 @@ error[E0308]: mismatched types --> $DIR/generic-type-params-name-repr.rs:39:31 | LL | let _: Foo = (); - | ---------------- ^^ expected struct `Foo`, found `()` + | ---------------- ^^ expected `Foo`, found `()` | | | expected due to this | @@ -57,7 +57,7 @@ error[E0308]: mismatched types --> $DIR/generic-type-params-name-repr.rs:46:27 | LL | let _: Foo = (); - | ------------ ^^ expected struct `Foo`, found `()` + | ------------ ^^ expected `Foo`, found `()` | | | expected due to this | diff --git a/tests/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision.stderr b/tests/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision.stderr index 095a1c6af37b..6ce56ba4b7ce 100644 --- a/tests/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision.stderr +++ b/tests/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match [5..4, 99..105, 43..44] { | ----------------------- this expression has type `[std::ops::Range<{integer}>; 3]` LL | [_, 99.., _] => {}, - | ^^ expected struct `Range`, found integer + | ^^ expected `Range<{integer}>`, found integer | = note: expected struct `std::ops::Range<{integer}>` found type `{integer}` diff --git a/tests/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision2.stderr b/tests/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision2.stderr index 2ea3205dcd4a..6f56ecd4c1c9 100644 --- a/tests/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision2.stderr +++ b/tests/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision2.stderr @@ -10,7 +10,7 @@ error[E0308]: mismatched types LL | match [5..4, 99..105, 43..44] { | ----------------------- this expression has type `[std::ops::Range<{integer}>; 3]` LL | [_, 99..] => {}, - | ^^ expected struct `Range`, found integer + | ^^ expected `Range<{integer}>`, found integer | = note: expected struct `std::ops::Range<{integer}>` found type `{integer}` diff --git a/tests/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision3.stderr b/tests/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision3.stderr index bbdf0c83f620..b9b272c4c7cb 100644 --- a/tests/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision3.stderr +++ b/tests/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision3.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match [5..4, 99..105, 43..44] { | ----------------------- this expression has type `[std::ops::Range<{integer}>; 3]` LL | [..9, 99..100, _] => {}, - | ^ expected struct `Range`, found integer + | ^ expected `Range<{integer}>`, found integer | = note: expected struct `std::ops::Range<{integer}>` found type `{integer}` @@ -17,7 +17,7 @@ LL | match [5..4, 99..105, 43..44] { LL | [..9, 99..100, _] => {}, | ^^ --- this is of type `{integer}` | | - | expected struct `Range`, found integer + | expected `Range<{integer}>`, found integer | = note: expected struct `std::ops::Range<{integer}>` found type `{integer}` @@ -28,7 +28,7 @@ error[E0308]: mismatched types LL | match [5..4, 99..105, 43..44] { | ----------------------- this expression has type `[std::ops::Range<{integer}>; 3]` LL | [..9, 99..100, _] => {}, - | -- ^^^ expected struct `Range`, found integer + | -- ^^^ expected `Range<{integer}>`, found integer | | | this is of type `{integer}` | diff --git a/tests/ui/half-open-range-patterns/pat-tuple-5.stderr b/tests/ui/half-open-range-patterns/pat-tuple-5.stderr index c608426382d9..43e7f03b8b4e 100644 --- a/tests/ui/half-open-range-patterns/pat-tuple-5.stderr +++ b/tests/ui/half-open-range-patterns/pat-tuple-5.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match (0, 1) { | ------ this expression has type `({integer}, {integer})` LL | (PAT ..) => {} - | ^^^ expected tuple, found `u8` + | ^^^ expected `({integer}, {integer})`, found `u8` | = note: expected tuple `({integer}, {integer})` found type `u8` diff --git a/tests/ui/higher-rank-trait-bounds/hang-on-deeply-nested-dyn.stderr b/tests/ui/higher-rank-trait-bounds/hang-on-deeply-nested-dyn.stderr index 71e196c32276..3e388653471e 100644 --- a/tests/ui/higher-rank-trait-bounds/hang-on-deeply-nested-dyn.stderr +++ b/tests/ui/higher-rank-trait-bounds/hang-on-deeply-nested-dyn.stderr @@ -11,7 +11,7 @@ LL | | ), LL | | ) { | |_- expected `&dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn Fn(u32) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a))` because of return type LL | f - | ^ expected reference, found `u32` + | ^ expected `&dyn for<'a> Fn(&'a ...)`, found `&dyn Fn(u32)` | = note: expected reference `&dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a ...) + 'a)) + 'a)) + 'a))` the full type name has been written to '$TEST_BUILD_DIR/higher-rank-trait-bounds/hang-on-deeply-nested-dyn/hang-on-deeply-nested-dyn.long-type-hash.txt' diff --git a/tests/ui/higher-rank-trait-bounds/issue-62203-hrtb-ice.stderr b/tests/ui/higher-rank-trait-bounds/issue-62203-hrtb-ice.stderr index 810f7c28c004..01d48ab59af1 100644 --- a/tests/ui/higher-rank-trait-bounds/issue-62203-hrtb-ice.stderr +++ b/tests/ui/higher-rank-trait-bounds/issue-62203-hrtb-ice.stderr @@ -42,7 +42,7 @@ LL | | f: |x| { ... | LL | | }, LL | | }, - | |_________^ expected struct `Unit3`, found struct `Unit4` + | |_________^ expected `Unit3`, found `Unit4` | note: required for `L<[closure@$DIR/issue-62203-hrtb-ice.rs:42:16: 42:19]>` to implement `for<'r> T0<'r, (&'r u8,)>` --> $DIR/issue-62203-hrtb-ice.rs:17:16 diff --git a/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr b/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr index 7f73d5e12d19..f64ba3bf1c41 100644 --- a/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr +++ b/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/dyn-trait-return-should-be-impl-trait.rs:7:35 | LL | fn fuz() -> (usize, Trait) { (42, Struct) } - | ^^^^^^ expected trait object `dyn Trait`, found struct `Struct` + | ^^^^^^ expected `dyn Trait`, found `Struct` | = note: expected trait object `(dyn Trait + 'static)` found struct `Struct` @@ -23,7 +23,7 @@ error[E0308]: mismatched types --> $DIR/dyn-trait-return-should-be-impl-trait.rs:10:39 | LL | fn bar() -> (usize, dyn Trait) { (42, Struct) } - | ^^^^^^ expected trait object `dyn Trait`, found struct `Struct` + | ^^^^^^ expected `dyn Trait`, found `Struct` | = note: expected trait object `(dyn Trait + 'static)` found struct `Struct` @@ -110,7 +110,7 @@ LL | | Struct | | ------ expected because of this LL | | } else { LL | | 42 - | | ^^ expected struct `Struct`, found integer + | | ^^ expected `Struct`, found integer LL | | } | |_____- `if` and `else` have incompatible types @@ -144,7 +144,7 @@ LL | fn bam() -> Box { | -------------- expected `Box<(dyn Trait + 'static)>` because of return type LL | if true { LL | return Struct; - | ^^^^^^ expected struct `Box`, found struct `Struct` + | ^^^^^^ expected `Box`, found `Struct` | = note: expected struct `Box<(dyn Trait + 'static)>` found struct `Struct` @@ -161,7 +161,7 @@ LL | fn bam() -> Box { | -------------- expected `Box<(dyn Trait + 'static)>` because of return type ... LL | 42 - | ^^ expected struct `Box`, found integer + | ^^ expected `Box`, found integer | = note: expected struct `Box<(dyn Trait + 'static)>` found type `{integer}` @@ -178,7 +178,7 @@ LL | fn baq() -> Box { | -------------- expected `Box<(dyn Trait + 'static)>` because of return type LL | if true { LL | return 0; - | ^ expected struct `Box`, found integer + | ^ expected `Box`, found integer | = note: expected struct `Box<(dyn Trait + 'static)>` found type `{integer}` @@ -195,7 +195,7 @@ LL | fn baq() -> Box { | -------------- expected `Box<(dyn Trait + 'static)>` because of return type ... LL | 42 - | ^^ expected struct `Box`, found integer + | ^^ expected `Box`, found integer | = note: expected struct `Box<(dyn Trait + 'static)>` found type `{integer}` @@ -212,7 +212,7 @@ LL | fn baz() -> Box { | -------------- expected `Box<(dyn Trait + 'static)>` because of return type LL | if true { LL | Struct - | ^^^^^^ expected struct `Box`, found struct `Struct` + | ^^^^^^ expected `Box`, found `Struct` | = note: expected struct `Box<(dyn Trait + 'static)>` found struct `Struct` @@ -229,7 +229,7 @@ LL | fn baz() -> Box { | -------------- expected `Box<(dyn Trait + 'static)>` because of return type ... LL | 42 - | ^^ expected struct `Box`, found integer + | ^^ expected `Box`, found integer | = note: expected struct `Box<(dyn Trait + 'static)>` found type `{integer}` @@ -246,7 +246,7 @@ LL | fn baw() -> Box { | -------------- expected `Box<(dyn Trait + 'static)>` because of return type LL | if true { LL | 0 - | ^ expected struct `Box`, found integer + | ^ expected `Box`, found integer | = note: expected struct `Box<(dyn Trait + 'static)>` found type `{integer}` @@ -263,7 +263,7 @@ LL | fn baw() -> Box { | -------------- expected `Box<(dyn Trait + 'static)>` because of return type ... LL | 42 - | ^^ expected struct `Box`, found integer + | ^^ expected `Box`, found integer | = note: expected struct `Box<(dyn Trait + 'static)>` found type `{integer}` diff --git a/tests/ui/impl-trait/in-trait/deep-match.stderr b/tests/ui/impl-trait/in-trait/deep-match.stderr index 034ee5ea4e10..3eba419c0a3f 100644 --- a/tests/ui/impl-trait/in-trait/deep-match.stderr +++ b/tests/ui/impl-trait/in-trait/deep-match.stderr @@ -4,7 +4,7 @@ error[E0053]: method `bar` has an incompatible return type for trait LL | fn bar() -> i32 { 0 } | ^^^ | | - | expected struct `Wrapper`, found `i32` + | expected `Wrapper<_>`, found `i32` | return type in trait | = note: expected struct `Wrapper<_>` diff --git a/tests/ui/impl-trait/in-trait/default-body-type-err-2.stderr b/tests/ui/impl-trait/in-trait/default-body-type-err-2.stderr index 142b1bff1a46..cc3bdf0e5717 100644 --- a/tests/ui/impl-trait/in-trait/default-body-type-err-2.stderr +++ b/tests/ui/impl-trait/in-trait/default-body-type-err-2.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | 42 | ^^- help: try using a conversion method: `.to_string()` | | - | expected struct `String`, found integer + | expected `String`, found integer error: aborting due to previous error diff --git a/tests/ui/impl-trait/in-trait/default-body-type-err.stderr b/tests/ui/impl-trait/in-trait/default-body-type-err.stderr index 461247a3e3ff..4742eb37d3e4 100644 --- a/tests/ui/impl-trait/in-trait/default-body-type-err.stderr +++ b/tests/ui/impl-trait/in-trait/default-body-type-err.stderr @@ -2,7 +2,7 @@ error[E0271]: type mismatch resolving `<&i32 as Deref>::Target == String` --> $DIR/default-body-type-err.rs:7:22 | LL | fn lol(&self) -> impl Deref { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found struct `String` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found `String` LL | LL | &1i32 | ----- return type was inferred to be `&i32` here diff --git a/tests/ui/impl-trait/issue-102605.stderr b/tests/ui/impl-trait/issue-102605.stderr index d4aba914908f..6cf0c33ad919 100644 --- a/tests/ui/impl-trait/issue-102605.stderr +++ b/tests/ui/impl-trait/issue-102605.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-102605.rs:13:20 | LL | convert_result(foo()) - | -------------- ^^^^^ expected enum `Result`, found opaque type + | -------------- ^^^^^ expected `Result<(), _>`, found opaque type | | | arguments to this function are incorrect | diff --git a/tests/ui/impl-trait/issue-99914.stderr b/tests/ui/impl-trait/issue-99914.stderr index 074d5d58d9a3..3b4e130fdebd 100644 --- a/tests/ui/impl-trait/issue-99914.stderr +++ b/tests/ui/impl-trait/issue-99914.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-99914.rs:9:27 | LL | t.and_then(|t| -> _ { bar(t) }); - | ^^^^^^ expected enum `Result`, found opaque type + | ^^^^^^ expected `Result<_, Error>`, found opaque type | note: while checking the return type of the `async fn` --> $DIR/issue-99914.rs:13:23 diff --git a/tests/ui/impl-trait/issues/issue-74282.stderr b/tests/ui/impl-trait/issues/issue-74282.stderr index 5b05fb2810df..724f3c5d6747 100644 --- a/tests/ui/impl-trait/issues/issue-74282.stderr +++ b/tests/ui/impl-trait/issues/issue-74282.stderr @@ -10,7 +10,7 @@ LL | Anonymous(|| { | | arguments to this struct are incorrect LL | | 3 LL | | }) - | |_____^ expected closure, found a different closure + | |_____^ expected opaque type, found closure | = note: expected opaque type `Closure` found closure `[closure@$DIR/issue-74282.rs:8:15: 8:17]` @@ -33,7 +33,7 @@ LL | | 3 LL | | }) | | ^- help: consider using a semicolon here: `;` | |______| - | expected `()`, found struct `Anonymous` + | expected `()`, found `Anonymous` error: aborting due to 2 previous errors diff --git a/tests/ui/impl-trait/object-unsafe-trait-in-return-position-impl-trait.stderr b/tests/ui/impl-trait/object-unsafe-trait-in-return-position-impl-trait.stderr index d6f5a1ac25b6..e5147bcea166 100644 --- a/tests/ui/impl-trait/object-unsafe-trait-in-return-position-impl-trait.stderr +++ b/tests/ui/impl-trait/object-unsafe-trait-in-return-position-impl-trait.stderr @@ -5,7 +5,7 @@ LL | fn can() -> impl NotObjectSafe { | ------------------ expected `A` because of return type ... LL | B - | ^ expected struct `A`, found struct `B` + | ^ expected `A`, found `B` error[E0308]: mismatched types --> $DIR/object-unsafe-trait-in-return-position-impl-trait.rs:43:5 @@ -14,7 +14,7 @@ LL | fn cat() -> impl ObjectSafe { | --------------- expected `A` because of return type ... LL | B - | ^ expected struct `A`, found struct `B` + | ^ expected `A`, found `B` error: aborting due to 2 previous errors diff --git a/tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle.stderr b/tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle.stderr index c7c6ca440126..f7aff4195444 100644 --- a/tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle.stderr +++ b/tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle.stderr @@ -15,7 +15,7 @@ LL | type Foo = impl PartialEq<(Foo, i32)>; LL | fn eq(&self, _other: &(Foo, i32)) -> bool { | ^^^^^^^^^^^ | | - | expected struct `Bar`, found opaque type + | expected `a::Bar`, found opaque type | help: change the parameter type to match the trait: `&(a::Bar, i32)` | = note: expected signature `fn(&a::Bar, &(a::Bar, i32)) -> _` @@ -38,7 +38,7 @@ LL | type Foo = impl PartialEq<(Foo, i32)>; LL | fn eq(&self, _other: &(Bar, i32)) -> bool { | ^^^^^^^^^^^ | | - | expected opaque type, found struct `Bar` + | expected opaque type, found `b::Bar` | help: change the parameter type to match the trait: `&(b::Foo, i32)` | = note: expected signature `fn(&b::Bar, &(b::Foo, i32)) -> _` diff --git a/tests/ui/impl-trait/universal-mismatched-type.stderr b/tests/ui/impl-trait/universal-mismatched-type.stderr index 817c573c0919..a56e542d8345 100644 --- a/tests/ui/impl-trait/universal-mismatched-type.stderr +++ b/tests/ui/impl-trait/universal-mismatched-type.stderr @@ -6,7 +6,7 @@ LL | fn foo(x: impl Debug) -> String { | | | this type parameter LL | x - | ^ expected struct `String`, found type parameter `impl Debug` + | ^ expected `String`, found type parameter `impl Debug` | = note: expected struct `String` found type parameter `impl Debug` diff --git a/tests/ui/include-macros/mismatched-types.stderr b/tests/ui/include-macros/mismatched-types.stderr index a408877afb61..4f2880e2f5d4 100644 --- a/tests/ui/include-macros/mismatched-types.stderr +++ b/tests/ui/include-macros/mismatched-types.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/mismatched-types.rs:2:20 | LL | let b: &[u8] = include_str!("file.txt"); - | ----- ^^^^^^^^^^^^^^^^^^^^^^^^ expected slice `[u8]`, found `str` + | ----- ^^^^^^^^^^^^^^^^^^^^^^^^ expected `&[u8]`, found `&str` | | | expected due to this | @@ -14,7 +14,7 @@ error[E0308]: mismatched types --> $DIR/mismatched-types.rs:3:19 | LL | let s: &str = include_bytes!("file.txt"); - | ---- ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `str`, found array `[u8; 0]` + | ---- ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&str`, found `&[u8; 0]` | | | expected due to this | diff --git a/tests/ui/inference/deref-suggestion.stderr b/tests/ui/inference/deref-suggestion.stderr index 3db67cdb5370..1626032ae997 100644 --- a/tests/ui/inference/deref-suggestion.stderr +++ b/tests/ui/inference/deref-suggestion.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | foo(s); | --- ^- help: try using a conversion method: `.to_string()` | | | - | | expected struct `String`, found `&String` + | | expected `String`, found `&String` | arguments to this function are incorrect | note: function defined here @@ -35,7 +35,7 @@ error[E0308]: mismatched types --> $DIR/deref-suggestion.rs:30:9 | LL | foo(&"aaa".to_owned()); - | --- ^^^^^^^^^^^^^^^^^ expected struct `String`, found `&String` + | --- ^^^^^^^^^^^^^^^^^ expected `String`, found `&String` | | | arguments to this function are incorrect | @@ -54,7 +54,7 @@ error[E0308]: mismatched types --> $DIR/deref-suggestion.rs:32:9 | LL | foo(&mut "aaa".to_owned()); - | --- ^^^^^^^^^^^^^^^^^^^^^ expected struct `String`, found `&mut String` + | --- ^^^^^^^^^^^^^^^^^^^^^ expected `String`, found `&mut String` | | | arguments to this function are incorrect | diff --git a/tests/ui/issues/issue-100605.stderr b/tests/ui/issues/issue-100605.stderr index 886e3cd6bb79..be30eef2af48 100644 --- a/tests/ui/issues/issue-100605.stderr +++ b/tests/ui/issues/issue-100605.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-100605.rs:4:18 | LL | takes_option(&None); - | ------------ ^^^^^ expected enum `Option`, found `&Option<_>` + | ------------ ^^^^^ expected `Option<&String>`, found `&Option<_>` | | | arguments to this function are incorrect | @@ -29,7 +29,7 @@ error[E0308]: mismatched types LL | takes_option(&res); | ------------ ^^^^ | | | - | | expected enum `Option`, found `&Option` + | | expected `Option<&String>`, found `&Option` | | help: you can convert from `&Option` to `Option<&T>` using `.as_ref()`: `res.as_ref()` | arguments to this function are incorrect | diff --git a/tests/ui/issues/issue-102964.stderr b/tests/ui/issues/issue-102964.stderr index 4504039097b5..4be53fd09e52 100644 --- a/tests/ui/issues/issue-102964.stderr +++ b/tests/ui/issues/issue-102964.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-102964.rs:5:41 | LL | fn bar_function(function: Foo) -> RcFoo { - | ------------ ^^^^^^^^ expected struct `Rc`, found `()` + | ------------ ^^^^^^^^ expected `Rc<&dyn for<'a> Fn(&'a T)>`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression | diff --git a/tests/ui/issues/issue-11374.stderr b/tests/ui/issues/issue-11374.stderr index ace77814a3a9..ef28c81d8573 100644 --- a/tests/ui/issues/issue-11374.stderr +++ b/tests/ui/issues/issue-11374.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | c.read_to(v); | ------- ^ | | | - | | expected `&mut [u8]`, found struct `Vec` + | | expected `&mut [u8]`, found `Vec<_>` | | help: consider mutably borrowing here: `&mut v` | arguments to this method are incorrect | diff --git a/tests/ui/issues/issue-11844.stderr b/tests/ui/issues/issue-11844.stderr index 81cf918a1030..9afd209773b7 100644 --- a/tests/ui/issues/issue-11844.stderr +++ b/tests/ui/issues/issue-11844.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match a { | - this expression has type `Option>` LL | Ok(a) => - | ^^^^^ expected enum `Option`, found enum `Result` + | ^^^^^ expected `Option>`, found `Result<_, _>` | = note: expected enum `Option>` found enum `Result<_, _>` diff --git a/tests/ui/issues/issue-13446.stderr b/tests/ui/issues/issue-13446.stderr index 30fb73dd3728..139c34c8880a 100644 --- a/tests/ui/issues/issue-13446.stderr +++ b/tests/ui/issues/issue-13446.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-13446.rs:3:26 | LL | static VEC: [u32; 256] = vec![]; - | ^^^^^^ expected array `[u32; 256]`, found struct `Vec` + | ^^^^^^ expected `[u32; 256]`, found `Vec<_>` | = note: expected array `[u32; 256]` found struct `Vec<_>` diff --git a/tests/ui/issues/issue-13466.rs b/tests/ui/issues/issue-13466.rs index a420c7704af5..52d4d75d29da 100644 --- a/tests/ui/issues/issue-13466.rs +++ b/tests/ui/issues/issue-13466.rs @@ -9,12 +9,12 @@ pub fn main() { //~^ ERROR mismatched types //~| expected enum `Option<{integer}>` //~| found enum `Result<_, _>` - //~| expected enum `Option`, found enum `Result` + //~| expected `Option<{integer}>`, found `Result<_, _>` Err(e) => panic!(e) //~^ ERROR mismatched types //~| expected enum `Option<{integer}>` //~| found enum `Result<_, _>` - //~| expected enum `Option`, found enum `Result` + //~| expected `Option<{integer}>`, found `Result<_, _>` }; } diff --git a/tests/ui/issues/issue-13466.stderr b/tests/ui/issues/issue-13466.stderr index c78466f4e8ce..fd928e45863d 100644 --- a/tests/ui/issues/issue-13466.stderr +++ b/tests/ui/issues/issue-13466.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let _x: usize = match Some(1) { | ------- this expression has type `Option<{integer}>` LL | Ok(u) => u, - | ^^^^^ expected enum `Option`, found enum `Result` + | ^^^^^ expected `Option<{integer}>`, found `Result<_, _>` | = note: expected enum `Option<{integer}>` found enum `Result<_, _>` @@ -16,7 +16,7 @@ LL | let _x: usize = match Some(1) { | ------- this expression has type `Option<{integer}>` ... LL | Err(e) => panic!(e) - | ^^^^^^ expected enum `Option`, found enum `Result` + | ^^^^^^ expected `Option<{integer}>`, found `Result<_, _>` | = note: expected enum `Option<{integer}>` found enum `Result<_, _>` diff --git a/tests/ui/issues/issue-14541.rs b/tests/ui/issues/issue-14541.rs index 555ec9f9868c..2ff1c1f8876c 100644 --- a/tests/ui/issues/issue-14541.rs +++ b/tests/ui/issues/issue-14541.rs @@ -4,7 +4,7 @@ struct Vec3 { y: f32, z: f32 } fn make(v: Vec2) { let Vec3 { y: _, z: _ } = v; //~^ ERROR mismatched types - //~| expected struct `Vec2`, found struct `Vec3` + //~| expected `Vec2`, found `Vec3` } fn main() { } diff --git a/tests/ui/issues/issue-14541.stderr b/tests/ui/issues/issue-14541.stderr index cf155f428c6a..b80c68ce4731 100644 --- a/tests/ui/issues/issue-14541.stderr +++ b/tests/ui/issues/issue-14541.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let Vec3 { y: _, z: _ } = v; | ^^^^^^^^^^^^^^^^^^^ - this expression has type `Vec2` | | - | expected struct `Vec2`, found struct `Vec3` + | expected `Vec2`, found `Vec3` error: aborting due to previous error diff --git a/tests/ui/issues/issue-15783.rs b/tests/ui/issues/issue-15783.rs index 0b1f4545e880..ceb37a20e3f3 100644 --- a/tests/ui/issues/issue-15783.rs +++ b/tests/ui/issues/issue-15783.rs @@ -9,6 +9,6 @@ fn main() { //~^ ERROR mismatched types //~| expected enum `Option<&[&str]>` //~| found enum `Option<&[&str; 1]>` - //~| expected slice `[&str]`, found array `[&str; 1]` + //~| expected `Option<&[&str]>`, found `Option<&[&str; 1]>` assert_eq!(msg, 3); } diff --git a/tests/ui/issues/issue-15783.stderr b/tests/ui/issues/issue-15783.stderr index 660dfe9ed3d5..598ec7e6053b 100644 --- a/tests/ui/issues/issue-15783.stderr +++ b/tests/ui/issues/issue-15783.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-15783.rs:8:19 | LL | let msg = foo(x); - | --- ^ expected slice `[&str]`, found array `[&str; 1]` + | --- ^ expected `Option<&[&str]>`, found `Option<&[&str; 1]>` | | | arguments to this function are incorrect | diff --git a/tests/ui/issues/issue-15896.stderr b/tests/ui/issues/issue-15896.stderr index 038337f5acc8..ec0d74596aa8 100644 --- a/tests/ui/issues/issue-15896.stderr +++ b/tests/ui/issues/issue-15896.stderr @@ -5,7 +5,7 @@ LL | let u = match e { | - this expression has type `E` LL | E::B( LL | Tau{t: x}, - | ^^^^^^^^^ expected enum `R`, found struct `Tau` + | ^^^^^^^^^ expected `R`, found `Tau` error: aborting due to previous error diff --git a/tests/ui/issues/issue-16338.stderr b/tests/ui/issues/issue-16338.stderr index 6878600b0298..0f08485e515d 100644 --- a/tests/ui/issues/issue-16338.stderr +++ b/tests/ui/issues/issue-16338.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let Slice { data: data, len: len } = "foo"; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ----- this expression has type `&str` | | - | expected `str`, found struct `Slice` + | expected `str`, found `Slice<_>` | = note: expected type `str` found struct `Slice<_>` diff --git a/tests/ui/issues/issue-16401.rs b/tests/ui/issues/issue-16401.rs index 332352ca727a..19ae7da107ca 100644 --- a/tests/ui/issues/issue-16401.rs +++ b/tests/ui/issues/issue-16401.rs @@ -9,7 +9,7 @@ fn main() { //~^ ERROR mismatched types //~| expected unit type `()` //~| found struct `Slice<_>` - //~| expected `()`, found struct `Slice` + //~| expected `()`, found `Slice<_>` _ => unreachable!() } } diff --git a/tests/ui/issues/issue-16401.stderr b/tests/ui/issues/issue-16401.stderr index f8ea0907099a..02f9f3ea8fdf 100644 --- a/tests/ui/issues/issue-16401.stderr +++ b/tests/ui/issues/issue-16401.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match () { | -- this expression has type `()` LL | Slice { data: data, len: len } => (), - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found struct `Slice` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found `Slice<_>` | = note: expected unit type `()` found struct `Slice<_>` diff --git a/tests/ui/issues/issue-18819.stderr b/tests/ui/issues/issue-18819.stderr index 767fdd5caf06..1fc974b609c1 100644 --- a/tests/ui/issues/issue-18819.stderr +++ b/tests/ui/issues/issue-18819.stderr @@ -4,7 +4,7 @@ error[E0061]: this function takes 2 arguments but 1 argument was supplied LL | print_x(X); | ^^^^^^^--- an argument of type `&str` is missing | -note: expected reference, found struct `X` +note: expected `&dyn Foo`, found `X` --> $DIR/issue-18819.rs:16:13 | LL | print_x(X); diff --git a/tests/ui/issues/issue-20225.stderr b/tests/ui/issues/issue-20225.stderr index 5822160107cc..b1c15672051d 100644 --- a/tests/ui/issues/issue-20225.stderr +++ b/tests/ui/issues/issue-20225.stderr @@ -6,7 +6,7 @@ LL | impl<'a, T> Fn<(&'a T,)> for Foo { LL | extern "rust-call" fn call(&self, (_,): (T,)) {} | ^^^^ | | - | expected `&T`, found type parameter `T` + | expected `&'a T`, found type parameter `T` | help: change the parameter type to match the trait: `(&'a T,)` | = note: expected signature `extern "rust-call" fn(&Foo, (&'a T,))` @@ -20,7 +20,7 @@ LL | impl<'a, T> FnMut<(&'a T,)> for Foo { LL | extern "rust-call" fn call_mut(&mut self, (_,): (T,)) {} | ^^^^ | | - | expected `&T`, found type parameter `T` + | expected `&'a T`, found type parameter `T` | help: change the parameter type to match the trait: `(&'a T,)` | = note: expected signature `extern "rust-call" fn(&mut Foo, (&'a T,))` @@ -35,7 +35,7 @@ LL | impl<'a, T> FnOnce<(&'a T,)> for Foo { LL | extern "rust-call" fn call_once(self, (_,): (T,)) {} | ^^^^ | | - | expected `&T`, found type parameter `T` + | expected `&'a T`, found type parameter `T` | help: change the parameter type to match the trait: `(&'a T,)` | = note: expected signature `extern "rust-call" fn(Foo, (&'a T,))` diff --git a/tests/ui/issues/issue-21332.rs b/tests/ui/issues/issue-21332.rs index 6547f3a9b19a..4473d00fd5da 100644 --- a/tests/ui/issues/issue-21332.rs +++ b/tests/ui/issues/issue-21332.rs @@ -4,7 +4,7 @@ impl Iterator for S { type Item = i32; fn next(&mut self) -> Result { Ok(7) } //~^ ERROR method `next` has an incompatible type for trait - //~| expected enum `Option`, found enum `Result` + //~| expected `Option`, found `Result` } fn main() {} diff --git a/tests/ui/issues/issue-21332.stderr b/tests/ui/issues/issue-21332.stderr index 0e1beebf2931..82549288064a 100644 --- a/tests/ui/issues/issue-21332.stderr +++ b/tests/ui/issues/issue-21332.stderr @@ -4,7 +4,7 @@ error[E0053]: method `next` has an incompatible type for trait LL | fn next(&mut self) -> Result { Ok(7) } | ^^^^^^^^^^^^^^^^ | | - | expected enum `Option`, found enum `Result` + | expected `Option`, found `Result` | help: change the output type to match the trait: `Option` | = note: expected signature `fn(&mut S) -> Option` diff --git a/tests/ui/issues/issue-24322.stderr b/tests/ui/issues/issue-24322.stderr index 1e4c8ac7c356..37cc3413f751 100644 --- a/tests/ui/issues/issue-24322.stderr +++ b/tests/ui/issues/issue-24322.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-24322.rs:8:29 | LL | let x: &fn(&B) -> u32 = &B::func; - | -------------- ^^^^^^^^ expected fn pointer, found fn item + | -------------- ^^^^^^^^ expected `&for<'a> fn(&'a B) -> u32`, found `&for<'a> fn(&'a B) -> u32 {B::func}` | | | expected due to this | diff --git a/tests/ui/issues/issue-24819.rs b/tests/ui/issues/issue-24819.rs index 59c3f2cd114d..fb4cfb7b29e8 100644 --- a/tests/ui/issues/issue-24819.rs +++ b/tests/ui/issues/issue-24819.rs @@ -4,7 +4,7 @@ fn main() { let mut v = Vec::new(); foo(&mut v); //~^ ERROR mismatched types - //~| expected struct `HashSet`, found struct `Vec` + //~| expected `&mut HashSet`, found `&mut Vec<_>` } fn foo(h: &mut HashSet) { diff --git a/tests/ui/issues/issue-24819.stderr b/tests/ui/issues/issue-24819.stderr index 982a11fef80e..8b4f1dbce431 100644 --- a/tests/ui/issues/issue-24819.stderr +++ b/tests/ui/issues/issue-24819.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-24819.rs:5:9 | LL | foo(&mut v); - | --- ^^^^^^ expected struct `HashSet`, found struct `Vec` + | --- ^^^^^^ expected `&mut HashSet`, found `&mut Vec<_>` | | | arguments to this function are incorrect | diff --git a/tests/ui/issues/issue-27008.rs b/tests/ui/issues/issue-27008.rs index e04de33f6ef2..adf8e779e0a0 100644 --- a/tests/ui/issues/issue-27008.rs +++ b/tests/ui/issues/issue-27008.rs @@ -3,5 +3,5 @@ struct S; fn main() { let b = [0; S]; //~^ ERROR mismatched types - //~| expected `usize`, found struct `S` + //~| expected `usize`, found `S` } diff --git a/tests/ui/issues/issue-27008.stderr b/tests/ui/issues/issue-27008.stderr index 5b7e74c1c301..9d18045aa794 100644 --- a/tests/ui/issues/issue-27008.stderr +++ b/tests/ui/issues/issue-27008.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-27008.rs:4:17 | LL | let b = [0; S]; - | ^ expected `usize`, found struct `S` + | ^ expected `usize`, found `S` error: aborting due to previous error diff --git a/tests/ui/issues/issue-32122-1.stderr b/tests/ui/issues/issue-32122-1.stderr index 10b0c0967c1e..b4f5b1296670 100644 --- a/tests/ui/issues/issue-32122-1.stderr +++ b/tests/ui/issues/issue-32122-1.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-32122-1.rs:16:24 | LL | let _: *const u8 = &a; - | --------- ^^ expected `u8`, found struct `Foo` + | --------- ^^ expected `*const u8`, found `&Foo` | | | expected due to this | diff --git a/tests/ui/issues/issue-32122-2.stderr b/tests/ui/issues/issue-32122-2.stderr index 5c3dade8e20c..02c335c1547f 100644 --- a/tests/ui/issues/issue-32122-2.stderr +++ b/tests/ui/issues/issue-32122-2.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-32122-2.rs:27:24 | LL | let _: *const u8 = &a; - | --------- ^^ expected `u8`, found struct `Emm` + | --------- ^^ expected `*const u8`, found `&Emm` | | | expected due to this | diff --git a/tests/ui/issues/issue-33504.stderr b/tests/ui/issues/issue-33504.stderr index d9e7c3b16e76..a831cf585f4e 100644 --- a/tests/ui/issues/issue-33504.stderr +++ b/tests/ui/issues/issue-33504.stderr @@ -7,7 +7,7 @@ LL | struct Test; LL | let Test = 1; | ^^^^ - this expression has type `{integer}` | | - | expected integer, found struct `Test` + | expected integer, found `Test` | `Test` is interpreted as a unit struct, not a new binding | help: introduce a new binding instead: `other_test` diff --git a/tests/ui/issues/issue-33941.stderr b/tests/ui/issues/issue-33941.stderr index 668eaabca4c4..e7f4a4fa004c 100644 --- a/tests/ui/issues/issue-33941.stderr +++ b/tests/ui/issues/issue-33941.stderr @@ -2,7 +2,7 @@ error[E0271]: expected `Iter<'_, _, _>` to be an iterator that yields `&_`, but --> $DIR/issue-33941.rs:6:36 | LL | for _ in HashMap::new().iter().cloned() {} - | ^^^^^^ expected reference, found tuple + | ^^^^^^ expected `&_`, found `(&_, &_)` | = note: expected reference `&_` found tuple `(&_, &_)` @@ -20,7 +20,7 @@ error[E0271]: expected `Iter<'_, _, _>` to be an iterator that yields `&_`, but --> $DIR/issue-33941.rs:6:14 | LL | for _ in HashMap::new().iter().cloned() {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected tuple, found reference + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `(&_, &_)`, found `&_` | = note: expected tuple `(&_, &_)` found reference `&_` @@ -31,7 +31,7 @@ error[E0271]: expected `Iter<'_, _, _>` to be an iterator that yields `&_`, but --> $DIR/issue-33941.rs:6:14 | LL | for _ in HashMap::new().iter().cloned() {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected tuple, found reference + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `(&_, &_)`, found `&_` | = note: expected tuple `(&_, &_)` found reference `&_` diff --git a/tests/ui/issues/issue-35241.stderr b/tests/ui/issues/issue-35241.stderr index d600e934bd57..4a2c15511fe2 100644 --- a/tests/ui/issues/issue-35241.stderr +++ b/tests/ui/issues/issue-35241.stderr @@ -5,7 +5,7 @@ LL | struct Foo(u32); | ---------- `Foo` defines a struct constructor here, which should be called LL | LL | fn test() -> Foo { Foo } - | --- ^^^ expected struct `Foo`, found struct constructor + | --- ^^^ expected `Foo`, found struct constructor | | | expected `Foo` because of return type | diff --git a/tests/ui/issues/issue-3680.rs b/tests/ui/issues/issue-3680.rs index 37c9000c043d..a0e527981229 100644 --- a/tests/ui/issues/issue-3680.rs +++ b/tests/ui/issues/issue-3680.rs @@ -4,6 +4,6 @@ fn main() { //~^ ERROR mismatched types //~| expected enum `Option<_>` //~| found enum `Result<_, _>` - //~| expected enum `Option`, found enum `Result` + //~| expected `Option<_>`, found `Result<_, _>` } } diff --git a/tests/ui/issues/issue-3680.stderr b/tests/ui/issues/issue-3680.stderr index 29ba44f136af..0b0ae419e2bf 100644 --- a/tests/ui/issues/issue-3680.stderr +++ b/tests/ui/issues/issue-3680.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match None { | ---- this expression has type `Option<_>` LL | Err(_) => () - | ^^^^^^ expected enum `Option`, found enum `Result` + | ^^^^^^ expected `Option<_>`, found `Result<_, _>` | = note: expected enum `Option<_>` found enum `Result<_, _>` diff --git a/tests/ui/issues/issue-40749.stderr b/tests/ui/issues/issue-40749.stderr index fa239f744fb2..afc39adec467 100644 --- a/tests/ui/issues/issue-40749.stderr +++ b/tests/ui/issues/issue-40749.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-40749.rs:2:9 | LL | [0; ..10]; - | ^^^^ expected `usize`, found struct `RangeTo` + | ^^^^ expected `usize`, found `RangeTo<{integer}>` | = note: expected type `usize` found struct `RangeTo<{integer}>` diff --git a/tests/ui/issues/issue-43420-no-over-suggest.stderr b/tests/ui/issues/issue-43420-no-over-suggest.stderr index 58fd1121a6b9..9b141e2bf99a 100644 --- a/tests/ui/issues/issue-43420-no-over-suggest.stderr +++ b/tests/ui/issues/issue-43420-no-over-suggest.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-43420-no-over-suggest.rs:8:9 | LL | foo(&a); - | --- ^^ expected slice `[u16]`, found struct `Vec` + | --- ^^ expected `&[u16]`, found `&Vec` | | | arguments to this function are incorrect | diff --git a/tests/ui/issues/issue-4517.rs b/tests/ui/issues/issue-4517.rs index caf85d44aac5..469304e2cf70 100644 --- a/tests/ui/issues/issue-4517.rs +++ b/tests/ui/issues/issue-4517.rs @@ -4,5 +4,5 @@ fn main() { let foo: [u8; 4] = [1; 4]; bar(foo); //~^ ERROR mismatched types - //~| expected `usize`, found array `[u8; 4]` + //~| expected `usize`, found `[u8; 4]` } diff --git a/tests/ui/issues/issue-4517.stderr b/tests/ui/issues/issue-4517.stderr index 70b4ca5ec496..78ee336f19a4 100644 --- a/tests/ui/issues/issue-4517.stderr +++ b/tests/ui/issues/issue-4517.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-4517.rs:5:9 | LL | bar(foo); - | --- ^^^ expected `usize`, found array `[u8; 4]` + | --- ^^^ expected `usize`, found `[u8; 4]` | | | arguments to this function are incorrect | diff --git a/tests/ui/issues/issue-48364.stderr b/tests/ui/issues/issue-48364.stderr index 60bbfc0c6e26..a4c88fd880a9 100644 --- a/tests/ui/issues/issue-48364.stderr +++ b/tests/ui/issues/issue-48364.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-48364.rs:2:21 | LL | b"".starts_with(stringify!(foo)) - | ----------- ^^^^^^^^^^^^^^^ expected slice `[u8]`, found `str` + | ----------- ^^^^^^^^^^^^^^^ expected `&[u8]`, found `&str` | | | arguments to this method are incorrect | diff --git a/tests/ui/issues/issue-4968.rs b/tests/ui/issues/issue-4968.rs index 634bd698d770..c8df46dc2674 100644 --- a/tests/ui/issues/issue-4968.rs +++ b/tests/ui/issues/issue-4968.rs @@ -6,5 +6,5 @@ fn main() { //~^ ERROR mismatched types //~| expected type `{integer}` //~| found tuple `(isize, isize)` - //~| expected integer, found tuple + //~| expected integer, found `(isize, isize)` } diff --git a/tests/ui/issues/issue-4968.stderr b/tests/ui/issues/issue-4968.stderr index bbaca4ed28f5..1ce0333846f4 100644 --- a/tests/ui/issues/issue-4968.stderr +++ b/tests/ui/issues/issue-4968.stderr @@ -7,7 +7,7 @@ LL | fn main() { LL | match 42 { A => () } | -- ^ | | | - | | expected integer, found tuple + | | expected integer, found `(isize, isize)` | | `A` is interpreted as a constant, not a new binding | | help: introduce a new binding instead: `other_a` | this expression has type `{integer}` diff --git a/tests/ui/issues/issue-5100.rs b/tests/ui/issues/issue-5100.rs index 69ed4b0e4328..53ebdec81649 100644 --- a/tests/ui/issues/issue-5100.rs +++ b/tests/ui/issues/issue-5100.rs @@ -7,7 +7,7 @@ fn main() { match (true, false) { A::B => (), //~^ ERROR mismatched types -//~| expected tuple, found enum `A` +//~| expected `(bool, bool)`, found `A` //~| expected tuple `(bool, bool)` //~| found enum `A` _ => () @@ -39,7 +39,7 @@ fn main() { match (true, false) { &(true, false) => () //~^ ERROR mismatched types -//~| expected tuple, found reference +//~| expected `(bool, bool)`, found `&_` //~| expected tuple `(bool, bool)` //~| found reference `&_` } diff --git a/tests/ui/issues/issue-5100.stderr b/tests/ui/issues/issue-5100.stderr index c87a3e348a2e..b1680aacd165 100644 --- a/tests/ui/issues/issue-5100.stderr +++ b/tests/ui/issues/issue-5100.stderr @@ -7,7 +7,7 @@ LL | enum A { B, C } LL | match (true, false) { | ------------- this expression has type `(bool, bool)` LL | A::B => (), - | ^^^^ expected tuple, found enum `A` + | ^^^^ expected `(bool, bool)`, found `A` | = note: expected tuple `(bool, bool)` found enum `A` @@ -40,7 +40,7 @@ error[E0308]: mismatched types LL | match (true, false) { | ------------- this expression has type `(bool, bool)` LL | box (true, false) => () - | ^^^^^^^^^^^^^^^^^ expected tuple, found struct `Box` + | ^^^^^^^^^^^^^^^^^ expected `(bool, bool)`, found `Box<_>` | = note: expected tuple `(bool, bool)` found struct `Box<_>` @@ -51,7 +51,7 @@ error[E0308]: mismatched types LL | match (true, false) { | ------------- this expression has type `(bool, bool)` LL | &(true, false) => () - | ^^^^^^^^^^^^^^ expected tuple, found reference + | ^^^^^^^^^^^^^^ expected `(bool, bool)`, found `&_` | = note: expected tuple `(bool, bool)` found reference `&_` diff --git a/tests/ui/issues/issue-51632-try-desugar-incompatible-types.stderr b/tests/ui/issues/issue-51632-try-desugar-incompatible-types.stderr index cc0726bcade3..7180a3d2426d 100644 --- a/tests/ui/issues/issue-51632-try-desugar-incompatible-types.stderr +++ b/tests/ui/issues/issue-51632-try-desugar-incompatible-types.stderr @@ -2,7 +2,7 @@ error[E0308]: `?` operator has incompatible types --> $DIR/issue-51632-try-desugar-incompatible-types.rs:8:5 | LL | missing_discourses()? - | ^^^^^^^^^^^^^^^^^^^^^ expected enum `Result`, found `isize` + | ^^^^^^^^^^^^^^^^^^^^^ expected `Result`, found `isize` | = note: `?` operator cannot convert from `isize` to `Result` = note: expected enum `Result` diff --git a/tests/ui/issues/issue-53348.rs b/tests/ui/issues/issue-53348.rs index d2f8c77c0ce1..66800d9e9296 100644 --- a/tests/ui/issues/issue-53348.rs +++ b/tests/ui/issues/issue-53348.rs @@ -9,7 +9,7 @@ fn main() { for i in v { a = *i.to_string(); //~^ ERROR mismatched types - //~| NOTE expected struct `String`, found `str` + //~| NOTE expected `String`, found `str` v2.push(a); } } diff --git a/tests/ui/issues/issue-53348.stderr b/tests/ui/issues/issue-53348.stderr index 71d9f5b3dbbf..e4cdb7e889bc 100644 --- a/tests/ui/issues/issue-53348.stderr +++ b/tests/ui/issues/issue-53348.stderr @@ -5,7 +5,7 @@ LL | let mut a = String::new(); | ------------- expected due to this value LL | for i in v { LL | a = *i.to_string(); - | ^^^^^^^^^^^^^^ expected struct `String`, found `str` + | ^^^^^^^^^^^^^^ expected `String`, found `str` error: aborting due to previous error diff --git a/tests/ui/issues/issue-5358-1.rs b/tests/ui/issues/issue-5358-1.rs index f5e32e78d879..14ee962b722e 100644 --- a/tests/ui/issues/issue-5358-1.rs +++ b/tests/ui/issues/issue-5358-1.rs @@ -5,7 +5,7 @@ fn main() { match S(Either::Left(5)) { Either::Right(_) => {} //~^ ERROR mismatched types - //~| expected struct `S`, found enum `Either` + //~| expected `S`, found `Either<_, _>` //~| expected struct `S` //~| found enum `Either<_, _>` _ => {} diff --git a/tests/ui/issues/issue-5358-1.stderr b/tests/ui/issues/issue-5358-1.stderr index 9d5b8d9d3fc1..059462a363e8 100644 --- a/tests/ui/issues/issue-5358-1.stderr +++ b/tests/ui/issues/issue-5358-1.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match S(Either::Left(5)) { | ------------------ this expression has type `S` LL | Either::Right(_) => {} - | ^^^^^^^^^^^^^^^^ expected struct `S`, found enum `Either` + | ^^^^^^^^^^^^^^^^ expected `S`, found `Either<_, _>` | = note: expected struct `S` found enum `Either<_, _>` diff --git a/tests/ui/issues/issue-56943.stderr b/tests/ui/issues/issue-56943.stderr index 74ed5ec0fb6f..c394e620b82f 100644 --- a/tests/ui/issues/issue-56943.stderr +++ b/tests/ui/issues/issue-56943.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-56943.rs:6:29 | LL | let _: issue_56943::S = issue_56943::S2; - | -------------- ^^^^^^^^^^^^^^^ expected struct `S`, found struct `S2` + | -------------- ^^^^^^^^^^^^^^^ expected `S`, found `S2` | | | expected due to this diff --git a/tests/ui/issues/issue-57741-1.stderr b/tests/ui/issues/issue-57741-1.stderr index 789a1f44db26..76f03bab6d15 100644 --- a/tests/ui/issues/issue-57741-1.stderr +++ b/tests/ui/issues/issue-57741-1.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let y = match x { | - this expression has type `Box` LL | S::A { a } | S::B { b: a } => a, - | ^^^^^^^^^^ expected struct `Box`, found enum `S` + | ^^^^^^^^^^ expected `Box`, found `S` | = note: expected struct `Box` found enum `S` @@ -15,7 +15,7 @@ error[E0308]: mismatched types LL | let y = match x { | - this expression has type `Box` LL | S::A { a } | S::B { b: a } => a, - | ^^^^^^^^^^^^^ expected struct `Box`, found enum `S` + | ^^^^^^^^^^^^^ expected `Box`, found `S` | = note: expected struct `Box` found enum `S` diff --git a/tests/ui/issues/issue-57741.stderr b/tests/ui/issues/issue-57741.stderr index cd277f20ef15..38014ecce757 100644 --- a/tests/ui/issues/issue-57741.stderr +++ b/tests/ui/issues/issue-57741.stderr @@ -7,7 +7,7 @@ LL | let y = match x { | this expression has type `Box` | help: consider dereferencing the boxed value: `*x` LL | T::A(a) | T::B(a) => a, - | ^^^^^^^ expected struct `Box`, found enum `T` + | ^^^^^^^ expected `Box`, found `T` | = note: expected struct `Box` found enum `T` @@ -21,7 +21,7 @@ LL | let y = match x { | this expression has type `Box` | help: consider dereferencing the boxed value: `*x` LL | T::A(a) | T::B(a) => a, - | ^^^^^^^ expected struct `Box`, found enum `T` + | ^^^^^^^ expected `Box`, found `T` | = note: expected struct `Box` found enum `T` @@ -35,7 +35,7 @@ LL | let y = match x { | this expression has type `Box` | help: consider dereferencing the boxed value: `*x` LL | S::A { a } | S::B { b: a } => a, - | ^^^^^^^^^^ expected struct `Box`, found enum `S` + | ^^^^^^^^^^ expected `Box`, found `S` | = note: expected struct `Box` found enum `S` @@ -49,7 +49,7 @@ LL | let y = match x { | this expression has type `Box` | help: consider dereferencing the boxed value: `*x` LL | S::A { a } | S::B { b: a } => a, - | ^^^^^^^^^^^^^ expected struct `Box`, found enum `S` + | ^^^^^^^^^^^^^ expected `Box`, found `S` | = note: expected struct `Box` found enum `S` diff --git a/tests/ui/issues/issue-59488.stderr b/tests/ui/issues/issue-59488.stderr index f9846b62a72f..d45beefa420c 100644 --- a/tests/ui/issues/issue-59488.stderr +++ b/tests/ui/issues/issue-59488.stderr @@ -15,7 +15,7 @@ error[E0308]: mismatched types --> $DIR/issue-59488.rs:14:11 | LL | foo > 12; - | ^^ expected fn item, found integer + | ^^ expected fn item, found `i32` | = note: expected fn item `fn() -> i32 {foo}` found type `i32` @@ -37,7 +37,7 @@ error[E0308]: mismatched types --> $DIR/issue-59488.rs:18:11 | LL | bar > 13; - | ^^ expected fn item, found integer + | ^^ expected fn item, found `i64` | = note: expected fn item `fn(i64) -> i64 {bar}` found type `i64` diff --git a/tests/ui/issues/issue-61106.stderr b/tests/ui/issues/issue-61106.stderr index 2bc09234116b..eff3e6e78495 100644 --- a/tests/ui/issues/issue-61106.stderr +++ b/tests/ui/issues/issue-61106.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | foo(x.clone()); | --- ^^^^^^^^^ | | | - | | expected `&str`, found struct `String` + | | expected `&str`, found `String` | | help: consider borrowing here: `&x` | arguments to this function are incorrect | diff --git a/tests/ui/issues/issue-6458-4.stderr b/tests/ui/issues/issue-6458-4.stderr index 168ececac31e..66ccfdff2366 100644 --- a/tests/ui/issues/issue-6458-4.stderr +++ b/tests/ui/issues/issue-6458-4.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-6458-4.rs:1:20 | LL | fn foo(b: bool) -> Result { - | --- ^^^^^^^^^^^^^^^^^^^ expected enum `Result`, found `()` + | --- ^^^^^^^^^^^^^^^^^^^ expected `Result`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression LL | Err("bar".to_string()); diff --git a/tests/ui/issues/issue-67039-unsound-pin-partialeq.stderr b/tests/ui/issues/issue-67039-unsound-pin-partialeq.stderr index 37e2c3bddc8c..6fde44eaf0ce 100644 --- a/tests/ui/issues/issue-67039-unsound-pin-partialeq.stderr +++ b/tests/ui/issues/issue-67039-unsound-pin-partialeq.stderr @@ -2,7 +2,7 @@ error[E0271]: type mismatch resolving ` as Deref>::Target == Rc --> $DIR/issue-67039-unsound-pin-partialeq.rs:25:29 | LL | let _ = Pin::new(Apple) == Rc::pin(Apple); - | ^^ expected struct `Apple`, found struct `Rc` + | ^^ expected `Apple`, found `Rc` | = note: expected struct `Apple` found struct `Rc` diff --git a/tests/ui/issues/issue-69306.stderr b/tests/ui/issues/issue-69306.stderr index 61ec5d3180cc..570677298ffa 100644 --- a/tests/ui/issues/issue-69306.stderr +++ b/tests/ui/issues/issue-69306.stderr @@ -22,7 +22,7 @@ error[E0308]: mismatched types LL | impl S0 { | - this type parameter LL | const C: S0 = Self(0); - | ^^^^^^^ expected `u8`, found type parameter `T` + | ^^^^^^^ expected `S0`, found `S0` | = note: expected struct `S0` found struct `S0` @@ -89,7 +89,7 @@ error[E0308]: mismatched types LL | impl S1 { | - this type parameter LL | const C: S1 = Self(0, 1); - | ^^^^^^^^^^ expected `u8`, found type parameter `T` + | ^^^^^^^^^^ expected `S1`, found `S1` | = note: expected struct `S1` found struct `S1` @@ -126,7 +126,7 @@ LL | fn map(x: U) -> S2 { | | | expected type parameter LL | Self(x) - | ^^^^^^^ expected type parameter `U`, found type parameter `T` + | ^^^^^^^ expected `S2`, found `S2` | = note: expected struct `S2` found struct `S2` diff --git a/tests/ui/issues/issue-7061.stderr b/tests/ui/issues/issue-7061.stderr index 27034378d3fc..a209f8a4249f 100644 --- a/tests/ui/issues/issue-7061.stderr +++ b/tests/ui/issues/issue-7061.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-7061.rs:4:46 | LL | fn foo(&'a mut self) -> Box { self } - | -------------- ^^^^ expected struct `Box`, found `&mut BarStruct` + | -------------- ^^^^ expected `Box`, found `&mut BarStruct` | | | expected `Box` because of return type | diff --git a/tests/ui/issues/issue-7092.rs b/tests/ui/issues/issue-7092.rs index 85bfbf90d9a2..c3c96c7d3f61 100644 --- a/tests/ui/issues/issue-7092.rs +++ b/tests/ui/issues/issue-7092.rs @@ -5,7 +5,7 @@ fn foo(x: Whatever) { match x { Some(field) => //~^ ERROR mismatched types -//~| expected enum `Whatever`, found enum `Option` +//~| expected `Whatever`, found `Option<_>` //~| expected enum `Whatever` //~| found enum `Option<_>` field.access(), diff --git a/tests/ui/issues/issue-7092.stderr b/tests/ui/issues/issue-7092.stderr index 59e8d75e236e..e35379fd1cfe 100644 --- a/tests/ui/issues/issue-7092.stderr +++ b/tests/ui/issues/issue-7092.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match x { | - this expression has type `Whatever` LL | Some(field) => - | ^^^^^^^^^^^ expected enum `Whatever`, found enum `Option` + | ^^^^^^^^^^^ expected `Whatever`, found `Option<_>` | = note: expected enum `Whatever` found enum `Option<_>` diff --git a/tests/ui/issues/issue-71676-1.stderr b/tests/ui/issues/issue-71676-1.stderr index 2104634eb935..164641ff7751 100644 --- a/tests/ui/issues/issue-71676-1.stderr +++ b/tests/ui/issues/issue-71676-1.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-71676-1.rs:43:24 | LL | let _: *const u8 = &a; - | --------- ^^ expected `u8`, found struct `Emm` + | --------- ^^ expected `*const u8`, found `&Emm` | | | expected due to this | @@ -32,7 +32,7 @@ error[E0308]: mismatched types --> $DIR/issue-71676-1.rs:49:24 | LL | let _: *const u8 = &mut a; - | --------- ^^^^^^ expected `u8`, found struct `Emm` + | --------- ^^^^^^ expected `*const u8`, found `&mut Emm` | | | expected due to this | @@ -47,7 +47,7 @@ error[E0308]: mismatched types --> $DIR/issue-71676-1.rs:52:22 | LL | let _: *mut u8 = &mut a; - | ------- ^^^^^^ expected `u8`, found struct `Emm` + | ------- ^^^^^^ expected `*mut u8`, found `&mut Emm` | | | expected due to this | diff --git a/tests/ui/issues/issue-74236/main.stderr b/tests/ui/issues/issue-74236/main.stderr index 55e94ae72c77..5cd64e48ab88 100644 --- a/tests/ui/issues/issue-74236/main.stderr +++ b/tests/ui/issues/issue-74236/main.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let () = dep::Renamed; | ^^ ------------ this expression has type `Renamed` | | - | expected struct `Renamed`, found `()` + | expected `Renamed`, found `()` error: aborting due to previous error diff --git a/tests/ui/issues/issue-76191.stderr b/tests/ui/issues/issue-76191.stderr index 13749804796b..32d9105b2599 100644 --- a/tests/ui/issues/issue-76191.stderr +++ b/tests/ui/issues/issue-76191.stderr @@ -9,7 +9,7 @@ LL | match n { LL | RANGE => {} | ^^^^^ | | - | expected `i32`, found struct `RangeInclusive` + | expected `i32`, found `RangeInclusive` | `RANGE` is interpreted as a constant, not a new binding | = note: expected type `i32` @@ -31,7 +31,7 @@ LL | match n { LL | RANGE2 => {} | ^^^^^^ | | - | expected `i32`, found struct `RangeInclusive` + | expected `i32`, found `RangeInclusive` | `RANGE2` is interpreted as a constant, not a new binding | = note: expected type `i32` diff --git a/tests/ui/issues/issue-7867.rs b/tests/ui/issues/issue-7867.rs index 3074052f14f2..e9fd10c6613d 100644 --- a/tests/ui/issues/issue-7867.rs +++ b/tests/ui/issues/issue-7867.rs @@ -6,7 +6,7 @@ fn main() { match (true, false) { A::B => (), //~^ ERROR mismatched types - //~| expected tuple, found enum `A` + //~| expected `(bool, bool)`, found `A` //~| expected tuple `(bool, bool)` //~| found enum `A` _ => () diff --git a/tests/ui/issues/issue-7867.stderr b/tests/ui/issues/issue-7867.stderr index 0d3121d60455..4fb1af344cda 100644 --- a/tests/ui/issues/issue-7867.stderr +++ b/tests/ui/issues/issue-7867.stderr @@ -7,7 +7,7 @@ LL | enum A { B, C } LL | match (true, false) { | ------------- this expression has type `(bool, bool)` LL | A::B => (), - | ^^^^ expected tuple, found enum `A` + | ^^^^ expected `(bool, bool)`, found `A` | = note: expected tuple `(bool, bool)` found enum `A` diff --git a/tests/ui/json/json-bom-plus-crlf-multifile.stderr b/tests/ui/json/json-bom-plus-crlf-multifile.stderr index 02f3bc687cba..84040e8050e9 100644 --- a/tests/ui/json/json-bom-plus-crlf-multifile.stderr +++ b/tests/ui/json/json-bom-plus-crlf-multifile.stderr @@ -24,7 +24,7 @@ This error occurs when an expression was used in a place where the compiler expected an expression of a different type. It can occur in several cases, the most common being when calling a function and passing an argument which has a different type than the matching type in the function declaration. -"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":621,"byte_end":622,"line_start":17,"line_end":17,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":22,"highlight_end":23}],"label":"expected struct `String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":612,"byte_end":618,"line_start":17,"line_end":17,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":622,"byte_end":622,"line_start":17,"line_end":17,"column_start":23,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":23,"highlight_end":23}],"label":null,"suggested_replacement":".to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf-multifile-aux.rs:17:22: error[E0308]: mismatched types +"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":621,"byte_end":622,"line_start":17,"line_end":17,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":22,"highlight_end":23}],"label":"expected `String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":612,"byte_end":618,"line_start":17,"line_end":17,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":622,"byte_end":622,"line_start":17,"line_end":17,"column_start":23,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":23,"highlight_end":23}],"label":null,"suggested_replacement":".to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf-multifile-aux.rs:17:22: error[E0308]: mismatched types "} {"message":"mismatched types","code":{"code":"E0308","explanation":"Expected type did not match the received type. @@ -52,7 +52,7 @@ This error occurs when an expression was used in a place where the compiler expected an expression of a different type. It can occur in several cases, the most common being when calling a function and passing an argument which has a different type than the matching type in the function declaration. -"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":681,"byte_end":682,"line_start":19,"line_end":19,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1","highlight_start":22,"highlight_end":23}],"label":"expected struct `String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":672,"byte_end":678,"line_start":19,"line_end":19,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = 1","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":682,"byte_end":682,"line_start":19,"line_end":19,"column_start":23,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1","highlight_start":23,"highlight_end":23}],"label":null,"suggested_replacement":".to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf-multifile-aux.rs:19:22: error[E0308]: mismatched types +"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":681,"byte_end":682,"line_start":19,"line_end":19,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1","highlight_start":22,"highlight_end":23}],"label":"expected `String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":672,"byte_end":678,"line_start":19,"line_end":19,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = 1","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":682,"byte_end":682,"line_start":19,"line_end":19,"column_start":23,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1","highlight_start":23,"highlight_end":23}],"label":null,"suggested_replacement":".to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf-multifile-aux.rs:19:22: error[E0308]: mismatched types "} {"message":"mismatched types","code":{"code":"E0308","explanation":"Expected type did not match the received type. @@ -80,7 +80,7 @@ This error occurs when an expression was used in a place where the compiler expected an expression of a different type. It can occur in several cases, the most common being when calling a function and passing an argument which has a different type than the matching type in the function declaration. -"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":745,"byte_end":746,"line_start":23,"line_end":23,"column_start":1,"column_end":2,"is_primary":true,"text":[{"text":"1; // Error after the newline.","highlight_start":1,"highlight_end":2}],"label":"expected struct `String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":735,"byte_end":741,"line_start":22,"line_end":22,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String =","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":746,"byte_end":746,"line_start":23,"line_end":23,"column_start":2,"column_end":2,"is_primary":true,"text":[{"text":"1; // Error after the newline.","highlight_start":2,"highlight_end":2}],"label":null,"suggested_replacement":".to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf-multifile-aux.rs:23:1: error[E0308]: mismatched types +"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":745,"byte_end":746,"line_start":23,"line_end":23,"column_start":1,"column_end":2,"is_primary":true,"text":[{"text":"1; // Error after the newline.","highlight_start":1,"highlight_end":2}],"label":"expected `String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":735,"byte_end":741,"line_start":22,"line_end":22,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String =","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":746,"byte_end":746,"line_start":23,"line_end":23,"column_start":2,"column_end":2,"is_primary":true,"text":[{"text":"1; // Error after the newline.","highlight_start":2,"highlight_end":2}],"label":null,"suggested_replacement":".to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf-multifile-aux.rs:23:1: error[E0308]: mismatched types "} {"message":"mismatched types","code":{"code":"E0308","explanation":"Expected type did not match the received type. @@ -108,7 +108,7 @@ This error occurs when an expression was used in a place where the compiler expected an expression of a different type. It can occur in several cases, the most common being when calling a function and passing an argument which has a different type than the matching type in the function declaration. -"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":801,"byte_end":809,"line_start":25,"line_end":26,"column_start":22,"column_end":6,"is_primary":true,"text":[{"text":" let s : String = (","highlight_start":22,"highlight_end":23},{"text":" ); // Error spanning the newline.","highlight_start":1,"highlight_end":6}],"label":"expected struct `String`, found `()`","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":792,"byte_end":798,"line_start":25,"line_end":25,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = (","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"$DIR/json-bom-plus-crlf-multifile-aux.rs:25:22: error[E0308]: mismatched types +"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":801,"byte_end":809,"line_start":25,"line_end":26,"column_start":22,"column_end":6,"is_primary":true,"text":[{"text":" let s : String = (","highlight_start":22,"highlight_end":23},{"text":" ); // Error spanning the newline.","highlight_start":1,"highlight_end":6}],"label":"expected `String`, found `()`","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf-multifile-aux.rs","byte_start":792,"byte_end":798,"line_start":25,"line_end":25,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = (","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"$DIR/json-bom-plus-crlf-multifile-aux.rs:25:22: error[E0308]: mismatched types "} {"message":"aborting due to 4 previous errors","code":null,"level":"error","spans":[],"children":[],"rendered":"error: aborting due to 4 previous errors "} diff --git a/tests/ui/json/json-bom-plus-crlf.stderr b/tests/ui/json/json-bom-plus-crlf.stderr index df6bd7286a61..b0f450e9ecc1 100644 --- a/tests/ui/json/json-bom-plus-crlf.stderr +++ b/tests/ui/json/json-bom-plus-crlf.stderr @@ -24,7 +24,7 @@ This error occurs when an expression was used in a place where the compiler expected an expression of a different type. It can occur in several cases, the most common being when calling a function and passing an argument which has a different type than the matching type in the function declaration. -"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":606,"byte_end":607,"line_start":16,"line_end":16,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":22,"highlight_end":23}],"label":"expected struct `String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":597,"byte_end":603,"line_start":16,"line_end":16,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":607,"byte_end":607,"line_start":16,"line_end":16,"column_start":23,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":23,"highlight_end":23}],"label":null,"suggested_replacement":".to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf.rs:16:22: error[E0308]: mismatched types +"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":606,"byte_end":607,"line_start":16,"line_end":16,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":22,"highlight_end":23}],"label":"expected `String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":597,"byte_end":603,"line_start":16,"line_end":16,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":607,"byte_end":607,"line_start":16,"line_end":16,"column_start":23,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":23,"highlight_end":23}],"label":null,"suggested_replacement":".to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf.rs:16:22: error[E0308]: mismatched types "} {"message":"mismatched types","code":{"code":"E0308","explanation":"Expected type did not match the received type. @@ -52,7 +52,7 @@ This error occurs when an expression was used in a place where the compiler expected an expression of a different type. It can occur in several cases, the most common being when calling a function and passing an argument which has a different type than the matching type in the function declaration. -"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":666,"byte_end":667,"line_start":18,"line_end":18,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1","highlight_start":22,"highlight_end":23}],"label":"expected struct `String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":657,"byte_end":663,"line_start":18,"line_end":18,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = 1","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":667,"byte_end":667,"line_start":18,"line_end":18,"column_start":23,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1","highlight_start":23,"highlight_end":23}],"label":null,"suggested_replacement":".to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf.rs:18:22: error[E0308]: mismatched types +"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":666,"byte_end":667,"line_start":18,"line_end":18,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1","highlight_start":22,"highlight_end":23}],"label":"expected `String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":657,"byte_end":663,"line_start":18,"line_end":18,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = 1","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":667,"byte_end":667,"line_start":18,"line_end":18,"column_start":23,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1","highlight_start":23,"highlight_end":23}],"label":null,"suggested_replacement":".to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf.rs:18:22: error[E0308]: mismatched types "} {"message":"mismatched types","code":{"code":"E0308","explanation":"Expected type did not match the received type. @@ -80,7 +80,7 @@ This error occurs when an expression was used in a place where the compiler expected an expression of a different type. It can occur in several cases, the most common being when calling a function and passing an argument which has a different type than the matching type in the function declaration. -"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":730,"byte_end":731,"line_start":22,"line_end":22,"column_start":1,"column_end":2,"is_primary":true,"text":[{"text":"1; // Error after the newline.","highlight_start":1,"highlight_end":2}],"label":"expected struct `String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":720,"byte_end":726,"line_start":21,"line_end":21,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String =","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":731,"byte_end":731,"line_start":22,"line_end":22,"column_start":2,"column_end":2,"is_primary":true,"text":[{"text":"1; // Error after the newline.","highlight_start":2,"highlight_end":2}],"label":null,"suggested_replacement":".to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf.rs:22:1: error[E0308]: mismatched types +"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":730,"byte_end":731,"line_start":22,"line_end":22,"column_start":1,"column_end":2,"is_primary":true,"text":[{"text":"1; // Error after the newline.","highlight_start":1,"highlight_end":2}],"label":"expected `String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":720,"byte_end":726,"line_start":21,"line_end":21,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String =","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":731,"byte_end":731,"line_start":22,"line_end":22,"column_start":2,"column_end":2,"is_primary":true,"text":[{"text":"1; // Error after the newline.","highlight_start":2,"highlight_end":2}],"label":null,"suggested_replacement":".to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf.rs:22:1: error[E0308]: mismatched types "} {"message":"mismatched types","code":{"code":"E0308","explanation":"Expected type did not match the received type. @@ -108,7 +108,7 @@ This error occurs when an expression was used in a place where the compiler expected an expression of a different type. It can occur in several cases, the most common being when calling a function and passing an argument which has a different type than the matching type in the function declaration. -"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":786,"byte_end":794,"line_start":24,"line_end":25,"column_start":22,"column_end":6,"is_primary":true,"text":[{"text":" let s : String = (","highlight_start":22,"highlight_end":23},{"text":" ); // Error spanning the newline.","highlight_start":1,"highlight_end":6}],"label":"expected struct `String`, found `()`","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":777,"byte_end":783,"line_start":24,"line_end":24,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = (","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"$DIR/json-bom-plus-crlf.rs:24:22: error[E0308]: mismatched types +"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":786,"byte_end":794,"line_start":24,"line_end":25,"column_start":22,"column_end":6,"is_primary":true,"text":[{"text":" let s : String = (","highlight_start":22,"highlight_end":23},{"text":" ); // Error spanning the newline.","highlight_start":1,"highlight_end":6}],"label":"expected `String`, found `()`","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":777,"byte_end":783,"line_start":24,"line_end":24,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = (","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"$DIR/json-bom-plus-crlf.rs:24:22: error[E0308]: mismatched types "} {"message":"aborting due to 4 previous errors","code":null,"level":"error","spans":[],"children":[],"rendered":"error: aborting due to 4 previous errors "} diff --git a/tests/ui/let-else/issue-94176.stderr b/tests/ui/let-else/issue-94176.stderr index 0cb97aceebfd..6a015aced6f4 100644 --- a/tests/ui/let-else/issue-94176.stderr +++ b/tests/ui/let-else/issue-94176.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-94176.rs:5:32 | LL | pub fn test(a: Option) -> Option { - | ---- ^^^^^^^^^^^ expected enum `Option`, found `()` + | ---- ^^^^^^^^^^^ expected `Option`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression | diff --git a/tests/ui/let-else/let-else-deref-coercion.stderr b/tests/ui/let-else/let-else-deref-coercion.stderr index bf78a079cdfa..143b838bac50 100644 --- a/tests/ui/let-else/let-else-deref-coercion.stderr +++ b/tests/ui/let-else/let-else-deref-coercion.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let Bar::Present(z) = self else { | ^^^^^^^^^^^^^^^ ---- this expression has type `&mut Foo` | | - | expected struct `Foo`, found enum `Bar` + | expected `Foo`, found `Bar` error[E0308]: mismatched types --> $DIR/let-else-deref-coercion.rs:68:13 @@ -12,7 +12,7 @@ error[E0308]: mismatched types LL | let Bar(z) = x; | ^^^^^^ - this expression has type `&mut irrefutable::Foo` | | - | expected struct `Foo`, found struct `Bar` + | expected `Foo`, found `Bar` error: aborting due to 2 previous errors diff --git a/tests/ui/let-else/let-else-non-diverging.stderr b/tests/ui/let-else/let-else-non-diverging.stderr index 78551fcc434a..661d905cd078 100644 --- a/tests/ui/let-else/let-else-non-diverging.stderr +++ b/tests/ui/let-else/let-else-non-diverging.stderr @@ -5,7 +5,7 @@ LL | let Some(x) = Some(1) else { | ________________________________^ LL | | Some(2) LL | | }; - | |_____^ expected `!`, found enum `Option` + | |_____^ expected `!`, found `Option<{integer}>` | = note: expected type `!` found enum `Option<{integer}>` @@ -32,7 +32,7 @@ error[E0308]: `else` clause of `let...else` does not diverge --> $DIR/let-else-non-diverging.rs:10:32 | LL | let Some(x) = Some(1) else { Some(2) }; - | ^^^^^^^^^^^ expected `!`, found enum `Option` + | ^^^^^^^^^^^ expected `!`, found `Option<{integer}>` | = note: expected type `!` found enum `Option<{integer}>` @@ -43,7 +43,7 @@ error[E0308]: `else` clause of `let...else` does not diverge --> $DIR/let-else-non-diverging.rs:15:32 | LL | let Some(x) = Some(1) else { foo::() }; - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `!`, found enum `Uninhabited` + | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `!`, found `Uninhabited` | = note: expected type `!` found enum `Uninhabited` diff --git a/tests/ui/let-else/let-else-ref-bindings.stderr b/tests/ui/let-else/let-else-ref-bindings.stderr index 56b9e073330a..ada1805e7256 100644 --- a/tests/ui/let-else/let-else-ref-bindings.stderr +++ b/tests/ui/let-else/let-else-ref-bindings.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/let-else-ref-bindings.rs:16:38 | LL | let Some(ref a): Option<&[u8]> = some else { return }; - | ^^^^ expected `&[u8]`, found struct `Vec` + | ^^^^ expected `Option<&[u8]>`, found `Option>` | = note: expected enum `Option<&[u8]>` found enum `Option>` @@ -11,7 +11,7 @@ error[E0308]: mismatched types --> $DIR/let-else-ref-bindings.rs:20:38 | LL | let Some(ref a): Option<&[u8]> = &some else { return }; - | ^^^^^ expected enum `Option`, found `&Option>` + | ^^^^^ expected `Option<&[u8]>`, found `&Option>` | = note: expected enum `Option<&[u8]>` found reference `&Option>` @@ -20,7 +20,7 @@ error[E0308]: mismatched types --> $DIR/let-else-ref-bindings.rs:24:34 | LL | let Some(a): Option<&[u8]> = some else { return }; - | ------------- ^^^^ expected `&[u8]`, found struct `Vec` + | ------------- ^^^^ expected `Option<&[u8]>`, found `Option>` | | | expected due to this | @@ -31,7 +31,7 @@ error[E0308]: mismatched types --> $DIR/let-else-ref-bindings.rs:27:34 | LL | let Some(a): Option<&[u8]> = &some else { return }; - | ------------- ^^^^^ expected enum `Option`, found `&Option>` + | ------------- ^^^^^ expected `Option<&[u8]>`, found `&Option>` | | | expected due to this | @@ -42,7 +42,7 @@ error[E0308]: mismatched types --> $DIR/let-else-ref-bindings.rs:44:46 | LL | let Some(ref mut a): Option<&mut [u8]> = some else { return }; - | ^^^^ expected `&mut [u8]`, found struct `Vec` + | ^^^^ expected `Option<&mut [u8]>`, found `Option>` | = note: expected enum `Option<&mut [u8]>` found enum `Option>` @@ -51,7 +51,7 @@ error[E0308]: mismatched types --> $DIR/let-else-ref-bindings.rs:48:46 | LL | let Some(ref mut a): Option<&mut [u8]> = &mut some else { return }; - | ^^^^^^^^^ expected enum `Option`, found mutable reference + | ^^^^^^^^^ expected `Option<&mut [u8]>`, found `&mut Option>` | = note: expected enum `Option<&mut [u8]>` found mutable reference `&mut Option>` @@ -60,7 +60,7 @@ error[E0308]: mismatched types --> $DIR/let-else-ref-bindings.rs:52:38 | LL | let Some(a): Option<&mut [u8]> = some else { return }; - | ----------------- ^^^^ expected `&mut [u8]`, found struct `Vec` + | ----------------- ^^^^ expected `Option<&mut [u8]>`, found `Option>` | | | expected due to this | @@ -71,7 +71,7 @@ error[E0308]: mismatched types --> $DIR/let-else-ref-bindings.rs:55:38 | LL | let Some(a): Option<&mut [u8]> = &mut some else { return }; - | ----------------- ^^^^^^^^^ expected enum `Option`, found mutable reference + | ----------------- ^^^^^^^^^ expected `Option<&mut [u8]>`, found `&mut Option>` | | | expected due to this | diff --git a/tests/ui/lifetimes/issue-17728.stderr b/tests/ui/lifetimes/issue-17728.stderr index 3b25902d757e..535073d6ebb0 100644 --- a/tests/ui/lifetimes/issue-17728.stderr +++ b/tests/ui/lifetimes/issue-17728.stderr @@ -9,7 +9,7 @@ LL | | "n" | "north" => RoomDirection::North, LL | | "down" => RoomDirection::Down, | | ------------------- this and all prior arms are found to be of type `RoomDirection` LL | | _ => None - | | ^^^^ expected enum `RoomDirection`, found enum `Option` + | | ^^^^ expected `RoomDirection`, found `Option<_>` LL | | } | |_____- `match` arms have incompatible types | diff --git a/tests/ui/lifetimes/issue-26638.stderr b/tests/ui/lifetimes/issue-26638.stderr index 98d39d614d0e..4dfacb938011 100644 --- a/tests/ui/lifetimes/issue-26638.stderr +++ b/tests/ui/lifetimes/issue-26638.stderr @@ -38,7 +38,7 @@ error[E0308]: mismatched types --> $DIR/issue-26638.rs:1:69 | LL | fn parse_type(iter: Box+'static>) -> &str { iter.next() } - | ---- ^^^^^^^^^^^ expected `&str`, found enum `Option` + | ---- ^^^^^^^^^^^ expected `&str`, found `Option<&str>` | | | expected `&'static str` because of return type | @@ -60,7 +60,7 @@ error[E0308]: mismatched types --> $DIR/issue-26638.rs:5:47 | LL | fn parse_type_2(iter: fn(&u8)->&u8) -> &str { iter() } - | ---- ^^^^^^ expected `str`, found `u8` + | ---- ^^^^^^ expected `&str`, found `&u8` | | | expected `&'static str` because of return type | diff --git a/tests/ui/lint/must_not_suspend/tuple-mismatch.stderr b/tests/ui/lint/must_not_suspend/tuple-mismatch.stderr index cca8cd9bd89f..294476107ef7 100644 --- a/tests/ui/lint/must_not_suspend/tuple-mismatch.stderr +++ b/tests/ui/lint/must_not_suspend/tuple-mismatch.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/tuple-mismatch.rs:6:20 | LL | yield ((), ()); - | ^^ expected tuple, found `()` + | ^^ expected `((), ())`, found `()` | = note: expected tuple `((), ())` found unit type `()` diff --git a/tests/ui/loops/loop-break-value.stderr b/tests/ui/loops/loop-break-value.stderr index ccb27c350707..5525dbb9005d 100644 --- a/tests/ui/loops/loop-break-value.stderr +++ b/tests/ui/loops/loop-break-value.stderr @@ -167,7 +167,7 @@ error[E0308]: mismatched types --> $DIR/loop-break-value.rs:80:15 | LL | break (break, break); - | ^^^^^^^^^^^^^^ expected `()`, found tuple + | ^^^^^^^^^^^^^^ expected `()`, found `(!, !)` | = note: expected unit type `()` found tuple `(!, !)` diff --git a/tests/ui/match/issue-12552.stderr b/tests/ui/match/issue-12552.stderr index 4b027eba2c25..195192fbd824 100644 --- a/tests/ui/match/issue-12552.stderr +++ b/tests/ui/match/issue-12552.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match t { | - this expression has type `Result<_, {integer}>` LL | Some(k) => match k { - | ^^^^^^^ expected enum `Result`, found enum `Option` + | ^^^^^^^ expected `Result<_, {integer}>`, found `Option<_>` | = note: expected enum `Result<_, {integer}>` found enum `Option<_>` @@ -20,7 +20,7 @@ LL | match t { | - this expression has type `Result<_, {integer}>` ... LL | None => () - | ^^^^ expected enum `Result`, found enum `Option` + | ^^^^ expected `Result<_, {integer}>`, found `Option<_>` | = note: expected enum `Result<_, {integer}>` found enum `Option<_>` diff --git a/tests/ui/match/issue-91058.stderr b/tests/ui/match/issue-91058.stderr index ec1d7e21fa53..12f37274b6b2 100644 --- a/tests/ui/match/issue-91058.stderr +++ b/tests/ui/match/issue-91058.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match array { | ----- this expression has type `[S; 1]` LL | [()] => {} - | ^^ expected struct `S`, found `()` + | ^^ expected `S`, found `()` error: aborting due to previous error diff --git a/tests/ui/match/match-struct.rs b/tests/ui/match/match-struct.rs index 7a54c54b98cb..4da7b436ba8a 100644 --- a/tests/ui/match/match-struct.rs +++ b/tests/ui/match/match-struct.rs @@ -5,7 +5,7 @@ fn main() { match (S { a: 1 }) { E::C(_) => (), //~^ ERROR mismatched types - //~| expected struct `S`, found enum `E` + //~| expected `S`, found `E` _ => () } } diff --git a/tests/ui/match/match-struct.stderr b/tests/ui/match/match-struct.stderr index a475bd5e5819..fdc6fd77077e 100644 --- a/tests/ui/match/match-struct.stderr +++ b/tests/ui/match/match-struct.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match (S { a: 1 }) { | ------------ this expression has type `S` LL | E::C(_) => (), - | ^^^^^^^ expected struct `S`, found enum `E` + | ^^^^^^^ expected `S`, found `E` error: aborting due to previous error diff --git a/tests/ui/match/match-tag-nullary.stderr b/tests/ui/match/match-tag-nullary.stderr index a6add31d1c51..aac873c760e7 100644 --- a/tests/ui/match/match-tag-nullary.stderr +++ b/tests/ui/match/match-tag-nullary.stderr @@ -5,7 +5,7 @@ LL | enum B { B } | - unit variant defined here LL | LL | fn main() { let x: A = A::A; match x { B::B => { } } } - | - ^^^^ expected enum `A`, found enum `B` + | - ^^^^ expected `A`, found `B` | | | this expression has type `A` diff --git a/tests/ui/match/match-tag-unary.stderr b/tests/ui/match/match-tag-unary.stderr index 31f77bdff8b1..25e8152d8cf5 100644 --- a/tests/ui/match/match-tag-unary.stderr +++ b/tests/ui/match/match-tag-unary.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/match-tag-unary.rs:4:43 | LL | fn main() { let x: A = A::A(0); match x { B::B(y) => { } } } - | - ^^^^^^^ expected enum `A`, found enum `B` + | - ^^^^^^^ expected `A`, found `B` | | | this expression has type `A` diff --git a/tests/ui/methods/issues/issue-61525.stderr b/tests/ui/methods/issues/issue-61525.stderr index 3e73b950a14e..32e269b7ad89 100644 --- a/tests/ui/methods/issues/issue-61525.stderr +++ b/tests/ui/methods/issues/issue-61525.stderr @@ -21,7 +21,7 @@ error[E0308]: mismatched types --> $DIR/issue-61525.rs:14:33 | LL | 1.query::("") - | --------------------- ^^ expected trait object `dyn ToString`, found `&str` + | --------------------- ^^ expected `dyn ToString`, found `&str` | | | arguments to this method are incorrect | diff --git a/tests/ui/methods/issues/issue-90315.stderr b/tests/ui/methods/issues/issue-90315.stderr index 4d3c086ff6e8..0466bb0a0c99 100644 --- a/tests/ui/methods/issues/issue-90315.stderr +++ b/tests/ui/methods/issues/issue-90315.stderr @@ -57,7 +57,7 @@ error[E0308]: mismatched types --> $DIR/issue-90315.rs:28:8 | LL | if 1..(end + 1).is_empty() { - | ^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `Range` + | ^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found `Range<{integer}>` | = note: expected type `bool` found struct `std::ops::Range<{integer}>` @@ -77,7 +77,7 @@ error[E0308]: mismatched types --> $DIR/issue-90315.rs:34:8 | LL | if 1..(end + 1).is_sorted() { - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `Range` + | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found `Range<{integer}>` | = note: expected type `bool` found struct `std::ops::Range<{integer}>` @@ -97,7 +97,7 @@ error[E0308]: mismatched types --> $DIR/issue-90315.rs:40:21 | LL | let _res: i32 = 3..6.take(2).sum(); - | --- ^^^^^^^^^^^^^^^^^^ expected `i32`, found struct `Range` + | --- ^^^^^^^^^^^^^^^^^^ expected `i32`, found `Range<{integer}>` | | | expected due to this | @@ -119,7 +119,7 @@ error[E0308]: mismatched types --> $DIR/issue-90315.rs:45:21 | LL | let _sum: i32 = 3..6.sum(); - | --- ^^^^^^^^^^ expected `i32`, found struct `Range` + | --- ^^^^^^^^^^ expected `i32`, found `Range<{integer}>` | | | expected due to this | @@ -158,7 +158,7 @@ error[E0308]: mismatched types --> $DIR/issue-90315.rs:62:8 | LL | if 1..end.error_method() { - | ^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `Range` + | ^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found `Range<{integer}>` | = note: expected type `bool` found struct `std::ops::Range<{integer}>` diff --git a/tests/ui/methods/method-self-arg-1.rs b/tests/ui/methods/method-self-arg-1.rs index f589f20d81dd..5912b4ec2c3c 100644 --- a/tests/ui/methods/method-self-arg-1.rs +++ b/tests/ui/methods/method-self-arg-1.rs @@ -9,9 +9,9 @@ impl Foo { fn main() { let x = Foo; Foo::bar(x); //~ ERROR mismatched types - //~| expected `&Foo`, found struct `Foo` + //~| expected `&Foo`, found `Foo` Foo::bar(&42); //~ ERROR mismatched types - //~| expected struct `Foo`, found integer + //~| expected `&Foo`, found `&{integer}` //~| expected reference `&Foo` //~| found reference `&{integer}` } diff --git a/tests/ui/methods/method-self-arg-1.stderr b/tests/ui/methods/method-self-arg-1.stderr index 01fec6fcaaee..32ab8dced219 100644 --- a/tests/ui/methods/method-self-arg-1.stderr +++ b/tests/ui/methods/method-self-arg-1.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | Foo::bar(x); | -------- ^ | | | - | | expected `&Foo`, found struct `Foo` + | | expected `&Foo`, found `Foo` | | help: consider borrowing here: `&x` | arguments to this function are incorrect | @@ -18,7 +18,7 @@ error[E0308]: mismatched types --> $DIR/method-self-arg-1.rs:13:14 | LL | Foo::bar(&42); - | -------- ^^^ expected struct `Foo`, found integer + | -------- ^^^ expected `&Foo`, found `&{integer}` | | | arguments to this function are incorrect | diff --git a/tests/ui/mismatched_types/abridged.stderr b/tests/ui/mismatched_types/abridged.stderr index ff1a836c9aec..6d2fb1ce9cf6 100644 --- a/tests/ui/mismatched_types/abridged.stderr +++ b/tests/ui/mismatched_types/abridged.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn a() -> Foo { | --- expected `Foo` because of return type LL | Some(Foo { bar: 1 }) - | ^^^^^^^^^^^^^^^^^^^^ expected struct `Foo`, found enum `Option` + | ^^^^^^^^^^^^^^^^^^^^ expected `Foo`, found `Option` | = note: expected struct `Foo` found enum `Option` @@ -15,7 +15,7 @@ error[E0308]: mismatched types LL | fn a2() -> Foo { | --- expected `Foo` because of return type LL | Ok(Foo { bar: 1}) - | ^^^^^^^^^^^^^^^^^ expected struct `Foo`, found enum `Result` + | ^^^^^^^^^^^^^^^^^ expected `Foo`, found `Result` | = note: expected struct `Foo` found enum `Result` @@ -26,7 +26,7 @@ error[E0308]: mismatched types LL | fn b() -> Option { | ----------- expected `Option` because of return type LL | Foo { bar: 1 } - | ^^^^^^^^^^^^^^ expected enum `Option`, found struct `Foo` + | ^^^^^^^^^^^^^^ expected `Option`, found `Foo` | = note: expected enum `Option` found struct `Foo` @@ -41,7 +41,7 @@ error[E0308]: mismatched types LL | fn c() -> Result { | ---------------- expected `Result` because of return type LL | Foo { bar: 1 } - | ^^^^^^^^^^^^^^ expected enum `Result`, found struct `Foo` + | ^^^^^^^^^^^^^^ expected `Result`, found `Foo` | = note: expected enum `Result` found struct `Foo` @@ -57,7 +57,7 @@ LL | fn d() -> X, String> { | ---------------------------- expected `X, String>` because of return type ... LL | x - | ^ expected struct `String`, found integer + | ^ expected `X, String>`, found `X, {integer}>` | = note: expected struct `X, String>` found struct `X, {integer}>` @@ -69,7 +69,7 @@ LL | fn e() -> X, String> { | ---------------------------- expected `X, String>` because of return type ... LL | x - | ^ expected struct `String`, found integer + | ^ expected `X, String>`, found `X, String>` | = note: expected struct `X, _>` found struct `X, _>` @@ -80,7 +80,7 @@ error[E0308]: mismatched types LL | fn f() -> String { | ------ expected `String` because of return type LL | 1+2 - | ^^^ expected struct `String`, found integer + | ^^^ expected `String`, found integer | help: try using a conversion method | @@ -93,7 +93,7 @@ error[E0308]: mismatched types LL | fn g() -> String { | ------ expected `String` because of return type LL | -2 - | ^^ expected struct `String`, found integer + | ^^ expected `String`, found integer | help: try using a conversion method | diff --git a/tests/ui/mismatched_types/do-not-suggest-boxed-trait-objects-instead-of-impl-trait.stderr b/tests/ui/mismatched_types/do-not-suggest-boxed-trait-objects-instead-of-impl-trait.stderr index 2f814445bbad..54abb50d6e8c 100644 --- a/tests/ui/mismatched_types/do-not-suggest-boxed-trait-objects-instead-of-impl-trait.stderr +++ b/tests/ui/mismatched_types/do-not-suggest-boxed-trait-objects-instead-of-impl-trait.stderr @@ -6,7 +6,7 @@ LL | | S | | - expected because of this LL | | } else { LL | | Y - | | ^ expected struct `S`, found struct `Y` + | | ^ expected `S`, found `Y` LL | | } | |_____- `if` and `else` have incompatible types @@ -17,7 +17,7 @@ LL | / match true { LL | | true => S, | | - this is found to be of type `S` LL | | false => Y, - | | ^ expected struct `S`, found struct `Y` + | | ^ expected `S`, found `Y` LL | | } | |_____- `match` arms have incompatible types diff --git a/tests/ui/mismatched_types/issue-106182.stderr b/tests/ui/mismatched_types/issue-106182.stderr index ac3ab8e9895c..96ab3a029914 100644 --- a/tests/ui/mismatched_types/issue-106182.stderr +++ b/tests/ui/mismatched_types/issue-106182.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match x { | - this expression has type `&_S` LL | _S(& (mut _y), _v) => { - | ^^^^^^^^^^ expected `u32`, found reference + | ^^^^^^^^^^ expected `u32`, found `&_` | = note: expected type `u32` found reference `&_` diff --git a/tests/ui/mismatched_types/issue-38371-unfixable.stderr b/tests/ui/mismatched_types/issue-38371-unfixable.stderr index 3c5e765abfbe..318285598a0b 100644 --- a/tests/ui/mismatched_types/issue-38371-unfixable.stderr +++ b/tests/ui/mismatched_types/issue-38371-unfixable.stderr @@ -10,7 +10,7 @@ error[E0308]: mismatched types LL | fn bgh(&&bar: u32) {} | ^^^^^ --- expected due to this | | - | expected `u32`, found reference + | expected `u32`, found `&_` | = note: expected type `u32` found reference `&_` diff --git a/tests/ui/mismatched_types/issue-38371.stderr b/tests/ui/mismatched_types/issue-38371.stderr index f43427f9832d..19335c446c3e 100644 --- a/tests/ui/mismatched_types/issue-38371.stderr +++ b/tests/ui/mismatched_types/issue-38371.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn foo(&_a: Foo) {} | ^^^ --- expected due to this | | - | expected struct `Foo`, found reference + | expected `Foo`, found `&_` | = note: expected struct `Foo` found reference `&_` @@ -20,7 +20,7 @@ error[E0308]: mismatched types LL | fn agh(&&_a: &u32) {} | ^^^ ---- expected due to this | | - | expected `u32`, found reference + | expected `u32`, found `&_` | = note: expected type `u32` found reference `&_` diff --git a/tests/ui/mismatched_types/non_zero_assigned_something.stderr b/tests/ui/mismatched_types/non_zero_assigned_something.stderr index d4b2c902f9b2..57db71f889cf 100644 --- a/tests/ui/mismatched_types/non_zero_assigned_something.stderr +++ b/tests/ui/mismatched_types/non_zero_assigned_something.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/non_zero_assigned_something.rs:2:35 | LL | let _: std::num::NonZeroU64 = 1; - | -------------------- ^ expected struct `NonZeroU64`, found integer + | -------------------- ^ expected `NonZeroU64`, found integer | | | expected due to this | @@ -15,7 +15,7 @@ error[E0308]: mismatched types --> $DIR/non_zero_assigned_something.rs:6:43 | LL | let _: Option = 1; - | ---------------------------- ^ expected enum `Option`, found integer + | ---------------------------- ^ expected `Option`, found integer | | | expected due to this | diff --git a/tests/ui/mismatched_types/normalize-fn-sig.stderr b/tests/ui/mismatched_types/normalize-fn-sig.stderr index 6c55f29c5d15..252e56387ba8 100644 --- a/tests/ui/mismatched_types/normalize-fn-sig.stderr +++ b/tests/ui/mismatched_types/normalize-fn-sig.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/normalize-fn-sig.rs:14:22 | LL | needs_i32_ref_fn(foo::<()>); - | ---------------- ^^^^^^^^^ expected `&i32`, found `i32` + | ---------------- ^^^^^^^^^ expected fn pointer, found fn item | | | arguments to this function are incorrect | diff --git a/tests/ui/mismatched_types/ref-pat-suggestions.stderr b/tests/ui/mismatched_types/ref-pat-suggestions.stderr index 63eaa3930b1c..62824004db5b 100644 --- a/tests/ui/mismatched_types/ref-pat-suggestions.stderr +++ b/tests/ui/mismatched_types/ref-pat-suggestions.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn _f0(&_a: u32) {} | ^^^ --- expected due to this | | - | expected `u32`, found reference + | expected `u32`, found `&_` | = note: expected type `u32` found reference `&_` @@ -41,7 +41,7 @@ error[E0308]: mismatched types LL | fn _f2(&&_a: &u32) {} | ^^^ ---- expected due to this | | - | expected `u32`, found reference + | expected `u32`, found `&_` | = note: expected type `u32` found reference `&_` @@ -57,7 +57,7 @@ error[E0308]: mismatched types LL | fn _f3(&mut &_a: &mut u32) {} | ^^^ -------- expected due to this | | - | expected `u32`, found reference + | expected `u32`, found `&_` | = note: expected type `u32` found reference `&_` @@ -106,7 +106,7 @@ LL | let _: fn(u32) = |&_a| (); | ^-- | || | |expected due to this - | expected `u32`, found reference + | expected `u32`, found `&_` | = note: expected type `u32` found reference `&_` @@ -145,7 +145,7 @@ LL | let _: fn(&u32) = |&&_a| (); | ^-- | || | |expected due to this - | expected `u32`, found reference + | expected `u32`, found `&_` | = note: expected type `u32` found reference `&_` @@ -162,7 +162,7 @@ LL | let _: fn(&mut u32) = |&mut &_a| (); | ^-- | || | |expected due to this - | expected `u32`, found reference + | expected `u32`, found `&_` | = note: expected type `u32` found reference `&_` @@ -212,7 +212,7 @@ error[E0308]: mismatched types LL | let _ = |&_a: u32| (); | ^^^ --- expected due to this | | - | expected `u32`, found reference + | expected `u32`, found `&_` | = note: expected type `u32` found reference `&_` @@ -249,7 +249,7 @@ error[E0308]: mismatched types LL | let _ = |&&_a: &u32| (); | ^^^ ---- expected due to this | | - | expected `u32`, found reference + | expected `u32`, found `&_` | = note: expected type `u32` found reference `&_` @@ -265,7 +265,7 @@ error[E0308]: mismatched types LL | let _ = |&mut &_a: &mut u32| (); | ^^^ -------- expected due to this | | - | expected `u32`, found reference + | expected `u32`, found `&_` | = note: expected type `u32` found reference `&_` diff --git a/tests/ui/mismatched_types/show_module.stderr b/tests/ui/mismatched_types/show_module.stderr index 5e48e0955aae..4bbeaaab9375 100644 --- a/tests/ui/mismatched_types/show_module.stderr +++ b/tests/ui/mismatched_types/show_module.stderr @@ -4,15 +4,15 @@ error[E0308]: mismatched types LL | fn foo() -> Foo { | --- expected `baz::Foo` because of return type LL | meh::Foo - | ^^^^^^^^ expected struct `baz::Foo`, found struct `meh::Foo` + | ^^^^^^^^ expected `baz::Foo`, found `meh::Foo` | - = note: struct `meh::Foo` and struct `baz::Foo` have similar names, but are actually distinct types -note: struct `meh::Foo` is defined in module `crate::meh` of the current crate + = note: `meh::Foo` and `baz::Foo` have similar names, but are actually distinct types +note: `meh::Foo` is defined in module `crate::meh` of the current crate --> $DIR/show_module.rs:8:5 | LL | pub struct Foo; | ^^^^^^^^^^^^^^ -note: struct `baz::Foo` is defined in module `crate::blah::baz` of the current crate +note: `baz::Foo` is defined in module `crate::blah::baz` of the current crate --> $DIR/show_module.rs:3:9 | LL | pub struct Foo; diff --git a/tests/ui/mismatched_types/similar_paths.stderr b/tests/ui/mismatched_types/similar_paths.stderr index 46a383325526..3e44fb759296 100644 --- a/tests/ui/mismatched_types/similar_paths.stderr +++ b/tests/ui/mismatched_types/similar_paths.stderr @@ -4,12 +4,12 @@ error[E0308]: mismatched types LL | pub fn foo() -> Option { | ---------- expected `Option` because of return type LL | Some(42_u8) - | ^^^^^^^^^^^ expected enum `Option`, found enum `std::option::Option` + | ^^^^^^^^^^^ expected `Option`, found `std::option::Option` | - = note: enum `std::option::Option` and enum `Option` have similar names, but are actually distinct types -note: enum `std::option::Option` is defined in crate `core` + = note: `std::option::Option` and `Option` have similar names, but are actually distinct types +note: `std::option::Option` is defined in crate `core` --> $SRC_DIR/core/src/option.rs:LL:COL -note: enum `Option` is defined in the current crate +note: `Option` is defined in the current crate --> $DIR/similar_paths.rs:1:1 | LL | enum Option { diff --git a/tests/ui/mismatched_types/similar_paths_primitive.stderr b/tests/ui/mismatched_types/similar_paths_primitive.stderr index 8a2f73945e84..80e78a4e4fa3 100644 --- a/tests/ui/mismatched_types/similar_paths_primitive.stderr +++ b/tests/ui/mismatched_types/similar_paths_primitive.stderr @@ -2,13 +2,13 @@ error[E0308]: mismatched types --> $DIR/similar_paths_primitive.rs:8:9 | LL | foo(true); - | --- ^^^^ expected struct `bool`, found `bool` + | --- ^^^^ expected `bool`, found a different `bool` | | | arguments to this function are incorrect | - = note: bool and struct `bool` have similar names, but are actually distinct types + = note: bool and `bool` have similar names, but are actually distinct types = note: bool is a primitive defined by the language -note: struct `bool` is defined in the current crate +note: `bool` is defined in the current crate --> $DIR/similar_paths_primitive.rs:3:1 | LL | struct bool; diff --git a/tests/ui/mismatched_types/suggest-boxed-trait-objects-instead-of-impl-trait.stderr b/tests/ui/mismatched_types/suggest-boxed-trait-objects-instead-of-impl-trait.stderr index f58b9c3ec16d..40182a75a989 100644 --- a/tests/ui/mismatched_types/suggest-boxed-trait-objects-instead-of-impl-trait.stderr +++ b/tests/ui/mismatched_types/suggest-boxed-trait-objects-instead-of-impl-trait.stderr @@ -6,7 +6,7 @@ LL | | S | | - expected because of this LL | | } else { LL | | Y - | | ^ expected struct `S`, found struct `Y` + | | ^ expected `S`, found `Y` LL | | } | |_____- `if` and `else` have incompatible types | @@ -28,7 +28,7 @@ LL | / match true { LL | | true => S, | | - this is found to be of type `S` LL | | false => Y, - | | ^ expected struct `S`, found struct `Y` + | | ^ expected `S`, found `Y` LL | | } | |_____- `match` arms have incompatible types | diff --git a/tests/ui/mismatched_types/suggest-removing-tuple-struct-field.stderr b/tests/ui/mismatched_types/suggest-removing-tuple-struct-field.stderr index 35871afb58b9..c5d0eef10265 100644 --- a/tests/ui/mismatched_types/suggest-removing-tuple-struct-field.stderr +++ b/tests/ui/mismatched_types/suggest-removing-tuple-struct-field.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/suggest-removing-tuple-struct-field.rs:11:13 | LL | some_fn(value.0); - | ------- ^^^^^^^ expected struct `MyWrapper`, found `u32` + | ------- ^^^^^^^ expected `MyWrapper`, found `u32` | | | arguments to this function are incorrect | @@ -21,7 +21,7 @@ error[E0308]: mismatched types --> $DIR/suggest-removing-tuple-struct-field.rs:12:13 | LL | some_fn(my_wrapper!(123).0); - | ------- ^^^^^^^^^^^^^^^^^^ expected struct `MyWrapper`, found `u32` + | ------- ^^^^^^^^^^^^^^^^^^ expected `MyWrapper`, found `u32` | | | arguments to this function are incorrect | diff --git a/tests/ui/mismatched_types/wrap-suggestion-privacy.stderr b/tests/ui/mismatched_types/wrap-suggestion-privacy.stderr index fdd92cbfc443..e20a0aa0e2ae 100644 --- a/tests/ui/mismatched_types/wrap-suggestion-privacy.stderr +++ b/tests/ui/mismatched_types/wrap-suggestion-privacy.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/wrap-suggestion-privacy.rs:12:19 | LL | needs_wrapper(0); - | ------------- ^ expected struct `Wrapper`, found integer + | ------------- ^ expected `Wrapper`, found integer | | | arguments to this function are incorrect | @@ -22,7 +22,7 @@ error[E0308]: mismatched types --> $DIR/wrap-suggestion-privacy.rs:17:20 | LL | needs_wrapping(0); - | -------------- ^ expected struct `Wrapping`, found integer + | -------------- ^ expected `Wrapping`, found integer | | | arguments to this function are incorrect | @@ -42,7 +42,7 @@ error[E0308]: mismatched types --> $DIR/wrap-suggestion-privacy.rs:22:17 | LL | needs_ready(Some(0)); - | ----------- ^^^^^^^ expected struct `Ready`, found enum `Option` + | ----------- ^^^^^^^ expected `Ready`, found `Option<{integer}>` | | | arguments to this function are incorrect | diff --git a/tests/ui/mut/mut-cross-borrowing.stderr b/tests/ui/mut/mut-cross-borrowing.stderr index ee739d6286a5..8401827e51f8 100644 --- a/tests/ui/mut/mut-cross-borrowing.stderr +++ b/tests/ui/mut/mut-cross-borrowing.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | f(x) | - ^ | | | - | | expected `&mut isize`, found struct `Box` + | | expected `&mut isize`, found `Box<{integer}>` | | help: consider mutably borrowing here: `&mut x` | arguments to this function are incorrect | diff --git a/tests/ui/never_type/diverging-tuple-parts-39485.stderr b/tests/ui/never_type/diverging-tuple-parts-39485.stderr index 52d07ae170c4..ded13e2707f5 100644 --- a/tests/ui/never_type/diverging-tuple-parts-39485.stderr +++ b/tests/ui/never_type/diverging-tuple-parts-39485.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/diverging-tuple-parts-39485.rs:8:5 | LL | &panic!() - | ^^^^^^^^^ expected `()`, found reference + | ^^^^^^^^^ expected `()`, found `&_` | = note: expected unit type `()` found reference `&_` @@ -22,7 +22,7 @@ error[E0308]: mismatched types LL | fn f() -> isize { | ----- expected `isize` because of return type LL | (return 1, return 2) - | ^^^^^^^^^^^^^^^^^^^^ expected `isize`, found tuple + | ^^^^^^^^^^^^^^^^^^^^ expected `isize`, found `(!, !)` | = note: expected type `isize` found tuple `(!, !)` diff --git a/tests/ui/never_type/issue-10176.rs b/tests/ui/never_type/issue-10176.rs index 6277aa05eb36..5ac4359c5016 100644 --- a/tests/ui/never_type/issue-10176.rs +++ b/tests/ui/never_type/issue-10176.rs @@ -3,7 +3,7 @@ fn f() -> isize { //~^ ERROR mismatched types //~| expected type `isize` //~| found tuple `(!, !)` -//~| expected `isize`, found tuple +//~| expected `isize`, found `(!, !)` } fn main() {} diff --git a/tests/ui/never_type/issue-10176.stderr b/tests/ui/never_type/issue-10176.stderr index cd5361ffad39..3f381b9aea9b 100644 --- a/tests/ui/never_type/issue-10176.stderr +++ b/tests/ui/never_type/issue-10176.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn f() -> isize { | ----- expected `isize` because of return type LL | (return 1, return 2) - | ^^^^^^^^^^^^^^^^^^^^ expected `isize`, found tuple + | ^^^^^^^^^^^^^^^^^^^^ expected `isize`, found `(!, !)` | = note: expected type `isize` found tuple `(!, !)` diff --git a/tests/ui/never_type/issue-52443.stderr b/tests/ui/never_type/issue-52443.stderr index 33b7a9185d0e..99dfce869034 100644 --- a/tests/ui/never_type/issue-52443.stderr +++ b/tests/ui/never_type/issue-52443.stderr @@ -19,7 +19,7 @@ error[E0308]: mismatched types --> $DIR/issue-52443.rs:2:10 | LL | [(); & { loop { continue } } ]; - | ^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found reference + | ^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&_` | = note: expected type `usize` found reference `&_` diff --git a/tests/ui/never_type/issue-96335.stderr b/tests/ui/never_type/issue-96335.stderr index e148b983e8e9..c3d80a425e05 100644 --- a/tests/ui/never_type/issue-96335.stderr +++ b/tests/ui/never_type/issue-96335.stderr @@ -19,7 +19,7 @@ error[E0308]: mismatched types LL | 0.....{loop{}1}; | ----^^^^^^^^^^^ | | | - | | expected integer, found struct `RangeTo` + | | expected integer, found `RangeTo<{integer}>` | arguments to this function are incorrect | = note: expected type `{integer}` diff --git a/tests/ui/noexporttypeexe.rs b/tests/ui/noexporttypeexe.rs index 964ac9a300e8..d473ad6c9c93 100644 --- a/tests/ui/noexporttypeexe.rs +++ b/tests/ui/noexporttypeexe.rs @@ -11,5 +11,5 @@ fn main() { //~^ ERROR mismatched types //~| expected type `isize` //~| found enum `Option` - //~| expected `isize`, found enum `Option` + //~| expected `isize`, found `Option` } diff --git a/tests/ui/noexporttypeexe.stderr b/tests/ui/noexporttypeexe.stderr index 7fc239613e2d..26bafd31d011 100644 --- a/tests/ui/noexporttypeexe.stderr +++ b/tests/ui/noexporttypeexe.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/noexporttypeexe.rs:10:18 | LL | let x: isize = noexporttypelib::foo(); - | ----- ^^^^^^^^^^^^^^^^^^^^^^ expected `isize`, found enum `Option` + | ----- ^^^^^^^^^^^^^^^^^^^^^^ expected `isize`, found `Option` | | | expected due to this | diff --git a/tests/ui/or-patterns/already-bound-name.stderr b/tests/ui/or-patterns/already-bound-name.stderr index 368782c1e0d0..795c46acb5d3 100644 --- a/tests/ui/or-patterns/already-bound-name.stderr +++ b/tests/ui/or-patterns/already-bound-name.stderr @@ -88,7 +88,7 @@ error[E0308]: mismatched types LL | let (B(A(a, _) | B(a)) | A(a, A(a, _) | B(a))) = B(B(1)); | - ^ ------- this expression has type `E>` | | | - | | expected integer, found enum `E` + | | expected integer, found `E<{integer}>` | first introduced with type `{integer}` here | = note: expected type `{integer}` diff --git a/tests/ui/or-patterns/nested-undelimited-precedence.stderr b/tests/ui/or-patterns/nested-undelimited-precedence.stderr index 2e25d8b3e7b0..5a63e621f4a3 100644 --- a/tests/ui/or-patterns/nested-undelimited-precedence.stderr +++ b/tests/ui/or-patterns/nested-undelimited-precedence.stderr @@ -42,7 +42,7 @@ error[E0308]: mismatched types LL | let &A(_) | B(_): F = A(3); | ^^^^^ - expected due to this | | - | expected enum `F`, found reference + | expected `F`, found `&_` | = note: expected enum `F` found reference `&_` @@ -53,7 +53,7 @@ error[E0308]: mismatched types LL | let &&A(_) | B(_): F = A(3); | ^^^^^^ - expected due to this | | - | expected enum `F`, found reference + | expected `F`, found `&_` | = note: expected enum `F` found reference `&_` @@ -64,7 +64,7 @@ error[E0308]: mismatched types LL | let &mut A(_) | B(_): F = A(3); | ^^^^^^^^^ - expected due to this | | - | expected enum `F`, found `&mut _` + | expected `F`, found `&mut _` | = note: expected enum `F` found mutable reference `&mut _` @@ -75,7 +75,7 @@ error[E0308]: mismatched types LL | let &&mut A(_) | B(_): F = A(3); | ^^^^^^^^^^ - expected due to this | | - | expected enum `F`, found reference + | expected `F`, found `&_` | = note: expected enum `F` found reference `&_` diff --git a/tests/ui/parser/issues/issue-87812-path.stderr b/tests/ui/parser/issues/issue-87812-path.stderr index f8ee0517533c..d045f4821ff3 100644 --- a/tests/ui/parser/issues/issue-87812-path.stderr +++ b/tests/ui/parser/issues/issue-87812-path.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-87812-path.rs:3:24 | LL | let _: usize = $f; - | ----- ^^ expected `usize`, found struct `Baz` + | ----- ^^ expected `usize`, found `Baz` | | | expected due to this ... diff --git a/tests/ui/parser/recover-range-pats.stderr b/tests/ui/parser/recover-range-pats.stderr index c54f13e01852..5b69ca5cd6df 100644 --- a/tests/ui/parser/recover-range-pats.stderr +++ b/tests/ui/parser/recover-range-pats.stderr @@ -314,7 +314,7 @@ error[E0308]: mismatched types LL | if let X.. .0 = 0 {} | - ^^ - this expression has type `u8` | | | - | | expected integer, found floating-point number + | | expected `u8`, found floating-point number | this is of type `u8` | = note: expected type `u8` @@ -351,7 +351,7 @@ error[E0308]: mismatched types LL | if let X..=.0 = 0 {} | - ^^ - this expression has type `u8` | | | - | | expected integer, found floating-point number + | | expected `u8`, found floating-point number | this is of type `u8` | = note: expected type `u8` @@ -388,7 +388,7 @@ error[E0308]: mismatched types LL | if let X... .0 = 0 {} | - ^^ - this expression has type `u8` | | | - | | expected integer, found floating-point number + | | expected `u8`, found floating-point number | this is of type `u8` | = note: expected type `u8` diff --git a/tests/ui/parser/unclosed-delimiter-in-dep.stderr b/tests/ui/parser/unclosed-delimiter-in-dep.stderr index 1366ef1bba8b..d1725c60dbbe 100644 --- a/tests/ui/parser/unclosed-delimiter-in-dep.stderr +++ b/tests/ui/parser/unclosed-delimiter-in-dep.stderr @@ -13,7 +13,7 @@ error[E0308]: mismatched types --> $DIR/unclosed-delimiter-in-dep.rs:4:20 | LL | let _: usize = unclosed_delim_mod::new(); - | ----- ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found enum `Result` + | ----- ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `Result` | | | expected due to this | diff --git a/tests/ui/pattern/for-loop-bad-item.stderr b/tests/ui/pattern/for-loop-bad-item.stderr index f064a25a9c9a..67c6d6f01a17 100644 --- a/tests/ui/pattern/for-loop-bad-item.stderr +++ b/tests/ui/pattern/for-loop-bad-item.stderr @@ -25,7 +25,7 @@ error[E0308]: mismatched types LL | for Some(Qux(_)) | None in [Some(""), None] { | ^^^^^^ ---------------- this is an iterator with items of type `Option<&str>` | | - | expected `str`, found struct `Qux` + | expected `str`, found `Qux` error: aborting due to 2 previous errors diff --git a/tests/ui/pattern/issue-67037-pat-tup-scrut-ty-diff-less-fields.stderr b/tests/ui/pattern/issue-67037-pat-tup-scrut-ty-diff-less-fields.stderr index 75a231f6b4ba..daab3a862c2e 100644 --- a/tests/ui/pattern/issue-67037-pat-tup-scrut-ty-diff-less-fields.stderr +++ b/tests/ui/pattern/issue-67037-pat-tup-scrut-ty-diff-less-fields.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let P() = U {}; | ^^^ ---- this expression has type `U` | | - | expected struct `U`, found struct `P` + | expected `U`, found `P<_>` | = note: expected struct `U` found struct `P<_>` diff --git a/tests/ui/pattern/pat-struct-field-expr-has-type.stderr b/tests/ui/pattern/pat-struct-field-expr-has-type.stderr index 3a61d4293b01..029075293106 100644 --- a/tests/ui/pattern/pat-struct-field-expr-has-type.stderr +++ b/tests/ui/pattern/pat-struct-field-expr-has-type.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match (S { f: 42 }) { | ------------- this expression has type `S` LL | S { f: Ok(_) } => {} - | ^^^^^ expected `u8`, found enum `Result` + | ^^^^^ expected `u8`, found `Result<_, _>` | = note: expected type `u8` found enum `Result<_, _>` diff --git a/tests/ui/pattern/pat-type-err-formal-param.stderr b/tests/ui/pattern/pat-type-err-formal-param.stderr index 206713a4bfc3..4f482c52a98f 100644 --- a/tests/ui/pattern/pat-type-err-formal-param.stderr +++ b/tests/ui/pattern/pat-type-err-formal-param.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn foo(Tuple(_): String) {} | ^^^^^^^^ ------ expected due to this | | - | expected struct `String`, found struct `Tuple` + | expected `String`, found `Tuple` error: aborting due to previous error diff --git a/tests/ui/pattern/pat-type-err-let-stmt.stderr b/tests/ui/pattern/pat-type-err-let-stmt.stderr index 090bd67117ea..b68b69a78a2f 100644 --- a/tests/ui/pattern/pat-type-err-let-stmt.stderr +++ b/tests/ui/pattern/pat-type-err-let-stmt.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/pat-type-err-let-stmt.rs:6:29 | LL | let Ok(0): Option = 42u8; - | ---------- ^^^^ expected enum `Option`, found `u8` + | ---------- ^^^^ expected `Option`, found `u8` | | | expected due to this | @@ -19,7 +19,7 @@ error[E0308]: mismatched types LL | let Ok(0): Option = 42u8; | ^^^^^ ---------- expected due to this | | - | expected enum `Option`, found enum `Result` + | expected `Option`, found `Result<_, _>` | = note: expected enum `Option` found enum `Result<_, _>` @@ -30,7 +30,7 @@ error[E0308]: mismatched types LL | let Ok(0): Option; | ^^^^^ ---------- expected due to this | | - | expected enum `Option`, found enum `Result` + | expected `Option`, found `Result<_, _>` | = note: expected enum `Option` found enum `Result<_, _>` @@ -41,7 +41,7 @@ error[E0308]: mismatched types LL | let Ok(0) = 42u8; | ^^^^^ ---- this expression has type `u8` | | - | expected `u8`, found enum `Result` + | expected `u8`, found `Result<_, _>` | = note: expected type `u8` found enum `Result<_, _>` diff --git a/tests/ui/pattern/pattern-error-continue.rs b/tests/ui/pattern/pattern-error-continue.rs index 0702a9986fc1..bed949439237 100644 --- a/tests/ui/pattern/pattern-error-continue.rs +++ b/tests/ui/pattern/pattern-error-continue.rs @@ -21,7 +21,7 @@ fn main() { match 'c' { S { .. } => (), //~^ ERROR mismatched types - //~| expected `char`, found struct `S` + //~| expected `char`, found `S` _ => () } diff --git a/tests/ui/pattern/pattern-error-continue.stderr b/tests/ui/pattern/pattern-error-continue.stderr index 4c2eff63ab5e..e1349fb02ea7 100644 --- a/tests/ui/pattern/pattern-error-continue.stderr +++ b/tests/ui/pattern/pattern-error-continue.stderr @@ -40,7 +40,7 @@ error[E0308]: mismatched types LL | match 'c' { | --- this expression has type `char` LL | S { .. } => (), - | ^^^^^^^^ expected `char`, found struct `S` + | ^^^^^^^^ expected `char`, found `S` error[E0308]: mismatched types --> $DIR/pattern-error-continue.rs:28:7 diff --git a/tests/ui/pattern/pattern-ident-path-generics.stderr b/tests/ui/pattern/pattern-ident-path-generics.stderr index 01b082bd35b0..62283dfe9b64 100644 --- a/tests/ui/pattern/pattern-ident-path-generics.stderr +++ b/tests/ui/pattern/pattern-ident-path-generics.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match Some("foo") { | ----------- this expression has type `Option<&str>` LL | None:: => {} - | ^^^^^^^^^^^^^ expected `&str`, found `isize` + | ^^^^^^^^^^^^^ expected `Option<&str>`, found `Option` | = note: expected enum `Option<&str>` found enum `Option` diff --git a/tests/ui/pattern/pattern-tyvar.stderr b/tests/ui/pattern/pattern-tyvar.stderr index f1e2a9d72cec..4eb00254861d 100644 --- a/tests/ui/pattern/pattern-tyvar.stderr +++ b/tests/ui/pattern/pattern-tyvar.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match t { | - this expression has type `Bar` LL | Bar::T1(_, Some::(x)) => { - | ^^^^^^^^^^^^^^^^ expected struct `Vec`, found `isize` + | ^^^^^^^^^^^^^^^^ expected `Option>`, found `Option` | = note: expected enum `Option>` found enum `Option` diff --git a/tests/ui/point-to-type-err-cause-on-impl-trait-return-2.stderr b/tests/ui/point-to-type-err-cause-on-impl-trait-return-2.stderr index f5a5f1ab37ae..a8d0d6236040 100644 --- a/tests/ui/point-to-type-err-cause-on-impl-trait-return-2.stderr +++ b/tests/ui/point-to-type-err-cause-on-impl-trait-return-2.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/point-to-type-err-cause-on-impl-trait-return-2.rs:9:41 | LL | let value: &bool = unsafe { &42 }; - | ^^^ expected `bool`, found integer + | ^^^ expected `&bool`, found `&{integer}` | = note: expected reference `&bool` found reference `&{integer}` diff --git a/tests/ui/proc-macro/break-token-spans.stderr b/tests/ui/proc-macro/break-token-spans.stderr index 0a0322b8a3ee..e69cc3b8cf59 100644 --- a/tests/ui/proc-macro/break-token-spans.stderr +++ b/tests/ui/proc-macro/break-token-spans.stderr @@ -8,7 +8,7 @@ error[E0308]: mismatched types --> $DIR/break-token-spans.rs:14:32 | LL | let a: Option>= true; - | ------------------ ^^^^ expected enum `Option`, found `bool` + | ------------------ ^^^^ expected `Option>`, found `bool` | | | expected due to this | diff --git a/tests/ui/proc-macro/issue-37788.stderr b/tests/ui/proc-macro/issue-37788.stderr index 345520d4852a..e437bb90b1df 100644 --- a/tests/ui/proc-macro/issue-37788.stderr +++ b/tests/ui/proc-macro/issue-37788.stderr @@ -7,7 +7,7 @@ LL | // Test that constructing the `visible_parent_map` (in `cstore_impl.rs` LL | std::cell::Cell::new(0) | ^^^^^^^^^^^^^^^^^^^^^^^- help: consider using a semicolon here: `;` | | - | expected `()`, found struct `Cell` + | expected `()`, found `Cell<{integer}>` | = note: expected unit type `()` found struct `Cell<{integer}>` diff --git a/tests/ui/proc-macro/resolved-located-at.stderr b/tests/ui/proc-macro/resolved-located-at.stderr index 422820e9d8bd..0b4dbcba6828 100644 --- a/tests/ui/proc-macro/resolved-located-at.stderr +++ b/tests/ui/proc-macro/resolved-located-at.stderr @@ -12,7 +12,7 @@ error[E0308]: mismatched types LL | fn main() { | - expected `()` because of default return type LL | resolve_located_at!(a b) - | ^ expected `()`, found struct `S` + | ^ expected `()`, found `S` | = note: this error originates in the macro `resolve_located_at` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/range/issue-54505-no-literals.stderr b/tests/ui/range/issue-54505-no-literals.stderr index 070dc844563c..d112983848de 100644 --- a/tests/ui/range/issue-54505-no-literals.stderr +++ b/tests/ui/range/issue-54505-no-literals.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | take_range(std::ops::Range { start: 0, end: 1 }); | ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | - | | expected reference, found struct `Range` + | | expected `&_`, found `Range<{integer}>` | | help: consider borrowing here: `&std::ops::Range { start: 0, end: 1 }` | arguments to this function are incorrect | @@ -22,7 +22,7 @@ error[E0308]: mismatched types LL | take_range(::std::ops::Range { start: 0, end: 1 }); | ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | - | | expected reference, found struct `Range` + | | expected `&_`, found `Range<{integer}>` | | help: consider borrowing here: `&::std::ops::Range { start: 0, end: 1 }` | arguments to this function are incorrect | @@ -40,7 +40,7 @@ error[E0308]: mismatched types LL | take_range(std::ops::RangeFrom { start: 1 }); | ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | - | | expected reference, found struct `RangeFrom` + | | expected `&_`, found `RangeFrom<{integer}>` | | help: consider borrowing here: `&std::ops::RangeFrom { start: 1 }` | arguments to this function are incorrect | @@ -58,7 +58,7 @@ error[E0308]: mismatched types LL | take_range(::std::ops::RangeFrom { start: 1 }); | ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | - | | expected reference, found struct `RangeFrom` + | | expected `&_`, found `RangeFrom<{integer}>` | | help: consider borrowing here: `&::std::ops::RangeFrom { start: 1 }` | arguments to this function are incorrect | @@ -76,7 +76,7 @@ error[E0308]: mismatched types LL | take_range(std::ops::RangeFull {}); | ---------- ^^^^^^^^^^^^^^^^^^^^^^ | | | - | | expected reference, found struct `RangeFull` + | | expected `&_`, found `RangeFull` | | help: consider borrowing here: `&std::ops::RangeFull {}` | arguments to this function are incorrect | @@ -94,7 +94,7 @@ error[E0308]: mismatched types LL | take_range(::std::ops::RangeFull {}); | ---------- ^^^^^^^^^^^^^^^^^^^^^^^^ | | | - | | expected reference, found struct `RangeFull` + | | expected `&_`, found `RangeFull` | | help: consider borrowing here: `&::std::ops::RangeFull {}` | arguments to this function are incorrect | @@ -112,7 +112,7 @@ error[E0308]: mismatched types LL | take_range(std::ops::RangeInclusive::new(0, 1)); | ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | - | | expected reference, found struct `RangeInclusive` + | | expected `&_`, found `RangeInclusive<{integer}>` | | help: consider borrowing here: `&std::ops::RangeInclusive::new(0, 1)` | arguments to this function are incorrect | @@ -130,7 +130,7 @@ error[E0308]: mismatched types LL | take_range(::std::ops::RangeInclusive::new(0, 1)); | ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | - | | expected reference, found struct `RangeInclusive` + | | expected `&_`, found `RangeInclusive<{integer}>` | | help: consider borrowing here: `&::std::ops::RangeInclusive::new(0, 1)` | arguments to this function are incorrect | @@ -148,7 +148,7 @@ error[E0308]: mismatched types LL | take_range(std::ops::RangeTo { end: 5 }); | ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | - | | expected reference, found struct `RangeTo` + | | expected `&_`, found `RangeTo<{integer}>` | | help: consider borrowing here: `&std::ops::RangeTo { end: 5 }` | arguments to this function are incorrect | @@ -166,7 +166,7 @@ error[E0308]: mismatched types LL | take_range(::std::ops::RangeTo { end: 5 }); | ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | - | | expected reference, found struct `RangeTo` + | | expected `&_`, found `RangeTo<{integer}>` | | help: consider borrowing here: `&::std::ops::RangeTo { end: 5 }` | arguments to this function are incorrect | @@ -184,7 +184,7 @@ error[E0308]: mismatched types LL | take_range(std::ops::RangeToInclusive { end: 5 }); | ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | - | | expected reference, found struct `RangeToInclusive` + | | expected `&_`, found `RangeToInclusive<{integer}>` | | help: consider borrowing here: `&std::ops::RangeToInclusive { end: 5 }` | arguments to this function are incorrect | @@ -202,7 +202,7 @@ error[E0308]: mismatched types LL | take_range(::std::ops::RangeToInclusive { end: 5 }); | ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | - | | expected reference, found struct `RangeToInclusive` + | | expected `&_`, found `RangeToInclusive<{integer}>` | | help: consider borrowing here: `&::std::ops::RangeToInclusive { end: 5 }` | arguments to this function are incorrect | diff --git a/tests/ui/range/issue-54505-no-std.stderr b/tests/ui/range/issue-54505-no-std.stderr index 9fb0e54a8a9b..a6a9f89da749 100644 --- a/tests/ui/range/issue-54505-no-std.stderr +++ b/tests/ui/range/issue-54505-no-std.stderr @@ -16,7 +16,7 @@ error[E0308]: mismatched types LL | take_range(0..1); | ---------- ^^^^ | | | - | | expected reference, found struct `Range` + | | expected `&_`, found `Range<{integer}>` | | help: consider borrowing here: `&(0..1)` | arguments to this function are incorrect | @@ -34,7 +34,7 @@ error[E0308]: mismatched types LL | take_range(1..); | ---------- ^^^ | | | - | | expected reference, found struct `RangeFrom` + | | expected `&_`, found `RangeFrom<{integer}>` | | help: consider borrowing here: `&(1..)` | arguments to this function are incorrect | @@ -52,7 +52,7 @@ error[E0308]: mismatched types LL | take_range(..); | ---------- ^^ | | | - | | expected reference, found struct `RangeFull` + | | expected `&_`, found `RangeFull` | | help: consider borrowing here: `&(..)` | arguments to this function are incorrect | @@ -70,7 +70,7 @@ error[E0308]: mismatched types LL | take_range(0..=1); | ---------- ^^^^^ | | | - | | expected reference, found struct `RangeInclusive` + | | expected `&_`, found `RangeInclusive<{integer}>` | | help: consider borrowing here: `&(0..=1)` | arguments to this function are incorrect | @@ -88,7 +88,7 @@ error[E0308]: mismatched types LL | take_range(..5); | ---------- ^^^ | | | - | | expected reference, found struct `RangeTo` + | | expected `&_`, found `RangeTo<{integer}>` | | help: consider borrowing here: `&(..5)` | arguments to this function are incorrect | @@ -106,7 +106,7 @@ error[E0308]: mismatched types LL | take_range(..=42); | ---------- ^^^^^ | | | - | | expected reference, found struct `RangeToInclusive` + | | expected `&_`, found `RangeToInclusive<{integer}>` | | help: consider borrowing here: `&(..=42)` | arguments to this function are incorrect | diff --git a/tests/ui/range/issue-54505.stderr b/tests/ui/range/issue-54505.stderr index 9eec169404cd..eda047b507a3 100644 --- a/tests/ui/range/issue-54505.stderr +++ b/tests/ui/range/issue-54505.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | take_range(0..1); | ---------- ^^^^ | | | - | | expected reference, found struct `Range` + | | expected `&_`, found `Range<{integer}>` | | help: consider borrowing here: `&(0..1)` | arguments to this function are incorrect | @@ -22,7 +22,7 @@ error[E0308]: mismatched types LL | take_range(1..); | ---------- ^^^ | | | - | | expected reference, found struct `RangeFrom` + | | expected `&_`, found `RangeFrom<{integer}>` | | help: consider borrowing here: `&(1..)` | arguments to this function are incorrect | @@ -40,7 +40,7 @@ error[E0308]: mismatched types LL | take_range(..); | ---------- ^^ | | | - | | expected reference, found struct `RangeFull` + | | expected `&_`, found `RangeFull` | | help: consider borrowing here: `&(..)` | arguments to this function are incorrect | @@ -58,7 +58,7 @@ error[E0308]: mismatched types LL | take_range(0..=1); | ---------- ^^^^^ | | | - | | expected reference, found struct `RangeInclusive` + | | expected `&_`, found `RangeInclusive<{integer}>` | | help: consider borrowing here: `&(0..=1)` | arguments to this function are incorrect | @@ -76,7 +76,7 @@ error[E0308]: mismatched types LL | take_range(..5); | ---------- ^^^ | | | - | | expected reference, found struct `RangeTo` + | | expected `&_`, found `RangeTo<{integer}>` | | help: consider borrowing here: `&(..5)` | arguments to this function are incorrect | @@ -94,7 +94,7 @@ error[E0308]: mismatched types LL | take_range(..=42); | ---------- ^^^^^ | | | - | | expected reference, found struct `RangeToInclusive` + | | expected `&_`, found `RangeToInclusive<{integer}>` | | help: consider borrowing here: `&(..=42)` | arguments to this function are incorrect | diff --git a/tests/ui/range/issue-73553-misinterp-range-literal.stderr b/tests/ui/range/issue-73553-misinterp-range-literal.stderr index d08d9b1345d4..77595b3678eb 100644 --- a/tests/ui/range/issue-73553-misinterp-range-literal.stderr +++ b/tests/ui/range/issue-73553-misinterp-range-literal.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | demo(tell(1)..tell(10)); | ---- ^^^^^^^^^^^^^^^^^ | | | - | | expected `&Range`, found struct `Range` + | | expected `&Range`, found `Range` | | help: consider borrowing here: `&(tell(1)..tell(10))` | arguments to this function are incorrect | @@ -22,7 +22,7 @@ error[E0308]: mismatched types LL | demo(1..10); | ---- ^^^^^ | | | - | | expected `&Range`, found struct `Range` + | | expected `&Range`, found `Range<{integer}>` | | help: consider borrowing here: `&(1..10)` | arguments to this function are incorrect | diff --git a/tests/ui/repeat-expr/repeat_count.rs b/tests/ui/repeat-expr/repeat_count.rs index 96abff4ab413..18610bc5bb08 100644 --- a/tests/ui/repeat-expr/repeat_count.rs +++ b/tests/ui/repeat-expr/repeat_count.rs @@ -30,5 +30,5 @@ fn main() { } let g = [0; G { g: () }]; //~^ ERROR mismatched types - //~| expected `usize`, found struct `G` + //~| expected `usize`, found `G` } diff --git a/tests/ui/repeat-expr/repeat_count.stderr b/tests/ui/repeat-expr/repeat_count.stderr index e222c141f8b6..8a1ed8f3b9c7 100644 --- a/tests/ui/repeat-expr/repeat_count.stderr +++ b/tests/ui/repeat-expr/repeat_count.stderr @@ -34,7 +34,7 @@ error[E0308]: mismatched types --> $DIR/repeat_count.rs:31:17 | LL | let g = [0; G { g: () }]; - | ^^^^^^^^^^^ expected `usize`, found struct `G` + | ^^^^^^^^^^^ expected `usize`, found `G` error[E0308]: mismatched types --> $DIR/repeat_count.rs:19:17 diff --git a/tests/ui/resolve/name-clash-nullary.stderr b/tests/ui/resolve/name-clash-nullary.stderr index 76c4b5914c16..fffd3027afdb 100644 --- a/tests/ui/resolve/name-clash-nullary.stderr +++ b/tests/ui/resolve/name-clash-nullary.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let None: isize = 42; | ^^^^ ----- expected due to this | | - | expected `isize`, found enum `Option` + | expected `isize`, found `Option<_>` | = note: expected type `isize` found enum `Option<_>` diff --git a/tests/ui/resolve/privacy-enum-ctor.stderr b/tests/ui/resolve/privacy-enum-ctor.stderr index a24fe4d23ea2..3c051429fd0e 100644 --- a/tests/ui/resolve/privacy-enum-ctor.stderr +++ b/tests/ui/resolve/privacy-enum-ctor.stderr @@ -267,7 +267,7 @@ LL | Fn(u8), | -- `Fn` defines an enum variant constructor here, which should be called ... LL | let _: Z = Z::Fn; - | - ^^^^^ expected enum `Z`, found enum constructor + | - ^^^^^ expected `Z`, found enum constructor | | | expected due to this | @@ -308,7 +308,7 @@ LL | Fn(u8), | -- `Fn` defines an enum variant constructor here, which should be called ... LL | let _: E = m::E::Fn; - | - ^^^^^^^^ expected enum `E`, found enum constructor + | - ^^^^^^^^ expected `E`, found enum constructor | | | expected due to this | @@ -349,7 +349,7 @@ LL | Fn(u8), | -- `Fn` defines an enum variant constructor here, which should be called ... LL | let _: E = E::Fn; - | - ^^^^^ expected enum `E`, found enum constructor + | - ^^^^^ expected `E`, found enum constructor | | | expected due to this | diff --git a/tests/ui/resolve/resolve-inconsistent-names.stderr b/tests/ui/resolve/resolve-inconsistent-names.stderr index 773c9f6cd111..023db303dd0f 100644 --- a/tests/ui/resolve/resolve-inconsistent-names.stderr +++ b/tests/ui/resolve/resolve-inconsistent-names.stderr @@ -87,7 +87,7 @@ error[E0308]: mismatched types LL | match x { | - this expression has type `(E, E)` LL | (A, B) | (ref B, c) | (c, A) => () - | - ^^^^^ expected enum `E`, found `&E` + | - ^^^^^ expected `E`, found `&E` | | | first introduced with type `E` here | diff --git a/tests/ui/return/return-type.stderr b/tests/ui/return/return-type.stderr index 5af136e60112..60d538eba882 100644 --- a/tests/ui/return/return-type.stderr +++ b/tests/ui/return/return-type.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/return-type.rs:10:5 | LL | foo(4 as usize) - | ^^^^^^^^^^^^^^^ expected `()`, found struct `S` + | ^^^^^^^^^^^^^^^ expected `()`, found `S` | = note: expected unit type `()` found struct `S` diff --git a/tests/ui/return/tail-expr-as-potential-return.stderr b/tests/ui/return/tail-expr-as-potential-return.stderr index 9183b4599ba6..ccb208fc6c4a 100644 --- a/tests/ui/return/tail-expr-as-potential-return.stderr +++ b/tests/ui/return/tail-expr-as-potential-return.stderr @@ -3,7 +3,7 @@ error[E0308]: mismatched types | LL | / if x { LL | | Err(42) - | | ^^^^^^^ expected `()`, found enum `Result` + | | ^^^^^^^ expected `()`, found `Result<_, {integer}>` LL | | //| HELP you might have meant to return this value LL | | } | |_____- expected this to be `()` @@ -35,7 +35,7 @@ error[E0308]: mismatched types | LL | / if x { LL | | Err(42) - | | ^^^^^^^ expected `()`, found enum `Result` + | | ^^^^^^^ expected `()`, found `Result<_, {integer}>` LL | | //| HELP you might have meant to return this value LL | | } | |_____- expected this to be `()` diff --git a/tests/ui/rfc-2005-default-binding-mode/const.stderr b/tests/ui/rfc-2005-default-binding-mode/const.stderr index 0f567125432b..fc06de90a003 100644 --- a/tests/ui/rfc-2005-default-binding-mode/const.stderr +++ b/tests/ui/rfc-2005-default-binding-mode/const.stderr @@ -9,7 +9,7 @@ LL | match &f { LL | FOO => {}, | ^^^ | | - | expected `&Foo`, found struct `Foo` + | expected `&Foo`, found `Foo` | `FOO` is interpreted as a constant, not a new binding | help: introduce a new binding instead: `other_foo` diff --git a/tests/ui/rfc-2005-default-binding-mode/lit.stderr b/tests/ui/rfc-2005-default-binding-mode/lit.stderr index 11bc170cdfa1..181f57899a91 100644 --- a/tests/ui/rfc-2005-default-binding-mode/lit.stderr +++ b/tests/ui/rfc-2005-default-binding-mode/lit.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match &s { | -- this expression has type `&&str` LL | "abc" => true, - | ^^^^^ expected `&str`, found `str` + | ^^^^^ expected `&&str`, found `&str` | = note: expected reference `&&str` found reference `&'static str` @@ -15,7 +15,7 @@ error[E0308]: mismatched types LL | match &s { | -- this expression has type `&&[u8]` LL | b"abc" => true, - | ^^^^^^ expected `&[u8]`, found array `[u8; 3]` + | ^^^^^^ expected `&&[u8]`, found `&[u8; 3]` | = note: expected reference `&&[u8]` found reference `&'static [u8; 3]` diff --git a/tests/ui/rfc-2008-non-exhaustive/uninhabited/coercions.stderr b/tests/ui/rfc-2008-non-exhaustive/uninhabited/coercions.stderr index f8ed156b57e3..c209caab5ecb 100644 --- a/tests/ui/rfc-2008-non-exhaustive/uninhabited/coercions.stderr +++ b/tests/ui/rfc-2008-non-exhaustive/uninhabited/coercions.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn cannot_coerce_empty_enum_to_anything(x: UninhabitedEnum) -> A { | - expected `A` because of return type LL | x - | ^ expected struct `A`, found enum `UninhabitedEnum` + | ^ expected `A`, found `UninhabitedEnum` error[E0308]: mismatched types --> $DIR/coercions.rs:27:5 @@ -12,7 +12,7 @@ error[E0308]: mismatched types LL | fn cannot_coerce_empty_tuple_struct_to_anything(x: UninhabitedTupleStruct) -> A { | - expected `A` because of return type LL | x - | ^ expected struct `A`, found struct `UninhabitedTupleStruct` + | ^ expected `A`, found `UninhabitedTupleStruct` error[E0308]: mismatched types --> $DIR/coercions.rs:31:5 @@ -20,7 +20,7 @@ error[E0308]: mismatched types LL | fn cannot_coerce_empty_struct_to_anything(x: UninhabitedStruct) -> A { | - expected `A` because of return type LL | x - | ^ expected struct `A`, found struct `UninhabitedStruct` + | ^ expected `A`, found `UninhabitedStruct` error[E0308]: mismatched types --> $DIR/coercions.rs:35:5 @@ -28,7 +28,7 @@ error[E0308]: mismatched types LL | fn cannot_coerce_enum_with_empty_variants_to_anything(x: UninhabitedVariants) -> A { | - expected `A` because of return type LL | x - | ^ expected struct `A`, found enum `UninhabitedVariants` + | ^ expected `A`, found `UninhabitedVariants` error: aborting due to 4 previous errors diff --git a/tests/ui/rfc-2008-non-exhaustive/uninhabited/coercions_same_crate.stderr b/tests/ui/rfc-2008-non-exhaustive/uninhabited/coercions_same_crate.stderr index fd2c56974bd4..289433edf629 100644 --- a/tests/ui/rfc-2008-non-exhaustive/uninhabited/coercions_same_crate.stderr +++ b/tests/ui/rfc-2008-non-exhaustive/uninhabited/coercions_same_crate.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn cannot_coerce_empty_enum_to_anything(x: UninhabitedEnum) -> A { | - expected `A` because of return type LL | x - | ^ expected struct `A`, found enum `UninhabitedEnum` + | ^ expected `A`, found `UninhabitedEnum` error[E0308]: mismatched types --> $DIR/coercions_same_crate.rs:34:5 @@ -12,7 +12,7 @@ error[E0308]: mismatched types LL | fn cannot_coerce_empty_tuple_struct_to_anything(x: UninhabitedTupleStruct) -> A { | - expected `A` because of return type LL | x - | ^ expected struct `A`, found struct `UninhabitedTupleStruct` + | ^ expected `A`, found `UninhabitedTupleStruct` error[E0308]: mismatched types --> $DIR/coercions_same_crate.rs:38:5 @@ -20,7 +20,7 @@ error[E0308]: mismatched types LL | fn cannot_coerce_empty_struct_to_anything(x: UninhabitedStruct) -> A { | - expected `A` because of return type LL | x - | ^ expected struct `A`, found struct `UninhabitedStruct` + | ^ expected `A`, found `UninhabitedStruct` error[E0308]: mismatched types --> $DIR/coercions_same_crate.rs:42:5 @@ -28,7 +28,7 @@ error[E0308]: mismatched types LL | fn cannot_coerce_enum_with_empty_variants_to_anything(x: UninhabitedVariants) -> A { | - expected `A` because of return type LL | x - | ^ expected struct `A`, found enum `UninhabitedVariants` + | ^ expected `A`, found `UninhabitedVariants` error: aborting due to 4 previous errors diff --git a/tests/ui/rfc-2294-if-let-guard/typeck.stderr b/tests/ui/rfc-2294-if-let-guard/typeck.stderr index dd1f4826fe05..4ce97a68a911 100644 --- a/tests/ui/rfc-2294-if-let-guard/typeck.stderr +++ b/tests/ui/rfc-2294-if-let-guard/typeck.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | Ok(x) if let Err(_) = x => {}, | ^^^^^^ - this expression has type `Option` | | - | expected enum `Option`, found enum `Result` + | expected `Option`, found `Result<_, _>` | = note: expected enum `Option` found enum `Result<_, _>` @@ -15,7 +15,7 @@ error[E0308]: mismatched types LL | Ok(x) if let 0 = x => {}, | ^ - this expression has type `Option` | | - | expected enum `Option`, found integer + | expected `Option`, found integer | = note: expected enum `Option` found type `{integer}` diff --git a/tests/ui/rfc-2497-if-let-chains/disallowed-positions.stderr b/tests/ui/rfc-2497-if-let-chains/disallowed-positions.stderr index 3028f8dbdbf7..81933173c25c 100644 --- a/tests/ui/rfc-2497-if-let-chains/disallowed-positions.stderr +++ b/tests/ui/rfc-2497-if-let-chains/disallowed-positions.stderr @@ -1516,7 +1516,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:157:8 | LL | if true..(let 0 = 0) {} - | ^^^^^^^^^^^^^^^^^ expected `bool`, found struct `Range` + | ^^^^^^^^^^^^^^^^^ expected `bool`, found `Range` | = note: expected type `bool` found struct `std::ops::Range` @@ -1525,7 +1525,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:161:8 | LL | if ..(let 0 = 0) {} - | ^^^^^^^^^^^^^ expected `bool`, found struct `RangeTo` + | ^^^^^^^^^^^^^ expected `bool`, found `RangeTo` | = note: expected type `bool` found struct `RangeTo` @@ -1534,7 +1534,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:165:8 | LL | if (let 0 = 0).. {} - | ^^^^^^^^^^^^^ expected `bool`, found struct `RangeFrom` + | ^^^^^^^^^^^^^ expected `bool`, found `RangeFrom` | = note: expected type `bool` found struct `RangeFrom` @@ -1545,7 +1545,7 @@ error[E0308]: mismatched types LL | if let Range { start: _, end: _ } = true..true && false {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool` | | - | expected `bool`, found struct `Range` + | expected `bool`, found `Range<_>` | = note: expected type `bool` found struct `std::ops::Range<_>` @@ -1554,7 +1554,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:171:8 | LL | if let Range { start: _, end: _ } = true..true && false {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `Range` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found `Range` | = note: expected type `bool` found struct `std::ops::Range` @@ -1565,7 +1565,7 @@ error[E0308]: mismatched types LL | if let Range { start: _, end: _ } = true..true || false {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool` | | - | expected `bool`, found struct `Range` + | expected `bool`, found `Range<_>` | = note: expected type `bool` found struct `std::ops::Range<_>` @@ -1574,7 +1574,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:175:8 | LL | if let Range { start: _, end: _ } = true..true || false {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `Range` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found `Range` | = note: expected type `bool` found struct `std::ops::Range` @@ -1585,7 +1585,7 @@ error[E0308]: mismatched types LL | if let Range { start: F, end } = F..|| true {} | ^^^^^^^^^^^^^^^^^^^^^^^ - this expression has type `fn() -> bool` | | - | expected fn pointer, found struct `Range` + | expected fn pointer, found `Range<_>` | = note: expected fn pointer `fn() -> bool` found struct `std::ops::Range<_>` @@ -1607,7 +1607,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:182:8 | LL | if let Range { start: F, end } = F..|| true {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `Range` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found `Range` | = note: expected type `bool` found struct `std::ops::Range` @@ -1618,7 +1618,7 @@ error[E0308]: mismatched types LL | if let Range { start: true, end } = t..&&false {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - this expression has type `&&bool` | | - | expected `bool`, found struct `Range` + | expected `bool`, found `Range<_>` | = note: expected type `bool` found struct `std::ops::Range<_>` @@ -1639,7 +1639,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:190:8 | LL | if let Range { start: true, end } = t..&&false {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `Range` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found `Range` | = note: expected type `bool` found struct `std::ops::Range` @@ -1710,7 +1710,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:249:11 | LL | while true..(let 0 = 0) {} - | ^^^^^^^^^^^^^^^^^ expected `bool`, found struct `Range` + | ^^^^^^^^^^^^^^^^^ expected `bool`, found `Range` | = note: expected type `bool` found struct `std::ops::Range` @@ -1719,7 +1719,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:253:11 | LL | while ..(let 0 = 0) {} - | ^^^^^^^^^^^^^ expected `bool`, found struct `RangeTo` + | ^^^^^^^^^^^^^ expected `bool`, found `RangeTo` | = note: expected type `bool` found struct `RangeTo` @@ -1728,7 +1728,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:257:11 | LL | while (let 0 = 0).. {} - | ^^^^^^^^^^^^^ expected `bool`, found struct `RangeFrom` + | ^^^^^^^^^^^^^ expected `bool`, found `RangeFrom` | = note: expected type `bool` found struct `RangeFrom` @@ -1739,7 +1739,7 @@ error[E0308]: mismatched types LL | while let Range { start: _, end: _ } = true..true && false {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool` | | - | expected `bool`, found struct `Range` + | expected `bool`, found `Range<_>` | = note: expected type `bool` found struct `std::ops::Range<_>` @@ -1748,7 +1748,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:263:11 | LL | while let Range { start: _, end: _ } = true..true && false {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `Range` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found `Range` | = note: expected type `bool` found struct `std::ops::Range` @@ -1759,7 +1759,7 @@ error[E0308]: mismatched types LL | while let Range { start: _, end: _ } = true..true || false {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool` | | - | expected `bool`, found struct `Range` + | expected `bool`, found `Range<_>` | = note: expected type `bool` found struct `std::ops::Range<_>` @@ -1768,7 +1768,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:267:11 | LL | while let Range { start: _, end: _ } = true..true || false {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `Range` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found `Range` | = note: expected type `bool` found struct `std::ops::Range` @@ -1779,7 +1779,7 @@ error[E0308]: mismatched types LL | while let Range { start: F, end } = F..|| true {} | ^^^^^^^^^^^^^^^^^^^^^^^ - this expression has type `fn() -> bool` | | - | expected fn pointer, found struct `Range` + | expected fn pointer, found `Range<_>` | = note: expected fn pointer `fn() -> bool` found struct `std::ops::Range<_>` @@ -1801,7 +1801,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:274:11 | LL | while let Range { start: F, end } = F..|| true {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `Range` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found `Range` | = note: expected type `bool` found struct `std::ops::Range` @@ -1812,7 +1812,7 @@ error[E0308]: mismatched types LL | while let Range { start: true, end } = t..&&false {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - this expression has type `&&bool` | | - | expected `bool`, found struct `Range` + | expected `bool`, found `Range<_>` | = note: expected type `bool` found struct `std::ops::Range<_>` @@ -1833,7 +1833,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:282:11 | LL | while let Range { start: true, end } = t..&&false {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `Range` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found `Range` | = note: expected type `bool` found struct `std::ops::Range` @@ -1883,7 +1883,7 @@ error[E0308]: mismatched types LL | (let Range { start: _, end: _ } = true..true || false); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool` | | - | expected `bool`, found struct `Range` + | expected `bool`, found `Range<_>` | = note: expected type `bool` found struct `std::ops::Range<_>` diff --git a/tests/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.stderr b/tests/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.stderr index f34ccecdd45e..802928452709 100644 --- a/tests/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.stderr +++ b/tests/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.stderr @@ -106,7 +106,7 @@ error[E0308]: mismatched types --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:9:19 | LL | let Some(n) = opt && n == 1 else { - | ^^^ expected `bool`, found enum `Option` + | ^^^ expected `bool`, found `Option` | = note: expected type `bool` found enum `Option` @@ -117,7 +117,7 @@ error[E0308]: mismatched types LL | let Some(n) = opt && n == 1 else { | ^^^^^^^ ------------- this expression has type `bool` | | - | expected `bool`, found enum `Option` + | expected `bool`, found `Option<_>` | = note: expected type `bool` found enum `Option<_>` @@ -126,7 +126,7 @@ error[E0308]: mismatched types --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:15:19 | LL | let Some(n) = opt && let another = n else { - | ^^^ expected `bool`, found enum `Option` + | ^^^ expected `bool`, found `Option` | = note: expected type `bool` found enum `Option` @@ -137,7 +137,7 @@ error[E0308]: mismatched types LL | let Some(n) = opt && let another = n else { | ^^^^^^^ ---------------------- this expression has type `bool` | | - | expected `bool`, found enum `Option` + | expected `bool`, found `Option<_>` | = note: expected type `bool` found enum `Option<_>` diff --git a/tests/ui/rfcs/rfc-2528-type-changing-struct-update/feature-gate.stderr b/tests/ui/rfcs/rfc-2528-type-changing-struct-update/feature-gate.stderr index 2217b8c04986..48e46d3d1d1a 100644 --- a/tests/ui/rfcs/rfc-2528-type-changing-struct-update/feature-gate.stderr +++ b/tests/ui/rfcs/rfc-2528-type-changing-struct-update/feature-gate.stderr @@ -11,7 +11,7 @@ error[E0308]: mismatched types --> $DIR/feature-gate.rs:22:11 | LL | ..m1 - | ^^ expected struct `State2`, found struct `State1` + | ^^ expected `Machine`, found `Machine` | = note: expected struct `Machine` found struct `Machine` diff --git a/tests/ui/rfcs/rfc-2528-type-changing-struct-update/issue-92010-trait-bound-not-satisfied.stderr b/tests/ui/rfcs/rfc-2528-type-changing-struct-update/issue-92010-trait-bound-not-satisfied.stderr index 5957ea7c9efd..831731ba4741 100644 --- a/tests/ui/rfcs/rfc-2528-type-changing-struct-update/issue-92010-trait-bound-not-satisfied.stderr +++ b/tests/ui/rfcs/rfc-2528-type-changing-struct-update/issue-92010-trait-bound-not-satisfied.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-92010-trait-bound-not-satisfied.rs:8:43 | LL | fn y(&self, y: f64) -> Self { P{y, .. self.clone() } } - | ^^^^^^^^^^^^ expected struct `P`, found `&P` + | ^^^^^^^^^^^^ expected `P`, found `&P` | = note: expected struct `P` found reference `&P` diff --git a/tests/ui/rfcs/rfc-2528-type-changing-struct-update/type-generic-update.stderr b/tests/ui/rfcs/rfc-2528-type-changing-struct-update/type-generic-update.stderr index 6f31b1a96207..f31b311c732d 100644 --- a/tests/ui/rfcs/rfc-2528-type-changing-struct-update/type-generic-update.stderr +++ b/tests/ui/rfcs/rfc-2528-type-changing-struct-update/type-generic-update.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/type-generic-update.rs:46:11 | LL | ..m1 - | ^^ expected `i32`, found `f64` + | ^^ expected `Machine<'_, i32, f64>`, found `Machine<'_, f64, f64>` | = note: expected struct `Machine<'_, i32, _>` found struct `Machine<'_, f64, _>` @@ -11,7 +11,7 @@ error[E0308]: mismatched types --> $DIR/type-generic-update.rs:51:11 | LL | ..m1 - | ^^ expected `i32`, found `f64` + | ^^ expected `Machine<'_, i32, i32>`, found `Machine<'_, f64, f64>` | = note: expected struct `Machine<'_, i32, i32>` found struct `Machine<'_, f64, f64>` diff --git a/tests/ui/self/issue-61882.stderr b/tests/ui/self/issue-61882.stderr index dd7194dc2e84..96f4e41de174 100644 --- a/tests/ui/self/issue-61882.stderr +++ b/tests/ui/self/issue-61882.stderr @@ -16,7 +16,7 @@ error[E0308]: mismatched types --> $DIR/issue-61882.rs:4:22 | LL | const B: A = Self(0); - | ^^^^^^^ expected `u8`, found `bool` + | ^^^^^^^ expected `A`, found `A` | = note: expected struct `A` found struct `A` diff --git a/tests/ui/slightly-nice-generic-literal-messages.rs b/tests/ui/slightly-nice-generic-literal-messages.rs index a48598ce8d5a..268009f65a5c 100644 --- a/tests/ui/slightly-nice-generic-literal-messages.rs +++ b/tests/ui/slightly-nice-generic-literal-messages.rs @@ -8,7 +8,7 @@ fn main() { //~^ ERROR mismatched types //~| expected struct `Foo<{float}, _>` //~| found type `{integer}` - //~| expected struct `Foo`, found integer + //~| expected `Foo<{float}, _>`, found integer } } diff --git a/tests/ui/slightly-nice-generic-literal-messages.stderr b/tests/ui/slightly-nice-generic-literal-messages.stderr index 14f01f0ebdf7..83ef522ab46e 100644 --- a/tests/ui/slightly-nice-generic-literal-messages.stderr +++ b/tests/ui/slightly-nice-generic-literal-messages.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match Foo(1.1, marker::PhantomData) { | ----------------------------- this expression has type `Foo<{float}, _>` LL | 1 => {} - | ^ expected struct `Foo`, found integer + | ^ expected `Foo<{float}, _>`, found integer | = note: expected struct `Foo<{float}, _>` found type `{integer}` diff --git a/tests/ui/span/coerce-suggestions.stderr b/tests/ui/span/coerce-suggestions.stderr index db784d5fe6cf..bb30f000ea7e 100644 --- a/tests/ui/span/coerce-suggestions.stderr +++ b/tests/ui/span/coerce-suggestions.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/coerce-suggestions.rs:7:20 | LL | let x: usize = String::new(); - | ----- ^^^^^^^^^^^^^ expected `usize`, found struct `String` + | ----- ^^^^^^^^^^^^^ expected `usize`, found `String` | | | expected due to this @@ -12,7 +12,7 @@ error[E0308]: mismatched types LL | let x: &str = String::new(); | ---- ^^^^^^^^^^^^^ | | | - | | expected `&str`, found struct `String` + | | expected `&str`, found `String` | | help: consider borrowing here: `&String::new()` | expected due to this @@ -63,7 +63,7 @@ error[E0308]: mismatched types --> $DIR/coerce-suggestions.rs:21:9 | LL | s = format!("foo"); - | ^^^^^^^^^^^^^^ expected `&mut String`, found struct `String` + | ^^^^^^^^^^^^^^ expected `&mut String`, found `String` | = note: this error originates in the macro `format` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/span/issue-33884.stderr b/tests/ui/span/issue-33884.stderr index aee153085177..8cece07cd48c 100644 --- a/tests/ui/span/issue-33884.stderr +++ b/tests/ui/span/issue-33884.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-33884.rs:6:22 | LL | stream.write_fmt(format!("message received")) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `Arguments`, found struct `String` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Arguments<'_>`, found `String` | = note: this error originates in the macro `format` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/span/issue-39018.stderr b/tests/ui/span/issue-39018.stderr index 5d4d692b2cff..771f21c45da6 100644 --- a/tests/ui/span/issue-39018.stderr +++ b/tests/ui/span/issue-39018.stderr @@ -80,7 +80,7 @@ error[E0308]: mismatched types LL | let _ = a + b; | ^ | | - | expected `&str`, found struct `String` + | expected `&str`, found `String` | help: consider borrowing here: `&b` error[E0369]: cannot add `String` to `&String` diff --git a/tests/ui/specialization/specialization-default-types.stderr b/tests/ui/specialization/specialization-default-types.stderr index 61a556a93116..ecccf29a107d 100644 --- a/tests/ui/specialization/specialization-default-types.stderr +++ b/tests/ui/specialization/specialization-default-types.stderr @@ -16,7 +16,7 @@ LL | default type Output = Box; LL | default fn generate(self) -> Self::Output { | ------------ expected `::Output` because of return type LL | Box::new(self) - | ^^^^^^^^^^^^^^ expected associated type, found struct `Box` + | ^^^^^^^^^^^^^^ expected associated type, found `Box` | = note: expected associated type `::Output` found struct `Box` @@ -27,7 +27,7 @@ error[E0308]: mismatched types LL | fn trouble(t: T) -> Box { | ------ expected `Box` because of return type LL | Example::generate(t) - | ^^^^^^^^^^^^^^^^^^^^ expected struct `Box`, found associated type + | ^^^^^^^^^^^^^^^^^^^^ expected `Box`, found associated type | = note: expected struct `Box` found associated type `::Output` diff --git a/tests/ui/static/bad-const-type.rs b/tests/ui/static/bad-const-type.rs index 934ee353da29..24fd67ecbaac 100644 --- a/tests/ui/static/bad-const-type.rs +++ b/tests/ui/static/bad-const-type.rs @@ -1,4 +1,4 @@ static i: String = 10; //~^ ERROR mismatched types -//~| expected struct `String`, found integer +//~| expected `String`, found integer fn main() { println!("{}", i); } diff --git a/tests/ui/static/bad-const-type.stderr b/tests/ui/static/bad-const-type.stderr index dcc1ee07cbd0..2e930f4596e0 100644 --- a/tests/ui/static/bad-const-type.stderr +++ b/tests/ui/static/bad-const-type.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | static i: String = 10; | ^^- help: try using a conversion method: `.to_string()` | | - | expected struct `String`, found integer + | expected `String`, found integer error: aborting due to previous error diff --git a/tests/ui/static/issue-5216.stderr b/tests/ui/static/issue-5216.stderr index 1afff28f0b4e..99c8b1aa131a 100644 --- a/tests/ui/static/issue-5216.stderr +++ b/tests/ui/static/issue-5216.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-5216.rs:3:21 | LL | pub static C: S = S(f); - | - ^ expected struct `Box`, found fn item + | - ^ expected `Box`, found fn item | | | arguments to this struct are incorrect | @@ -18,7 +18,7 @@ error[E0308]: mismatched types --> $DIR/issue-5216.rs:8:19 | LL | pub static D: T = g; - | ^ expected struct `Box`, found fn item + | ^ expected `Box`, found fn item | = note: expected struct `Box<(dyn FnMut() + Sync + 'static)>` found fn item `fn() {g}` diff --git a/tests/ui/static/static-reference-to-fn-1.stderr b/tests/ui/static/static-reference-to-fn-1.stderr index f68939d0ec8c..ea4c7b41995e 100644 --- a/tests/ui/static/static-reference-to-fn-1.stderr +++ b/tests/ui/static/static-reference-to-fn-1.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | func: &foo, | ^^^^ | | - | expected fn pointer, found fn item + | expected `&fn() -> Option`, found `&fn() -> Option {foo}` | help: consider casting to a fn pointer: `&(foo as fn() -> Option)` | = note: expected reference `&fn() -> Option` diff --git a/tests/ui/str/str-lit-type-mismatch.stderr b/tests/ui/str/str-lit-type-mismatch.stderr index 6b56cd6f3fc1..5ae7df5a2ecd 100644 --- a/tests/ui/str/str-lit-type-mismatch.stderr +++ b/tests/ui/str/str-lit-type-mismatch.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/str-lit-type-mismatch.rs:2:20 | LL | let x: &[u8] = "foo"; - | ----- ^^^^^ expected slice `[u8]`, found `str` + | ----- ^^^^^ expected `&[u8]`, found `&str` | | | expected due to this | @@ -17,7 +17,7 @@ error[E0308]: mismatched types --> $DIR/str-lit-type-mismatch.rs:3:23 | LL | let y: &[u8; 4] = "baaa"; - | -------- ^^^^^^ expected array `[u8; 4]`, found `str` + | -------- ^^^^^^ expected `&[u8; 4]`, found `&str` | | | expected due to this | @@ -32,7 +32,7 @@ error[E0308]: mismatched types --> $DIR/str-lit-type-mismatch.rs:4:19 | LL | let z: &str = b"foo"; - | ---- ^^^^^^ expected `str`, found array `[u8; 3]` + | ---- ^^^^^^ expected `&str`, found `&[u8; 3]` | | | expected due to this | diff --git a/tests/ui/structs/struct-base-wrong-type.stderr b/tests/ui/structs/struct-base-wrong-type.stderr index b039ce2cc920..1299af72ba93 100644 --- a/tests/ui/structs/struct-base-wrong-type.stderr +++ b/tests/ui/structs/struct-base-wrong-type.stderr @@ -2,25 +2,25 @@ error[E0308]: mismatched types --> $DIR/struct-base-wrong-type.rs:7:33 | LL | static foo: Foo = Foo { a: 2, ..bar }; - | ^^^ expected struct `Foo`, found struct `Bar` + | ^^^ expected `Foo`, found `Bar` error[E0308]: mismatched types --> $DIR/struct-base-wrong-type.rs:8:35 | LL | static foo_i: Foo = Foo { a: 2, ..4 }; - | ^ expected struct `Foo`, found integer + | ^ expected `Foo`, found integer error[E0308]: mismatched types --> $DIR/struct-base-wrong-type.rs:12:27 | LL | let f = Foo { a: 2, ..b }; - | ^ expected struct `Foo`, found struct `Bar` + | ^ expected `Foo`, found `Bar` error[E0308]: mismatched types --> $DIR/struct-base-wrong-type.rs:13:34 | LL | let f__isize = Foo { a: 2, ..4 }; - | ^ expected struct `Foo`, found integer + | ^ expected `Foo`, found integer error: aborting due to 4 previous errors diff --git a/tests/ui/structs/struct-path-self-type-mismatch.stderr b/tests/ui/structs/struct-path-self-type-mismatch.stderr index b55a2cbf7527..cddc1356194b 100644 --- a/tests/ui/structs/struct-path-self-type-mismatch.stderr +++ b/tests/ui/structs/struct-path-self-type-mismatch.stderr @@ -34,7 +34,7 @@ LL | | LL | | inner: u LL | | LL | | } - | |_________^ expected type parameter `U`, found type parameter `T` + | |_________^ expected `Foo`, found `Foo` | = note: expected struct `Foo` found struct `Foo` diff --git a/tests/ui/structs/struct-record-suggestion.stderr b/tests/ui/structs/struct-record-suggestion.stderr index 9b751d1b66c5..38274f8d9c0d 100644 --- a/tests/ui/structs/struct-record-suggestion.stderr +++ b/tests/ui/structs/struct-record-suggestion.stderr @@ -18,7 +18,7 @@ error[E0308]: mismatched types --> $DIR/struct-record-suggestion.rs:23:20 | LL | let q = B { b: 1..Default::default() }; - | ^^^^^^^^^^^^^^^^^^^^^ expected `u32`, found struct `Range` + | ^^^^^^^^^^^^^^^^^^^^^ expected `u32`, found `Range<{integer}>` | = note: expected type `u32` found struct `std::ops::Range<{integer}>` diff --git a/tests/ui/structs/structure-constructor-type-mismatch.stderr b/tests/ui/structs/structure-constructor-type-mismatch.stderr index 3d64fc601df9..3e3f9ea06eff 100644 --- a/tests/ui/structs/structure-constructor-type-mismatch.stderr +++ b/tests/ui/structs/structure-constructor-type-mismatch.stderr @@ -104,7 +104,7 @@ error[E0308]: mismatched types LL | match (Point { x: 1, y: 2 }) { | ---------------------- this expression has type `Point<{integer}>` LL | PointF:: { .. } => {} - | ^^^^^^^^^^^^^^^^^^^^ expected integer, found `f32` + | ^^^^^^^^^^^^^^^^^^^^ expected `Point<{integer}>`, found `Point` | = note: expected struct `Point<{integer}>` found struct `Point` @@ -115,7 +115,7 @@ error[E0308]: mismatched types LL | match (Point { x: 1, y: 2 }) { | ---------------------- this expression has type `Point<{integer}>` LL | PointF { .. } => {} - | ^^^^^^^^^^^^^ expected integer, found `f32` + | ^^^^^^^^^^^^^ expected `Point<{integer}>`, found `Point` | = note: expected struct `Point<{integer}>` found struct `Point` @@ -126,7 +126,7 @@ error[E0308]: mismatched types LL | match (Pair { x: 1, y: 2 }) { | --------------------- this expression has type `Pair<{integer}, {integer}>` LL | PairF:: { .. } => {} - | ^^^^^^^^^^^^^^^^^^^ expected integer, found `f32` + | ^^^^^^^^^^^^^^^^^^^ expected `Pair<{integer}, {integer}>`, found `Pair` | = note: expected struct `Pair<{integer}, {integer}>` found struct `Pair` diff --git a/tests/ui/suggestions/args-instead-of-tuple-errors.stderr b/tests/ui/suggestions/args-instead-of-tuple-errors.stderr index bc097bf6eb45..e97363638160 100644 --- a/tests/ui/suggestions/args-instead-of-tuple-errors.stderr +++ b/tests/ui/suggestions/args-instead-of-tuple-errors.stderr @@ -4,7 +4,7 @@ error[E0061]: this enum variant takes 1 argument but 2 arguments were supplied LL | let _: Option<(i32, bool)> = Some(1, 2); | ^^^^ - argument of type `{integer}` unexpected | -note: expected tuple, found integer +note: expected `(i32, bool)`, found integer --> $DIR/args-instead-of-tuple-errors.rs:6:39 | LL | let _: Option<(i32, bool)> = Some(1, 2); @@ -31,7 +31,7 @@ error[E0061]: this function takes 1 argument but 2 arguments were supplied LL | int_bool(1, 2); | ^^^^^^^^ - argument of type `{integer}` unexpected | -note: expected tuple, found integer +note: expected `(i32, bool)`, found integer --> $DIR/args-instead-of-tuple-errors.rs:8:14 | LL | int_bool(1, 2); @@ -65,7 +65,7 @@ error[E0308]: mismatched types --> $DIR/args-instead-of-tuple-errors.rs:14:34 | LL | let _: Option<(i32,)> = Some(5_usize); - | ---- ^^^^^^^ expected tuple, found `usize` + | ---- ^^^^^^^ expected `(i32,)`, found `usize` | | | arguments to this enum variant are incorrect | @@ -85,7 +85,7 @@ error[E0308]: mismatched types --> $DIR/args-instead-of-tuple-errors.rs:17:34 | LL | let _: Option<(i32,)> = Some((5_usize)); - | ---- ^^^^^^^^^ expected tuple, found `usize` + | ---- ^^^^^^^^^ expected `(i32,)`, found `usize` | | | arguments to this enum variant are incorrect | diff --git a/tests/ui/suggestions/args-instead-of-tuple.stderr b/tests/ui/suggestions/args-instead-of-tuple.stderr index 3ed9dbf4abbc..0bdf10b0d63a 100644 --- a/tests/ui/suggestions/args-instead-of-tuple.stderr +++ b/tests/ui/suggestions/args-instead-of-tuple.stderr @@ -41,7 +41,7 @@ error[E0308]: mismatched types --> $DIR/args-instead-of-tuple.rs:14:34 | LL | let _: Option<(i32,)> = Some(3); - | ---- ^ expected tuple, found integer + | ---- ^ expected `(i32,)`, found integer | | | arguments to this enum variant are incorrect | @@ -58,7 +58,7 @@ error[E0308]: mismatched types --> $DIR/args-instead-of-tuple.rs:17:34 | LL | let _: Option<(i32,)> = Some((3)); - | ---- ^^^ expected tuple, found integer + | ---- ^^^ expected `(i32,)`, found integer | | | arguments to this enum variant are incorrect | diff --git a/tests/ui/suggestions/as-ref.stderr b/tests/ui/suggestions/as-ref.stderr index deafa9f48d45..0ee343ebf9f1 100644 --- a/tests/ui/suggestions/as-ref.stderr +++ b/tests/ui/suggestions/as-ref.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/as-ref.rs:7:29 | LL | opt.map(|arg| takes_ref(arg)); - | --- --------- ^^^ expected `&Foo`, found struct `Foo` + | --- --------- ^^^ expected `&Foo`, found `Foo` | | | | | arguments to this function are incorrect | help: consider using `as_ref` instead: `as_ref().map` @@ -17,7 +17,7 @@ error[E0308]: mismatched types --> $DIR/as-ref.rs:8:39 | LL | opt.and_then(|arg| Some(takes_ref(arg))); - | -------- --------- ^^^ expected `&Foo`, found struct `Foo` + | -------- --------- ^^^ expected `&Foo`, found `Foo` | | | | | arguments to this function are incorrect | help: consider using `as_ref` instead: `as_ref().and_then` @@ -32,7 +32,7 @@ error[E0308]: mismatched types --> $DIR/as-ref.rs:10:29 | LL | opt.map(|arg| takes_ref(arg)); - | --- --------- ^^^ expected `&Foo`, found struct `Foo` + | --- --------- ^^^ expected `&Foo`, found `Foo` | | | | | arguments to this function are incorrect | help: consider using `as_ref` instead: `as_ref().map` @@ -47,7 +47,7 @@ error[E0308]: mismatched types --> $DIR/as-ref.rs:11:37 | LL | opt.and_then(|arg| Ok(takes_ref(arg))); - | -------- --------- ^^^ expected `&Foo`, found struct `Foo` + | -------- --------- ^^^ expected `&Foo`, found `Foo` | | | | | arguments to this function are incorrect | help: consider using `as_ref` instead: `as_ref().and_then` @@ -64,7 +64,7 @@ error[E0308]: mismatched types LL | let y: Option<&usize> = x; | -------------- ^ | | | - | | expected enum `Option`, found `&Option` + | | expected `Option<&usize>`, found `&Option` | | help: you can convert from `&Option` to `Option<&T>` using `.as_ref()`: `x.as_ref()` | expected due to this | @@ -75,7 +75,7 @@ error[E0308]: mismatched types --> $DIR/as-ref.rs:15:37 | LL | let y: Result<&usize, &usize> = x; - | ---------------------- ^ expected enum `Result`, found reference + | ---------------------- ^ expected `Result<&usize, &usize>`, found `&Result` | | | expected due to this | @@ -90,7 +90,7 @@ error[E0308]: mismatched types --> $DIR/as-ref.rs:19:36 | LL | let y: Result<&usize, usize> = x; - | --------------------- ^ expected enum `Result`, found reference + | --------------------- ^ expected `Result<&usize, usize>`, found `&Result` | | | expected due to this | @@ -101,7 +101,7 @@ error[E0308]: mismatched types --> $DIR/as-ref.rs:22:42 | LL | multiple_ref_opt.map(|arg| takes_ref(arg)); - | --- --------- ^^^ expected `&Foo`, found struct `Foo` + | --- --------- ^^^ expected `&Foo`, found `Foo` | | | | | arguments to this function are incorrect | help: consider using `as_ref` instead: `as_ref().map` @@ -116,7 +116,7 @@ error[E0308]: mismatched types --> $DIR/as-ref.rs:23:52 | LL | multiple_ref_opt.and_then(|arg| Some(takes_ref(arg))); - | -------- --------- ^^^ expected `&Foo`, found struct `Foo` + | -------- --------- ^^^ expected `&Foo`, found `Foo` | | | | | arguments to this function are incorrect | help: consider using `as_ref` instead: `as_ref().and_then` @@ -131,7 +131,7 @@ error[E0308]: mismatched types --> $DIR/as-ref.rs:25:45 | LL | multiple_ref_result.map(|arg| takes_ref(arg)); - | --- --------- ^^^ expected `&Foo`, found struct `Foo` + | --- --------- ^^^ expected `&Foo`, found `Foo` | | | | | arguments to this function are incorrect | help: consider using `as_ref` instead: `as_ref().map` @@ -146,7 +146,7 @@ error[E0308]: mismatched types --> $DIR/as-ref.rs:26:53 | LL | multiple_ref_result.and_then(|arg| Ok(takes_ref(arg))); - | -------- --------- ^^^ expected `&Foo`, found struct `Foo` + | -------- --------- ^^^ expected `&Foo`, found `Foo` | | | | | arguments to this function are incorrect | help: consider using `as_ref` instead: `as_ref().and_then` diff --git a/tests/ui/suggestions/boxed-variant-field.stderr b/tests/ui/suggestions/boxed-variant-field.stderr index 9ae36a06a715..1adbc05406cb 100644 --- a/tests/ui/suggestions/boxed-variant-field.stderr +++ b/tests/ui/suggestions/boxed-variant-field.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/boxed-variant-field.rs:9:31 | LL | Ty::List(elem) => foo(elem), - | --- ^^^^ expected enum `Ty`, found struct `Box` + | --- ^^^^ expected `Ty`, found `Box` | | | arguments to this function are incorrect | diff --git a/tests/ui/suggestions/call-boxed.stderr b/tests/ui/suggestions/call-boxed.stderr index 9b619ac9a3f5..9b31ee07cca7 100644 --- a/tests/ui/suggestions/call-boxed.stderr +++ b/tests/ui/suggestions/call-boxed.stderr @@ -6,7 +6,7 @@ LL | let mut x = 1i32; LL | let y = Box::new(|| 1); | -- the found closure LL | x = y; - | ^ expected `i32`, found struct `Box` + | ^ expected `i32`, found `Box<[closure@call-boxed.rs:3:22]>` | = note: expected type `i32` found struct `Box<[closure@$DIR/call-boxed.rs:3:22: 3:24]>` diff --git a/tests/ui/suggestions/chain-method-call-mutation-in-place.stderr b/tests/ui/suggestions/chain-method-call-mutation-in-place.stderr index 965dbb9679d2..11d9b8391f6d 100644 --- a/tests/ui/suggestions/chain-method-call-mutation-in-place.stderr +++ b/tests/ui/suggestions/chain-method-call-mutation-in-place.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn foo(mut s: String) -> String { | ------ expected `String` because of return type LL | s.push_str("asdf") - | ^^^^^^^^^^^^^^^^^^ expected struct `String`, found `()` + | ^^^^^^^^^^^^^^^^^^ expected `String`, found `()` | note: method `push_str` modifies its receiver in-place --> $DIR/chain-method-call-mutation-in-place.rs:3:7 diff --git a/tests/ui/suggestions/clone-on-unconstrained-borrowed-type-param.stderr b/tests/ui/suggestions/clone-on-unconstrained-borrowed-type-param.stderr index 26ab515d9b4b..45593035b9d6 100644 --- a/tests/ui/suggestions/clone-on-unconstrained-borrowed-type-param.stderr +++ b/tests/ui/suggestions/clone-on-unconstrained-borrowed-type-param.stderr @@ -26,7 +26,7 @@ error[E0308]: mismatched types LL | fn wut(t: &Foo) -> Foo { | --- expected `Foo` because of return type LL | t.clone() - | ^^^^^^^^^ expected struct `Foo`, found `&Foo` + | ^^^^^^^^^ expected `Foo`, found `&Foo` | note: `Foo` does not implement `Clone`, so `&Foo` was cloned instead --> $DIR/clone-on-unconstrained-borrowed-type-param.rs:9:5 diff --git a/tests/ui/suggestions/const-in-struct-pat.stderr b/tests/ui/suggestions/const-in-struct-pat.stderr index c8b93f3dc48f..f344ac06db1f 100644 --- a/tests/ui/suggestions/const-in-struct-pat.stderr +++ b/tests/ui/suggestions/const-in-struct-pat.stderr @@ -7,7 +7,7 @@ LL | struct foo; LL | let Thing { foo } = t; | ^^^ - this expression has type `Thing` | | - | expected struct `String`, found struct `foo` + | expected `String`, found `foo` | `foo` is interpreted as a unit struct, not a new binding | help: bind the struct field to a different name instead diff --git a/tests/ui/suggestions/copied-and-cloned.stderr b/tests/ui/suggestions/copied-and-cloned.stderr index a6336281b407..067808141824 100644 --- a/tests/ui/suggestions/copied-and-cloned.stderr +++ b/tests/ui/suggestions/copied-and-cloned.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/copied-and-cloned.rs:7:26 | LL | expect::>(x); - | -------------------- ^ expected `()`, found `&()` + | -------------------- ^ expected `Option<()>`, found `Option<&()>` | | | arguments to this function are incorrect | @@ -22,7 +22,7 @@ error[E0308]: mismatched types --> $DIR/copied-and-cloned.rs:11:30 | LL | expect::>(x); - | ------------------------ ^ expected `()`, found `&()` + | ------------------------ ^ expected `Result<(), ()>`, found `Result<&(), _>` | | | arguments to this function are incorrect | @@ -42,7 +42,7 @@ error[E0308]: mismatched types --> $DIR/copied-and-cloned.rs:16:30 | LL | expect::>(x); - | ------------------------ ^ expected struct `String`, found `&String` + | ------------------------ ^ expected `Option`, found `Option<&String>` | | | arguments to this function are incorrect | @@ -62,7 +62,7 @@ error[E0308]: mismatched types --> $DIR/copied-and-cloned.rs:20:34 | LL | expect::>(x); - | ---------------------------- ^ expected struct `String`, found `&String` + | ---------------------------- ^ expected `Result`, found `Result<&String, _>` | | | arguments to this function are incorrect | diff --git a/tests/ui/suggestions/dont-suggest-deref-inside-macro-issue-58298.stderr b/tests/ui/suggestions/dont-suggest-deref-inside-macro-issue-58298.stderr index 5dc4e64446fb..c6867270ad81 100644 --- a/tests/ui/suggestions/dont-suggest-deref-inside-macro-issue-58298.stderr +++ b/tests/ui/suggestions/dont-suggest-deref-inside-macro-issue-58298.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | / intrinsic_match! { LL | | "abc" LL | | }; - | |_____^ expected `&str`, found struct `String` + | |_____^ expected `&str`, found `String` | = note: this error originates in the macro `format` which comes from the expansion of the macro `intrinsic_match` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/suggestions/dont-suggest-doc-hidden-variant-for-enum/hidden-child.stderr b/tests/ui/suggestions/dont-suggest-doc-hidden-variant-for-enum/hidden-child.stderr index 67f4ac08de2c..866d3fab46e7 100644 --- a/tests/ui/suggestions/dont-suggest-doc-hidden-variant-for-enum/hidden-child.stderr +++ b/tests/ui/suggestions/dont-suggest-doc-hidden-variant-for-enum/hidden-child.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/hidden-child.rs:9:26 | LL | let x: Option = 1i32; - | ----------- ^^^^ expected enum `Option`, found `i32` + | ----------- ^^^^ expected `Option`, found `i32` | | | expected due to this | diff --git a/tests/ui/suggestions/dont-suggest-doc-hidden-variant-for-enum/hidden-parent.stderr b/tests/ui/suggestions/dont-suggest-doc-hidden-variant-for-enum/hidden-parent.stderr index d92b81279101..f8029e452bb7 100644 --- a/tests/ui/suggestions/dont-suggest-doc-hidden-variant-for-enum/hidden-parent.stderr +++ b/tests/ui/suggestions/dont-suggest-doc-hidden-variant-for-enum/hidden-parent.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/hidden-parent.rs:6:26 | LL | let x: Option = 1i32; - | ----------- ^^^^ expected enum `Option`, found `i32` + | ----------- ^^^^ expected `Option`, found `i32` | | | expected due to this | diff --git a/tests/ui/suggestions/expected-boxed-future-isnt-pinned.stderr b/tests/ui/suggestions/expected-boxed-future-isnt-pinned.stderr index b1e04dab8f62..90ea06239528 100644 --- a/tests/ui/suggestions/expected-boxed-future-isnt-pinned.stderr +++ b/tests/ui/suggestions/expected-boxed-future-isnt-pinned.stderr @@ -5,7 +5,7 @@ LL | fn foo + Send + 'static>(x: F) -> BoxFuture<'static, | - this type parameter ----------------------- expected `Pin + Send + 'static)>>` because of return type LL | // We could instead use an `async` block, but this way we have no std spans. LL | x - | ^ expected struct `Pin`, found type parameter `F` + | ^ expected `Pin>`, found type parameter `F` | = note: expected struct `Pin + Send + 'static)>>` found type parameter `F` @@ -20,7 +20,7 @@ error[E0308]: mismatched types LL | fn bar + Send + 'static>(x: F) -> BoxFuture<'static, i32> { | ----------------------- expected `Pin + Send + 'static)>>` because of return type LL | Box::new(x) - | ^^^^^^^^^^^ expected struct `Pin`, found struct `Box` + | ^^^^^^^^^^^ expected `Pin>`, found `Box` | = note: expected struct `Pin + Send + 'static)>>` found struct `Box` @@ -32,7 +32,7 @@ error[E0308]: mismatched types LL | fn baz + Send + 'static>(x: F) -> BoxFuture<'static, i32> { | - this type parameter LL | Pin::new(x) - | -------- ^ expected struct `Box`, found type parameter `F` + | -------- ^ expected `Box + Send>`, found type parameter `F` | | | arguments to this function are incorrect | help: use `Box::pin` to pin and box this expression: `Box::pin` @@ -74,7 +74,7 @@ LL | | 42 LL | | } | | ^ | | | - | |_____expected struct `Pin`, found `async` block + | |_____expected `Pin>`, found `async` block | arguments to this function are incorrect | = note: expected struct `Pin + Send>>` diff --git a/tests/ui/suggestions/field-access.stderr b/tests/ui/suggestions/field-access.stderr index b9f0f788b8c3..007bc6ecf937 100644 --- a/tests/ui/suggestions/field-access.stderr +++ b/tests/ui/suggestions/field-access.stderr @@ -7,7 +7,7 @@ LL | Fst, LL | if let B::Fst = a {}; | ^^^^^^ - this expression has type `A` | | - | expected struct `A`, found enum `B` + | expected `A`, found `B` | help: you might have meant to use field `b` whose type is `B` | @@ -24,7 +24,7 @@ LL | match a { | - this expression has type `A` ... LL | B::Fst => (), - | ^^^^^^ expected struct `A`, found enum `B` + | ^^^^^^ expected `A`, found `B` | help: you might have meant to use field `b` whose type is `B` | @@ -41,7 +41,7 @@ LL | match a { | - this expression has type `A` ... LL | B::Snd => (), - | ^^^^^^ expected struct `A`, found enum `B` + | ^^^^^^ expected `A`, found `B` | help: you might have meant to use field `b` whose type is `B` | @@ -55,7 +55,7 @@ LL | match foo { | --- this expression has type `Foo` LL | LL | 1u32 => (), - | ^^^^ expected union `Foo`, found `u32` + | ^^^^ expected `Foo`, found `u32` | help: you might have meant to use field `bar` whose type is `u32` | diff --git a/tests/ui/suggestions/fn-or-tuple-struct-without-args.stderr b/tests/ui/suggestions/fn-or-tuple-struct-without-args.stderr index 4cbcd31fa5ec..4f981a163741 100644 --- a/tests/ui/suggestions/fn-or-tuple-struct-without-args.stderr +++ b/tests/ui/suggestions/fn-or-tuple-struct-without-args.stderr @@ -23,7 +23,7 @@ LL | struct S(usize, usize); | -------- `S` defines a struct constructor here, which should be called ... LL | let _: S = S; - | - ^ expected struct `S`, found struct constructor + | - ^ expected `S`, found struct constructor | | | expected due to this | @@ -59,7 +59,7 @@ LL | struct V(); | -------- `V` defines a struct constructor here, which should be called ... LL | let _: V = V; - | - ^ expected struct `V`, found struct constructor + | - ^ expected `V`, found struct constructor | | | expected due to this | @@ -113,7 +113,7 @@ LL | A(usize), | - `A` defines an enum variant constructor here, which should be called ... LL | let _: E = E::A; - | - ^^^^ expected enum `E`, found enum constructor + | - ^^^^ expected `E`, found enum constructor | | | expected due to this | diff --git a/tests/ui/suggestions/format-borrow.stderr b/tests/ui/suggestions/format-borrow.stderr index 8ed2b9c9a633..3ea0d208cbb7 100644 --- a/tests/ui/suggestions/format-borrow.stderr +++ b/tests/ui/suggestions/format-borrow.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/format-borrow.rs:2:21 | LL | let a: String = &String::from("a"); - | ------ ^^^^^^^^^^^^^^^^^^ expected struct `String`, found `&String` + | ------ ^^^^^^^^^^^^^^^^^^ expected `String`, found `&String` | | | expected due to this | @@ -20,7 +20,7 @@ error[E0308]: mismatched types --> $DIR/format-borrow.rs:4:21 | LL | let b: String = &format!("b"); - | ------ ^^^^^^^^^^^^^ expected struct `String`, found `&String` + | ------ ^^^^^^^^^^^^^ expected `String`, found `&String` | | | expected due to this | @@ -38,7 +38,7 @@ error[E0308]: mismatched types --> $DIR/format-borrow.rs:6:21 | LL | let c: String = &mut format!("c"); - | ------ ^^^^^^^^^^^^^^^^^ expected struct `String`, found `&mut String` + | ------ ^^^^^^^^^^^^^^^^^ expected `String`, found `&mut String` | | | expected due to this | @@ -56,7 +56,7 @@ error[E0308]: mismatched types --> $DIR/format-borrow.rs:8:21 | LL | let d: String = &mut (format!("d")); - | ------ ^^^^^^^^^^^^^^^^^^^ expected struct `String`, found `&mut String` + | ------ ^^^^^^^^^^^^^^^^^^^ expected `String`, found `&mut String` | | | expected due to this | diff --git a/tests/ui/suggestions/into-convert.stderr b/tests/ui/suggestions/into-convert.stderr index d43104a21724..704b280a985f 100644 --- a/tests/ui/suggestions/into-convert.stderr +++ b/tests/ui/suggestions/into-convert.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/into-convert.rs:6:16 | LL | let x: A = B; - | - ^ expected struct `A`, found struct `B` + | - ^ expected `A`, found `B` | | | expected due to this | @@ -15,7 +15,7 @@ error[E0308]: mismatched types --> $DIR/into-convert.rs:10:24 | LL | let y: Arc = PathBuf::new(); - | --------- ^^^^^^^^^^^^^^ expected struct `Arc`, found struct `PathBuf` + | --------- ^^^^^^^^^^^^^^ expected `Arc`, found `PathBuf` | | | expected due to this | @@ -30,7 +30,7 @@ error[E0308]: mismatched types --> $DIR/into-convert.rs:14:24 | LL | let z: AtomicU32 = 1; - | --------- ^ expected struct `AtomicU32`, found integer + | --------- ^ expected `AtomicU32`, found integer | | | expected due to this | diff --git a/tests/ui/suggestions/issue-101065.stderr b/tests/ui/suggestions/issue-101065.stderr index 6f7ecd24ca42..9f77ead42944 100644 --- a/tests/ui/suggestions/issue-101065.stderr +++ b/tests/ui/suggestions/issue-101065.stderr @@ -7,7 +7,7 @@ LL | | FakeResult::Ok(FakeResult::Ok(())) | | ---------------------------------- expected because of this LL | | } else { LL | | FakeResult::Ok(()) - | | ^^^^^^^^^^^^^^^^^^ expected enum `FakeResult`, found `()` + | | ^^^^^^^^^^^^^^^^^^ expected `FakeResult>`, found `FakeResult<()>` LL | | }; | |_____- `if` and `else` have incompatible types | diff --git a/tests/ui/suggestions/issue-101465.stderr b/tests/ui/suggestions/issue-101465.stderr index e2ca7771257d..2aec3c863af5 100644 --- a/tests/ui/suggestions/issue-101465.stderr +++ b/tests/ui/suggestions/issue-101465.stderr @@ -5,7 +5,7 @@ LL | / match true { LL | | true => B, | | - this is found to be of type `B` LL | | false => C, - | | ^ expected struct `B`, found struct `C` + | | ^ expected `B`, found `C` LL | | LL | | } | |_____- `match` arms have incompatible types diff --git a/tests/ui/suggestions/issue-101984.stderr b/tests/ui/suggestions/issue-101984.stderr index 81758a7007c2..6ae2842b2bf3 100644 --- a/tests/ui/suggestions/issue-101984.stderr +++ b/tests/ui/suggestions/issue-101984.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let (cmp, router) = self.router.at()?; | ^^^^^^^^^^^^^ ----------------- this expression has type `Match<&(for<'a> fn(&'a ()), Box)>` | | - | expected struct `Match`, found tuple + | expected `Match<&(for<'a> fn(&'a ()), ...)>`, found `(_, _)` | = note: expected struct `Match<&(for<'a> fn(&'a ()), Box)>` found tuple `(_, _)` diff --git a/tests/ui/suggestions/issue-102892.stderr b/tests/ui/suggestions/issue-102892.stderr index a3dbc7cb861f..e64a89ffe330 100644 --- a/tests/ui/suggestions/issue-102892.stderr +++ b/tests/ui/suggestions/issue-102892.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-102892.rs:15:26 | LL | let (a, b): (A, B) = &**arc; // suggests putting `&**arc` here too - | ------ ^^^^^^ expected tuple, found `&(A, B)` + | ------ ^^^^^^ expected `(A, B)`, found `&(A, B)` | | | expected due to this | @@ -22,7 +22,7 @@ error[E0308]: mismatched types --> $DIR/issue-102892.rs:20:32 | LL | let (a, b): ((A, B), A) = (&mut *mutation, &(**arc).0); // suggests putting `&**arc` here too - | ^^^^^^^^^^^^^^ expected tuple, found `&mut (A, B)` + | ^^^^^^^^^^^^^^ expected `(A, B)`, found `&mut (A, B)` | = note: expected tuple `(A, B)` found mutable reference `&mut (A, B)` @@ -40,7 +40,7 @@ error[E0308]: mismatched types --> $DIR/issue-102892.rs:20:48 | LL | let (a, b): ((A, B), A) = (&mut *mutation, &(**arc).0); // suggests putting `&**arc` here too - | ^^^^^^^^^^ expected struct `A`, found `&A` + | ^^^^^^^^^^ expected `A`, found `&A` | help: consider removing the borrow | diff --git a/tests/ui/suggestions/issue-105494.stderr b/tests/ui/suggestions/issue-105494.stderr index 5aa3f2af738f..4cb4a399a724 100644 --- a/tests/ui/suggestions/issue-105494.stderr +++ b/tests/ui/suggestions/issue-105494.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-105494.rs:2:19 | LL | let _v: i32 = (1 as i32).to_string(); - | --- ^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found struct `String` + | --- ^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found `String` | | | expected due to this | @@ -16,7 +16,7 @@ error[E0308]: mismatched types --> $DIR/issue-105494.rs:5:19 | LL | let _v: i32 = (1 as i128).to_string(); - | --- ^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found struct `String` + | --- ^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found `String` | | | expected due to this @@ -24,7 +24,7 @@ error[E0308]: mismatched types --> $DIR/issue-105494.rs:7:20 | LL | let _v: &str = "foo".to_string(); - | ---- ^^^^^^^^^^^^^^^^^ expected `&str`, found struct `String` + | ---- ^^^^^^^^^^^^^^^^^ expected `&str`, found `String` | | | expected due to this | @@ -41,7 +41,7 @@ LL | let mut path: String = "/usr".to_string(); | ------ expected due to this type ... LL | path = format!("{}/{}", path, folder).as_str(); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `String`, found `&str` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `String`, found `&str` | help: try removing the method call | diff --git a/tests/ui/suggestions/issue-106443-sugg-clone-for-arg.stderr b/tests/ui/suggestions/issue-106443-sugg-clone-for-arg.stderr index 1e66fe3af241..4e91dfc82d2f 100644 --- a/tests/ui/suggestions/issue-106443-sugg-clone-for-arg.stderr +++ b/tests/ui/suggestions/issue-106443-sugg-clone-for-arg.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-106443-sugg-clone-for-arg.rs:11:9 | LL | foo(s); - | --- ^ expected struct `S`, found `&S` + | --- ^ expected `S`, found `&S` | | | arguments to this function are incorrect | @@ -20,7 +20,7 @@ error[E0308]: mismatched types --> $DIR/issue-106443-sugg-clone-for-arg.rs:17:9 | LL | bar(t); - | --- ^ expected struct `T`, found `&T` + | --- ^ expected `T`, found `&T` | | | arguments to this function are incorrect | diff --git a/tests/ui/suggestions/issue-52820.stderr b/tests/ui/suggestions/issue-52820.stderr index 09269ed4eee9..a67d75014171 100644 --- a/tests/ui/suggestions/issue-52820.stderr +++ b/tests/ui/suggestions/issue-52820.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-52820.rs:12:9 | LL | guts, - | ^^^^ expected struct `String`, found `&str` + | ^^^^ expected `String`, found `&str` | help: try using a conversion method | @@ -16,7 +16,7 @@ LL | brains: guts.clone(), | ^^^^^-----^^ | | | | | help: try using a conversion method: `to_string` - | expected struct `String`, found `&str` + | expected `String`, found `&str` error: aborting due to 2 previous errors diff --git a/tests/ui/suggestions/issue-53692.stderr b/tests/ui/suggestions/issue-53692.stderr index 3a1b624f402f..469a538411fb 100644 --- a/tests/ui/suggestions/issue-53692.stderr +++ b/tests/ui/suggestions/issue-53692.stderr @@ -5,7 +5,7 @@ LL | let items_clone: Vec = ref_items.clone(); | -------- ^^^^^^^^^^-----^^ | | | | | | | help: try using a conversion method: `to_vec` - | | expected struct `Vec`, found `&[i32]` + | | expected `Vec`, found `&[i32]` | expected due to this | = note: expected struct `Vec` @@ -18,7 +18,7 @@ LL | let string: String = s.clone(); | ------ ^^-----^^ | | | | | | | help: try using a conversion method: `to_string` - | | expected struct `String`, found `&str` + | | expected `String`, found `&str` | expected due to this error: aborting due to 2 previous errors diff --git a/tests/ui/suggestions/issue-59819.stderr b/tests/ui/suggestions/issue-59819.stderr index 40e4c7b78499..43acf9549c29 100644 --- a/tests/ui/suggestions/issue-59819.stderr +++ b/tests/ui/suggestions/issue-59819.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-59819.rs:28:18 | LL | let y: i32 = x; - | --- ^ expected `i32`, found struct `Foo` + | --- ^ expected `i32`, found `Foo` | | | expected due to this | @@ -30,7 +30,7 @@ error[E0308]: mismatched types LL | let g: String = f; | ------ ^- help: try using a conversion method: `.to_string()` | | | - | | expected struct `String`, found struct `Bar` + | | expected `String`, found `Bar` | expected due to this error: aborting due to 3 previous errors diff --git a/tests/ui/suggestions/issue-83943.stderr b/tests/ui/suggestions/issue-83943.stderr index 885106e8429b..c73667f09cbe 100644 --- a/tests/ui/suggestions/issue-83943.stderr +++ b/tests/ui/suggestions/issue-83943.stderr @@ -8,7 +8,7 @@ LL | | } else { LL | | "B" | | ^^^- help: try using a conversion method: `.to_string()` | | | - | | expected struct `String`, found `&str` + | | expected `String`, found `&str` LL | | }; | |_____- `if` and `else` have incompatible types diff --git a/tests/ui/suggestions/issue-86100-tuple-paren-comma.stderr b/tests/ui/suggestions/issue-86100-tuple-paren-comma.stderr index 8c9a41a20276..da6f7641be53 100644 --- a/tests/ui/suggestions/issue-86100-tuple-paren-comma.stderr +++ b/tests/ui/suggestions/issue-86100-tuple-paren-comma.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-86100-tuple-paren-comma.rs:9:22 | LL | let _x: (i32,) = (5); - | ------ ^^^ expected tuple, found integer + | ------ ^^^ expected `(i32,)`, found integer | | | expected due to this | @@ -17,7 +17,7 @@ error[E0308]: mismatched types --> $DIR/issue-86100-tuple-paren-comma.rs:13:9 | LL | foo((Some(3))); - | --- ^^^^^^^^^ expected tuple, found enum `Option` + | --- ^^^^^^^^^ expected `(_,)`, found `Option<{integer}>` | | | arguments to this function are incorrect | @@ -37,7 +37,7 @@ error[E0308]: mismatched types --> $DIR/issue-86100-tuple-paren-comma.rs:17:22 | LL | let _s = S { _s: ("abc".to_string()) }; - | ^^^^^^^^^^^^^^^^^^^ expected tuple, found struct `String` + | ^^^^^^^^^^^^^^^^^^^ expected `(String,)`, found `String` | = note: expected tuple `(String,)` found struct `String` diff --git a/tests/ui/suggestions/issue-90213-expected-boxfuture-self-ice.stderr b/tests/ui/suggestions/issue-90213-expected-boxfuture-self-ice.stderr index 611f7d5ddda7..7d1da7d24eeb 100644 --- a/tests/ui/suggestions/issue-90213-expected-boxfuture-self-ice.stderr +++ b/tests/ui/suggestions/issue-90213-expected-boxfuture-self-ice.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-90213-expected-boxfuture-self-ice.rs:9:19 | LL | Self::foo(None) - | --------- ^^^^ expected struct `Box`, found enum `Option` + | --------- ^^^^ expected `Box>`, found `Option<_>` | | | arguments to this function are incorrect | diff --git a/tests/ui/suggestions/match-ergonomics.stderr b/tests/ui/suggestions/match-ergonomics.stderr index aa2b407bf561..a3e059e8ac64 100644 --- a/tests/ui/suggestions/match-ergonomics.stderr +++ b/tests/ui/suggestions/match-ergonomics.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | match &x[..] { | ------ this expression has type `&[i32]` LL | [&v] => {}, - | ^^ expected `i32`, found reference + | ^^ expected `i32`, found `&_` | = note: expected type `i32` found reference `&_` @@ -36,7 +36,7 @@ error[E0308]: mismatched types LL | match y { | - this expression has type `i32` LL | &v => {}, - | ^^ expected `i32`, found reference + | ^^ expected `i32`, found `&_` | = note: expected type `i32` found reference `&_` @@ -52,7 +52,7 @@ error[E0308]: mismatched types LL | if let [&v] = &x[..] {} | ^^ ------ this expression has type `&[i32]` | | - | expected `i32`, found reference + | expected `i32`, found `&_` | = note: expected type `i32` found reference `&_` diff --git a/tests/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.stderr b/tests/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.stderr index 00aa7d18a968..51ea5b35ae11 100644 --- a/tests/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.stderr +++ b/tests/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.stderr @@ -16,7 +16,7 @@ LL | / match c { LL | | "baz" => Box::new(Baz), | | ------------- this is found to be of type `Box` LL | | _ => Box::new(Bar), - | | ^^^^^^^^^^^^^ expected struct `Baz`, found struct `Bar` + | | ^^^^^^^^^^^^^ expected `Box`, found `Box` LL | | }; | |_____- `match` arms have incompatible types | @@ -39,7 +39,7 @@ error[E0308]: mismatched types --> $DIR/match-with-different-arm-types-as-stmt-instead-of-expr.rs:23:22 | LL | fn wrong(c: &str) -> Box { - | ----- ^^^^^^^^^^^^ expected struct `Box`, found `()` + | ----- ^^^^^^^^^^^^ expected `Box`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression | diff --git a/tests/ui/suggestions/method-access-to-range-literal-typo.stderr b/tests/ui/suggestions/method-access-to-range-literal-typo.stderr index f421408944bb..54a16b8efa74 100644 --- a/tests/ui/suggestions/method-access-to-range-literal-typo.stderr +++ b/tests/ui/suggestions/method-access-to-range-literal-typo.stderr @@ -16,7 +16,7 @@ error[E0308]: mismatched types LL | fn method(&self) -> Option<&Vec> { | ---------------- expected `Option<&Vec>` because of return type LL | self.option..as_ref().map(|x| x) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `Option`, found struct `Range` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Option<&Vec>`, found `Range>>` | = note: expected enum `Option<&Vec>` found struct `std::ops::Range>>` @@ -32,7 +32,7 @@ error[E0308]: mismatched types LL | fn method2(&self) -> Option<&u8> { | ----------- expected `Option<&u8>` because of return type LL | self.option..foo().get(0) - | ^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `Option`, found struct `Range` + | ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Option<&u8>`, found `Range>>` | = note: expected enum `Option<&u8>` found struct `std::ops::Range>>` diff --git a/tests/ui/suggestions/mut-ref-reassignment.stderr b/tests/ui/suggestions/mut-ref-reassignment.stderr index b3cb6dd06142..b86a04c7cd3d 100644 --- a/tests/ui/suggestions/mut-ref-reassignment.stderr +++ b/tests/ui/suggestions/mut-ref-reassignment.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn suggestion(opt: &mut Option) { | ------------------- expected due to this parameter type LL | opt = None; - | ^^^^ expected mutable reference, found enum `Option` + | ^^^^ expected `&mut Option`, found `Option<_>` | = note: expected mutable reference `&mut Option` found enum `Option<_>` @@ -19,7 +19,7 @@ error[E0308]: mismatched types LL | fn no_suggestion(opt: &mut Result) { | ----------------------- expected due to this parameter type LL | opt = None - | ^^^^ expected mutable reference, found enum `Option` + | ^^^^ expected `&mut Result`, found `Option<_>` | = note: expected mutable reference `&mut Result` found enum `Option<_>` @@ -30,7 +30,7 @@ error[E0308]: mismatched types LL | fn suggestion2(opt: &mut Option) { | ------------------- expected due to this parameter type LL | opt = Some(String::new()) - | ^^^^^^^^^^^^^^^^^^^ expected mutable reference, found enum `Option` + | ^^^^^^^^^^^^^^^^^^^ expected `&mut Option`, found `Option` | = note: expected mutable reference `&mut Option` found enum `Option` @@ -45,7 +45,7 @@ error[E0308]: mismatched types LL | fn no_suggestion2(opt: &mut Option) { | ------------------- expected due to this parameter type LL | opt = Some(42) - | ^^^^^^^^ expected mutable reference, found enum `Option` + | ^^^^^^^^ expected `&mut Option`, found `Option<{integer}>` | = note: expected mutable reference `&mut Option` found enum `Option<{integer}>` diff --git a/tests/ui/suggestions/option-to-bool.stderr b/tests/ui/suggestions/option-to-bool.stderr index 4050c7be82a0..e042f07daeb1 100644 --- a/tests/ui/suggestions/option-to-bool.stderr +++ b/tests/ui/suggestions/option-to-bool.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/option-to-bool.rs:4:16 | LL | if true && x {} - | ---- ^ expected `bool`, found enum `Option` + | ---- ^ expected `bool`, found `Option` | | | expected because this is `bool` | diff --git a/tests/ui/suggestions/recover-from-semicolon-trailing-item.stderr b/tests/ui/suggestions/recover-from-semicolon-trailing-item.stderr index 9588eedc98b4..fee83eb5c181 100644 --- a/tests/ui/suggestions/recover-from-semicolon-trailing-item.stderr +++ b/tests/ui/suggestions/recover-from-semicolon-trailing-item.stderr @@ -22,7 +22,7 @@ error[E0308]: mismatched types --> $DIR/recover-from-semicolon-trailing-item.rs:10:20 | LL | let _: usize = S {}; - | ----- ^^^^ expected `usize`, found struct `S` + | ----- ^^^^ expected `usize`, found `S` | | | expected due to this @@ -30,7 +30,7 @@ error[E0308]: mismatched types --> $DIR/recover-from-semicolon-trailing-item.rs:12:20 | LL | let _: usize = X {}; - | ----- ^^^^ expected `usize`, found struct `X` + | ----- ^^^^ expected `usize`, found `X` | | | expected due to this diff --git a/tests/ui/suggestions/return-bindings.stderr b/tests/ui/suggestions/return-bindings.stderr index c14fb336773d..6f906c27ba94 100644 --- a/tests/ui/suggestions/return-bindings.stderr +++ b/tests/ui/suggestions/return-bindings.stderr @@ -18,7 +18,7 @@ LL | let s: String = if let Some(s) = opt_str { | ______________________________________________^ LL | | LL | | } else { - | |_____^ expected struct `String`, found `()` + | |_____^ expected `String`, found `()` | help: consider returning the local binding `s` | @@ -31,7 +31,7 @@ error[E0308]: mismatched types --> $DIR/return-bindings.rs:14:11 | LL | fn c() -> Option { - | - ^^^^^^^^^^^ expected enum `Option`, found `()` + | - ^^^^^^^^^^^ expected `Option`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression | @@ -50,7 +50,7 @@ LL | let s: String = if let Some(s) = opt_str { | ______________________________________________^ LL | | LL | | } else { - | |_____^ expected struct `String`, found `()` + | |_____^ expected `String`, found `()` | help: consider returning the local binding `s` | @@ -67,7 +67,7 @@ LL | let s = if let Some(s) = opt_str { LL | | } else { | |_____- expected because of this LL | String::new() - | ^^^^^^^^^^^^^ expected `()`, found struct `String` + | ^^^^^^^^^^^^^ expected `()`, found `String` | help: consider returning the local binding `s` | @@ -80,7 +80,7 @@ error[E0308]: mismatched types --> $DIR/return-bindings.rs:37:20 | LL | Some(s) => {} - | ^^ expected struct `String`, found `()` + | ^^ expected `String`, found `()` | help: consider returning the local binding `s` | @@ -95,7 +95,7 @@ LL | let s = match opt_str { LL | | Some(s) => {} | | -- this is found to be of type `()` LL | | None => String::new(), - | | ^^^^^^^^^^^^^ expected `()`, found struct `String` + | | ^^^^^^^^^^^^^ expected `()`, found `String` LL | | LL | | }; | |_____- `match` arms have incompatible types diff --git a/tests/ui/suggestions/shadowed-lplace-method-2.stderr b/tests/ui/suggestions/shadowed-lplace-method-2.stderr index 94eef15f3306..2956360980ec 100644 --- a/tests/ui/suggestions/shadowed-lplace-method-2.stderr +++ b/tests/ui/suggestions/shadowed-lplace-method-2.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/shadowed-lplace-method-2.rs:22:17 | LL | *x.foo(0) = (); - | --------- ^^ expected struct `X`, found `()` + | --------- ^^ expected `X`, found `()` | | | expected due to the type of this binding | diff --git a/tests/ui/suggestions/shadowed-lplace-method.stderr b/tests/ui/suggestions/shadowed-lplace-method.stderr index 91d0d1200d43..33824c4cbc75 100644 --- a/tests/ui/suggestions/shadowed-lplace-method.stderr +++ b/tests/ui/suggestions/shadowed-lplace-method.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/shadowed-lplace-method.rs:9:24 | LL | *rc.borrow_mut() = false; - | ---------------- ^^^^^ expected struct `Rc`, found `bool` + | ---------------- ^^^^^ expected `Rc>`, found `bool` | | | expected due to the type of this binding | diff --git a/tests/ui/suggestions/suggest-box.stderr b/tests/ui/suggestions/suggest-box.stderr index 2bdaa4e9780e..9a4e9fef43c5 100644 --- a/tests/ui/suggestions/suggest-box.stderr +++ b/tests/ui/suggestions/suggest-box.stderr @@ -8,7 +8,7 @@ LL | let _x: Box Result<(), ()>> = || { LL | | Err(())?; LL | | Ok(()) LL | | }; - | |_____^ expected struct `Box`, found closure + | |_____^ expected `Box Result<(), ()>>`, found closure | = note: expected struct `Box Result<(), ()>>` found closure `[closure@$DIR/suggest-box.rs:4:47: 4:49]` diff --git a/tests/ui/suggestions/suggest-full-enum-variant-for-local-module.stderr b/tests/ui/suggestions/suggest-full-enum-variant-for-local-module.stderr index 9b6dba7e9e75..3fb3047d866c 100644 --- a/tests/ui/suggestions/suggest-full-enum-variant-for-local-module.stderr +++ b/tests/ui/suggestions/suggest-full-enum-variant-for-local-module.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/suggest-full-enum-variant-for-local-module.rs:9:28 | LL | let _: option::O<()> = (); - | ------------- ^^ expected enum `O`, found `()` + | ------------- ^^ expected `O<()>`, found `()` | | | expected due to this | diff --git a/tests/ui/suggestions/suggest-remove-deref.stderr b/tests/ui/suggestions/suggest-remove-deref.stderr index f5d810e36f03..4253838eb526 100644 --- a/tests/ui/suggestions/suggest-remove-deref.stderr +++ b/tests/ui/suggestions/suggest-remove-deref.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/suggest-remove-deref.rs:13:9 | LL | foo(*hello); - | --- ^^^^^^ expected reference, found struct `S` + | --- ^^^^^^ expected `&_`, found `S` | | | arguments to this function are incorrect | @@ -23,7 +23,7 @@ error[E0308]: mismatched types --> $DIR/suggest-remove-deref.rs:21:9 | LL | bar(*s); - | --- ^^ expected `&String`, found struct `String` + | --- ^^ expected `&String`, found `String` | | | arguments to this function are incorrect | diff --git a/tests/ui/suggestions/unnecessary_dot_for_floating_point_literal.stderr b/tests/ui/suggestions/unnecessary_dot_for_floating_point_literal.stderr index 34eaa8322c87..8b48ee9f1247 100644 --- a/tests/ui/suggestions/unnecessary_dot_for_floating_point_literal.stderr +++ b/tests/ui/suggestions/unnecessary_dot_for_floating_point_literal.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/unnecessary_dot_for_floating_point_literal.rs:2:18 | LL | let _: f64 = 0..10; - | --- ^^^^^ expected `f64`, found struct `Range` + | --- ^^^^^ expected `f64`, found `Range<{integer}>` | | | expected due to this | @@ -17,7 +17,7 @@ error[E0308]: mismatched types --> $DIR/unnecessary_dot_for_floating_point_literal.rs:3:18 | LL | let _: f64 = 1..; - | --- ^^^ expected `f64`, found struct `RangeFrom` + | --- ^^^ expected `f64`, found `RangeFrom<{integer}>` | | | expected due to this | @@ -32,7 +32,7 @@ error[E0308]: mismatched types --> $DIR/unnecessary_dot_for_floating_point_literal.rs:4:18 | LL | let _: f64 = ..10; - | --- ^^^^ expected `f64`, found struct `RangeTo` + | --- ^^^^ expected `f64`, found `RangeTo<{integer}>` | | | expected due to this | @@ -47,7 +47,7 @@ error[E0308]: mismatched types --> $DIR/unnecessary_dot_for_floating_point_literal.rs:5:18 | LL | let _: f64 = std::ops::Range { start: 0, end: 1 }; - | --- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `f64`, found struct `Range` + | --- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `f64`, found `Range<{integer}>` | | | expected due to this | diff --git a/tests/ui/suppressed-error.rs b/tests/ui/suppressed-error.rs index 256ec1713d4c..1e39be460809 100644 --- a/tests/ui/suppressed-error.rs +++ b/tests/ui/suppressed-error.rs @@ -3,6 +3,6 @@ fn main() { //~^ ERROR mismatched types //~| expected unit type `()` //~| found tuple `(_, _)` -//~| expected `()`, found tuple +//~| expected `()`, found return x; } diff --git a/tests/ui/suppressed-error.stderr b/tests/ui/suppressed-error.stderr index c2874ae9a14b..11d70f8a4336 100644 --- a/tests/ui/suppressed-error.stderr +++ b/tests/ui/suppressed-error.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let (x, y) = (); | ^^^^^^ -- this expression has type `()` | | - | expected `()`, found tuple + | expected `()`, found `(_, _)` | = note: expected unit type `()` found tuple `(_, _)` diff --git a/tests/ui/switched-expectations.stderr b/tests/ui/switched-expectations.stderr index 82fea0f14bd2..744d8483bd3d 100644 --- a/tests/ui/switched-expectations.stderr +++ b/tests/ui/switched-expectations.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/switched-expectations.rs:3:30 | LL | let ref string: String = var; - | ^^^ expected struct `String`, found `i32` + | ^^^ expected `String`, found `i32` error: aborting due to previous error diff --git a/tests/ui/tag-that-dare-not-speak-its-name.rs b/tests/ui/tag-that-dare-not-speak-its-name.rs index 36e22f0b5f1a..0e76ec246d7c 100644 --- a/tests/ui/tag-that-dare-not-speak-its-name.rs +++ b/tests/ui/tag-that-dare-not-speak-its-name.rs @@ -12,5 +12,5 @@ fn main() { //~^ ERROR mismatched types //~| expected type `char` //~| found enum `Option<_>` - //~| expected `char`, found enum `Option` + //~| expected `char`, found `Option<_>` } diff --git a/tests/ui/tag-that-dare-not-speak-its-name.stderr b/tests/ui/tag-that-dare-not-speak-its-name.stderr index 96bab152612f..f53abe53bf13 100644 --- a/tests/ui/tag-that-dare-not-speak-its-name.stderr +++ b/tests/ui/tag-that-dare-not-speak-its-name.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/tag-that-dare-not-speak-its-name.rs:11:20 | LL | let x : char = last(y); - | ---- ^^^^^^^ expected `char`, found enum `Option` + | ---- ^^^^^^^ expected `char`, found `Option<_>` | | | expected due to this | diff --git a/tests/ui/terr-in-field.rs b/tests/ui/terr-in-field.rs index aa801fd0a6c6..cfe350ef86db 100644 --- a/tests/ui/terr-in-field.rs +++ b/tests/ui/terr-in-field.rs @@ -11,7 +11,7 @@ struct Bar { fn want_foo(f: Foo) {} fn have_bar(b: Bar) { want_foo(b); //~ ERROR mismatched types - //~| expected struct `Foo`, found struct `Bar` + //~| expected `Foo`, found `Bar` } fn main() {} diff --git a/tests/ui/terr-in-field.stderr b/tests/ui/terr-in-field.stderr index d2fda09c0767..09df4b34bb52 100644 --- a/tests/ui/terr-in-field.stderr +++ b/tests/ui/terr-in-field.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/terr-in-field.rs:13:14 | LL | want_foo(b); - | -------- ^ expected struct `Foo`, found struct `Bar` + | -------- ^ expected `Foo`, found `Bar` | | | arguments to this function are incorrect | diff --git a/tests/ui/terr-sorts.stderr b/tests/ui/terr-sorts.stderr index 5a61a2fab126..8f1975374a57 100644 --- a/tests/ui/terr-sorts.stderr +++ b/tests/ui/terr-sorts.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/terr-sorts.rs:10:14 | LL | want_foo(b); - | -------- ^ expected struct `Foo`, found struct `Box` + | -------- ^ expected `Foo`, found `Box` | | | arguments to this function are incorrect | diff --git a/tests/ui/traits/issue-52893.stderr b/tests/ui/traits/issue-52893.stderr index a11867c03a68..006cb3a7b72c 100644 --- a/tests/ui/traits/issue-52893.stderr +++ b/tests/ui/traits/issue-52893.stderr @@ -5,7 +5,7 @@ LL | impl AddClass for Class

| - this type parameter ... LL | builder.push(output); - | ---- ^^^^^^ expected type parameter `F`, found struct `Class` + | ---- ^^^^^^ expected type parameter `F`, found `Class

` | | | arguments to this method are incorrect | diff --git a/tests/ui/traits/issue-68295.stderr b/tests/ui/traits/issue-68295.stderr index cb6e6e0769cb..671a97666fda 100644 --- a/tests/ui/traits/issue-68295.stderr +++ b/tests/ui/traits/issue-68295.stderr @@ -5,7 +5,7 @@ LL | fn crash(input: Matrix) -> Matrix | ----------------- expected `Matrix` because of return type ... LL | input.into_owned() - | ^^^^^^^^^^^^^^^^^^ expected `u32`, found associated type + | ^^^^^^^^^^^^^^^^^^ expected `Matrix`, found `Matrix` | = note: expected struct `Matrix<_, _, u32>` found struct `Matrix<_, _, <() as Allocator>::Buffer>` diff --git a/tests/ui/transmutability/issue-101739-1.stderr b/tests/ui/transmutability/issue-101739-1.stderr index 5fa741f26fd0..7c6b533ef5f7 100644 --- a/tests/ui/transmutability/issue-101739-1.stderr +++ b/tests/ui/transmutability/issue-101739-1.stderr @@ -8,7 +8,7 @@ error[E0308]: mismatched types --> $DIR/issue-101739-1.rs:8:50 | LL | Dst: BikeshedIntrinsicFrom, - | ^^^^^^^^^^^^^^^^ expected struct `Assume`, found `bool` + | ^^^^^^^^^^^^^^^^ expected `Assume`, found `bool` error: aborting due to 2 previous errors diff --git a/tests/ui/tuple/add-tuple-within-arguments.stderr b/tests/ui/tuple/add-tuple-within-arguments.stderr index 2e20a4cca084..6849128eaddd 100644 --- a/tests/ui/tuple/add-tuple-within-arguments.stderr +++ b/tests/ui/tuple/add-tuple-within-arguments.stderr @@ -18,7 +18,7 @@ error[E0308]: mismatched types --> $DIR/add-tuple-within-arguments.rs:8:15 | LL | bar("hi", "hi", "hi"); - | --- ^^^^ expected tuple, found `&str` + | --- ^^^^ expected `(&str,)`, found `&str` | | | arguments to this function are incorrect | diff --git a/tests/ui/tuple/wrong_argument_ice-3.stderr b/tests/ui/tuple/wrong_argument_ice-3.stderr index 0a503e1fe58c..75dfe716395a 100644 --- a/tests/ui/tuple/wrong_argument_ice-3.stderr +++ b/tests/ui/tuple/wrong_argument_ice-3.stderr @@ -4,7 +4,7 @@ error[E0061]: this method takes 1 argument but 2 arguments were supplied LL | groups.push(new_group, vec![process]); | ^^^^ ------------- argument of type `Vec<&Process>` unexpected | -note: expected tuple, found struct `Vec` +note: expected `(Vec, Vec)`, found `Vec` --> $DIR/wrong_argument_ice-3.rs:9:21 | LL | groups.push(new_group, vec![process]); diff --git a/tests/ui/type-alias-enum-variants/enum-variant-priority-higher-than-other-inherent.stderr b/tests/ui/type-alias-enum-variants/enum-variant-priority-higher-than-other-inherent.stderr index eb58ee73ca21..db75a520c658 100644 --- a/tests/ui/type-alias-enum-variants/enum-variant-priority-higher-than-other-inherent.stderr +++ b/tests/ui/type-alias-enum-variants/enum-variant-priority-higher-than-other-inherent.stderr @@ -18,7 +18,7 @@ error[E0308]: mismatched types --> $DIR/enum-variant-priority-higher-than-other-inherent.rs:22:17 | LL | let _: u8 = ::V; - | -- ^^^^^^^ expected `u8`, found enum `E2` + | -- ^^^^^^^ expected `u8`, found `E2` | | | expected due to this diff --git a/tests/ui/type-alias-impl-trait/issue-98604.stderr b/tests/ui/type-alias-impl-trait/issue-98604.stderr index 92d01eb0d3d5..64fe15c19f45 100644 --- a/tests/ui/type-alias-impl-trait/issue-98604.stderr +++ b/tests/ui/type-alias-impl-trait/issue-98604.stderr @@ -2,7 +2,7 @@ error[E0271]: expected `fn() -> impl Future {test}` to be a fn item --> $DIR/issue-98604.rs:9:5 | LL | Box::new(test) as AsyncFnPtr; - | ^^^^^^^^^^^^^^ expected struct `Pin`, found opaque type + | ^^^^^^^^^^^^^^ expected `Pin>>`, found opaque type | note: while checking the return type of the `async fn` --> $DIR/issue-98604.rs:5:17 diff --git a/tests/ui/type-alias-impl-trait/issue-98608.stderr b/tests/ui/type-alias-impl-trait/issue-98608.stderr index 916a58451baa..3a3db42c42d3 100644 --- a/tests/ui/type-alias-impl-trait/issue-98608.stderr +++ b/tests/ui/type-alias-impl-trait/issue-98608.stderr @@ -5,7 +5,7 @@ LL | fn hi() -> impl Sized { | ---------- the found opaque type ... LL | let b: Box Box> = Box::new(hi); - | ^^^^^^^^^^^^ expected struct `Box`, found opaque type + | ^^^^^^^^^^^^ expected `Box`, found opaque type | = note: expected struct `Box` found opaque type `impl Sized` diff --git a/tests/ui/type-alias-impl-trait/unnameable_type.stderr b/tests/ui/type-alias-impl-trait/unnameable_type.stderr index 7dc6efc4b1b6..e9032433494a 100644 --- a/tests/ui/type-alias-impl-trait/unnameable_type.stderr +++ b/tests/ui/type-alias-impl-trait/unnameable_type.stderr @@ -15,7 +15,7 @@ LL | type MyPrivate = impl Sized; LL | fn dont_define_this(_private: MyPrivate) {} | ^^^^^^^^^ | | - | expected struct `Private`, found opaque type + | expected `Private`, found opaque type | help: change the parameter type to match the trait: `Private` | note: type in trait diff --git a/tests/ui/type-inference/issue-30225.stderr b/tests/ui/type-inference/issue-30225.stderr index ccd05fa6bfb0..72c33d16cabe 100644 --- a/tests/ui/type-inference/issue-30225.stderr +++ b/tests/ui/type-inference/issue-30225.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-30225.rs:31:9 | LL | u = v; // mark $0 and $1 in a subtype relationship - | ^ expected struct `A`, found struct `B` + | ^ expected `A`, found `B` error: aborting due to previous error diff --git a/tests/ui/type/type-ascription-precedence.stderr b/tests/ui/type/type-ascription-precedence.stderr index edc5aeffdcd6..d6d1e1d7d029 100644 --- a/tests/ui/type/type-ascription-precedence.stderr +++ b/tests/ui/type/type-ascription-precedence.stderr @@ -2,13 +2,13 @@ error[E0308]: mismatched types --> $DIR/type-ascription-precedence.rs:31:7 | LL | &(S: &S); - | ^ expected `&S`, found struct `S` + | ^ expected `&S`, found `S` error[E0308]: mismatched types --> $DIR/type-ascription-precedence.rs:35:7 | LL | *(S: Z); - | ^ expected struct `Z`, found struct `S` + | ^ expected `Z`, found `S` error[E0614]: type `Z` cannot be dereferenced --> $DIR/type-ascription-precedence.rs:35:5 @@ -20,7 +20,7 @@ error[E0308]: mismatched types --> $DIR/type-ascription-precedence.rs:40:7 | LL | -(S: Z); - | ^ expected struct `Z`, found struct `S` + | ^ expected `Z`, found `S` error[E0600]: cannot apply unary operator `-` to type `Z` --> $DIR/type-ascription-precedence.rs:40:5 @@ -40,19 +40,19 @@ error[E0308]: mismatched types --> $DIR/type-ascription-precedence.rs:45:5 | LL | (S + Z): Z; - | ^^^^^^^ expected struct `Z`, found struct `S` + | ^^^^^^^ expected `Z`, found `S` error[E0308]: mismatched types --> $DIR/type-ascription-precedence.rs:49:5 | LL | (S * Z): Z; - | ^^^^^^^ expected struct `Z`, found struct `S` + | ^^^^^^^ expected `Z`, found `S` error[E0308]: mismatched types --> $DIR/type-ascription-precedence.rs:53:5 | LL | (S .. S): S; - | ^^^^^^^^ expected struct `S`, found struct `Range` + | ^^^^^^^^ expected `S`, found `Range` | = note: expected struct `S` found struct `std::ops::Range` diff --git a/tests/ui/type/type-ascription-soundness.stderr b/tests/ui/type/type-ascription-soundness.stderr index 522d5b2e3755..778836a2e06a 100644 --- a/tests/ui/type/type-ascription-soundness.stderr +++ b/tests/ui/type/type-ascription-soundness.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/type-ascription-soundness.rs:7:31 | LL | let ref x = type_ascribe!(arr, &[u8]); - | ^^^ expected slice `[u8]`, found array `[u8; 3]` + | ^^^ expected `&[u8]`, found `&[u8; 3]` | = note: expected reference `&[u8]` found reference `&[u8; 3]` @@ -11,7 +11,7 @@ error[E0308]: mismatched types --> $DIR/type-ascription-soundness.rs:8:35 | LL | let ref mut x = type_ascribe!(arr, &[u8]); - | ^^^ expected slice `[u8]`, found array `[u8; 3]` + | ^^^ expected `&[u8]`, found `&[u8; 3]` | = note: expected reference `&[u8]` found reference `&[u8; 3]` @@ -20,7 +20,7 @@ error[E0308]: mismatched types --> $DIR/type-ascription-soundness.rs:9:25 | LL | match type_ascribe!(arr, &[u8]) { - | ^^^ expected slice `[u8]`, found array `[u8; 3]` + | ^^^ expected `&[u8]`, found `&[u8; 3]` | = note: expected reference `&[u8]` found reference `&[u8; 3]` @@ -29,7 +29,7 @@ error[E0308]: mismatched types --> $DIR/type-ascription-soundness.rs:12:30 | LL | let _len = type_ascribe!(arr, &[u8]).len(); - | ^^^ expected slice `[u8]`, found array `[u8; 3]` + | ^^^ expected `&[u8]`, found `&[u8; 3]` | = note: expected reference `&[u8]` found reference `&[u8; 3]` diff --git a/tests/ui/type/type-check/coerce-result-return-value-2.stderr b/tests/ui/type/type-check/coerce-result-return-value-2.stderr index 5992162341e6..b2c409e07b8c 100644 --- a/tests/ui/type/type-check/coerce-result-return-value-2.stderr +++ b/tests/ui/type/type-check/coerce-result-return-value-2.stderr @@ -5,7 +5,7 @@ LL | fn foo4(x: Result<(), A>) -> Result<(), B> { | ------------- expected `Result<(), B>` because of return type LL | match true { LL | true => x, - | ^ expected struct `B`, found struct `A` + | ^ expected `Result<(), B>`, found `Result<(), A>` | = note: expected enum `Result<_, B>` found enum `Result<_, A>` @@ -21,7 +21,7 @@ LL | fn foo5(x: Result<(), A>) -> Result<(), B> { | ------------- expected `Result<(), B>` because of return type LL | match true { LL | true => return x, - | ^ expected struct `B`, found struct `A` + | ^ expected `Result<(), B>`, found `Result<(), A>` | = note: expected enum `Result<_, B>` found enum `Result<_, A>` @@ -37,7 +37,7 @@ LL | let _: Result<(), B> = { | ____________________________^ LL | | Err(A); LL | | }; - | |_____^ expected enum `Result`, found `()` + | |_____^ expected `Result<(), B>`, found `()` | = note: expected enum `Result<(), B>` found unit type `()` diff --git a/tests/ui/type/type-check/coerce-result-return-value.stderr b/tests/ui/type/type-check/coerce-result-return-value.stderr index 550153520782..adec2f612ae0 100644 --- a/tests/ui/type/type-check/coerce-result-return-value.stderr +++ b/tests/ui/type/type-check/coerce-result-return-value.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn foo1(x: Result<(), A>) -> Result<(), B> { | ------------- expected `Result<(), B>` because of return type LL | x - | ^ expected struct `B`, found struct `A` + | ^ expected `Result<(), B>`, found `Result<(), A>` | = note: expected enum `Result<_, B>` found enum `Result<_, A>` @@ -19,7 +19,7 @@ error[E0308]: mismatched types LL | fn foo2(x: Result<(), A>) -> Result<(), B> { | ------------- expected `Result<(), B>` because of return type LL | return x; - | ^ expected struct `B`, found struct `A` + | ^ expected `Result<(), B>`, found `Result<(), A>` | = note: expected enum `Result<_, B>` found enum `Result<_, A>` @@ -35,7 +35,7 @@ LL | fn foo3(x: Result<(), A>) -> Result<(), B> { | ------------- expected `Result<(), B>` because of return type LL | if true { LL | x - | ^ expected struct `B`, found struct `A` + | ^ expected `Result<(), B>`, found `Result<(), A>` | = note: expected enum `Result<_, B>` found enum `Result<_, A>` @@ -51,7 +51,7 @@ LL | fn foo3(x: Result<(), A>) -> Result<(), B> { | ------------- expected `Result<(), B>` because of return type ... LL | x - | ^ expected struct `B`, found struct `A` + | ^ expected `Result<(), B>`, found `Result<(), A>` | = note: expected enum `Result<_, B>` found enum `Result<_, A>` diff --git a/tests/ui/type/type-check/point-at-inference-2.stderr b/tests/ui/type/type-check/point-at-inference-2.stderr index 13227c5e245b..1d2777ad69a2 100644 --- a/tests/ui/type/type-check/point-at-inference-2.stderr +++ b/tests/ui/type/type-check/point-at-inference-2.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/point-at-inference-2.rs:5:9 | LL | bar(v); - | --- ^ expected `i32`, found `&{integer}` + | --- ^ expected `Vec`, found `Vec<&{integer}>` | | | arguments to this function are incorrect | @@ -21,7 +21,7 @@ LL | baz(&v); | - here the type of `v` is inferred to be `Vec<&i32>` LL | baz(&v); LL | bar(v); - | --- ^ expected `i32`, found `&i32` + | --- ^ expected `Vec`, found `Vec<&i32>` | | | arguments to this function are incorrect | @@ -39,7 +39,7 @@ error[E0308]: mismatched types LL | baz(&v); | - here the type of `v` is inferred to be `Vec<&i32>` LL | bar(v); - | --- ^ expected `i32`, found `&i32` + | --- ^ expected `Vec`, found `Vec<&i32>` | | | arguments to this function are incorrect | diff --git a/tests/ui/type/type-check/point-at-inference.stderr b/tests/ui/type/type-check/point-at-inference.stderr index 70428fe841b9..a76b4f90c734 100644 --- a/tests/ui/type/type-check/point-at-inference.stderr +++ b/tests/ui/type/type-check/point-at-inference.stderr @@ -5,7 +5,7 @@ LL | foo.push(i); | - this is of type `&{integer}`, which causes `foo` to be inferred as `Vec<&{integer}>` ... LL | bar(foo); - | --- ^^^ expected `i32`, found `&{integer}` + | --- ^^^ expected `Vec`, found `Vec<&{integer}>` | | | arguments to this function are incorrect | diff --git a/tests/ui/type/type-mismatch-same-crate-name.rs b/tests/ui/type/type-mismatch-same-crate-name.rs index c9cdc874c02e..2a59bd994508 100644 --- a/tests/ui/type/type-mismatch-same-crate-name.rs +++ b/tests/ui/type/type-mismatch-same-crate-name.rs @@ -16,7 +16,7 @@ fn main() { a::try_foo(foo2); //~^ ERROR mismatched types //~| perhaps two different versions of crate `crate_a1` - //~| expected struct `main::a::Foo` + //~| expected `main::a::Foo`, found a different `main::a::Foo` a::try_bar(bar2); //~^ ERROR mismatched types //~| perhaps two different versions of crate `crate_a1` diff --git a/tests/ui/type/type-mismatch-same-crate-name.stderr b/tests/ui/type/type-mismatch-same-crate-name.stderr index fcafd315ebf5..504812f5867a 100644 --- a/tests/ui/type/type-mismatch-same-crate-name.stderr +++ b/tests/ui/type/type-mismatch-same-crate-name.stderr @@ -2,17 +2,17 @@ error[E0308]: mismatched types --> $DIR/type-mismatch-same-crate-name.rs:16:20 | LL | a::try_foo(foo2); - | ---------- ^^^^ expected struct `main::a::Foo`, found a different struct `main::a::Foo` + | ---------- ^^^^ expected `main::a::Foo`, found a different `main::a::Foo` | | | arguments to this function are incorrect | - = note: struct `main::a::Foo` and struct `main::a::Foo` have similar names, but are actually distinct types -note: struct `main::a::Foo` is defined in crate `crate_a2` + = note: `main::a::Foo` and `main::a::Foo` have similar names, but are actually distinct types +note: `main::a::Foo` is defined in crate `crate_a2` --> $DIR/auxiliary/crate_a2.rs:1:1 | LL | pub struct Foo; | ^^^^^^^^^^^^^^ -note: struct `main::a::Foo` is defined in crate `crate_a1` +note: `main::a::Foo` is defined in crate `crate_a1` --> $DIR/auxiliary/crate_a1.rs:1:1 | LL | pub struct Foo; diff --git a/tests/ui/type/type-mismatch.stderr b/tests/ui/type/type-mismatch.stderr index 6c187bad0725..67a1f893050c 100644 --- a/tests/ui/type/type-mismatch.stderr +++ b/tests/ui/type/type-mismatch.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:17:17 | LL | want::(f); - | ----------- ^ expected struct `foo`, found `usize` + | ----------- ^ expected `foo`, found `usize` | | | arguments to this function are incorrect | @@ -16,7 +16,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:18:17 | LL | want::(f); - | ----------- ^ expected struct `bar`, found `usize` + | ----------- ^ expected `bar`, found `usize` | | | arguments to this function are incorrect | @@ -30,7 +30,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:19:24 | LL | want::>(f); - | ------------------ ^ expected struct `Foo`, found `usize` + | ------------------ ^ expected `Foo`, found `usize` | | | arguments to this function are incorrect | @@ -46,7 +46,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:20:27 | LL | want::>(f); - | --------------------- ^ expected struct `Foo`, found `usize` + | --------------------- ^ expected `Foo`, found `usize` | | | arguments to this function are incorrect | @@ -62,7 +62,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:21:22 | LL | want::>(f); - | ---------------- ^ expected struct `Foo`, found `usize` + | ---------------- ^ expected `Foo`, found `usize` | | | arguments to this function are incorrect | @@ -78,7 +78,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:22:25 | LL | want::>(f); - | ------------------- ^ expected struct `Foo`, found `usize` + | ------------------- ^ expected `Foo`, found `usize` | | | arguments to this function are incorrect | @@ -94,7 +94,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:23:22 | LL | want::>(f); - | ---------------- ^ expected struct `Foo`, found `usize` + | ---------------- ^ expected `Foo`, found `usize` | | | arguments to this function are incorrect | @@ -110,7 +110,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:24:25 | LL | want::>(f); - | ------------------- ^ expected struct `Foo`, found `usize` + | ------------------- ^ expected `Foo`, found `usize` | | | arguments to this function are incorrect | @@ -126,7 +126,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:28:19 | LL | want::(f); - | ------------- ^ expected `usize`, found struct `foo` + | ------------- ^ expected `usize`, found `foo` | | | arguments to this function are incorrect | @@ -140,7 +140,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:29:17 | LL | want::(f); - | ----------- ^ expected struct `bar`, found struct `foo` + | ----------- ^ expected `bar`, found `foo` | | | arguments to this function are incorrect | @@ -154,7 +154,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:30:24 | LL | want::>(f); - | ------------------ ^ expected struct `Foo`, found struct `foo` + | ------------------ ^ expected `Foo`, found `foo` | | | arguments to this function are incorrect | @@ -170,7 +170,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:31:27 | LL | want::>(f); - | --------------------- ^ expected struct `Foo`, found struct `foo` + | --------------------- ^ expected `Foo`, found `foo` | | | arguments to this function are incorrect | @@ -186,7 +186,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:32:22 | LL | want::>(f); - | ---------------- ^ expected struct `Foo`, found struct `foo` + | ---------------- ^ expected `Foo`, found `foo` | | | arguments to this function are incorrect | @@ -202,7 +202,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:33:25 | LL | want::>(f); - | ------------------- ^ expected struct `Foo`, found struct `foo` + | ------------------- ^ expected `Foo`, found `foo` | | | arguments to this function are incorrect | @@ -218,7 +218,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:34:22 | LL | want::>(f); - | ---------------- ^ expected struct `Foo`, found struct `foo` + | ---------------- ^ expected `Foo`, found `foo` | | | arguments to this function are incorrect | @@ -234,7 +234,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:35:25 | LL | want::>(f); - | ------------------- ^ expected struct `Foo`, found struct `foo` + | ------------------- ^ expected `Foo`, found `foo` | | | arguments to this function are incorrect | @@ -250,7 +250,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:39:19 | LL | want::(f); - | ------------- ^ expected `usize`, found struct `Foo` + | ------------- ^ expected `usize`, found `Foo` | | | arguments to this function are incorrect | @@ -266,7 +266,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:40:17 | LL | want::(f); - | ----------- ^ expected struct `foo`, found struct `Foo` + | ----------- ^ expected `foo`, found `Foo` | | | arguments to this function are incorrect | @@ -282,7 +282,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:41:17 | LL | want::(f); - | ----------- ^ expected struct `bar`, found struct `Foo` + | ----------- ^ expected `bar`, found `Foo` | | | arguments to this function are incorrect | @@ -298,7 +298,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:42:24 | LL | want::>(f); - | ------------------ ^ expected `usize`, found struct `foo` + | ------------------ ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -314,7 +314,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:43:27 | LL | want::>(f); - | --------------------- ^ expected `usize`, found struct `foo` + | --------------------- ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -330,7 +330,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:44:25 | LL | want::>(f); - | ------------------- ^ expected struct `B`, found struct `A` + | ------------------- ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -346,7 +346,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:45:22 | LL | want::>(f); - | ---------------- ^ expected struct `bar`, found struct `foo` + | ---------------- ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -362,7 +362,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:46:25 | LL | want::>(f); - | ------------------- ^ expected struct `bar`, found struct `foo` + | ------------------- ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -380,7 +380,7 @@ error[E0308]: mismatched types LL | want::<&Foo>(f); | ----------------- ^ | | | - | | expected `&Foo`, found struct `Foo` + | | expected `&Foo`, found `Foo` | | help: consider borrowing here: `&f` | arguments to this function are incorrect | @@ -396,7 +396,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:48:26 | LL | want::<&Foo>(f); - | -------------------- ^ expected `&Foo`, found struct `Foo` + | -------------------- ^ expected `&Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -412,7 +412,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:52:19 | LL | want::(f); - | ------------- ^ expected `usize`, found struct `Foo` + | ------------- ^ expected `usize`, found `Foo` | | | arguments to this function are incorrect | @@ -428,7 +428,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:53:17 | LL | want::(f); - | ----------- ^ expected struct `foo`, found struct `Foo` + | ----------- ^ expected `foo`, found `Foo` | | | arguments to this function are incorrect | @@ -444,7 +444,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:54:17 | LL | want::(f); - | ----------- ^ expected struct `bar`, found struct `Foo` + | ----------- ^ expected `bar`, found `Foo` | | | arguments to this function are incorrect | @@ -460,7 +460,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:55:24 | LL | want::>(f); - | ------------------ ^ expected `usize`, found struct `foo` + | ------------------ ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -476,7 +476,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:56:27 | LL | want::>(f); - | --------------------- ^ expected `usize`, found struct `foo` + | --------------------- ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -492,7 +492,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:57:22 | LL | want::>(f); - | ---------------- ^ expected struct `A`, found struct `B` + | ---------------- ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -508,7 +508,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:58:22 | LL | want::>(f); - | ---------------- ^ expected struct `bar`, found struct `foo` + | ---------------- ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -524,7 +524,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:59:25 | LL | want::>(f); - | ------------------- ^ expected struct `bar`, found struct `foo` + | ------------------- ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -540,7 +540,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:60:23 | LL | want::<&Foo>(f); - | ----------------- ^ expected `&Foo`, found struct `Foo` + | ----------------- ^ expected `&Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -558,7 +558,7 @@ error[E0308]: mismatched types LL | want::<&Foo>(f); | -------------------- ^ | | | - | | expected `&Foo`, found struct `Foo` + | | expected `&Foo`, found `Foo` | | help: consider borrowing here: `&f` | arguments to this function are incorrect | @@ -574,7 +574,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:65:19 | LL | want::(f); - | ------------- ^ expected `usize`, found struct `Foo` + | ------------- ^ expected `usize`, found `Foo` | | | arguments to this function are incorrect | @@ -590,7 +590,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:66:17 | LL | want::(f); - | ----------- ^ expected struct `foo`, found struct `Foo` + | ----------- ^ expected `foo`, found `Foo` | | | arguments to this function are incorrect | @@ -606,7 +606,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:67:17 | LL | want::(f); - | ----------- ^ expected struct `bar`, found struct `Foo` + | ----------- ^ expected `bar`, found `Foo` | | | arguments to this function are incorrect | @@ -622,7 +622,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:68:24 | LL | want::>(f); - | ------------------ ^ expected `usize`, found struct `foo` + | ------------------ ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -638,7 +638,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:69:27 | LL | want::>(f); - | --------------------- ^ expected `usize`, found struct `foo` + | --------------------- ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -654,7 +654,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:70:22 | LL | want::>(f); - | ---------------- ^ expected struct `A`, found struct `B` + | ---------------- ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -670,7 +670,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:71:25 | LL | want::>(f); - | ------------------- ^ expected struct `B`, found struct `A` + | ------------------- ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -686,7 +686,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:72:22 | LL | want::>(f); - | ---------------- ^ expected struct `bar`, found struct `foo` + | ---------------- ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -702,7 +702,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:73:25 | LL | want::>(f); - | ------------------- ^ expected struct `bar`, found struct `foo` + | ------------------- ^ expected `Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -718,7 +718,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:74:23 | LL | want::<&Foo>(f); - | ----------------- ^ expected `&Foo`, found struct `Foo` + | ----------------- ^ expected `&Foo`, found `Foo` | | | arguments to this function are incorrect | @@ -734,7 +734,7 @@ error[E0308]: mismatched types --> $DIR/type-mismatch.rs:75:26 | LL | want::<&Foo>(f); - | -------------------- ^ expected `&Foo`, found struct `Foo` + | -------------------- ^ expected `&Foo`, found `Foo` | | | arguments to this function are incorrect | diff --git a/tests/ui/typeck/assign-non-lval-derefmut.stderr b/tests/ui/typeck/assign-non-lval-derefmut.stderr index e394cf8206ed..b26d16da0152 100644 --- a/tests/ui/typeck/assign-non-lval-derefmut.stderr +++ b/tests/ui/typeck/assign-non-lval-derefmut.stderr @@ -30,7 +30,7 @@ error[E0308]: mismatched types LL | let mut y = x.lock().unwrap(); | ----------------- expected due to this value LL | y = 2; - | ^ expected struct `MutexGuard`, found integer + | ^ expected `MutexGuard<'_, usize>`, found integer | = note: expected struct `MutexGuard<'_, usize>` found type `{integer}` diff --git a/tests/ui/typeck/bad-type-in-vec-push.stderr b/tests/ui/typeck/bad-type-in-vec-push.stderr index e4c99ec8e701..882854acb1d8 100644 --- a/tests/ui/typeck/bad-type-in-vec-push.stderr +++ b/tests/ui/typeck/bad-type-in-vec-push.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | vector.sort(); | ------ here the type of `vector` is inferred to be `Vec<_>` LL | result.push(vector); - | ---- ^^^^^^ expected integer, found struct `Vec` + | ---- ^^^^^^ expected integer, found `Vec<_>` | | | arguments to this method are incorrect | diff --git a/tests/ui/typeck/conversion-methods.stderr b/tests/ui/typeck/conversion-methods.stderr index 091502bdda34..a9b5078ccdde 100644 --- a/tests/ui/typeck/conversion-methods.stderr +++ b/tests/ui/typeck/conversion-methods.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let _tis_an_instants_play: String = "'Tis a fond Ambush—"; | ------ ^^^^^^^^^^^^^^^^^^^^^- help: try using a conversion method: `.to_string()` | | | - | | expected struct `String`, found `&str` + | | expected `String`, found `&str` | expected due to this error[E0308]: mismatched types @@ -13,7 +13,7 @@ error[E0308]: mismatched types LL | let _just_to_make_bliss: PathBuf = Path::new("/ern/her/own/surprise"); | ------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^- help: try using a conversion method: `.to_path_buf()` | | | - | | expected struct `PathBuf`, found `&Path` + | | expected `PathBuf`, found `&Path` | expected due to this error[E0308]: mismatched types @@ -22,14 +22,14 @@ error[E0308]: mismatched types LL | let _but_should_the_play: String = 2; // Perhaps surprisingly, we suggest .to_string() here | ------ ^- help: try using a conversion method: `.to_string()` | | | - | | expected struct `String`, found integer + | | expected `String`, found integer | expected due to this error[E0308]: mismatched types --> $DIR/conversion-methods.rs:12:47 | LL | let _prove_piercing_earnest: Vec = &[1, 2, 3]; - | ---------- ^^^^^^^^^^ expected struct `Vec`, found `&[{integer}; 3]` + | ---------- ^^^^^^^^^^ expected `Vec`, found `&[{integer}; 3]` | | | expected due to this | diff --git a/tests/ui/typeck/deref-multi.stderr b/tests/ui/typeck/deref-multi.stderr index bd6575c73d24..4346e273d0d6 100644 --- a/tests/ui/typeck/deref-multi.stderr +++ b/tests/ui/typeck/deref-multi.stderr @@ -58,7 +58,7 @@ error[E0308]: mismatched types LL | fn d(x: std::sync::Mutex<&i32>) -> i32 { | --- expected `i32` because of return type LL | x.lock().unwrap() - | ^^^^^^^^^^^^^^^^^ expected `i32`, found struct `MutexGuard` + | ^^^^^^^^^^^^^^^^^ expected `i32`, found `MutexGuard<'_, &i32>` | = note: expected type `i32` found struct `MutexGuard<'_, &i32>` diff --git a/tests/ui/typeck/explain_clone_autoref.rs b/tests/ui/typeck/explain_clone_autoref.rs index 9279e4c3901d..4d21574700ad 100644 --- a/tests/ui/typeck/explain_clone_autoref.rs +++ b/tests/ui/typeck/explain_clone_autoref.rs @@ -9,5 +9,5 @@ fn clone_thing(nc: &NotClone) -> NotClone { nc.clone() //~^ ERROR mismatched type //~| NOTE `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead - //~| NOTE expected struct `NotClone`, found `&NotClone` + //~| NOTE expected `NotClone`, found `&NotClone` } diff --git a/tests/ui/typeck/explain_clone_autoref.stderr b/tests/ui/typeck/explain_clone_autoref.stderr index ff36e18d2830..4539da4389b3 100644 --- a/tests/ui/typeck/explain_clone_autoref.stderr +++ b/tests/ui/typeck/explain_clone_autoref.stderr @@ -5,7 +5,7 @@ LL | fn clone_thing(nc: &NotClone) -> NotClone { | -------- expected `NotClone` because of return type LL | LL | nc.clone() - | ^^^^^^^^^^ expected struct `NotClone`, found `&NotClone` + | ^^^^^^^^^^ expected `NotClone`, found `&NotClone` | note: `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead --> $DIR/explain_clone_autoref.rs:9:5 diff --git a/tests/ui/typeck/issue-100246.stderr b/tests/ui/typeck/issue-100246.stderr index 8b77de94e89f..428a0792091e 100644 --- a/tests/ui/typeck/issue-100246.stderr +++ b/tests/ui/typeck/issue-100246.stderr @@ -2,7 +2,7 @@ error[E0308]: `?` operator has incompatible types --> $DIR/issue-100246.rs:28:24 | LL | let other: Other = downcast()?; - | ^^^^^^^^^^^ expected struct `Other`, found reference + | ^^^^^^^^^^^ expected `Other`, found `&_` | = note: `?` operator cannot convert from `&_` to `Other` = note: expected struct `Other` diff --git a/tests/ui/typeck/issue-13853.stderr b/tests/ui/typeck/issue-13853.stderr index 876ac2c67ef3..11d34f5b93b0 100644 --- a/tests/ui/typeck/issue-13853.stderr +++ b/tests/ui/typeck/issue-13853.stderr @@ -5,7 +5,7 @@ LL | fn nodes<'a, I: Iterator>(&self) -> I | - this type parameter - expected `I` because of return type ... LL | self.iter() - | ^^^^^^^^^^^ expected type parameter `I`, found struct `Iter` + | ^^^^^^^^^^^ expected type parameter `I`, found `Iter<'_, N>` | = note: expected type parameter `I` found struct `std::slice::Iter<'_, N>` @@ -22,7 +22,7 @@ error[E0308]: mismatched types LL | iterate(graph); | ------- ^^^^^ | | | - | | expected reference, found struct `Vec` + | | expected `&_`, found `Vec` | | help: consider borrowing here: `&graph` | arguments to this function are incorrect | diff --git a/tests/ui/typeck/issue-31173.stderr b/tests/ui/typeck/issue-31173.stderr index f3be99f9bcb4..8346c9a0aaec 100644 --- a/tests/ui/typeck/issue-31173.stderr +++ b/tests/ui/typeck/issue-31173.stderr @@ -2,7 +2,7 @@ error[E0271]: expected `TakeWhile<&mut IntoIter, [closure@issue-31173.rs:7:2 --> $DIR/issue-31173.rs:11:10 | LL | .cloned() - | ^^^^^^ expected reference, found `u8` + | ^^^^^^ expected `&_`, found `u8` | = note: expected reference `&_` found type `u8` diff --git a/tests/ui/typeck/issue-46112.stderr b/tests/ui/typeck/issue-46112.stderr index 8f5ff51fbe10..26fc21dda06a 100644 --- a/tests/ui/typeck/issue-46112.stderr +++ b/tests/ui/typeck/issue-46112.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-46112.rs:9:21 | LL | fn main() { test(Ok(())); } - | -- ^^ expected enum `Option`, found `()` + | -- ^^ expected `Option<()>`, found `()` | | | arguments to this enum variant are incorrect | diff --git a/tests/ui/typeck/issue-50687-ice-on-borrow.stderr b/tests/ui/typeck/issue-50687-ice-on-borrow.stderr index e6a0edac4b11..9e48ccefd86b 100644 --- a/tests/ui/typeck/issue-50687-ice-on-borrow.stderr +++ b/tests/ui/typeck/issue-50687-ice-on-borrow.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-50687-ice-on-borrow.rs:40:17 | LL | let _: () = Borrow::borrow(&owned); - | -- ^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found reference + | -- ^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found `&_` | | | expected due to this | diff --git a/tests/ui/typeck/issue-57673-ice-on-deref-of-boxed-trait.stderr b/tests/ui/typeck/issue-57673-ice-on-deref-of-boxed-trait.stderr index b92a6f2ec2b4..dc4bc5b5f44b 100644 --- a/tests/ui/typeck/issue-57673-ice-on-deref-of-boxed-trait.stderr +++ b/tests/ui/typeck/issue-57673-ice-on-deref-of-boxed-trait.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn ice(x: Box>) { | - help: try adding a return type: `-> (dyn Iterator + 'static)` LL | *x - | ^^ expected `()`, found trait object `dyn Iterator` + | ^^ expected `()`, found `dyn Iterator` | = note: expected unit type `()` found trait object `(dyn Iterator + 'static)` diff --git a/tests/ui/typeck/issue-67971.stderr b/tests/ui/typeck/issue-67971.stderr index 5d07f9cc748e..d50ed9cf13bb 100644 --- a/tests/ui/typeck/issue-67971.stderr +++ b/tests/ui/typeck/issue-67971.stderr @@ -8,7 +8,7 @@ error[E0308]: mismatched types --> $DIR/issue-67971.rs:3:24 | LL | fn foo(ctx: &mut S) -> String { - | --- ^^^^^^ expected struct `String`, found `()` + | --- ^^^^^^ expected `String`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression diff --git a/tests/ui/typeck/issue-84160.stderr b/tests/ui/typeck/issue-84160.stderr index 24c188b3fcb7..4d456ae842f6 100644 --- a/tests/ui/typeck/issue-84160.stderr +++ b/tests/ui/typeck/issue-84160.stderr @@ -5,7 +5,7 @@ LL | fn mismatched_types_with_reference(x: &u32) -> &u32 { | ---- expected `&u32` because of return type ... LL | return "test"; - | ^^^^^^ expected `u32`, found `str` + | ^^^^^^ expected `&u32`, found `&str` | = note: expected reference `&u32` found reference `&'static str` diff --git a/tests/ui/typeck/issue-84768.stderr b/tests/ui/typeck/issue-84768.stderr index 09f3aee2d9ec..63936f9979f4 100644 --- a/tests/ui/typeck/issue-84768.stderr +++ b/tests/ui/typeck/issue-84768.stderr @@ -8,7 +8,7 @@ error[E0308]: mismatched types --> $DIR/issue-84768.rs:7:42 | LL | ::call_once(f, 1) - | --------------------------------- ^ expected tuple, found integer + | --------------------------------- ^ expected `(&mut u8,)`, found integer | | | arguments to this function are incorrect | diff --git a/tests/ui/typeck/issue-89856.stderr b/tests/ui/typeck/issue-89856.stderr index 5fa1ae1a54f7..6b9cbe52c255 100644 --- a/tests/ui/typeck/issue-89856.stderr +++ b/tests/ui/typeck/issue-89856.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-89856.rs:6:20 | LL | take_str_maybe(option); - | -------------- ^^^^^^ expected `str`, found struct `String` + | -------------- ^^^^^^ expected `Option<&str>`, found `Option<&String>` | | | arguments to this function are incorrect | diff --git a/tests/ui/typeck/issue-91450-inner-ty-error.stderr b/tests/ui/typeck/issue-91450-inner-ty-error.stderr index 32f4c8f6fdf8..7ca5446c2e7a 100644 --- a/tests/ui/typeck/issue-91450-inner-ty-error.stderr +++ b/tests/ui/typeck/issue-91450-inner-ty-error.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-91450-inner-ty-error.rs:4:13 | LL | fn foo() -> Option<_> {} - | --- ^^^^^^^^^ expected enum `Option`, found `()` + | --- ^^^^^^^^^ expected `Option<_>`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression | diff --git a/tests/ui/typeck/issue-92481.stderr b/tests/ui/typeck/issue-92481.stderr index cd778a649b62..c3acbd2c067c 100644 --- a/tests/ui/typeck/issue-92481.stderr +++ b/tests/ui/typeck/issue-92481.stderr @@ -49,7 +49,7 @@ LL | fn r({) { LL | / Ok { LL | | d..||_=m LL | | } - | |_____^ expected `()`, found enum `Result` + | |_____^ expected `()`, found `Result<_, _>` | = note: expected unit type `()` found enum `Result<_, _>` diff --git a/tests/ui/typeck/issue-96530.stderr b/tests/ui/typeck/issue-96530.stderr index 4b4568b1de9b..3a67ef0260b4 100644 --- a/tests/ui/typeck/issue-96530.stderr +++ b/tests/ui/typeck/issue-96530.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-96530.rs:9:11 | LL | ..man.clone() - | ^^^^^^^^^^^ expected struct `Person`, found `&Person` + | ^^^^^^^^^^^ expected `Person`, found `&Person` error: aborting due to previous error diff --git a/tests/ui/typeck/return_type_containing_closure.rs b/tests/ui/typeck/return_type_containing_closure.rs index 29624e08a2e8..8b826daeede4 100644 --- a/tests/ui/typeck/return_type_containing_closure.rs +++ b/tests/ui/typeck/return_type_containing_closure.rs @@ -2,7 +2,7 @@ fn foo() { //~ HELP a return type might be missing here vec!['a'].iter().map(|c| c) //~^ ERROR mismatched types [E0308] - //~| NOTE expected `()`, found struct `Map` + //~| NOTE expected `()`, found `Map, ...>` //~| NOTE expected unit type `()` //~| HELP consider using a semicolon here } diff --git a/tests/ui/typeck/return_type_containing_closure.stderr b/tests/ui/typeck/return_type_containing_closure.stderr index 101aee39559c..f9a240963997 100644 --- a/tests/ui/typeck/return_type_containing_closure.stderr +++ b/tests/ui/typeck/return_type_containing_closure.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/return_type_containing_closure.rs:3:5 | LL | vec!['a'].iter().map(|c| c) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found struct `Map` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found `Map, ...>` | = note: expected unit type `()` found struct `Map, [closure@$DIR/return_type_containing_closure.rs:3:26: 3:29]>` diff --git a/tests/ui/typeck/typeck_type_placeholder_mismatch.rs b/tests/ui/typeck/typeck_type_placeholder_mismatch.rs index 2f9cfcf8dbb5..718b6deed1bb 100644 --- a/tests/ui/typeck/typeck_type_placeholder_mismatch.rs +++ b/tests/ui/typeck/typeck_type_placeholder_mismatch.rs @@ -14,7 +14,7 @@ fn test1() { //~^ ERROR mismatched types //~| expected struct `Foo<_>` //~| found struct `Bar` - //~| expected struct `Foo`, found struct `Bar` + //~| expected `Foo<_>`, found `Bar` let y: Foo = x; } @@ -23,5 +23,5 @@ fn test2() { //~^ ERROR mismatched types //~| expected struct `Foo<_>` //~| found struct `Bar` - //~| expected struct `Foo`, found struct `Bar` + //~| expected `Foo<_>`, found `Bar` } diff --git a/tests/ui/typeck/typeck_type_placeholder_mismatch.stderr b/tests/ui/typeck/typeck_type_placeholder_mismatch.stderr index 867412a24b28..bf8e0bbb519c 100644 --- a/tests/ui/typeck/typeck_type_placeholder_mismatch.stderr +++ b/tests/ui/typeck/typeck_type_placeholder_mismatch.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/typeck_type_placeholder_mismatch.rs:13:21 | LL | let x: Foo<_> = Bar::(PhantomData); - | ------ ^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `Foo`, found struct `Bar` + | ------ ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Foo<_>`, found `Bar` | | | expected due to this | @@ -13,7 +13,7 @@ error[E0308]: mismatched types --> $DIR/typeck_type_placeholder_mismatch.rs:22:21 | LL | let x: Foo<_> = Bar::(PhantomData); - | ------ ^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `Foo`, found struct `Bar` + | ------ ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Foo<_>`, found `Bar` | | | expected due to this | diff --git a/tests/ui/unsized-locals/suggest-borrow.stderr b/tests/ui/unsized-locals/suggest-borrow.stderr index 08745eab28d1..d456c16de0dc 100644 --- a/tests/ui/unsized-locals/suggest-borrow.stderr +++ b/tests/ui/unsized-locals/suggest-borrow.stderr @@ -18,7 +18,7 @@ error[E0308]: mismatched types LL | let x: &[u8] = vec!(1, 2, 3)[..]; | ----- ^^^^^^^^^^^^^^^^^ | | | - | | expected `&[u8]`, found slice `[{integer}]` + | | expected `&[u8]`, found `[{integer}]` | | help: consider borrowing here: `&vec!(1, 2, 3)[..]` | expected due to this @@ -26,7 +26,7 @@ error[E0308]: mismatched types --> $DIR/suggest-borrow.rs:4:19 | LL | let x: [u8] = &vec!(1, 2, 3)[..]; - | ---- ^^^^^^^^^^^^^^^^^^ expected slice `[u8]`, found `&[{integer}]` + | ---- ^^^^^^^^^^^^^^^^^^ expected `[u8]`, found `&[{integer}]` | | | expected due to this | diff --git a/tests/ui/unsized/box-instead-of-dyn-fn.stderr b/tests/ui/unsized/box-instead-of-dyn-fn.stderr index c96c59afc5a5..bfb7c3957f42 100644 --- a/tests/ui/unsized/box-instead-of-dyn-fn.stderr +++ b/tests/ui/unsized/box-instead-of-dyn-fn.stderr @@ -9,7 +9,7 @@ LL | | move || println!("{a}") | | expected because of this LL | | } else { LL | | Box::new(move || println!("{}", b)) - | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected closure, found struct `Box` + | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected closure, found `Box<[closure@box-instead-of-dyn-fn.rs:10:18]>` LL | | LL | | } | |_____- `if` and `else` have incompatible types diff --git a/tests/ui/unsized/param-mentioned-by-different-field.stderr b/tests/ui/unsized/param-mentioned-by-different-field.stderr index d18fa6456f3e..b1ad0cb5b88e 100644 --- a/tests/ui/unsized/param-mentioned-by-different-field.stderr +++ b/tests/ui/unsized/param-mentioned-by-different-field.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/param-mentioned-by-different-field.rs:8:25 | LL | let y: &Foo<[u8]> = &x; - | ---------- ^^ expected slice `[u8]`, found array `[u8; 1]` + | ---------- ^^ expected `&Foo<[u8]>`, found `&Foo<[u8; 1]>` | | | expected due to this | diff --git a/tests/ui/wf/wf-unsafe-trait-obj-match.stderr b/tests/ui/wf/wf-unsafe-trait-obj-match.stderr index 96fc1d36b9cf..d2b41630976a 100644 --- a/tests/ui/wf/wf-unsafe-trait-obj-match.stderr +++ b/tests/ui/wf/wf-unsafe-trait-obj-match.stderr @@ -5,7 +5,7 @@ LL | / match opt() { LL | | Some(()) => &S, | | -- this is found to be of type `&S` LL | | None => &R, - | | ^^ expected struct `S`, found struct `R` + | | ^^ expected `&S`, found `&R` LL | | } | |_____- `match` arms have incompatible types | diff --git a/tests/ui/wrong-mul-method-signature.stderr b/tests/ui/wrong-mul-method-signature.stderr index 504a6032b01f..25a92f5ec12a 100644 --- a/tests/ui/wrong-mul-method-signature.stderr +++ b/tests/ui/wrong-mul-method-signature.stderr @@ -16,7 +16,7 @@ error[E0053]: method `mul` has an incompatible type for trait LL | fn mul(self, s: f64) -> Vec2 { | ^^^ | | - | expected struct `Vec2`, found `f64` + | expected `Vec2`, found `f64` | help: change the parameter type to match the trait: `Vec2` | = note: expected signature `fn(Vec2, Vec2) -> f64` @@ -38,7 +38,7 @@ error[E0308]: mismatched types --> $DIR/wrong-mul-method-signature.rs:63:45 | LL | let x: Vec2 = Vec2 { x: 1.0, y: 2.0 } * 2.0; // trait had reversed order - | ----------------------- ^^^ expected struct `Vec2`, found floating-point number + | ----------------------- ^^^ expected `Vec2`, found floating-point number | | | expected because this is `Vec2` @@ -46,7 +46,7 @@ error[E0308]: mismatched types --> $DIR/wrong-mul-method-signature.rs:63:19 | LL | let x: Vec2 = Vec2 { x: 1.0, y: 2.0 } * 2.0; // trait had reversed order - | ---- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `Vec2`, found `f64` + | ---- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Vec2`, found `f64` | | | expected due to this From 3fa95b847be64342562bccd55abb7e55c8daa3f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 6 Jan 2023 00:53:31 +0000 Subject: [PATCH 35/69] review comments --- .../rustc_hir_analysis/src/check/check.rs | 6 +- .../src/infer/error_reporting/mod.rs | 2 +- compiler/rustc_middle/src/ty/error.rs | 79 ++++++++++--------- 3 files changed, 46 insertions(+), 41 deletions(-) diff --git a/compiler/rustc_hir_analysis/src/check/check.rs b/compiler/rustc_hir_analysis/src/check/check.rs index ccd75ad0ec5a..f7ebacaa8546 100644 --- a/compiler/rustc_hir_analysis/src/check/check.rs +++ b/compiler/rustc_hir_analysis/src/check/check.rs @@ -442,12 +442,10 @@ fn check_opaque_meets_bounds<'tcx>( match ocx.eq(&misc_cause, param_env, opaque_ty, hidden_ty) { Ok(()) => {} Err(ty_err) => { + let ty_err = ty_err.to_string(tcx); tcx.sess.delay_span_bug( span, - &format!( - "could not unify `{hidden_ty}` with revealed type:\n{}", - ty_err.to_string(tcx) - ), + &format!("could not unify `{hidden_ty}` with revealed type:\n{ty_err}"), ); } } diff --git a/compiler/rustc_infer/src/infer/error_reporting/mod.rs b/compiler/rustc_infer/src/infer/error_reporting/mod.rs index d58a5ceef966..8ebcd3d54aa7 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/mod.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/mod.rs @@ -1613,7 +1613,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> { { format!("expected this to be `{}`", expected) } else { - terr.to_string(self.tcx) + terr.to_string(self.tcx).to_string() }; label_or_note(sp, &terr); label_or_note(span, &msg); diff --git a/compiler/rustc_middle/src/ty/error.rs b/compiler/rustc_middle/src/ty/error.rs index bb87b0eea378..6229c0072f2a 100644 --- a/compiler/rustc_middle/src/ty/error.rs +++ b/compiler/rustc_middle/src/ty/error.rs @@ -86,7 +86,7 @@ impl TypeError<'_> { /// afterwards to present additional details, particularly when it comes to lifetime-related /// errors. impl<'tcx> TypeError<'tcx> { - pub fn to_string(self, tcx: TyCtxt<'tcx>) -> String { + pub fn to_string(self, tcx: TyCtxt<'tcx>) -> Cow<'static, str> { use self::TypeError::*; fn report_maybe_different(expected: &str, found: &str) -> String { // A naive approach to making sure that we're not reporting silly errors such as: @@ -104,48 +104,52 @@ impl<'tcx> TypeError<'tcx> { }; match self { - CyclicTy(_) => format!("cyclic type of infinite size"), - CyclicConst(_) => format!("encountered a self-referencing constant"), - Mismatch => format!("types differ"), + CyclicTy(_) => "cyclic type of infinite size".into(), + CyclicConst(_) => "encountered a self-referencing constant".into(), + Mismatch => "types differ".into(), ConstnessMismatch(values) => { - format!("expected {} bound, found {} bound", values.expected, values.found) + format!("expected {} bound, found {} bound", values.expected, values.found).into() } PolarityMismatch(values) => { format!("expected {} polarity, found {} polarity", values.expected, values.found) + .into() } UnsafetyMismatch(values) => { - format!("expected {} fn, found {} fn", values.expected, values.found) + format!("expected {} fn, found {} fn", values.expected, values.found).into() } AbiMismatch(values) => { - format!("expected {} fn, found {} fn", values.expected, values.found) + format!("expected {} fn, found {} fn", values.expected, values.found).into() } - ArgumentMutability(_) | Mutability => format!("types differ in mutability"), + ArgumentMutability(_) | Mutability => "types differ in mutability".into(), TupleSize(values) => format!( "expected a tuple with {} element{}, found one with {} element{}", values.expected, pluralize!(values.expected), values.found, pluralize!(values.found) - ), + ) + .into(), FixedArraySize(values) => format!( "expected an array with a fixed size of {} element{}, found one with {} element{}", values.expected, pluralize!(values.expected), values.found, pluralize!(values.found) - ), - ArgCount => format!("incorrect number of function parameters"), - FieldMisMatch(adt, field) => format!("field type mismatch: {}.{}", adt, field), - RegionsDoesNotOutlive(..) => format!("lifetime mismatch"), + ) + .into(), + ArgCount => "incorrect number of function parameters".into(), + FieldMisMatch(adt, field) => format!("field type mismatch: {}.{}", adt, field).into(), + RegionsDoesNotOutlive(..) => "lifetime mismatch".into(), // Actually naming the region here is a bit confusing because context is lacking RegionsInsufficientlyPolymorphic(..) => { - format!("one type is more general than the other") + "one type is more general than the other".into() } RegionsOverlyPolymorphic(br, _) => format!( "expected concrete lifetime, found bound lifetime parameter{}", br_string(br) - ), - RegionsPlaceholderMismatch => format!("one type is more general than the other"), + ) + .into(), + RegionsPlaceholderMismatch => "one type is more general than the other".into(), ArgumentSorts(values, _) | Sorts(values) => { let mut expected = values.expected.sort_string(tcx); let mut found = values.found.sort_string(tcx); @@ -153,7 +157,7 @@ impl<'tcx> TypeError<'tcx> { expected = values.expected.sort_string(tcx); found = values.found.sort_string(tcx); } - report_maybe_different(&expected, &found) + report_maybe_different(&expected, &found).into() } Traits(values) => { let (mut expected, mut found) = with_forced_trimmed_paths!(( @@ -165,6 +169,7 @@ impl<'tcx> TypeError<'tcx> { found = tcx.def_path_str(values.found); } report_maybe_different(&format!("trait `{expected}`"), &format!("trait `{found}`")) + .into() } IntMismatch(ref values) => { let expected = match values.expected { @@ -175,36 +180,38 @@ impl<'tcx> TypeError<'tcx> { ty::IntVarValue::IntType(ty) => ty.name_str(), ty::IntVarValue::UintType(ty) => ty.name_str(), }; - format!("expected `{}`, found `{}`", expected, found) - } - FloatMismatch(ref values) => { - format!( - "expected `{}`, found `{}`", - values.expected.name_str(), - values.found.name_str() - ) + format!("expected `{}`, found `{}`", expected, found).into() } + FloatMismatch(ref values) => format!( + "expected `{}`, found `{}`", + values.expected.name_str(), + values.found.name_str() + ) + .into(), VariadicMismatch(ref values) => format!( "expected {} fn, found {} function", if values.expected { "variadic" } else { "non-variadic" }, if values.found { "variadic" } else { "non-variadic" } - ), + ) + .into(), ProjectionMismatched(ref values) => format!( "expected {}, found {}", tcx.def_path_str(values.expected), tcx.def_path_str(values.found) - ), + ) + .into(), ExistentialMismatch(ref values) => report_maybe_different( &format!("trait `{}`", values.expected), &format!("trait `{}`", values.found), - ), + ) + .into(), ConstMismatch(ref values) => { - format!("expected `{}`, found `{}`", values.expected, values.found) + format!("expected `{}`, found `{}`", values.expected, values.found).into() + } + IntrinsicCast => "cannot coerce intrinsics to function pointers".into(), + TargetFeatureCast(_) => { + "cannot coerce functions with `#[target_feature]` to safe function pointers".into() } - IntrinsicCast => format!("cannot coerce intrinsics to function pointers"), - TargetFeatureCast(_) => format!( - "cannot coerce functions with `#[target_feature]` to safe function pointers" - ), } } } @@ -237,7 +244,7 @@ impl<'tcx> TypeError<'tcx> { } impl<'tcx> Ty<'tcx> { - pub fn sort_string(self, tcx: TyCtxt<'tcx>) -> String { + pub fn sort_string(self, tcx: TyCtxt<'tcx>) -> Cow<'static, str> { match *self.kind() { ty::Foreign(def_id) => format!("extern type `{}`", tcx.def_path_str(def_id)).into(), ty::FnDef(def_id, ..) => match tcx.def_kind(def_id) { @@ -247,7 +254,7 @@ impl<'tcx> Ty<'tcx> { }, ty::FnPtr(_) => "fn pointer".into(), ty::Dynamic(ref inner, ..) if let Some(principal) = inner.principal() => { - format!("`dyn {}`", tcx.def_path_str(principal.def_id())) + format!("`dyn {}`", tcx.def_path_str(principal.def_id())).into() } ty::Dynamic(..) => "trait object".into(), ty::Closure(..) => "closure".into(), @@ -269,7 +276,7 @@ impl<'tcx> Ty<'tcx> { _ => { let width = tcx.sess.diagnostic_width(); let length_limit = std::cmp::max(width / 4, 15); - format!("`{}`", tcx.ty_string_with_limit(self, length_limit)) + format!("`{}`", tcx.ty_string_with_limit(self, length_limit)).into() } } } From 81973a39e05bfc5ddad4b5a54903c2c8fbdfa273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 6 Jan 2023 01:03:52 +0000 Subject: [PATCH 36/69] Don't show `for<'lt>` in force trimmed paths --- compiler/rustc_middle/src/ty/print/pretty.rs | 11 ++++++++--- tests/ui/function-pointer/unsized-ret.stderr | 2 +- .../hang-on-deeply-nested-dyn.stderr | 4 ++-- tests/ui/higher-rank-trait-bounds/issue-30786.stderr | 2 +- tests/ui/issues/issue-102964.stderr | 2 +- tests/ui/issues/issue-24322.stderr | 2 +- tests/ui/issues/issue-57362-2.stderr | 4 ++-- tests/ui/nll/issue-57642-higher-ranked-subtype.stderr | 8 ++++---- tests/ui/regions/issue-102374.stderr | 2 +- tests/ui/suggestions/issue-101984.stderr | 2 +- 10 files changed, 22 insertions(+), 17 deletions(-) diff --git a/compiler/rustc_middle/src/ty/print/pretty.rs b/compiler/rustc_middle/src/ty/print/pretty.rs index f2abec216b7b..d9d6e65a97a6 100644 --- a/compiler/rustc_middle/src/ty/print/pretty.rs +++ b/compiler/rustc_middle/src/ty/print/pretty.rs @@ -2346,6 +2346,7 @@ impl<'tcx> FmtPrinter<'_, 'tcx> { } else { let tcx = self.tcx; + let trim_path = FORCE_TRIMMED_PATH.with(|flag| flag.get()); // Closure used in `RegionFolder` to create names for anonymous late-bound // regions. We use two `DebruijnIndex`es (one for the currently folded // late-bound region and the other for the binder level) to determine @@ -2400,8 +2401,10 @@ impl<'tcx> FmtPrinter<'_, 'tcx> { } }; - start_or_continue(&mut self, "for<", ", "); - do_continue(&mut self, name); + if !trim_path { + start_or_continue(&mut self, "for<", ", "); + do_continue(&mut self, name); + } tcx.mk_region(ty::ReLateBound(ty::INNERMOST, ty::BoundRegion { var: br.var, kind })) }; let mut folder = RegionFolder { @@ -2412,7 +2415,9 @@ impl<'tcx> FmtPrinter<'_, 'tcx> { }; let new_value = value.clone().skip_binder().fold_with(&mut folder); let region_map = folder.region_map; - start_or_continue(&mut self, "", "> "); + if !trim_path { + start_or_continue(&mut self, "", "> "); + } (new_value, region_map) }; diff --git a/tests/ui/function-pointer/unsized-ret.stderr b/tests/ui/function-pointer/unsized-ret.stderr index 6f430687e6d6..dd00ff103e7a 100644 --- a/tests/ui/function-pointer/unsized-ret.stderr +++ b/tests/ui/function-pointer/unsized-ret.stderr @@ -23,7 +23,7 @@ LL | foo:: fn(&'a ()) -> (dyn std::fmt::Display + 'a), _>(None, (&() | required by a bound introduced by this call | = help: within `for<'a> fn(&'a ()) -> (dyn std::fmt::Display + 'a)`, the trait `for<'a> Sized` is not implemented for `(dyn std::fmt::Display + 'a)` - = note: required because it appears within the type `for<'a> fn(&'a ()) -> (dyn Display + 'a)` + = note: required because it appears within the type `fn(&'a ()) -> (dyn Display + 'a)` note: required by a bound in `foo` --> $DIR/unsized-ret.rs:5:11 | diff --git a/tests/ui/higher-rank-trait-bounds/hang-on-deeply-nested-dyn.stderr b/tests/ui/higher-rank-trait-bounds/hang-on-deeply-nested-dyn.stderr index 3e388653471e..173bc47b2725 100644 --- a/tests/ui/higher-rank-trait-bounds/hang-on-deeply-nested-dyn.stderr +++ b/tests/ui/higher-rank-trait-bounds/hang-on-deeply-nested-dyn.stderr @@ -11,9 +11,9 @@ LL | | ), LL | | ) { | |_- expected `&dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn Fn(u32) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a))` because of return type LL | f - | ^ expected `&dyn for<'a> Fn(&'a ...)`, found `&dyn Fn(u32)` + | ^ expected `&dyn Fn(&'a (dyn Fn(&'a ...) + 'a))`, found `&dyn Fn(u32)` | - = note: expected reference `&dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a ...) + 'a)) + 'a)) + 'a))` + = note: expected reference `&dyn Fn(&'a (dyn Fn(&'a (dyn Fn(&'a (dyn Fn(&'a (dyn Fn(&'a (dyn Fn(...) + 'a)) + 'a)) + 'a)) + 'a)) + 'a))` the full type name has been written to '$TEST_BUILD_DIR/higher-rank-trait-bounds/hang-on-deeply-nested-dyn/hang-on-deeply-nested-dyn.long-type-hash.txt' found reference `&dyn Fn(u32)` diff --git a/tests/ui/higher-rank-trait-bounds/issue-30786.stderr b/tests/ui/higher-rank-trait-bounds/issue-30786.stderr index 0458d2535f2f..671055105737 100644 --- a/tests/ui/higher-rank-trait-bounds/issue-30786.stderr +++ b/tests/ui/higher-rank-trait-bounds/issue-30786.stderr @@ -19,7 +19,7 @@ note: the following trait bounds were not satisfied: LL | impl StreamExt for T where for<'a> &'a mut T: Stream {} | --------- - ^^^^^^ unsatisfied trait bound introduced here -error[E0599]: the method `countx` exists for struct `Filter fn(&'a u64) -> &'a u64 {identity::}>, [closure@issue-30786.rs:129:30]>`, but its trait bounds were not satisfied +error[E0599]: the method `countx` exists for struct `Filter &'a u64 {identity::}>, [closure@issue-30786.rs:129:30]>`, but its trait bounds were not satisfied --> $DIR/issue-30786.rs:130:24 | LL | pub struct Filter { diff --git a/tests/ui/issues/issue-102964.stderr b/tests/ui/issues/issue-102964.stderr index 4be53fd09e52..0cec4751fb86 100644 --- a/tests/ui/issues/issue-102964.stderr +++ b/tests/ui/issues/issue-102964.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-102964.rs:5:41 | LL | fn bar_function(function: Foo) -> RcFoo { - | ------------ ^^^^^^^^ expected `Rc<&dyn for<'a> Fn(&'a T)>`, found `()` + | ------------ ^^^^^^^^ expected `Rc<&dyn Fn(&'a T)>`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression | diff --git a/tests/ui/issues/issue-24322.stderr b/tests/ui/issues/issue-24322.stderr index 37cc3413f751..583afaead2d3 100644 --- a/tests/ui/issues/issue-24322.stderr +++ b/tests/ui/issues/issue-24322.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-24322.rs:8:29 | LL | let x: &fn(&B) -> u32 = &B::func; - | -------------- ^^^^^^^^ expected `&for<'a> fn(&'a B) -> u32`, found `&for<'a> fn(&'a B) -> u32 {B::func}` + | -------------- ^^^^^^^^ expected `&fn(&'a B) -> u32`, found `&fn(&'a B) -> u32 {B::func}` | | | expected due to this | diff --git a/tests/ui/issues/issue-57362-2.stderr b/tests/ui/issues/issue-57362-2.stderr index 7d08c4643ff2..8dcf7911baf9 100644 --- a/tests/ui/issues/issue-57362-2.stderr +++ b/tests/ui/issues/issue-57362-2.stderr @@ -1,8 +1,8 @@ -error[E0599]: the function or associated item `make_g` exists for fn pointer `for<'a> fn(&'a ())`, but its trait bounds were not satisfied +error[E0599]: the function or associated item `make_g` exists for fn pointer `fn(&'a ())`, but its trait bounds were not satisfied --> $DIR/issue-57362-2.rs:22:25 | LL | let x = ::make_g(); - | ^^^^^^ function or associated item cannot be called on `for<'a> fn(&'a ())` due to unsatisfied trait bounds + | ^^^^^^ function or associated item cannot be called on `fn(&'a ())` due to unsatisfied trait bounds | = note: the following trait bounds were not satisfied: `for<'a> fn(&'a ()): X` diff --git a/tests/ui/nll/issue-57642-higher-ranked-subtype.stderr b/tests/ui/nll/issue-57642-higher-ranked-subtype.stderr index 6e96f40c0e0d..ceef6e34d024 100644 --- a/tests/ui/nll/issue-57642-higher-ranked-subtype.stderr +++ b/tests/ui/nll/issue-57642-higher-ranked-subtype.stderr @@ -1,8 +1,8 @@ -error[E0599]: the function or associated item `make_g` exists for fn pointer `for<'a> fn(&'a ())`, but its trait bounds were not satisfied +error[E0599]: the function or associated item `make_g` exists for fn pointer `fn(&'a ())`, but its trait bounds were not satisfied --> $DIR/issue-57642-higher-ranked-subtype.rs:31:25 | LL | let x = ::make_g(); - | ^^^^^^ function or associated item cannot be called on `for<'a> fn(&'a ())` due to unsatisfied trait bounds + | ^^^^^^ function or associated item cannot be called on `fn(&'a ())` due to unsatisfied trait bounds | = note: the following trait bounds were not satisfied: `for<'a> fn(&'a ()): X` @@ -13,11 +13,11 @@ note: `X` defines an item `make_g`, perhaps you need to implement it LL | trait X { | ^^^^^^^ -error[E0599]: no function or associated item named `make_f` found for fn pointer `for<'a> fn(&'a ())` in the current scope +error[E0599]: no function or associated item named `make_f` found for fn pointer `fn(&'a ())` in the current scope --> $DIR/issue-57642-higher-ranked-subtype.rs:35:25 | LL | let x = ::make_f(); - | ^^^^^^ function or associated item not found in `for<'a> fn(&'a ())` + | ^^^^^^ function or associated item not found in `fn(&'a ())` | = help: items from traits can only be used if the trait is implemented and in scope note: `Y` defines an item `make_f`, perhaps you need to implement it diff --git a/tests/ui/regions/issue-102374.stderr b/tests/ui/regions/issue-102374.stderr index 157850693ab5..af64b6867bb0 100644 --- a/tests/ui/regions/issue-102374.stderr +++ b/tests/ui/regions/issue-102374.stderr @@ -7,7 +7,7 @@ LL | f | ^ expected `i32`, found fn pointer | = note: expected type `i32` - found fn pointer `for<'z1, 'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k, 'l, 'm, 'n, 'o, 'p, 'q, 'r, 's, 't, 'u, 'v, 'w, 'x, 'y, 'z, 'z0> fn(Cell<...>)` + found fn pointer `fn(Cell<...>)` the full type name has been written to '$TEST_BUILD_DIR/regions/issue-102374/issue-102374.long-type-hash.txt' error: aborting due to previous error diff --git a/tests/ui/suggestions/issue-101984.stderr b/tests/ui/suggestions/issue-101984.stderr index 6ae2842b2bf3..3492f4ea0f15 100644 --- a/tests/ui/suggestions/issue-101984.stderr +++ b/tests/ui/suggestions/issue-101984.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let (cmp, router) = self.router.at()?; | ^^^^^^^^^^^^^ ----------------- this expression has type `Match<&(for<'a> fn(&'a ()), Box)>` | | - | expected `Match<&(for<'a> fn(&'a ()), ...)>`, found `(_, _)` + | expected `Match<&(fn(&'a ()), Box)>`, found `(_, _)` | = note: expected struct `Match<&(for<'a> fn(&'a ()), Box)>` found tuple `(_, _)` From 252c43b42b33dc2bf341afd525d0041c5097d2b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 6 Jan 2023 01:11:50 +0000 Subject: [PATCH 37/69] Do not mention lifetime names in force trimmed paths --- compiler/rustc_middle/src/ty/print/pretty.rs | 4 ++++ tests/ui/associated-type-bounds/inside-adt.stderr | 4 ++-- tests/ui/associated-types/issue-43924.stderr | 4 ++-- tests/ui/async-await/issue-98634.rs | 6 +++--- tests/ui/async-await/issue-98634.stderr | 6 +++--- tests/ui/feature-gates/feature-gate-trivial_bounds.stderr | 2 +- tests/ui/function-pointer/unsized-ret.stderr | 2 +- .../hang-on-deeply-nested-dyn.stderr | 4 ++-- tests/ui/higher-rank-trait-bounds/issue-30786.stderr | 2 +- .../dyn-trait-return-should-be-impl-trait.stderr | 4 ++-- tests/ui/issues/issue-102964.stderr | 2 +- tests/ui/issues/issue-19521.stderr | 4 ++-- tests/ui/issues/issue-24322.stderr | 2 +- tests/ui/issues/issue-57362-2.stderr | 4 ++-- tests/ui/kindck/kindck-send-object1.stderr | 2 +- tests/ui/nll/issue-57642-higher-ranked-subtype.stderr | 8 ++++---- tests/ui/object-pointer-types.stderr | 4 ++-- tests/ui/suggestions/issue-101984.stderr | 2 +- tests/ui/suggestions/remove-as_str.stderr | 2 +- tests/ui/suggestions/suggest-using-chars.rs | 4 ++-- tests/ui/suggestions/suggest-using-chars.stderr | 8 ++++---- tests/ui/type-alias-impl-trait/issue-98604.rs | 2 +- tests/ui/type-alias-impl-trait/issue-98604.stderr | 2 +- 23 files changed, 44 insertions(+), 40 deletions(-) diff --git a/compiler/rustc_middle/src/ty/print/pretty.rs b/compiler/rustc_middle/src/ty/print/pretty.rs index d9d6e65a97a6..78f17c7783e9 100644 --- a/compiler/rustc_middle/src/ty/print/pretty.rs +++ b/compiler/rustc_middle/src/ty/print/pretty.rs @@ -2070,6 +2070,10 @@ impl<'tcx> PrettyPrinter<'tcx> for FmtPrinter<'_, 'tcx> { return true; } + if FORCE_TRIMMED_PATH.with(|flag| flag.get()) { + return false; + } + let identify_regions = self.tcx.sess.opts.unstable_opts.identify_regions; match *region { diff --git a/tests/ui/associated-type-bounds/inside-adt.stderr b/tests/ui/associated-type-bounds/inside-adt.stderr index dbfcfa580630..fa1390a5462f 100644 --- a/tests/ui/associated-type-bounds/inside-adt.stderr +++ b/tests/ui/associated-type-bounds/inside-adt.stderr @@ -95,7 +95,7 @@ LL | union U1 { f: ManuallyDrop> } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time | = help: within `ManuallyDrop<(dyn Iterator + 'static)>`, the trait `Sized` is not implemented for `(dyn Iterator + 'static)` - = note: required because it appears within the type `ManuallyDrop<(dyn Iterator + 'static)>` + = note: required because it appears within the type `ManuallyDrop>` = note: no field of a union may have a dynamically sized type = help: change the field's type to have a statically known size help: borrowed types always have a statically known size @@ -114,7 +114,7 @@ LL | union U3 { f: ManuallyDrop> } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time | = help: within `ManuallyDrop<(dyn Iterator + 'static)>`, the trait `Sized` is not implemented for `(dyn Iterator + 'static)` - = note: required because it appears within the type `ManuallyDrop<(dyn Iterator + 'static)>` + = note: required because it appears within the type `ManuallyDrop>` = note: no field of a union may have a dynamically sized type = help: change the field's type to have a statically known size help: borrowed types always have a statically known size diff --git a/tests/ui/associated-types/issue-43924.stderr b/tests/ui/associated-types/issue-43924.stderr index 526f425b21e7..9046170d7c99 100644 --- a/tests/ui/associated-types/issue-43924.stderr +++ b/tests/ui/associated-types/issue-43924.stderr @@ -10,11 +10,11 @@ note: required by a bound in `Foo::Out` LL | type Out: Default + ToString + ?Sized = dyn ToString; | ^^^^^^^ required by this bound in `Foo::Out` -error[E0599]: no function or associated item named `default` found for trait object `(dyn ToString + 'static)` in the current scope +error[E0599]: no function or associated item named `default` found for trait object `dyn ToString` in the current scope --> $DIR/issue-43924.rs:14:39 | LL | assert_eq!(<() as Foo>::Out::default().to_string(), "false"); - | ^^^^^^^ function or associated item not found in `(dyn ToString + 'static)` + | ^^^^^^^ function or associated item not found in `dyn ToString` error: aborting due to 2 previous errors diff --git a/tests/ui/async-await/issue-98634.rs b/tests/ui/async-await/issue-98634.rs index b0d38687f01c..104b85baa63f 100644 --- a/tests/ui/async-await/issue-98634.rs +++ b/tests/ui/async-await/issue-98634.rs @@ -43,8 +43,8 @@ impl Runtime { fn main() { Runtime.block_on(async { StructAsync { callback }.await; - //~^ ERROR expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin + 'static)>>`, but it returns `impl Future` - //~| ERROR expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin + 'static)>>`, but it returns `impl Future` - //~| ERROR expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin + 'static)>>`, but it returns `impl Future` + //~^ ERROR expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin>>`, but it returns `impl Future` + //~| ERROR expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin>>`, but it returns `impl Future` + //~| ERROR expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin>>`, but it returns `impl Future` }); } diff --git a/tests/ui/async-await/issue-98634.stderr b/tests/ui/async-await/issue-98634.stderr index 85fa04446ccc..17e598508e57 100644 --- a/tests/ui/async-await/issue-98634.stderr +++ b/tests/ui/async-await/issue-98634.stderr @@ -1,4 +1,4 @@ -error[E0271]: expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin + 'static)>>`, but it returns `impl Future` +error[E0271]: expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin>>`, but it returns `impl Future` --> $DIR/issue-98634.rs:45:23 | LL | StructAsync { callback }.await; @@ -17,7 +17,7 @@ note: required by a bound in `StructAsync` LL | pub struct StructAsync Pin>>> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `StructAsync` -error[E0271]: expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin + 'static)>>`, but it returns `impl Future` +error[E0271]: expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin>>`, but it returns `impl Future` --> $DIR/issue-98634.rs:45:9 | LL | StructAsync { callback }.await; @@ -36,7 +36,7 @@ note: required by a bound in `StructAsync` LL | pub struct StructAsync Pin>>> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `StructAsync` -error[E0271]: expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin + 'static)>>`, but it returns `impl Future` +error[E0271]: expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin>>`, but it returns `impl Future` --> $DIR/issue-98634.rs:45:33 | LL | StructAsync { callback }.await; diff --git a/tests/ui/feature-gates/feature-gate-trivial_bounds.stderr b/tests/ui/feature-gates/feature-gate-trivial_bounds.stderr index 1b87ebd9f20c..d2ad372dfbc5 100644 --- a/tests/ui/feature-gates/feature-gate-trivial_bounds.stderr +++ b/tests/ui/feature-gates/feature-gate-trivial_bounds.stderr @@ -95,7 +95,7 @@ LL | fn unsized_local() where Dst: Sized { | ^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time | = help: within `Dst<(dyn A + 'static)>`, the trait `Sized` is not implemented for `(dyn A + 'static)` -note: required because it appears within the type `Dst<(dyn A + 'static)>` +note: required because it appears within the type `Dst` --> $DIR/feature-gate-trivial_bounds.rs:48:8 | LL | struct Dst { diff --git a/tests/ui/function-pointer/unsized-ret.stderr b/tests/ui/function-pointer/unsized-ret.stderr index dd00ff103e7a..870f1805b589 100644 --- a/tests/ui/function-pointer/unsized-ret.stderr +++ b/tests/ui/function-pointer/unsized-ret.stderr @@ -23,7 +23,7 @@ LL | foo:: fn(&'a ()) -> (dyn std::fmt::Display + 'a), _>(None, (&() | required by a bound introduced by this call | = help: within `for<'a> fn(&'a ()) -> (dyn std::fmt::Display + 'a)`, the trait `for<'a> Sized` is not implemented for `(dyn std::fmt::Display + 'a)` - = note: required because it appears within the type `fn(&'a ()) -> (dyn Display + 'a)` + = note: required because it appears within the type `fn(&()) -> dyn Display` note: required by a bound in `foo` --> $DIR/unsized-ret.rs:5:11 | diff --git a/tests/ui/higher-rank-trait-bounds/hang-on-deeply-nested-dyn.stderr b/tests/ui/higher-rank-trait-bounds/hang-on-deeply-nested-dyn.stderr index 173bc47b2725..3662cbfb9ba1 100644 --- a/tests/ui/higher-rank-trait-bounds/hang-on-deeply-nested-dyn.stderr +++ b/tests/ui/higher-rank-trait-bounds/hang-on-deeply-nested-dyn.stderr @@ -11,9 +11,9 @@ LL | | ), LL | | ) { | |_- expected `&dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn for<'a> Fn(&'a (dyn Fn(u32) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a)) + 'a))` because of return type LL | f - | ^ expected `&dyn Fn(&'a (dyn Fn(&'a ...) + 'a))`, found `&dyn Fn(u32)` + | ^ expected `&dyn Fn(&dyn Fn(&dyn Fn(&...)))`, found `&dyn Fn(u32)` | - = note: expected reference `&dyn Fn(&'a (dyn Fn(&'a (dyn Fn(&'a (dyn Fn(&'a (dyn Fn(&'a (dyn Fn(...) + 'a)) + 'a)) + 'a)) + 'a)) + 'a))` + = note: expected reference `&dyn Fn(&dyn Fn(&dyn Fn(&dyn Fn(&dyn Fn(&dyn Fn(&dyn Fn(&dyn Fn(&dyn Fn(&dyn Fn(&dyn Fn(&...)))))))))))` the full type name has been written to '$TEST_BUILD_DIR/higher-rank-trait-bounds/hang-on-deeply-nested-dyn/hang-on-deeply-nested-dyn.long-type-hash.txt' found reference `&dyn Fn(u32)` diff --git a/tests/ui/higher-rank-trait-bounds/issue-30786.stderr b/tests/ui/higher-rank-trait-bounds/issue-30786.stderr index 671055105737..2ded5ae56cdb 100644 --- a/tests/ui/higher-rank-trait-bounds/issue-30786.stderr +++ b/tests/ui/higher-rank-trait-bounds/issue-30786.stderr @@ -19,7 +19,7 @@ note: the following trait bounds were not satisfied: LL | impl StreamExt for T where for<'a> &'a mut T: Stream {} | --------- - ^^^^^^ unsatisfied trait bound introduced here -error[E0599]: the method `countx` exists for struct `Filter &'a u64 {identity::}>, [closure@issue-30786.rs:129:30]>`, but its trait bounds were not satisfied +error[E0599]: the method `countx` exists for struct `Filter &u64 {identity::}>, [closure@issue-30786.rs:129:30]>`, but its trait bounds were not satisfied --> $DIR/issue-30786.rs:130:24 | LL | pub struct Filter { diff --git a/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr b/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr index f64ba3bf1c41..dc1e40ea560a 100644 --- a/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr +++ b/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr @@ -16,7 +16,7 @@ LL | fn fuz() -> (usize, Trait) { (42, Struct) } | doesn't have a size known at compile-time | = help: within `(usize, (dyn Trait + 'static))`, the trait `Sized` is not implemented for `(dyn Trait + 'static)` - = note: required because it appears within the type `(usize, (dyn Trait + 'static))` + = note: required because it appears within the type `(usize, dyn Trait)` = note: the return type of a function must have a statically known size error[E0308]: mismatched types @@ -37,7 +37,7 @@ LL | fn bar() -> (usize, dyn Trait) { (42, Struct) } | doesn't have a size known at compile-time | = help: within `(usize, (dyn Trait + 'static))`, the trait `Sized` is not implemented for `(dyn Trait + 'static)` - = note: required because it appears within the type `(usize, (dyn Trait + 'static))` + = note: required because it appears within the type `(usize, dyn Trait)` = note: the return type of a function must have a statically known size error[E0746]: return type cannot have an unboxed trait object diff --git a/tests/ui/issues/issue-102964.stderr b/tests/ui/issues/issue-102964.stderr index 0cec4751fb86..c0766480a41f 100644 --- a/tests/ui/issues/issue-102964.stderr +++ b/tests/ui/issues/issue-102964.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-102964.rs:5:41 | LL | fn bar_function(function: Foo) -> RcFoo { - | ------------ ^^^^^^^^ expected `Rc<&dyn Fn(&'a T)>`, found `()` + | ------------ ^^^^^^^^ expected `Rc<&dyn Fn(&T)>`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression | diff --git a/tests/ui/issues/issue-19521.stderr b/tests/ui/issues/issue-19521.stderr index b6847cd755c3..899363740853 100644 --- a/tests/ui/issues/issue-19521.stderr +++ b/tests/ui/issues/issue-19521.stderr @@ -1,8 +1,8 @@ -error[E0599]: no method named `homura` found for reference `&'static str` in the current scope +error[E0599]: no method named `homura` found for reference `&str` in the current scope --> $DIR/issue-19521.rs:2:8 | LL | "".homura()(); - | ^^^^^^ method not found in `&'static str` + | ^^^^^^ method not found in `&str` error: aborting due to previous error diff --git a/tests/ui/issues/issue-24322.stderr b/tests/ui/issues/issue-24322.stderr index 583afaead2d3..954fd4928126 100644 --- a/tests/ui/issues/issue-24322.stderr +++ b/tests/ui/issues/issue-24322.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-24322.rs:8:29 | LL | let x: &fn(&B) -> u32 = &B::func; - | -------------- ^^^^^^^^ expected `&fn(&'a B) -> u32`, found `&fn(&'a B) -> u32 {B::func}` + | -------------- ^^^^^^^^ expected `&fn(&B) -> u32`, found `&fn(&B) -> u32 {B::func}` | | | expected due to this | diff --git a/tests/ui/issues/issue-57362-2.stderr b/tests/ui/issues/issue-57362-2.stderr index 8dcf7911baf9..37beb587d276 100644 --- a/tests/ui/issues/issue-57362-2.stderr +++ b/tests/ui/issues/issue-57362-2.stderr @@ -1,8 +1,8 @@ -error[E0599]: the function or associated item `make_g` exists for fn pointer `fn(&'a ())`, but its trait bounds were not satisfied +error[E0599]: the function or associated item `make_g` exists for fn pointer `fn(&())`, but its trait bounds were not satisfied --> $DIR/issue-57362-2.rs:22:25 | LL | let x = ::make_g(); - | ^^^^^^ function or associated item cannot be called on `fn(&'a ())` due to unsatisfied trait bounds + | ^^^^^^ function or associated item cannot be called on `fn(&())` due to unsatisfied trait bounds | = note: the following trait bounds were not satisfied: `for<'a> fn(&'a ()): X` diff --git a/tests/ui/kindck/kindck-send-object1.stderr b/tests/ui/kindck/kindck-send-object1.stderr index 11f597fee91b..19ef4f6fc68d 100644 --- a/tests/ui/kindck/kindck-send-object1.stderr +++ b/tests/ui/kindck/kindck-send-object1.stderr @@ -20,7 +20,7 @@ LL | assert_send::>(); | = help: the trait `Send` is not implemented for `(dyn Dummy + 'a)` = note: required for `Unique<(dyn Dummy + 'a)>` to implement `Send` - = note: required because it appears within the type `Box<(dyn Dummy + 'a)>` + = note: required because it appears within the type `Box` note: required by a bound in `assert_send` --> $DIR/kindck-send-object1.rs:5:18 | diff --git a/tests/ui/nll/issue-57642-higher-ranked-subtype.stderr b/tests/ui/nll/issue-57642-higher-ranked-subtype.stderr index ceef6e34d024..cab5898259fb 100644 --- a/tests/ui/nll/issue-57642-higher-ranked-subtype.stderr +++ b/tests/ui/nll/issue-57642-higher-ranked-subtype.stderr @@ -1,8 +1,8 @@ -error[E0599]: the function or associated item `make_g` exists for fn pointer `fn(&'a ())`, but its trait bounds were not satisfied +error[E0599]: the function or associated item `make_g` exists for fn pointer `fn(&())`, but its trait bounds were not satisfied --> $DIR/issue-57642-higher-ranked-subtype.rs:31:25 | LL | let x = ::make_g(); - | ^^^^^^ function or associated item cannot be called on `fn(&'a ())` due to unsatisfied trait bounds + | ^^^^^^ function or associated item cannot be called on `fn(&())` due to unsatisfied trait bounds | = note: the following trait bounds were not satisfied: `for<'a> fn(&'a ()): X` @@ -13,11 +13,11 @@ note: `X` defines an item `make_g`, perhaps you need to implement it LL | trait X { | ^^^^^^^ -error[E0599]: no function or associated item named `make_f` found for fn pointer `fn(&'a ())` in the current scope +error[E0599]: no function or associated item named `make_f` found for fn pointer `fn(&())` in the current scope --> $DIR/issue-57642-higher-ranked-subtype.rs:35:25 | LL | let x = ::make_f(); - | ^^^^^^ function or associated item not found in `fn(&'a ())` + | ^^^^^^ function or associated item not found in `fn(&())` | = help: items from traits can only be used if the trait is implemented and in scope note: `Y` defines an item `make_f`, perhaps you need to implement it diff --git a/tests/ui/object-pointer-types.stderr b/tests/ui/object-pointer-types.stderr index a477425edc81..7133f8ae1947 100644 --- a/tests/ui/object-pointer-types.stderr +++ b/tests/ui/object-pointer-types.stderr @@ -16,11 +16,11 @@ LL | fn owned(self: Box); LL | x.owned(); | ^^^^^ method not found in `&mut dyn Foo` -error[E0599]: no method named `managed` found for struct `Box<(dyn Foo + 'static)>` in the current scope +error[E0599]: no method named `managed` found for struct `Box` in the current scope --> $DIR/object-pointer-types.rs:23:7 | LL | x.managed(); - | ^^^^^^^ method not found in `Box<(dyn Foo + 'static)>` + | ^^^^^^^ method not found in `Box` error: aborting due to 3 previous errors diff --git a/tests/ui/suggestions/issue-101984.stderr b/tests/ui/suggestions/issue-101984.stderr index 3492f4ea0f15..151587d42223 100644 --- a/tests/ui/suggestions/issue-101984.stderr +++ b/tests/ui/suggestions/issue-101984.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let (cmp, router) = self.router.at()?; | ^^^^^^^^^^^^^ ----------------- this expression has type `Match<&(for<'a> fn(&'a ()), Box)>` | | - | expected `Match<&(fn(&'a ()), Box)>`, found `(_, _)` + | expected `Match<&(fn(&()), Box)>`, found `(_, _)` | = note: expected struct `Match<&(for<'a> fn(&'a ()), Box)>` found tuple `(_, _)` diff --git a/tests/ui/suggestions/remove-as_str.stderr b/tests/ui/suggestions/remove-as_str.stderr index 534c497780a9..cb618db704d1 100644 --- a/tests/ui/suggestions/remove-as_str.stderr +++ b/tests/ui/suggestions/remove-as_str.stderr @@ -4,7 +4,7 @@ error[E0599]: no method named `as_str` found for reference `&str` in the current LL | s.as_str(); | -^^^^^^-- help: remove this method call -error[E0599]: no method named `as_str` found for reference `&'a str` in the current scope +error[E0599]: no method named `as_str` found for reference `&str` in the current scope --> $DIR/remove-as_str.rs:7:7 | LL | s.as_str(); diff --git a/tests/ui/suggestions/suggest-using-chars.rs b/tests/ui/suggestions/suggest-using-chars.rs index 95732881baf0..29750a201999 100644 --- a/tests/ui/suggestions/suggest-using-chars.rs +++ b/tests/ui/suggestions/suggest-using-chars.rs @@ -1,6 +1,6 @@ pub fn main() { - let _ = "foo".iter(); //~ ERROR no method named `iter` found for reference `&'static str` in the current scope - let _ = "foo".foo(); //~ ERROR no method named `foo` found for reference `&'static str` in the current scope + let _ = "foo".iter(); //~ ERROR no method named `iter` found for reference `&str` in the current scope + let _ = "foo".foo(); //~ ERROR no method named `foo` found for reference `&str` in the current scope let _ = String::from("bar").iter(); //~ ERROR no method named `iter` found for struct `String` in the current scope let _ = (&String::from("bar")).iter(); //~ ERROR no method named `iter` found for reference `&String` in the current scope let _ = 0.iter(); //~ ERROR no method named `iter` found for type `{integer}` in the current scope diff --git a/tests/ui/suggestions/suggest-using-chars.stderr b/tests/ui/suggestions/suggest-using-chars.stderr index 99bcfb08a089..57b0e866f845 100644 --- a/tests/ui/suggestions/suggest-using-chars.stderr +++ b/tests/ui/suggestions/suggest-using-chars.stderr @@ -1,19 +1,19 @@ -error[E0599]: no method named `iter` found for reference `&'static str` in the current scope +error[E0599]: no method named `iter` found for reference `&str` in the current scope --> $DIR/suggest-using-chars.rs:2:19 | LL | let _ = "foo".iter(); - | ^^^^ method not found in `&'static str` + | ^^^^ method not found in `&str` | help: because of the in-memory representation of `&str`, to obtain an `Iterator` over each of its codepoint use method `chars` | LL | let _ = "foo".chars(); | ~~~~~ -error[E0599]: no method named `foo` found for reference `&'static str` in the current scope +error[E0599]: no method named `foo` found for reference `&str` in the current scope --> $DIR/suggest-using-chars.rs:3:19 | LL | let _ = "foo".foo(); - | ^^^ method not found in `&'static str` + | ^^^ method not found in `&str` error[E0599]: no method named `iter` found for struct `String` in the current scope --> $DIR/suggest-using-chars.rs:4:33 diff --git a/tests/ui/type-alias-impl-trait/issue-98604.rs b/tests/ui/type-alias-impl-trait/issue-98604.rs index 32c2f9ed51ed..35f0bbfac93f 100644 --- a/tests/ui/type-alias-impl-trait/issue-98604.rs +++ b/tests/ui/type-alias-impl-trait/issue-98604.rs @@ -7,5 +7,5 @@ async fn test() {} #[allow(unused_must_use)] fn main() { Box::new(test) as AsyncFnPtr; - //~^ ERROR expected `fn() -> impl Future {test}` to be a fn item that returns `Pin + 'static)>>`, but it returns `impl Future` + //~^ ERROR expected `fn() -> impl Future {test}` to be a fn item that returns `Pin>>`, but it returns `impl Future } diff --git a/tests/ui/type-alias-impl-trait/issue-98604.stderr b/tests/ui/type-alias-impl-trait/issue-98604.stderr index 64fe15c19f45..650376f8c6b4 100644 --- a/tests/ui/type-alias-impl-trait/issue-98604.stderr +++ b/tests/ui/type-alias-impl-trait/issue-98604.stderr @@ -1,4 +1,4 @@ -error[E0271]: expected `fn() -> impl Future {test}` to be a fn item that returns `Pin + 'static)>>`, but it returns `impl Future` +error[E0271]: expected `fn() -> impl Future {test}` to be a fn item that returns `Pin>>`, but it returns `impl Future` --> $DIR/issue-98604.rs:9:5 | LL | Box::new(test) as AsyncFnPtr; From ab8dc9a0adedcee75a217ea0d60709fe38269768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 6 Jan 2023 01:22:24 +0000 Subject: [PATCH 38/69] Hide lifetimes of `impl Trait` in force trimmed paths --- compiler/rustc_middle/src/ty/print/pretty.rs | 8 +++++--- tests/ui/associated-type-bounds/inside-adt.stderr | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_middle/src/ty/print/pretty.rs b/compiler/rustc_middle/src/ty/print/pretty.rs index 78f17c7783e9..6a20f62b6f9b 100644 --- a/compiler/rustc_middle/src/ty/print/pretty.rs +++ b/compiler/rustc_middle/src/ty/print/pretty.rs @@ -1084,9 +1084,11 @@ pub trait PrettyPrinter<'tcx>: write!(self, "Sized")?; } - for re in lifetimes { - write!(self, " + ")?; - self = self.print_region(re)?; + if !FORCE_TRIMMED_PATH.with(|flag| flag.get()) { + for re in lifetimes { + write!(self, " + ")?; + self = self.print_region(re)?; + } } Ok(self) diff --git a/tests/ui/associated-type-bounds/inside-adt.stderr b/tests/ui/associated-type-bounds/inside-adt.stderr index fa1390a5462f..1668b613b25b 100644 --- a/tests/ui/associated-type-bounds/inside-adt.stderr +++ b/tests/ui/associated-type-bounds/inside-adt.stderr @@ -114,7 +114,7 @@ LL | union U3 { f: ManuallyDrop> } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time | = help: within `ManuallyDrop<(dyn Iterator + 'static)>`, the trait `Sized` is not implemented for `(dyn Iterator + 'static)` - = note: required because it appears within the type `ManuallyDrop>` + = note: required because it appears within the type `ManuallyDrop>` = note: no field of a union may have a dynamically sized type = help: change the field's type to have a statically known size help: borrowed types always have a statically known size From 153ed09fb3a0e7ed8d42749720e8a0b4fac50d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 6 Jan 2023 19:21:47 +0000 Subject: [PATCH 39/69] Tweak use of trimmed paths --- .../rustc_hir_typeck/src/method/suggest.rs | 36 +++++++++++++++---- tests/ui/associated-types/issue-43924.stderr | 2 +- .../issue-33784.stderr | 4 +-- .../ui/empty/empty-struct-braces-expr.stderr | 4 +-- .../fn-help-with-err.stderr | 2 +- .../higher-rank-trait-bounds/issue-30786.rs | 2 ++ .../issue-30786.stderr | 27 +++++++------- .../no-method-suggested-traits.stderr | 16 ++++----- tests/ui/issues/issue-19521.stderr | 2 +- tests/ui/issues/issue-30123.stderr | 2 +- .../issue-57642-higher-ranked-subtype.stderr | 2 +- tests/ui/object-pointer-types.stderr | 2 +- tests/ui/suggestions/remove-as_str.stderr | 2 +- tests/ui/suggestions/suggest-using-chars.rs | 4 +-- .../ui/suggestions/suggest-using-chars.stderr | 4 +-- ...ed-closures-static-call-wrong-trait.stderr | 2 +- 16 files changed, 69 insertions(+), 44 deletions(-) diff --git a/compiler/rustc_hir_typeck/src/method/suggest.rs b/compiler/rustc_hir_typeck/src/method/suggest.rs index 31d55a41d8a3..54890489f8b8 100644 --- a/compiler/rustc_hir_typeck/src/method/suggest.rs +++ b/compiler/rustc_hir_typeck/src/method/suggest.rs @@ -259,7 +259,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let mode = no_match_data.mode; let tcx = self.tcx; let rcvr_ty = self.resolve_vars_if_possible(rcvr_ty); - let ty_str = with_forced_trimmed_paths!(self.ty_to_string(rcvr_ty)); + let (ty_str, ty_file) = tcx.short_ty_string(rcvr_ty); + let short_ty_str = with_forced_trimmed_paths!(rcvr_ty.to_string()); let is_method = mode == Mode::MethodCall; let unsatisfied_predicates = &no_match_data.unsatisfied_predicates; let similar_candidate = no_match_data.similar_candidate; @@ -276,11 +277,24 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } }; - if self.suggest_wrapping_range_with_parens(tcx, rcvr_ty, source, span, item_name, &ty_str) - || self.suggest_constraining_numerical_ty( - tcx, rcvr_ty, source, span, item_kind, item_name, &ty_str, - ) - { + // We could pass the file for long types into these two, but it isn't strictly necessary + // given how targetted they are. + if self.suggest_wrapping_range_with_parens( + tcx, + rcvr_ty, + source, + span, + item_name, + &short_ty_str, + ) || self.suggest_constraining_numerical_ty( + tcx, + rcvr_ty, + source, + span, + item_kind, + item_name, + &short_ty_str, + ) { return None; } span = item_name.span; @@ -319,6 +333,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { rcvr_ty.prefix_string(self.tcx), ty_str_reported, ); + let ty_str = if short_ty_str.len() < ty_str.len() && ty_str.len() > 10 { + short_ty_str + } else { + ty_str + }; + if let Some(file) = ty_file { + err.note(&format!("the full type name has been written to '{}'", file.display(),)); + } if rcvr_ty.references_error() { err.downgrade_to_delayed_bug(); } @@ -826,7 +848,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let primary_message = primary_message.unwrap_or_else(|| { format!( "the {item_kind} `{item_name}` exists for {actual_prefix} `{ty_str}`, \ - but its trait bounds were not satisfied" + but its trait bounds were not satisfied" ) }); err.set_primary_message(&primary_message); diff --git a/tests/ui/associated-types/issue-43924.stderr b/tests/ui/associated-types/issue-43924.stderr index 9046170d7c99..ab1a9511ec6c 100644 --- a/tests/ui/associated-types/issue-43924.stderr +++ b/tests/ui/associated-types/issue-43924.stderr @@ -10,7 +10,7 @@ note: required by a bound in `Foo::Out` LL | type Out: Default + ToString + ?Sized = dyn ToString; | ^^^^^^^ required by this bound in `Foo::Out` -error[E0599]: no function or associated item named `default` found for trait object `dyn ToString` in the current scope +error[E0599]: no function or associated item named `default` found for trait object `(dyn ToString + 'static)` in the current scope --> $DIR/issue-43924.rs:14:39 | LL | assert_eq!(<() as Foo>::Out::default().to_string(), "false"); diff --git a/tests/ui/confuse-field-and-method/issue-33784.stderr b/tests/ui/confuse-field-and-method/issue-33784.stderr index 3906d64c9462..34debb683173 100644 --- a/tests/ui/confuse-field-and-method/issue-33784.stderr +++ b/tests/ui/confuse-field-and-method/issue-33784.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `closure` found for reference `&Obj<[closure@issue-33784.rs:25:43]>` in the current scope +error[E0599]: no method named `closure` found for reference `&Obj<[closure@$DIR/issue-33784.rs:25:43: 25:45]>` in the current scope --> $DIR/issue-33784.rs:27:7 | LL | p.closure(); @@ -9,7 +9,7 @@ help: to call the function stored in `closure`, surround the field access with p LL | (p.closure)(); | + + -error[E0599]: no method named `fn_ptr` found for reference `&&Obj<[closure@issue-33784.rs:25:43]>` in the current scope +error[E0599]: no method named `fn_ptr` found for reference `&&Obj<[closure@$DIR/issue-33784.rs:25:43: 25:45]>` in the current scope --> $DIR/issue-33784.rs:29:7 | LL | q.fn_ptr(); diff --git a/tests/ui/empty/empty-struct-braces-expr.stderr b/tests/ui/empty/empty-struct-braces-expr.stderr index 0e580aedeaa9..4604ebeaa8b9 100644 --- a/tests/ui/empty/empty-struct-braces-expr.stderr +++ b/tests/ui/empty/empty-struct-braces-expr.stderr @@ -100,7 +100,7 @@ help: a unit struct with a similar name exists LL | let xe1 = XEmpty2(); | ~~~~~~~ -error[E0599]: no variant or associated item named `Empty3` found for enum `XE` in the current scope +error[E0599]: no variant or associated item named `Empty3` found for enum `empty_struct::XE` in the current scope --> $DIR/empty-struct-braces-expr.rs:25:19 | LL | let xe3 = XE::Empty3; @@ -109,7 +109,7 @@ LL | let xe3 = XE::Empty3; | variant or associated item not found in `XE` | help: there is a variant with a similar name: `XEmpty3` -error[E0599]: no variant or associated item named `Empty3` found for enum `XE` in the current scope +error[E0599]: no variant or associated item named `Empty3` found for enum `empty_struct::XE` in the current scope --> $DIR/empty-struct-braces-expr.rs:26:19 | LL | let xe3 = XE::Empty3(); diff --git a/tests/ui/functions-closures/fn-help-with-err.stderr b/tests/ui/functions-closures/fn-help-with-err.stderr index 83a2b1f58f9c..da081eb43558 100644 --- a/tests/ui/functions-closures/fn-help-with-err.stderr +++ b/tests/ui/functions-closures/fn-help-with-err.stderr @@ -4,7 +4,7 @@ error[E0425]: cannot find value `oops` in this scope LL | let arc = std::sync::Arc::new(oops); | ^^^^ not found in this scope -error[E0599]: no method named `bar` found for struct `Arc<[closure@fn-help-with-err.rs:18:36]>` in the current scope +error[E0599]: no method named `bar` found for struct `Arc<[closure@$DIR/fn-help-with-err.rs:18:36: 18:38]>` in the current scope --> $DIR/fn-help-with-err.rs:19:10 | LL | arc2.bar(); diff --git a/tests/ui/higher-rank-trait-bounds/issue-30786.rs b/tests/ui/higher-rank-trait-bounds/issue-30786.rs index e5f46f711c2f..4a6399c8f624 100644 --- a/tests/ui/higher-rank-trait-bounds/issue-30786.rs +++ b/tests/ui/higher-rank-trait-bounds/issue-30786.rs @@ -1,3 +1,5 @@ +// normalize-stderr-test: "long-type-\d+" -> "long-type-hash" + // rust-lang/rust#30786: the use of `for<'b> &'b mut A: Stream`, but its trait bounds were not satisfied - --> $DIR/issue-30786.rs:118:22 +error[E0599]: the method `filterx` exists for struct `Map`, but its trait bounds were not satisfied + --> $DIR/issue-30786.rs:120:22 | LL | pub struct Map { | -------------------- @@ -8,19 +8,19 @@ LL | pub struct Map { | doesn't satisfy `_: StreamExt` ... LL | let filter = map.filterx(|x: &_| true); - | ^^^^^^^ method cannot be called on `Map` due to unsatisfied trait bounds + | ^^^^^^^ method cannot be called on `Map` due to unsatisfied trait bounds | note: the following trait bounds were not satisfied: - `&'a mut &Map: Stream` - `&'a mut &mut Map: Stream` - `&'a mut Map: Stream` - --> $DIR/issue-30786.rs:96:50 + `&'a mut &Map: Stream` + `&'a mut &mut Map: Stream` + `&'a mut Map: Stream` + --> $DIR/issue-30786.rs:98:50 | LL | impl StreamExt for T where for<'a> &'a mut T: Stream {} | --------- - ^^^^^^ unsatisfied trait bound introduced here -error[E0599]: the method `countx` exists for struct `Filter &u64 {identity::}>, [closure@issue-30786.rs:129:30]>`, but its trait bounds were not satisfied - --> $DIR/issue-30786.rs:130:24 +error[E0599]: the method `countx` exists for struct `Filter &u64 {identity::}>, [closure@issue-30786.rs:131:30]>`, but its trait bounds were not satisfied + --> $DIR/issue-30786.rs:132:24 | LL | pub struct Filter { | ----------------------- @@ -31,11 +31,12 @@ LL | pub struct Filter { LL | let count = filter.countx(); | ^^^^^^ method cannot be called due to unsatisfied trait bounds | + = note: the full type name has been written to '$TEST_BUILD_DIR/higher-rank-trait-bounds/issue-30786/issue-30786.long-type-hash.txt' note: the following trait bounds were not satisfied: - `&'a mut &Filter fn(&'a u64) -> &'a u64 {identity::}>, [closure@$DIR/issue-30786.rs:129:30: 129:37]>: Stream` - `&'a mut &mut Filter fn(&'a u64) -> &'a u64 {identity::}>, [closure@$DIR/issue-30786.rs:129:30: 129:37]>: Stream` - `&'a mut Filter fn(&'a u64) -> &'a u64 {identity::}>, [closure@$DIR/issue-30786.rs:129:30: 129:37]>: Stream` - --> $DIR/issue-30786.rs:96:50 + `&'a mut &Filter fn(&'a u64) -> &'a u64 {identity::}>, [closure@$DIR/issue-30786.rs:131:30: 131:37]>: Stream` + `&'a mut &mut Filter fn(&'a u64) -> &'a u64 {identity::}>, [closure@$DIR/issue-30786.rs:131:30: 131:37]>: Stream` + `&'a mut Filter fn(&'a u64) -> &'a u64 {identity::}>, [closure@$DIR/issue-30786.rs:131:30: 131:37]>: Stream` + --> $DIR/issue-30786.rs:98:50 | LL | impl StreamExt for T where for<'a> &'a mut T: Stream {} | --------- - ^^^^^^ unsatisfied trait bound introduced here diff --git a/tests/ui/impl-trait/no-method-suggested-traits.stderr b/tests/ui/impl-trait/no-method-suggested-traits.stderr index 548c89d0a387..3c2c01dc227b 100644 --- a/tests/ui/impl-trait/no-method-suggested-traits.stderr +++ b/tests/ui/impl-trait/no-method-suggested-traits.stderr @@ -145,7 +145,7 @@ note: `foo::Bar` defines an item `method2`, perhaps you need to implement it LL | pub trait Bar { | ^^^^^^^^^^^^^ -error[E0599]: no method named `method2` found for struct `Foo` in the current scope +error[E0599]: no method named `method2` found for struct `no_method_suggested_traits::Foo` in the current scope --> $DIR/no-method-suggested-traits.rs:50:37 | LL | no_method_suggested_traits::Foo.method2(); @@ -158,7 +158,7 @@ note: `foo::Bar` defines an item `method2`, perhaps you need to implement it LL | pub trait Bar { | ^^^^^^^^^^^^^ -error[E0599]: no method named `method2` found for struct `Rc<&mut Box<&Foo>>` in the current scope +error[E0599]: no method named `method2` found for struct `Rc<&mut Box<&no_method_suggested_traits::Foo>>` in the current scope --> $DIR/no-method-suggested-traits.rs:52:71 | LL | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).method2(); @@ -171,7 +171,7 @@ note: `foo::Bar` defines an item `method2`, perhaps you need to implement it LL | pub trait Bar { | ^^^^^^^^^^^^^ -error[E0599]: no method named `method2` found for enum `Bar` in the current scope +error[E0599]: no method named `method2` found for enum `no_method_suggested_traits::Bar` in the current scope --> $DIR/no-method-suggested-traits.rs:54:40 | LL | no_method_suggested_traits::Bar::X.method2(); @@ -184,7 +184,7 @@ note: `foo::Bar` defines an item `method2`, perhaps you need to implement it LL | pub trait Bar { | ^^^^^^^^^^^^^ -error[E0599]: no method named `method2` found for struct `Rc<&mut Box<&Bar>>` in the current scope +error[E0599]: no method named `method2` found for struct `Rc<&mut Box<&no_method_suggested_traits::Bar>>` in the current scope --> $DIR/no-method-suggested-traits.rs:56:74 | LL | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).method2(); @@ -255,25 +255,25 @@ error[E0599]: no method named `method3` found for struct `Rc<&mut Box<&usize>>` LL | std::rc::Rc::new(&mut Box::new(&1_usize)).method3(); | ^^^^^^^ method not found in `Rc<&mut Box<&usize>>` -error[E0599]: no method named `method3` found for struct `Foo` in the current scope +error[E0599]: no method named `method3` found for struct `no_method_suggested_traits::Foo` in the current scope --> $DIR/no-method-suggested-traits.rs:71:37 | LL | no_method_suggested_traits::Foo.method3(); | ^^^^^^^ method not found in `Foo` -error[E0599]: no method named `method3` found for struct `Rc<&mut Box<&Foo>>` in the current scope +error[E0599]: no method named `method3` found for struct `Rc<&mut Box<&no_method_suggested_traits::Foo>>` in the current scope --> $DIR/no-method-suggested-traits.rs:72:71 | LL | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).method3(); | ^^^^^^^ method not found in `Rc<&mut Box<&Foo>>` -error[E0599]: no method named `method3` found for enum `Bar` in the current scope +error[E0599]: no method named `method3` found for enum `no_method_suggested_traits::Bar` in the current scope --> $DIR/no-method-suggested-traits.rs:74:40 | LL | no_method_suggested_traits::Bar::X.method3(); | ^^^^^^^ method not found in `Bar` -error[E0599]: no method named `method3` found for struct `Rc<&mut Box<&Bar>>` in the current scope +error[E0599]: no method named `method3` found for struct `Rc<&mut Box<&no_method_suggested_traits::Bar>>` in the current scope --> $DIR/no-method-suggested-traits.rs:75:74 | LL | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).method3(); diff --git a/tests/ui/issues/issue-19521.stderr b/tests/ui/issues/issue-19521.stderr index 899363740853..13a12acb3605 100644 --- a/tests/ui/issues/issue-19521.stderr +++ b/tests/ui/issues/issue-19521.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `homura` found for reference `&str` in the current scope +error[E0599]: no method named `homura` found for reference `&'static str` in the current scope --> $DIR/issue-19521.rs:2:8 | LL | "".homura()(); diff --git a/tests/ui/issues/issue-30123.stderr b/tests/ui/issues/issue-30123.stderr index 7808cbf8aa10..a00a1dbb8843 100644 --- a/tests/ui/issues/issue-30123.stderr +++ b/tests/ui/issues/issue-30123.stderr @@ -1,4 +1,4 @@ -error[E0599]: no function or associated item named `new_undirected` found for struct `Graph` in the current scope +error[E0599]: no function or associated item named `new_undirected` found for struct `issue_30123_aux::Graph` in the current scope --> $DIR/issue-30123.rs:7:33 | LL | let ug = Graph::::new_undirected(); diff --git a/tests/ui/nll/issue-57642-higher-ranked-subtype.stderr b/tests/ui/nll/issue-57642-higher-ranked-subtype.stderr index cab5898259fb..d1e94bc702ca 100644 --- a/tests/ui/nll/issue-57642-higher-ranked-subtype.stderr +++ b/tests/ui/nll/issue-57642-higher-ranked-subtype.stderr @@ -13,7 +13,7 @@ note: `X` defines an item `make_g`, perhaps you need to implement it LL | trait X { | ^^^^^^^ -error[E0599]: no function or associated item named `make_f` found for fn pointer `fn(&())` in the current scope +error[E0599]: no function or associated item named `make_f` found for fn pointer `for<'a> fn(&'a ())` in the current scope --> $DIR/issue-57642-higher-ranked-subtype.rs:35:25 | LL | let x = ::make_f(); diff --git a/tests/ui/object-pointer-types.stderr b/tests/ui/object-pointer-types.stderr index 7133f8ae1947..2c8df3b616fb 100644 --- a/tests/ui/object-pointer-types.stderr +++ b/tests/ui/object-pointer-types.stderr @@ -16,7 +16,7 @@ LL | fn owned(self: Box); LL | x.owned(); | ^^^^^ method not found in `&mut dyn Foo` -error[E0599]: no method named `managed` found for struct `Box` in the current scope +error[E0599]: no method named `managed` found for struct `Box<(dyn Foo + 'static)>` in the current scope --> $DIR/object-pointer-types.rs:23:7 | LL | x.managed(); diff --git a/tests/ui/suggestions/remove-as_str.stderr b/tests/ui/suggestions/remove-as_str.stderr index cb618db704d1..534c497780a9 100644 --- a/tests/ui/suggestions/remove-as_str.stderr +++ b/tests/ui/suggestions/remove-as_str.stderr @@ -4,7 +4,7 @@ error[E0599]: no method named `as_str` found for reference `&str` in the current LL | s.as_str(); | -^^^^^^-- help: remove this method call -error[E0599]: no method named `as_str` found for reference `&str` in the current scope +error[E0599]: no method named `as_str` found for reference `&'a str` in the current scope --> $DIR/remove-as_str.rs:7:7 | LL | s.as_str(); diff --git a/tests/ui/suggestions/suggest-using-chars.rs b/tests/ui/suggestions/suggest-using-chars.rs index 29750a201999..95732881baf0 100644 --- a/tests/ui/suggestions/suggest-using-chars.rs +++ b/tests/ui/suggestions/suggest-using-chars.rs @@ -1,6 +1,6 @@ pub fn main() { - let _ = "foo".iter(); //~ ERROR no method named `iter` found for reference `&str` in the current scope - let _ = "foo".foo(); //~ ERROR no method named `foo` found for reference `&str` in the current scope + let _ = "foo".iter(); //~ ERROR no method named `iter` found for reference `&'static str` in the current scope + let _ = "foo".foo(); //~ ERROR no method named `foo` found for reference `&'static str` in the current scope let _ = String::from("bar").iter(); //~ ERROR no method named `iter` found for struct `String` in the current scope let _ = (&String::from("bar")).iter(); //~ ERROR no method named `iter` found for reference `&String` in the current scope let _ = 0.iter(); //~ ERROR no method named `iter` found for type `{integer}` in the current scope diff --git a/tests/ui/suggestions/suggest-using-chars.stderr b/tests/ui/suggestions/suggest-using-chars.stderr index 57b0e866f845..ba80ec6a2019 100644 --- a/tests/ui/suggestions/suggest-using-chars.stderr +++ b/tests/ui/suggestions/suggest-using-chars.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `iter` found for reference `&str` in the current scope +error[E0599]: no method named `iter` found for reference `&'static str` in the current scope --> $DIR/suggest-using-chars.rs:2:19 | LL | let _ = "foo".iter(); @@ -9,7 +9,7 @@ help: because of the in-memory representation of `&str`, to obtain an `Iterator` LL | let _ = "foo".chars(); | ~~~~~ -error[E0599]: no method named `foo` found for reference `&str` in the current scope +error[E0599]: no method named `foo` found for reference `&'static str` in the current scope --> $DIR/suggest-using-chars.rs:3:19 | LL | let _ = "foo".foo(); diff --git a/tests/ui/unboxed-closures/unboxed-closures-static-call-wrong-trait.stderr b/tests/ui/unboxed-closures/unboxed-closures-static-call-wrong-trait.stderr index 99ec51783400..482fd3cb44de 100644 --- a/tests/ui/unboxed-closures/unboxed-closures-static-call-wrong-trait.stderr +++ b/tests/ui/unboxed-closures/unboxed-closures-static-call-wrong-trait.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `call` found for closure `[closure@unboxed-closures-static-call-wrong-trait.rs:6:26]` in the current scope +error[E0599]: no method named `call` found for closure `[closure@$DIR/unboxed-closures-static-call-wrong-trait.rs:6:26: 6:29]` in the current scope --> $DIR/unboxed-closures-static-call-wrong-trait.rs:7:10 | LL | mut_.call((0, )); From 80fcd7c40ec46613b130b5d732162ecbfda6c509 Mon Sep 17 00:00:00 2001 From: Cassaundra Smith Date: Mon, 30 Jan 2023 13:39:25 -0800 Subject: [PATCH 40/69] Fix invalid float literal suggestions when recovering an integer Only suggest adding a zero to integers with a preceding dot when the change will result in a valid floating point literal. For example, `.0x0` should not be turned into `0.0x0`. --- compiler/rustc_parse/src/parser/expr.rs | 11 +++++++- .../recover-invalid-float-invalid.rs | 24 +++++++++++++++++ .../recover-invalid-float-invalid.stderr | 26 +++++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 tests/ui/suggestions/recover-invalid-float-invalid.rs create mode 100644 tests/ui/suggestions/recover-invalid-float-invalid.stderr diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index d58afcd4c9fc..6bf1a68f84cb 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -1854,7 +1854,16 @@ impl<'a> Parser<'a> { if let token::Literal(token::Lit { kind: token::Integer, symbol, suffix }) = next_token.kind { - if self.token.span.hi() == next_token.span.lo() { + // If this integer looks like a float, then recover as such. + // + // We will never encounter the exponent part of a floating + // point literal here, since there's no use of the exponent + // syntax that also constitutes a valid integer, so we need + // not check for that. + if suffix.map_or(true, |s| s == sym::f32 || s == sym::f64) + && symbol.as_str().chars().all(|c| c.is_numeric() || c == '_') + && self.token.span.hi() == next_token.span.lo() + { let s = String::from("0.") + symbol.as_str(); let kind = TokenKind::lit(token::Float, Symbol::intern(&s), suffix); return Some(Token::new(kind, self.token.span.to(next_token.span))); diff --git a/tests/ui/suggestions/recover-invalid-float-invalid.rs b/tests/ui/suggestions/recover-invalid-float-invalid.rs new file mode 100644 index 000000000000..79430d8c0513 --- /dev/null +++ b/tests/ui/suggestions/recover-invalid-float-invalid.rs @@ -0,0 +1,24 @@ +// Check that suggestions to add a zero to integers with a preceding dot only appear when the change +// will result in a valid floating point literal. + +fn main() {} + +fn a() { + _ = .3u32; + //~^ ERROR expected expression, found `.` +} + +fn b() { + _ = .0b0; + //~^ ERROR expected expression, found `.` +} + +fn c() { + _ = .0o07; + //~^ ERROR expected expression, found `.` +} + +fn d() { + _ = .0x0ABC; + //~^ ERROR expected expression, found `.` +} diff --git a/tests/ui/suggestions/recover-invalid-float-invalid.stderr b/tests/ui/suggestions/recover-invalid-float-invalid.stderr new file mode 100644 index 000000000000..5764afc1a21f --- /dev/null +++ b/tests/ui/suggestions/recover-invalid-float-invalid.stderr @@ -0,0 +1,26 @@ +error: expected expression, found `.` + --> $DIR/recover-invalid-float-invalid.rs:7:9 + | +LL | _ = .3u32; + | ^ expected expression + +error: expected expression, found `.` + --> $DIR/recover-invalid-float-invalid.rs:12:9 + | +LL | _ = .0b0; + | ^ expected expression + +error: expected expression, found `.` + --> $DIR/recover-invalid-float-invalid.rs:17:9 + | +LL | _ = .0o07; + | ^ expected expression + +error: expected expression, found `.` + --> $DIR/recover-invalid-float-invalid.rs:22:9 + | +LL | _ = .0x0ABC; + | ^ expected expression + +error: aborting due to 4 previous errors + From 5ae8e238169586d8af4bb61b980c2bd4bfb71b86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 6 Jan 2023 20:15:10 +0000 Subject: [PATCH 41/69] Mention fn coercion rules (needs to be expanded) --- .../rustc_infer/src/infer/error_reporting/mod.rs | 12 ++++++++++++ .../src/infer/error_reporting/note_and_explain.rs | 7 +++++++ compiler/rustc_middle/src/ty/error.rs | 2 +- .../argument-suggestions/two-mismatch-notes.stderr | 1 + .../associated-types/associated-types-eq-hr.stderr | 8 ++++---- tests/ui/associated-types/issue-87261.rs | 6 +++--- tests/ui/associated-types/issue-87261.stderr | 6 +++--- tests/ui/c-variadic/variadic-ffi-1.stderr | 2 ++ tests/ui/fn/fn-pointer-mismatch.stderr | 1 + .../ui/fn/signature-error-reporting-under-verbose.rs | 1 + .../signature-error-reporting-under-verbose.stderr | 1 + .../collections-project-default.stderr | 1 + .../issue-79422.extended.stderr | 4 ++-- .../issue-62203-hrtb-ice.stderr | 4 ++-- tests/ui/impl-trait/equality2.stderr | 2 ++ tests/ui/issues/issue-10764.stderr | 1 + tests/ui/issues/issue-39970.rs | 2 +- tests/ui/issues/issue-39970.stderr | 4 ++-- tests/ui/mismatched_types/normalize-fn-sig.stderr | 1 + ...region-lifetime-bounds-on-fns-where-clause.stderr | 1 + ...ltiple-lifetime-bounds-on-fns-where-clause.stderr | 1 + .../regions-fn-subtyping-return-static-fail.stderr | 1 + .../ui/regions/regions-lifetime-bounds-on-fns.stderr | 1 + tests/ui/reify-intrinsic.stderr | 1 + .../rfc-2396-target_feature-11/fn-ptr.mir.stderr | 1 + .../rfc-2396-target_feature-11/fn-ptr.thir.stderr | 1 + tests/ui/static/static-reference-to-fn-1.stderr | 1 + 27 files changed, 56 insertions(+), 18 deletions(-) diff --git a/compiler/rustc_infer/src/infer/error_reporting/mod.rs b/compiler/rustc_infer/src/infer/error_reporting/mod.rs index 8ebcd3d54aa7..554a70265d43 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/mod.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/mod.rs @@ -1865,6 +1865,18 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> { self.check_and_note_conflicting_crates(diag, terr); self.note_and_explain_type_err(diag, terr, cause, span, cause.body_id.to_def_id()); + if let Some(exp_found) = exp_found + && let exp_found = TypeError::Sorts(exp_found) + && exp_found != terr + { + self.note_and_explain_type_err( + diag, + exp_found, + cause, + span, + cause.body_id.to_def_id(), + ); + } if let Some(ValuePairs::PolyTraitRefs(exp_found)) = values && let ty::Closure(def_id, _) = exp_found.expected.skip_binder().self_ty().kind() diff --git a/compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs b/compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs index e18cfb93bedd..39b3c98f0a5c 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs @@ -218,6 +218,13 @@ impl Trait for X { ); } } + (ty::FnPtr(_), ty::FnDef(def, _)) + if let hir::def::DefKind::Fn = tcx.def_kind(def) => { + diag.note( + "when the arguments and return types match, functions can be coerced \ + to function pointers", + ); + } _ => {} } debug!( diff --git a/compiler/rustc_middle/src/ty/error.rs b/compiler/rustc_middle/src/ty/error.rs index 6229c0072f2a..d188199773a5 100644 --- a/compiler/rustc_middle/src/ty/error.rs +++ b/compiler/rustc_middle/src/ty/error.rs @@ -28,7 +28,7 @@ impl ExpectedFound { } // Data structures used in type unification -#[derive(Copy, Clone, Debug, TypeFoldable, TypeVisitable, Lift)] +#[derive(Copy, Clone, Debug, TypeFoldable, TypeVisitable, Lift, PartialEq, Eq)] #[rustc_pass_by_value] pub enum TypeError<'tcx> { Mismatch, diff --git a/tests/ui/argument-suggestions/two-mismatch-notes.stderr b/tests/ui/argument-suggestions/two-mismatch-notes.stderr index 70cc60255c71..38cf23ddc389 100644 --- a/tests/ui/argument-suggestions/two-mismatch-notes.stderr +++ b/tests/ui/argument-suggestions/two-mismatch-notes.stderr @@ -11,6 +11,7 @@ LL | foo(f, w); | ^ = note: expected fn pointer `fn(i32)` found fn item `fn(u32) {f}` + = note: when the arguments and return types match, functions can be coerced to function pointers note: expected `Wrapper`, found `Wrapper` --> $DIR/two-mismatch-notes.rs:10:12 | diff --git a/tests/ui/associated-types/associated-types-eq-hr.stderr b/tests/ui/associated-types/associated-types-eq-hr.stderr index 6cff403b318c..99db0c1bf3bc 100644 --- a/tests/ui/associated-types/associated-types-eq-hr.stderr +++ b/tests/ui/associated-types/associated-types-eq-hr.stderr @@ -1,8 +1,8 @@ -error[E0271]: type mismatch resolving `for<'x> >::A == &'x isize` +error[E0271]: type mismatch resolving `>::A == &isize` --> $DIR/associated-types-eq-hr.rs:87:11 | LL | foo::(); - | ^^^^^^^^^^ type mismatch resolving `for<'x> >::A == &'x isize` + | ^^^^^^^^^^ type mismatch resolving `>::A == &isize` | note: expected this to be `&isize` --> $DIR/associated-types-eq-hr.rs:26:14 @@ -20,11 +20,11 @@ LL | where LL | T: for<'x> TheTrait<&'x isize, A = &'x isize>, | ^^^^^^^^^^^^^ required by this bound in `foo` -error[E0271]: type mismatch resolving `for<'x> >::A == &'x usize` +error[E0271]: type mismatch resolving `>::A == &usize` --> $DIR/associated-types-eq-hr.rs:91:11 | LL | bar::(); - | ^^^^^^^^^ type mismatch resolving `for<'x> >::A == &'x usize` + | ^^^^^^^^^ type mismatch resolving `>::A == &usize` | note: expected this to be `&usize` --> $DIR/associated-types-eq-hr.rs:14:14 diff --git a/tests/ui/associated-types/issue-87261.rs b/tests/ui/associated-types/issue-87261.rs index e8548d402fae..384561f8ccd7 100644 --- a/tests/ui/associated-types/issue-87261.rs +++ b/tests/ui/associated-types/issue-87261.rs @@ -77,10 +77,10 @@ where fn main() { accepts_trait(returns_opaque()); - //~^ ERROR type mismatch resolving `::Associated == ()` + //~^ ERROR type mismatch resolving `::Associated == ()` accepts_trait(returns_opaque_derived()); - //~^ ERROR type mismatch resolving `::Associated == ()` + //~^ ERROR type mismatch resolving `::Associated == ()` accepts_trait(returns_opaque_foo()); //~^ ERROR type mismatch resolving `::Associated == ()` @@ -89,7 +89,7 @@ fn main() { //~^ ERROR type mismatch resolving `::Associated == ()` accepts_generic_trait(returns_opaque_generic()); - //~^ ERROR type mismatch resolving ` + 'static as GenericTrait<()>>::Associated == ()` + //~^ ERROR type mismatch resolving ` as GenericTrait<()>>::Associated == ()` accepts_generic_trait(returns_opaque_generic_foo()); //~^ ERROR type mismatch resolving ` + Foo as GenericTrait<()>>::Associated == ()` diff --git a/tests/ui/associated-types/issue-87261.stderr b/tests/ui/associated-types/issue-87261.stderr index 2cce6b947025..f5c6d82471a8 100644 --- a/tests/ui/associated-types/issue-87261.stderr +++ b/tests/ui/associated-types/issue-87261.stderr @@ -132,7 +132,7 @@ note: required by a bound in `accepts_generic_trait` LL | fn accepts_generic_trait>(_: T) {} | ^^^^^^^^^^^^^^^ required by this bound in `accepts_generic_trait` -error[E0271]: type mismatch resolving `::Associated == ()` +error[E0271]: type mismatch resolving `::Associated == ()` --> $DIR/issue-87261.rs:79:19 | LL | fn returns_opaque() -> impl Trait + 'static { @@ -155,7 +155,7 @@ help: consider constraining the associated type ` LL | fn returns_opaque() -> impl Trait + 'static { | +++++++++++++++++ -error[E0271]: type mismatch resolving `::Associated == ()` +error[E0271]: type mismatch resolving `::Associated == ()` --> $DIR/issue-87261.rs:82:19 | LL | fn returns_opaque_derived() -> impl DerivedTrait + 'static { @@ -222,7 +222,7 @@ note: required by a bound in `accepts_trait` LL | fn accepts_trait>(_: T) {} | ^^^^^^^^^^^^^^^ required by this bound in `accepts_trait` -error[E0271]: type mismatch resolving ` + 'static as GenericTrait<()>>::Associated == ()` +error[E0271]: type mismatch resolving ` as GenericTrait<()>>::Associated == ()` --> $DIR/issue-87261.rs:91:27 | LL | fn returns_opaque_generic() -> impl GenericTrait<()> + 'static { diff --git a/tests/ui/c-variadic/variadic-ffi-1.stderr b/tests/ui/c-variadic/variadic-ffi-1.stderr index 4beea83d8a52..c7899338197d 100644 --- a/tests/ui/c-variadic/variadic-ffi-1.stderr +++ b/tests/ui/c-variadic/variadic-ffi-1.stderr @@ -46,6 +46,7 @@ LL | let x: unsafe extern "C" fn(f: isize, x: u8) = foo; | = note: expected fn pointer `unsafe extern "C" fn(_, _)` found fn item `unsafe extern "C" fn(_, _, ...) {foo}` + = note: when the arguments and return types match, functions can be coerced to function pointers error[E0308]: mismatched types --> $DIR/variadic-ffi-1.rs:26:54 @@ -57,6 +58,7 @@ LL | let y: extern "C" fn(f: isize, x: u8, ...) = bar; | = note: expected fn pointer `extern "C" fn(_, _, ...)` found fn item `extern "C" fn(_, _) {bar}` + = note: when the arguments and return types match, functions can be coerced to function pointers error[E0617]: can't pass `f32` to variadic function --> $DIR/variadic-ffi-1.rs:28:19 diff --git a/tests/ui/fn/fn-pointer-mismatch.stderr b/tests/ui/fn/fn-pointer-mismatch.stderr index 74f79f6df5ab..bed59d4af6df 100644 --- a/tests/ui/fn/fn-pointer-mismatch.stderr +++ b/tests/ui/fn/fn-pointer-mismatch.stderr @@ -78,6 +78,7 @@ LL | let e: &fn(u32) -> u32 = &foo; = note: expected reference `&fn(u32) -> u32` found reference `&fn(u32) -> u32 {foo}` = note: fn items are distinct from fn pointers + = note: when the arguments and return types match, functions can be coerced to function pointers error: aborting due to 6 previous errors diff --git a/tests/ui/fn/signature-error-reporting-under-verbose.rs b/tests/ui/fn/signature-error-reporting-under-verbose.rs index d00cbd8a0f24..12ff113c9134 100644 --- a/tests/ui/fn/signature-error-reporting-under-verbose.rs +++ b/tests/ui/fn/signature-error-reporting-under-verbose.rs @@ -12,4 +12,5 @@ fn main() { //~| NOTE expected fn pointer, found fn item //~| NOTE expected fn pointer `fn(i32, u32)` //~| NOTE arguments to this function are incorrect + //~| NOTE when the arguments and return types match, functions can be coerced to function pointers } diff --git a/tests/ui/fn/signature-error-reporting-under-verbose.stderr b/tests/ui/fn/signature-error-reporting-under-verbose.stderr index 067ee824d5d8..f4498db7259e 100644 --- a/tests/ui/fn/signature-error-reporting-under-verbose.stderr +++ b/tests/ui/fn/signature-error-reporting-under-verbose.stderr @@ -8,6 +8,7 @@ LL | needs_ptr(foo); | = note: expected fn pointer `fn(i32, u32)` found fn item `fn(i32, i32) {foo}` + = note: when the arguments and return types match, functions can be coerced to function pointers note: function defined here --> $DIR/signature-error-reporting-under-verbose.rs:5:4 | diff --git a/tests/ui/generic-associated-types/collections-project-default.stderr b/tests/ui/generic-associated-types/collections-project-default.stderr index 5701017dc347..9aa0b239e478 100644 --- a/tests/ui/generic-associated-types/collections-project-default.stderr +++ b/tests/ui/generic-associated-types/collections-project-default.stderr @@ -9,6 +9,7 @@ LL | res | = note: expected associated type `>::Sibling` found associated type `<>::Family as CollectionFamily>::Member` + = note: an associated type was expected, but a different one was found error: aborting due to previous error diff --git a/tests/ui/generic-associated-types/issue-79422.extended.stderr b/tests/ui/generic-associated-types/issue-79422.extended.stderr index d79de0ca6279..04184fce921f 100644 --- a/tests/ui/generic-associated-types/issue-79422.extended.stderr +++ b/tests/ui/generic-associated-types/issue-79422.extended.stderr @@ -14,11 +14,11 @@ help: add missing lifetime argument LL | as Box = dyn RefCont<'_, u8>>>; | ++++ -error[E0271]: type mismatch resolving ` as MapLike>::VRefCont<'_> == (dyn RefCont<'_, u8> + 'static)` +error[E0271]: type mismatch resolving ` as MapLike>::VRefCont<'_> == dyn RefCont<'_, u8>` --> $DIR/issue-79422.rs:44:13 | LL | let m = Box::new(std::collections::BTreeMap::::new()) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type mismatch resolving ` as MapLike>::VRefCont<'_> == (dyn RefCont<'_, u8> + 'static)` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type mismatch resolving ` as MapLike>::VRefCont<'_> == dyn RefCont<'_, u8>` | note: expected this to be `(dyn RefCont<'_, u8> + 'static)` --> $DIR/issue-79422.rs:28:25 diff --git a/tests/ui/higher-rank-trait-bounds/issue-62203-hrtb-ice.stderr b/tests/ui/higher-rank-trait-bounds/issue-62203-hrtb-ice.stderr index 01d48ab59af1..86198c3f7fd7 100644 --- a/tests/ui/higher-rank-trait-bounds/issue-62203-hrtb-ice.stderr +++ b/tests/ui/higher-rank-trait-bounds/issue-62203-hrtb-ice.stderr @@ -1,4 +1,4 @@ -error[E0271]: type mismatch resolving `for<'r> as T0<'r, (&'r u8,)>>::O == <_ as Ty<'r>>::V` +error[E0271]: type mismatch resolving ` as T0<'r, (&u8,)>>::O == <_ as Ty<'r>>::V` --> $DIR/issue-62203-hrtb-ice.rs:39:9 | LL | let v = Unit2.m( @@ -10,7 +10,7 @@ LL | | f: |x| { ... | LL | | }, LL | | }, - | |_________^ type mismatch resolving `for<'r> as T0<'r, (&'r u8,)>>::O == <_ as Ty<'r>>::V` + | |_________^ type mismatch resolving ` as T0<'r, (&u8,)>>::O == <_ as Ty<'r>>::V` | note: expected this to be `<_ as Ty<'_>>::V` --> $DIR/issue-62203-hrtb-ice.rs:21:14 diff --git a/tests/ui/impl-trait/equality2.stderr b/tests/ui/impl-trait/equality2.stderr index e399a61023d1..52f25d2458c9 100644 --- a/tests/ui/impl-trait/equality2.stderr +++ b/tests/ui/impl-trait/equality2.stderr @@ -54,6 +54,7 @@ LL | x = (x.1, | = note: expected opaque type `impl Foo` (`u32`) found opaque type `impl Foo` (`i32`) + = note: distinct uses of `impl Trait` result in different opaque types error[E0308]: mismatched types --> $DIR/equality2.rs:41:10 @@ -69,6 +70,7 @@ LL | x.0); | = note: expected opaque type `impl Foo` (`i32`) found opaque type `impl Foo` (`u32`) + = note: distinct uses of `impl Trait` result in different opaque types error: aborting due to 4 previous errors; 1 warning emitted diff --git a/tests/ui/issues/issue-10764.stderr b/tests/ui/issues/issue-10764.stderr index 4d8a85a13971..fcb45affe2c1 100644 --- a/tests/ui/issues/issue-10764.stderr +++ b/tests/ui/issues/issue-10764.stderr @@ -8,6 +8,7 @@ LL | fn main() { f(bar) } | = note: expected fn pointer `fn()` found fn item `extern "C" fn() {bar}` + = note: when the arguments and return types match, functions can be coerced to function pointers note: function defined here --> $DIR/issue-10764.rs:1:4 | diff --git a/tests/ui/issues/issue-39970.rs b/tests/ui/issues/issue-39970.rs index f51e3b522e1c..40d3ae30a87c 100644 --- a/tests/ui/issues/issue-39970.rs +++ b/tests/ui/issues/issue-39970.rs @@ -17,5 +17,5 @@ impl Visit for () where fn main() { <() as Visit>::visit(); - //~^ ERROR type mismatch resolving `for<'a> <() as Array<'a>>::Element == ()` + //~^ ERROR type mismatch resolving `<() as Array<'a>>::Element == ()` } diff --git a/tests/ui/issues/issue-39970.stderr b/tests/ui/issues/issue-39970.stderr index 0cabdf7f234a..8344b88c3bea 100644 --- a/tests/ui/issues/issue-39970.stderr +++ b/tests/ui/issues/issue-39970.stderr @@ -1,8 +1,8 @@ -error[E0271]: type mismatch resolving `for<'a> <() as Array<'a>>::Element == ()` +error[E0271]: type mismatch resolving `<() as Array<'a>>::Element == ()` --> $DIR/issue-39970.rs:19:5 | LL | <() as Visit>::visit(); - | ^^^^^^^^^^^^^^^^^^^^ type mismatch resolving `for<'a> <() as Array<'a>>::Element == ()` + | ^^^^^^^^^^^^^^^^^^^^ type mismatch resolving `<() as Array<'a>>::Element == ()` | note: expected this to be `()` --> $DIR/issue-39970.rs:10:20 diff --git a/tests/ui/mismatched_types/normalize-fn-sig.stderr b/tests/ui/mismatched_types/normalize-fn-sig.stderr index 252e56387ba8..e3a0646550cb 100644 --- a/tests/ui/mismatched_types/normalize-fn-sig.stderr +++ b/tests/ui/mismatched_types/normalize-fn-sig.stderr @@ -8,6 +8,7 @@ LL | needs_i32_ref_fn(foo::<()>); | = note: expected fn pointer `fn(&'static i32, i32)` found fn item `fn(i32, &'static i32) {foo::<()>}` + = note: when the arguments and return types match, functions can be coerced to function pointers note: function defined here --> $DIR/normalize-fn-sig.rs:11:4 | diff --git a/tests/ui/regions/region-lifetime-bounds-on-fns-where-clause.stderr b/tests/ui/regions/region-lifetime-bounds-on-fns-where-clause.stderr index 3b62c7b61c1b..bb5bc6f66a5f 100644 --- a/tests/ui/regions/region-lifetime-bounds-on-fns-where-clause.stderr +++ b/tests/ui/regions/region-lifetime-bounds-on-fns-where-clause.stderr @@ -6,6 +6,7 @@ LL | let _: fn(&mut &isize, &mut &isize) = a; | = note: expected fn pointer `for<'a, 'b, 'c, 'd> fn(&'a mut &'b isize, &'c mut &'d isize)` found fn item `for<'a, 'b> fn(&'a mut &isize, &'b mut &isize) {a::<'_, '_>}` + = note: when the arguments and return types match, functions can be coerced to function pointers error: aborting due to previous error diff --git a/tests/ui/regions/region-multiple-lifetime-bounds-on-fns-where-clause.stderr b/tests/ui/regions/region-multiple-lifetime-bounds-on-fns-where-clause.stderr index 8a18a234b5c4..dbe9e9b1a2e5 100644 --- a/tests/ui/regions/region-multiple-lifetime-bounds-on-fns-where-clause.stderr +++ b/tests/ui/regions/region-multiple-lifetime-bounds-on-fns-where-clause.stderr @@ -6,6 +6,7 @@ LL | let _: fn(&mut &isize, &mut &isize, &mut &isize) = a; | = note: expected fn pointer `for<'a, 'b, 'c, 'd, 'e, 'f> fn(&'a mut &'b isize, &'c mut &'d isize, &'e mut &'f isize)` found fn item `for<'a, 'b, 'c> fn(&'a mut &isize, &'b mut &isize, &'c mut &isize) {a::<'_, '_, '_>}` + = note: when the arguments and return types match, functions can be coerced to function pointers error: aborting due to previous error diff --git a/tests/ui/regions/regions-fn-subtyping-return-static-fail.stderr b/tests/ui/regions/regions-fn-subtyping-return-static-fail.stderr index 8d82ff958ff3..766a3d0337c0 100644 --- a/tests/ui/regions/regions-fn-subtyping-return-static-fail.stderr +++ b/tests/ui/regions/regions-fn-subtyping-return-static-fail.stderr @@ -8,6 +8,7 @@ LL | want_G(baz); | = note: expected fn pointer `for<'cx> fn(&'cx S) -> &'static S` found fn item `for<'a> fn(&'a S) -> &'a S {baz}` + = note: when the arguments and return types match, functions can be coerced to function pointers note: function defined here --> $DIR/regions-fn-subtyping-return-static-fail.rs:20:4 | diff --git a/tests/ui/regions/regions-lifetime-bounds-on-fns.stderr b/tests/ui/regions/regions-lifetime-bounds-on-fns.stderr index 17a9019436a1..df0fd069edca 100644 --- a/tests/ui/regions/regions-lifetime-bounds-on-fns.stderr +++ b/tests/ui/regions/regions-lifetime-bounds-on-fns.stderr @@ -6,6 +6,7 @@ LL | let _: fn(&mut &isize, &mut &isize) = a; | = note: expected fn pointer `for<'a, 'b, 'c, 'd> fn(&'a mut &'b isize, &'c mut &'d isize)` found fn item `for<'a, 'b> fn(&'a mut &isize, &'b mut &isize) {a::<'_, '_>}` + = note: when the arguments and return types match, functions can be coerced to function pointers error: aborting due to previous error diff --git a/tests/ui/reify-intrinsic.stderr b/tests/ui/reify-intrinsic.stderr index 310b6c224e0e..9f9034a30c73 100644 --- a/tests/ui/reify-intrinsic.stderr +++ b/tests/ui/reify-intrinsic.stderr @@ -8,6 +8,7 @@ LL | let _: unsafe extern "rust-intrinsic" fn(isize) -> usize = std::mem::tr | = note: expected fn pointer `unsafe extern "rust-intrinsic" fn(isize) -> usize` found fn item `unsafe extern "rust-intrinsic" fn(_) -> _ {transmute::<_, _>}` + = note: when the arguments and return types match, functions can be coerced to function pointers error[E0606]: casting `unsafe extern "rust-intrinsic" fn(_) -> _ {transmute::<_, _>}` as `unsafe extern "rust-intrinsic" fn(isize) -> usize` is invalid --> $DIR/reify-intrinsic.rs:11:13 diff --git a/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.mir.stderr b/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.mir.stderr index 07f6dc906c6b..36561ab91ee8 100644 --- a/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.mir.stderr +++ b/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.mir.stderr @@ -15,6 +15,7 @@ LL | let foo: fn() = foo; found fn item `fn() {foo}` = note: fn items are distinct from fn pointers = note: functions with `#[target_feature]` can only be coerced to `unsafe` function pointers + = note: when the arguments and return types match, functions can be coerced to function pointers error: aborting due to previous error diff --git a/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.thir.stderr b/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.thir.stderr index 07f6dc906c6b..36561ab91ee8 100644 --- a/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.thir.stderr +++ b/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.thir.stderr @@ -15,6 +15,7 @@ LL | let foo: fn() = foo; found fn item `fn() {foo}` = note: fn items are distinct from fn pointers = note: functions with `#[target_feature]` can only be coerced to `unsafe` function pointers + = note: when the arguments and return types match, functions can be coerced to function pointers error: aborting due to previous error diff --git a/tests/ui/static/static-reference-to-fn-1.stderr b/tests/ui/static/static-reference-to-fn-1.stderr index ea4c7b41995e..a75c7438cb74 100644 --- a/tests/ui/static/static-reference-to-fn-1.stderr +++ b/tests/ui/static/static-reference-to-fn-1.stderr @@ -10,6 +10,7 @@ LL | func: &foo, = note: expected reference `&fn() -> Option` found reference `&fn() -> Option {foo}` = note: fn items are distinct from fn pointers + = note: when the arguments and return types match, functions can be coerced to function pointers error: aborting due to previous error From 6c2c8edac3f7aa2d2aa779d0683db7f3dd2e9887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 6 Jan 2023 20:28:46 +0000 Subject: [PATCH 42/69] Tweak E0271 wording --- .../src/traits/error_reporting/mod.rs | 8 ++++++-- tests/ui/async-await/issue-98634.rs | 6 +++--- tests/ui/async-await/issue-98634.stderr | 6 +++--- tests/ui/intrinsics/const-eval-select-bad.rs | 2 +- tests/ui/intrinsics/const-eval-select-bad.stderr | 2 +- tests/ui/type-alias-impl-trait/issue-98604.rs | 2 +- tests/ui/type-alias-impl-trait/issue-98604.stderr | 2 +- tests/ui/type-alias-impl-trait/issue-98608.rs | 2 +- tests/ui/type-alias-impl-trait/issue-98608.stderr | 2 +- 9 files changed, 18 insertions(+), 14 deletions(-) diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs index e9842b2cba51..df6ce2777cfa 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs @@ -1866,10 +1866,14 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> { with_forced_trimmed_paths! { if Some(pred.projection_ty.def_id) == self.tcx.lang_items().fn_once_output() { + let fn_kind = self_ty.prefix_string(self.tcx); + let item = match self_ty.kind() { + ty::FnDef(def, _) => self.tcx.item_name(*def).to_string(), + _ => self_ty.to_string(), + }; Some(format!( - "expected `{self_ty}` to be a {fn_kind} that returns `{expected_ty}`, but it \ + "expected `{item}` to be a {fn_kind} that returns `{expected_ty}`, but it \ returns `{normalized_ty}`", - fn_kind = self_ty.prefix_string(self.tcx) )) } else if Some(trait_def_id) == self.tcx.lang_items().future_trait() { Some(format!( diff --git a/tests/ui/async-await/issue-98634.rs b/tests/ui/async-await/issue-98634.rs index 104b85baa63f..169cc7f9b21e 100644 --- a/tests/ui/async-await/issue-98634.rs +++ b/tests/ui/async-await/issue-98634.rs @@ -43,8 +43,8 @@ impl Runtime { fn main() { Runtime.block_on(async { StructAsync { callback }.await; - //~^ ERROR expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin>>`, but it returns `impl Future` - //~| ERROR expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin>>`, but it returns `impl Future` - //~| ERROR expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin>>`, but it returns `impl Future` + //~^ ERROR expected `callback` to be a fn item that returns `Pin>>`, but it returns `impl Future` + //~| ERROR expected `callback` to be a fn item that returns `Pin>>`, but it returns `impl Future` + //~| ERROR expected `callback` to be a fn item that returns `Pin>>`, but it returns `impl Future` }); } diff --git a/tests/ui/async-await/issue-98634.stderr b/tests/ui/async-await/issue-98634.stderr index 17e598508e57..08ea5bdc574f 100644 --- a/tests/ui/async-await/issue-98634.stderr +++ b/tests/ui/async-await/issue-98634.stderr @@ -1,4 +1,4 @@ -error[E0271]: expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin>>`, but it returns `impl Future` +error[E0271]: expected `callback` to be a fn item that returns `Pin>>`, but it returns `impl Future` --> $DIR/issue-98634.rs:45:23 | LL | StructAsync { callback }.await; @@ -17,7 +17,7 @@ note: required by a bound in `StructAsync` LL | pub struct StructAsync Pin>>> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `StructAsync` -error[E0271]: expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin>>`, but it returns `impl Future` +error[E0271]: expected `callback` to be a fn item that returns `Pin>>`, but it returns `impl Future` --> $DIR/issue-98634.rs:45:9 | LL | StructAsync { callback }.await; @@ -36,7 +36,7 @@ note: required by a bound in `StructAsync` LL | pub struct StructAsync Pin>>> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `StructAsync` -error[E0271]: expected `fn() -> impl Future {callback}` to be a fn item that returns `Pin>>`, but it returns `impl Future` +error[E0271]: expected `callback` to be a fn item that returns `Pin>>`, but it returns `impl Future` --> $DIR/issue-98634.rs:45:33 | LL | StructAsync { callback }.await; diff --git a/tests/ui/intrinsics/const-eval-select-bad.rs b/tests/ui/intrinsics/const-eval-select-bad.rs index fa14efad7b4a..991d1450aff9 100644 --- a/tests/ui/intrinsics/const-eval-select-bad.rs +++ b/tests/ui/intrinsics/const-eval-select-bad.rs @@ -30,7 +30,7 @@ fn baz(n: bool) -> i32 { const fn return_ty_mismatch() { const_eval_select((1,), foo, bar); - //~^ ERROR expected `fn(i32) -> bool {bar}` to be a fn item that returns `i32`, but it returns `bool` + //~^ ERROR expected `bar` to be a fn item that returns `i32`, but it returns `bool` } const fn args_ty_mismatch() { diff --git a/tests/ui/intrinsics/const-eval-select-bad.stderr b/tests/ui/intrinsics/const-eval-select-bad.stderr index fd7d061b6b2e..d4507a27aeaa 100644 --- a/tests/ui/intrinsics/const-eval-select-bad.stderr +++ b/tests/ui/intrinsics/const-eval-select-bad.stderr @@ -60,7 +60,7 @@ LL | const_eval_select((), 42, 0xDEADBEEF); note: required by a bound in `const_eval_select` --> $SRC_DIR/core/src/intrinsics.rs:LL:COL -error[E0271]: expected `fn(i32) -> bool {bar}` to be a fn item that returns `i32`, but it returns `bool` +error[E0271]: expected `bar` to be a fn item that returns `i32`, but it returns `bool` --> $DIR/const-eval-select-bad.rs:32:34 | LL | const_eval_select((1,), foo, bar); diff --git a/tests/ui/type-alias-impl-trait/issue-98604.rs b/tests/ui/type-alias-impl-trait/issue-98604.rs index 35f0bbfac93f..d07fc9822a02 100644 --- a/tests/ui/type-alias-impl-trait/issue-98604.rs +++ b/tests/ui/type-alias-impl-trait/issue-98604.rs @@ -7,5 +7,5 @@ async fn test() {} #[allow(unused_must_use)] fn main() { Box::new(test) as AsyncFnPtr; - //~^ ERROR expected `fn() -> impl Future {test}` to be a fn item that returns `Pin>>`, but it returns `impl Future + //~^ ERROR expected `test` to be a fn item that returns `Pin>>`, but it returns `impl Future } diff --git a/tests/ui/type-alias-impl-trait/issue-98604.stderr b/tests/ui/type-alias-impl-trait/issue-98604.stderr index 650376f8c6b4..c5a4b5217d7a 100644 --- a/tests/ui/type-alias-impl-trait/issue-98604.stderr +++ b/tests/ui/type-alias-impl-trait/issue-98604.stderr @@ -1,4 +1,4 @@ -error[E0271]: expected `fn() -> impl Future {test}` to be a fn item that returns `Pin>>`, but it returns `impl Future` +error[E0271]: expected `test` to be a fn item that returns `Pin>>`, but it returns `impl Future` --> $DIR/issue-98604.rs:9:5 | LL | Box::new(test) as AsyncFnPtr; diff --git a/tests/ui/type-alias-impl-trait/issue-98608.rs b/tests/ui/type-alias-impl-trait/issue-98608.rs index 1f89af045765..5e026ea4096c 100644 --- a/tests/ui/type-alias-impl-trait/issue-98608.rs +++ b/tests/ui/type-alias-impl-trait/issue-98608.rs @@ -4,7 +4,7 @@ fn hi() -> impl Sized { fn main() { let b: Box Box> = Box::new(hi); - //~^ ERROR expected `fn() -> impl Sized {hi}` to be a fn item that returns `Box`, but it returns `impl Sized` + //~^ ERROR expected `hi` to be a fn item that returns `Box`, but it returns `impl Sized` let boxed = b(); let null = *boxed; println!("{null:?}"); diff --git a/tests/ui/type-alias-impl-trait/issue-98608.stderr b/tests/ui/type-alias-impl-trait/issue-98608.stderr index 3a3db42c42d3..506d40cb7768 100644 --- a/tests/ui/type-alias-impl-trait/issue-98608.stderr +++ b/tests/ui/type-alias-impl-trait/issue-98608.stderr @@ -1,4 +1,4 @@ -error[E0271]: expected `fn() -> impl Sized {hi}` to be a fn item that returns `Box`, but it returns `impl Sized` +error[E0271]: expected `hi` to be a fn item that returns `Box`, but it returns `impl Sized` --> $DIR/issue-98608.rs:6:39 | LL | fn hi() -> impl Sized { From d86835769c58b5d9599cdb54a90e239ee041189b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Mon, 30 Jan 2023 21:55:25 +0000 Subject: [PATCH 43/69] Make structured suggestion for fn casting verbose --- .../src/infer/error_reporting/suggest.rs | 2 +- tests/ui/fn/fn-pointer-mismatch.stderr | 30 +++++++++++-------- .../fn-ptr.mir.stderr | 10 ++++--- .../fn-ptr.thir.stderr | 10 ++++--- .../ui/static/static-reference-to-fn-1.stderr | 9 +++--- 5 files changed, 36 insertions(+), 25 deletions(-) diff --git a/compiler/rustc_infer/src/infer/error_reporting/suggest.rs b/compiler/rustc_infer/src/infer/error_reporting/suggest.rs index 23063e80b05f..73859aca4247 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/suggest.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/suggest.rs @@ -404,7 +404,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> { (msg, sug) } }; - diag.span_suggestion(span, msg, sug, Applicability::MaybeIncorrect); + diag.span_suggestion_verbose(span, msg, sug, Applicability::MaybeIncorrect); } (ty::FnDef(did1, substs1), ty::FnDef(did2, substs2)) => { let expected_sig = diff --git a/tests/ui/fn/fn-pointer-mismatch.stderr b/tests/ui/fn/fn-pointer-mismatch.stderr index bed59d4af6df..a674babcb324 100644 --- a/tests/ui/fn/fn-pointer-mismatch.stderr +++ b/tests/ui/fn/fn-pointer-mismatch.stderr @@ -43,42 +43,48 @@ error[E0308]: mismatched types --> $DIR/fn-pointer-mismatch.rs:36:29 | LL | let c: fn(u32) -> u32 = &foo; - | -------------- ^^^^ - | | | - | | expected fn pointer, found `&fn(u32) -> u32 {foo}` - | | help: consider removing the reference: `foo` + | -------------- ^^^^ expected fn pointer, found `&fn(u32) -> u32 {foo}` + | | | expected due to this | = note: expected fn pointer `fn(u32) -> u32` found reference `&fn(u32) -> u32 {foo}` +help: consider removing the reference + | +LL | let c: fn(u32) -> u32 = foo; + | ~~~ error[E0308]: mismatched types --> $DIR/fn-pointer-mismatch.rs:42:30 | LL | let d: &fn(u32) -> u32 = foo; - | --------------- ^^^ - | | | - | | expected `&fn(u32) -> u32`, found fn item - | | help: consider using a reference: `&foo` + | --------------- ^^^ expected `&fn(u32) -> u32`, found fn item + | | | expected due to this | = note: expected reference `&fn(u32) -> u32` found fn item `fn(u32) -> u32 {foo}` +help: consider using a reference + | +LL | let d: &fn(u32) -> u32 = &foo; + | ~~~~ error[E0308]: mismatched types --> $DIR/fn-pointer-mismatch.rs:48:30 | LL | let e: &fn(u32) -> u32 = &foo; - | --------------- ^^^^ - | | | - | | expected `&fn(u32) -> u32`, found `&fn(u32) -> u32 {foo}` - | | help: consider casting to a fn pointer: `&(foo as fn(u32) -> u32)` + | --------------- ^^^^ expected `&fn(u32) -> u32`, found `&fn(u32) -> u32 {foo}` + | | | expected due to this | = note: expected reference `&fn(u32) -> u32` found reference `&fn(u32) -> u32 {foo}` = note: fn items are distinct from fn pointers = note: when the arguments and return types match, functions can be coerced to function pointers +help: consider casting to a fn pointer + | +LL | let e: &fn(u32) -> u32 = &(foo as fn(u32) -> u32); + | ~~~~~~~~~~~~~~~~~~~~~~~~ error: aborting due to 6 previous errors diff --git a/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.mir.stderr b/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.mir.stderr index 36561ab91ee8..b0ac5dc44ad9 100644 --- a/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.mir.stderr +++ b/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.mir.stderr @@ -5,10 +5,8 @@ LL | #[target_feature(enable = "sse2")] | ---------------------------------- `#[target_feature]` added here ... LL | let foo: fn() = foo; - | ---- ^^^ - | | | - | | cannot coerce functions with `#[target_feature]` to safe function pointers - | | help: consider casting to a fn pointer: `foo as fn()` + | ---- ^^^ cannot coerce functions with `#[target_feature]` to safe function pointers + | | | expected due to this | = note: expected fn pointer `fn()` @@ -16,6 +14,10 @@ LL | let foo: fn() = foo; = note: fn items are distinct from fn pointers = note: functions with `#[target_feature]` can only be coerced to `unsafe` function pointers = note: when the arguments and return types match, functions can be coerced to function pointers +help: consider casting to a fn pointer + | +LL | let foo: fn() = foo as fn(); + | ~~~~~~~~~~~ error: aborting due to previous error diff --git a/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.thir.stderr b/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.thir.stderr index 36561ab91ee8..b0ac5dc44ad9 100644 --- a/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.thir.stderr +++ b/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.thir.stderr @@ -5,10 +5,8 @@ LL | #[target_feature(enable = "sse2")] | ---------------------------------- `#[target_feature]` added here ... LL | let foo: fn() = foo; - | ---- ^^^ - | | | - | | cannot coerce functions with `#[target_feature]` to safe function pointers - | | help: consider casting to a fn pointer: `foo as fn()` + | ---- ^^^ cannot coerce functions with `#[target_feature]` to safe function pointers + | | | expected due to this | = note: expected fn pointer `fn()` @@ -16,6 +14,10 @@ LL | let foo: fn() = foo; = note: fn items are distinct from fn pointers = note: functions with `#[target_feature]` can only be coerced to `unsafe` function pointers = note: when the arguments and return types match, functions can be coerced to function pointers +help: consider casting to a fn pointer + | +LL | let foo: fn() = foo as fn(); + | ~~~~~~~~~~~ error: aborting due to previous error diff --git a/tests/ui/static/static-reference-to-fn-1.stderr b/tests/ui/static/static-reference-to-fn-1.stderr index a75c7438cb74..b68352b51831 100644 --- a/tests/ui/static/static-reference-to-fn-1.stderr +++ b/tests/ui/static/static-reference-to-fn-1.stderr @@ -2,15 +2,16 @@ error[E0308]: mismatched types --> $DIR/static-reference-to-fn-1.rs:17:15 | LL | func: &foo, - | ^^^^ - | | - | expected `&fn() -> Option`, found `&fn() -> Option {foo}` - | help: consider casting to a fn pointer: `&(foo as fn() -> Option)` + | ^^^^ expected `&fn() -> Option`, found `&fn() -> Option {foo}` | = note: expected reference `&fn() -> Option` found reference `&fn() -> Option {foo}` = note: fn items are distinct from fn pointers = note: when the arguments and return types match, functions can be coerced to function pointers +help: consider casting to a fn pointer + | +LL | func: &(foo as fn() -> Option), + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ error: aborting due to previous error From 449dfc64f0792f2320ef68bc08f238281199f53d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Mon, 30 Jan 2023 22:02:30 +0000 Subject: [PATCH 44/69] Fix unquoted projection types in label --- compiler/rustc_middle/src/ty/error.rs | 2 +- .../generic-associated-types/collections-project-default.stderr | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/rustc_middle/src/ty/error.rs b/compiler/rustc_middle/src/ty/error.rs index d188199773a5..bd78705cdb59 100644 --- a/compiler/rustc_middle/src/ty/error.rs +++ b/compiler/rustc_middle/src/ty/error.rs @@ -195,7 +195,7 @@ impl<'tcx> TypeError<'tcx> { ) .into(), ProjectionMismatched(ref values) => format!( - "expected {}, found {}", + "expected `{}`, found `{}`", tcx.def_path_str(values.expected), tcx.def_path_str(values.found) ) diff --git a/tests/ui/generic-associated-types/collections-project-default.stderr b/tests/ui/generic-associated-types/collections-project-default.stderr index 9aa0b239e478..3c3ae24dd473 100644 --- a/tests/ui/generic-associated-types/collections-project-default.stderr +++ b/tests/ui/generic-associated-types/collections-project-default.stderr @@ -5,7 +5,7 @@ LL | fn floatify_sibling(ints: &C) -> >::Sibling | ------------------------------------ expected `>::Sibling` because of return type ... LL | res - | ^^^ expected Collection::Sibling, found CollectionFamily::Member + | ^^^ expected `Collection::Sibling`, found `CollectionFamily::Member` | = note: expected associated type `>::Sibling` found associated type `<>::Family as CollectionFamily>::Member` From e905b937060e3c920d85d1ae09d1e3a9a5f5a190 Mon Sep 17 00:00:00 2001 From: Edward Shen Date: Mon, 30 Jan 2023 14:09:40 -0800 Subject: [PATCH 45/69] Make the "extra if in let...else block" hint a suggestion --- compiler/rustc_parse/src/errors.rs | 2 +- compiler/rustc_parse/src/parser/expr.rs | 2 +- tests/ui/let-else/accidental-if.stderr | 6 +++--- ...e-that-let-else-does-not-interact-with-let-chains.stderr | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_parse/src/errors.rs b/compiler/rustc_parse/src/errors.rs index 054b41b478d6..e63fc3c73b20 100644 --- a/compiler/rustc_parse/src/errors.rs +++ b/compiler/rustc_parse/src/errors.rs @@ -351,7 +351,7 @@ pub(crate) enum IfExpressionMissingThenBlockSub { } #[derive(Subdiagnostic)] -#[help(parse_extra_if_in_let_else)] +#[suggestion(parse_extra_if_in_let_else, applicability = "maybe-incorrect", code = "")] pub(crate) struct IfExpressionLetSomeSub { #[primary_span] pub if_span: Span, diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index 17d1e200b41a..614cc3118559 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -2281,7 +2281,7 @@ impl<'a> Parser<'a> { block } else { let let_else_sub = matches!(cond.kind, ExprKind::Let(..)) - .then(|| IfExpressionLetSomeSub { if_span: lo }); + .then(|| IfExpressionLetSomeSub { if_span: lo.until(cond_span) }); self.sess.emit_err(IfExpressionMissingThenBlock { if_span: lo, diff --git a/tests/ui/let-else/accidental-if.stderr b/tests/ui/let-else/accidental-if.stderr index 5474a67aac45..57e525917307 100644 --- a/tests/ui/let-else/accidental-if.stderr +++ b/tests/ui/let-else/accidental-if.stderr @@ -10,10 +10,10 @@ help: add a block here LL | if let Some(y) = x else { | ^ help: remove the `if` if you meant to write a `let...else` statement - --> $DIR/accidental-if.rs:3:5 | -LL | if let Some(y) = x else { - | ^^ +LL - if let Some(y) = x else { +LL + let Some(y) = x else { + | error: aborting due to previous error diff --git a/tests/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.stderr b/tests/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.stderr index f34ccecdd45e..e0e0eff8f71f 100644 --- a/tests/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.stderr +++ b/tests/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.stderr @@ -38,10 +38,10 @@ help: add a block here LL | if let Some(n) = opt else { | ^ help: remove the `if` if you meant to write a `let...else` statement - --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:24:5 | -LL | if let Some(n) = opt else { - | ^^ +LL - if let Some(n) = opt else { +LL + let Some(n) = opt else { + | error: this `if` expression is missing a block after the condition --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:28:5 From 0e98a162c86cbc4a1bad86d63a0eb72739bb99f3 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Tue, 17 Jan 2023 03:27:48 +0000 Subject: [PATCH 46/69] Track bound types like bound regions --- .../src/check/compare_impl_item.rs | 2 +- .../src/infer/higher_ranked/mod.rs | 2 +- compiler/rustc_infer/src/infer/mod.rs | 6 +-- compiler/rustc_middle/src/ty/fold.rs | 4 +- compiler/rustc_middle/src/ty/mod.rs | 2 +- compiler/rustc_middle/src/ty/print/pretty.rs | 6 ++- .../rustc_middle/src/ty/structural_impls.rs | 1 + compiler/rustc_middle/src/ty/sty.rs | 15 +++++-- .../src/traits/project.rs | 2 +- .../src/traits/select/confirmation.rs | 2 +- compiler/rustc_traits/src/chalk/db.rs | 2 +- compiler/rustc_traits/src/chalk/lowering.rs | 40 ++++++++++--------- compiler/rustc_traits/src/chalk/mod.rs | 6 +-- 13 files changed, 52 insertions(+), 38 deletions(-) diff --git a/compiler/rustc_hir_analysis/src/check/compare_impl_item.rs b/compiler/rustc_hir_analysis/src/check/compare_impl_item.rs index 3115f5f464a0..21e700418105 100644 --- a/compiler/rustc_hir_analysis/src/check/compare_impl_item.rs +++ b/compiler/rustc_hir_analysis/src/check/compare_impl_item.rs @@ -1930,7 +1930,7 @@ pub(super) fn check_type_bounds<'tcx>( smallvec::SmallVec::with_capacity(defs.count()); InternalSubsts::fill_single(&mut substs, defs, &mut |param, _| match param.kind { GenericParamDefKind::Type { .. } => { - let kind = ty::BoundTyKind::Param(param.name); + let kind = ty::BoundTyKind::Param(param.def_id, param.name); let bound_var = ty::BoundVariableKind::Ty(kind); bound_vars.push(bound_var); tcx.mk_ty(ty::Bound( diff --git a/compiler/rustc_infer/src/infer/higher_ranked/mod.rs b/compiler/rustc_infer/src/infer/higher_ranked/mod.rs index 817ae10c7608..31be107b3547 100644 --- a/compiler/rustc_infer/src/infer/higher_ranked/mod.rs +++ b/compiler/rustc_infer/src/infer/higher_ranked/mod.rs @@ -90,7 +90,7 @@ impl<'tcx> InferCtxt<'tcx> { types: &mut |bound_ty: ty::BoundTy| { self.tcx.mk_ty(ty::Placeholder(ty::PlaceholderType { universe: next_universe, - name: bound_ty.var, + name: bound_ty.kind, })) }, consts: &mut |bound_var: ty::BoundVar, ty| { diff --git a/compiler/rustc_infer/src/infer/mod.rs b/compiler/rustc_infer/src/infer/mod.rs index f0e42c1fce49..f39170bb2916 100644 --- a/compiler/rustc_infer/src/infer/mod.rs +++ b/compiler/rustc_infer/src/infer/mod.rs @@ -2044,7 +2044,7 @@ fn replace_param_and_infer_substs_with_placeholder<'tcx>( ) -> SubstsRef<'tcx> { struct ReplaceParamAndInferWithPlaceholder<'tcx> { tcx: TyCtxt<'tcx>, - idx: usize, + idx: u32, } impl<'tcx> TypeFolder<'tcx> for ReplaceParamAndInferWithPlaceholder<'tcx> { @@ -2056,7 +2056,7 @@ fn replace_param_and_infer_substs_with_placeholder<'tcx>( if let ty::Infer(_) = t.kind() { self.tcx.mk_ty(ty::Placeholder(ty::PlaceholderType { universe: ty::UniverseIndex::ROOT, - name: ty::BoundVar::from_usize({ + name: ty::BoundTyKind::Anon({ let idx = self.idx; self.idx += 1; idx @@ -2077,7 +2077,7 @@ fn replace_param_and_infer_substs_with_placeholder<'tcx>( self.tcx.mk_const( ty::PlaceholderConst { universe: ty::UniverseIndex::ROOT, - name: ty::BoundVar::from_usize({ + name: ty::BoundVar::from_u32({ let idx = self.idx; self.idx += 1; idx diff --git a/compiler/rustc_middle/src/ty/fold.rs b/compiler/rustc_middle/src/ty/fold.rs index 6b9a37d848da..1445bc1ed32e 100644 --- a/compiler/rustc_middle/src/ty/fold.rs +++ b/compiler/rustc_middle/src/ty/fold.rs @@ -610,7 +610,9 @@ impl<'tcx> TyCtxt<'tcx> { let index = entry.index(); let var = ty::BoundVar::from_usize(index); let kind = entry - .or_insert_with(|| ty::BoundVariableKind::Ty(ty::BoundTyKind::Anon)) + .or_insert_with(|| { + ty::BoundVariableKind::Ty(ty::BoundTyKind::Anon(index as u32)) + }) .expect_ty(); self.tcx.mk_ty(ty::Bound(ty::INNERMOST, BoundTy { var, kind })) } diff --git a/compiler/rustc_middle/src/ty/mod.rs b/compiler/rustc_middle/src/ty/mod.rs index 25c6777a14c7..09c3d5b736cf 100644 --- a/compiler/rustc_middle/src/ty/mod.rs +++ b/compiler/rustc_middle/src/ty/mod.rs @@ -1369,7 +1369,7 @@ pub struct Placeholder { pub type PlaceholderRegion = Placeholder; -pub type PlaceholderType = Placeholder; +pub type PlaceholderType = Placeholder; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, HashStable)] #[derive(TyEncodable, TyDecodable, PartialOrd, Ord)] diff --git a/compiler/rustc_middle/src/ty/print/pretty.rs b/compiler/rustc_middle/src/ty/print/pretty.rs index f2abec216b7b..df4e8c1a52db 100644 --- a/compiler/rustc_middle/src/ty/print/pretty.rs +++ b/compiler/rustc_middle/src/ty/print/pretty.rs @@ -698,8 +698,10 @@ pub trait PrettyPrinter<'tcx>: ty::Error(_) => p!("[type error]"), ty::Param(ref param_ty) => p!(print(param_ty)), ty::Bound(debruijn, bound_ty) => match bound_ty.kind { - ty::BoundTyKind::Anon => self.pretty_print_bound_var(debruijn, bound_ty.var)?, - ty::BoundTyKind::Param(p) => p!(write("{}", p)), + ty::BoundTyKind::Anon(bv) => { + self.pretty_print_bound_var(debruijn, ty::BoundVar::from_u32(bv))? + } + ty::BoundTyKind::Param(_, s) => p!(write("{}", s)), }, ty::Adt(def, substs) => { p!(print_def_path(def.did(), substs)); diff --git a/compiler/rustc_middle/src/ty/structural_impls.rs b/compiler/rustc_middle/src/ty/structural_impls.rs index 034aab0c38ea..8df639750c70 100644 --- a/compiler/rustc_middle/src/ty/structural_impls.rs +++ b/compiler/rustc_middle/src/ty/structural_impls.rs @@ -240,6 +240,7 @@ TrivialTypeTraversalAndLiftImpls! { crate::ty::AssocKind, crate::ty::AliasKind, crate::ty::Placeholder, + crate::ty::Placeholder, crate::ty::ClosureKind, crate::ty::FreeRegion, crate::ty::InferTy, diff --git a/compiler/rustc_middle/src/ty/sty.rs b/compiler/rustc_middle/src/ty/sty.rs index f97d2e753a3b..060d864389cb 100644 --- a/compiler/rustc_middle/src/ty/sty.rs +++ b/compiler/rustc_middle/src/ty/sty.rs @@ -1504,13 +1504,22 @@ pub struct BoundTy { #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, TyEncodable, TyDecodable)] #[derive(HashStable)] pub enum BoundTyKind { - Anon, - Param(Symbol), + Anon(u32), + Param(DefId, Symbol), +} + +impl BoundTyKind { + pub fn expect_anon(self) -> u32 { + match self { + BoundTyKind::Anon(i) => i, + _ => bug!(), + } + } } impl From for BoundTy { fn from(var: BoundVar) -> Self { - BoundTy { var, kind: BoundTyKind::Anon } + BoundTy { var, kind: BoundTyKind::Anon(var.as_u32()) } } } diff --git a/compiler/rustc_trait_selection/src/traits/project.rs b/compiler/rustc_trait_selection/src/traits/project.rs index a11c5e819695..53cae3e720c5 100644 --- a/compiler/rustc_trait_selection/src/traits/project.rs +++ b/compiler/rustc_trait_selection/src/traits/project.rs @@ -783,7 +783,7 @@ impl<'tcx> TypeFolder<'tcx> for BoundVarReplacer<'_, 'tcx> { } ty::Bound(debruijn, bound_ty) if debruijn >= self.current_index => { let universe = self.universe_for(debruijn); - let p = ty::PlaceholderType { universe, name: bound_ty.var }; + let p = ty::PlaceholderType { universe, name: bound_ty.kind }; self.mapped_types.insert(p, bound_ty); self.infcx.tcx.mk_ty(ty::Placeholder(p)) } diff --git a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs index 89a8fdbac1cb..0a4136dc1cfe 100644 --- a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs +++ b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs @@ -524,7 +524,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { .kind { GenericParamDefKind::Type { .. } => { - let kind = ty::BoundTyKind::Param(param.name); + let kind = ty::BoundTyKind::Param(param.def_id, param.name); let bound_var = ty::BoundVariableKind::Ty(kind); bound_vars.push(bound_var); tcx.mk_ty(ty::Bound( diff --git a/compiler/rustc_traits/src/chalk/db.rs b/compiler/rustc_traits/src/chalk/db.rs index 84f7e8362081..dbd5f13fe4e8 100644 --- a/compiler/rustc_traits/src/chalk/db.rs +++ b/compiler/rustc_traits/src/chalk/db.rs @@ -725,7 +725,7 @@ fn bound_vars_for_item(tcx: TyCtxt<'_>, def_id: DefId) -> SubstsRef<'_> { ty::INNERMOST, ty::BoundTy { var: ty::BoundVar::from(param.index), - kind: ty::BoundTyKind::Param(param.name), + kind: ty::BoundTyKind::Param(param.def_id, param.name), }, )) .into(), diff --git a/compiler/rustc_traits/src/chalk/lowering.rs b/compiler/rustc_traits/src/chalk/lowering.rs index 3a2541051620..9c5db3314c5c 100644 --- a/compiler/rustc_traits/src/chalk/lowering.rs +++ b/compiler/rustc_traits/src/chalk/lowering.rs @@ -370,7 +370,7 @@ impl<'tcx> LowerInto<'tcx, chalk_ir::Ty>> for Ty<'tcx> { ty::Placeholder(_placeholder) => { chalk_ir::TyKind::Placeholder(chalk_ir::PlaceholderIndex { ui: chalk_ir::UniverseIndex { counter: _placeholder.universe.as_usize() }, - idx: _placeholder.name.as_usize(), + idx: _placeholder.name.expect_anon() as usize, }) } ty::Infer(_infer) => unimplemented!(), @@ -452,10 +452,6 @@ impl<'tcx> LowerInto<'tcx, Ty<'tcx>> for &chalk_ir::Ty> { ), TyKind::Foreign(def_id) => ty::Foreign(def_id.0), TyKind::Error => return interner.tcx.ty_error(), - TyKind::Placeholder(placeholder) => ty::Placeholder(ty::Placeholder { - universe: ty::UniverseIndex::from_usize(placeholder.ui.counter), - name: ty::BoundVar::from_usize(placeholder.idx), - }), TyKind::Alias(alias_ty) => match alias_ty { chalk_ir::AliasTy::Projection(projection) => ty::Alias( ty::Projection, @@ -473,13 +469,17 @@ impl<'tcx> LowerInto<'tcx, Ty<'tcx>> for &chalk_ir::Ty> { ), }, TyKind::Function(_quantified_ty) => unimplemented!(), - TyKind::BoundVar(_bound) => ty::Bound( - ty::DebruijnIndex::from_usize(_bound.debruijn.depth() as usize), + TyKind::BoundVar(bound) => ty::Bound( + ty::DebruijnIndex::from_usize(bound.debruijn.depth() as usize), ty::BoundTy { - var: ty::BoundVar::from_usize(_bound.index), - kind: ty::BoundTyKind::Anon, + var: ty::BoundVar::from_usize(bound.index), + kind: ty::BoundTyKind::Anon(bound.index as u32), }, ), + TyKind::Placeholder(placeholder) => ty::Placeholder(ty::Placeholder { + universe: ty::UniverseIndex::from_usize(placeholder.ui.counter), + name: ty::BoundTyKind::Anon(placeholder.idx as u32), + }), TyKind::InferenceVar(_, _) => unimplemented!(), TyKind::Dyn(_) => unimplemented!(), }; @@ -504,7 +504,7 @@ impl<'tcx> LowerInto<'tcx, chalk_ir::Lifetime>> for Region<'t ty::RePlaceholder(placeholder_region) => { chalk_ir::LifetimeData::Placeholder(chalk_ir::PlaceholderIndex { ui: chalk_ir::UniverseIndex { counter: placeholder_region.universe.index() }, - idx: 0, + idx: 0, // FIXME: This `idx: 0` is sus. }) .intern(interner) } @@ -674,7 +674,7 @@ impl<'tcx> LowerInto<'tcx, chalk_ir::Binders { binder_index: ty::DebruijnIndex, list: Vec, next_ty_placeholder: usize, - pub(crate) params: rustc_data_structures::fx::FxHashMap, + pub(crate) params: rustc_data_structures::fx::FxHashMap, pub(crate) named_regions: BTreeMap, } @@ -1072,15 +1072,15 @@ impl<'tcx> TypeFolder<'tcx> for ParamsSubstitutor<'tcx> { ty::Param(param) => match self.list.iter().position(|r| r == ¶m) { Some(idx) => self.tcx.mk_ty(ty::Placeholder(ty::PlaceholderType { universe: ty::UniverseIndex::from_usize(0), - name: ty::BoundVar::from_usize(idx), + name: ty::BoundTyKind::Anon(idx as u32), })), None => { self.list.push(param); let idx = self.list.len() - 1 + self.next_ty_placeholder; - self.params.insert(idx, param); + self.params.insert(idx as u32, param); self.tcx.mk_ty(ty::Placeholder(ty::PlaceholderType { universe: ty::UniverseIndex::from_usize(0), - name: ty::BoundVar::from_usize(idx), + name: ty::BoundTyKind::Anon(idx as u32), })) } }, @@ -1119,13 +1119,13 @@ impl<'tcx> TypeFolder<'tcx> for ParamsSubstitutor<'tcx> { pub(crate) struct ReverseParamsSubstitutor<'tcx> { tcx: TyCtxt<'tcx>, - params: rustc_data_structures::fx::FxHashMap, + params: rustc_data_structures::fx::FxHashMap, } impl<'tcx> ReverseParamsSubstitutor<'tcx> { pub(crate) fn new( tcx: TyCtxt<'tcx>, - params: rustc_data_structures::fx::FxHashMap, + params: rustc_data_structures::fx::FxHashMap, ) -> Self { Self { tcx, params } } @@ -1139,7 +1139,7 @@ impl<'tcx> TypeFolder<'tcx> for ReverseParamsSubstitutor<'tcx> { fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> { match *t.kind() { ty::Placeholder(ty::PlaceholderType { universe: ty::UniverseIndex::ROOT, name }) => { - match self.params.get(&name.as_usize()) { + match self.params.get(&name.expect_anon()) { Some(param) => self.tcx.mk_ty(ty::Param(*param)), None => t, } @@ -1171,7 +1171,8 @@ impl<'tcx> TypeVisitor<'tcx> for PlaceholdersCollector { fn visit_ty(&mut self, t: Ty<'tcx>) -> ControlFlow { match t.kind() { ty::Placeholder(p) if p.universe == self.universe_index => { - self.next_ty_placeholder = self.next_ty_placeholder.max(p.name.as_usize() + 1); + self.next_ty_placeholder = + self.next_ty_placeholder.max(p.name.expect_anon() as usize + 1); } _ => (), @@ -1186,6 +1187,7 @@ impl<'tcx> TypeVisitor<'tcx> for PlaceholdersCollector { if let ty::BoundRegionKind::BrAnon(anon, _) = p.name { self.next_anon_region_placeholder = self.next_anon_region_placeholder.max(anon); } + // FIXME: This doesn't seem to handle BrNamed at all? } _ => (), diff --git a/compiler/rustc_traits/src/chalk/mod.rs b/compiler/rustc_traits/src/chalk/mod.rs index 13d83b926894..5855a8e28dd1 100644 --- a/compiler/rustc_traits/src/chalk/mod.rs +++ b/compiler/rustc_traits/src/chalk/mod.rs @@ -6,12 +6,10 @@ pub(crate) mod db; pub(crate) mod lowering; -use rustc_data_structures::fx::FxHashMap; - use rustc_middle::infer::canonical::{CanonicalTyVarKind, CanonicalVarKind}; use rustc_middle::traits::ChalkRustInterner; use rustc_middle::ty::query::Providers; -use rustc_middle::ty::{self, ParamTy, TyCtxt, TypeFoldable, TypeVisitable}; +use rustc_middle::ty::{self, TyCtxt, TypeFoldable, TypeVisitable}; use rustc_infer::infer::canonical::{ Canonical, CanonicalVarValues, Certainty, QueryRegionConstraints, QueryResponse, @@ -41,7 +39,7 @@ pub(crate) fn evaluate_goal<'tcx>( let mut params_substitutor = ParamsSubstitutor::new(tcx, placeholders_collector.next_ty_placeholder); let obligation = obligation.fold_with(&mut params_substitutor); - let params: FxHashMap = params_substitutor.params; + let params = params_substitutor.params; let max_universe = obligation.max_universe.index(); From 31c14f6c5d0d970af3f7707b795ca3e0a2d528be Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Mon, 30 Jan 2023 16:36:57 -0700 Subject: [PATCH 47/69] rustdoc: remove unused CSS from `.setting-check` These rules were needed for the mobile-style switches, but those were removed in 0f3ae6218ef1d9e9b14bf983b463785b14abc205 --- src/librustdoc/html/static/css/settings.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/librustdoc/html/static/css/settings.css b/src/librustdoc/html/static/css/settings.css index c28cefebc8bf..920f45c4bbad 100644 --- a/src/librustdoc/html/static/css/settings.css +++ b/src/librustdoc/html/static/css/settings.css @@ -40,8 +40,6 @@ } .setting-check { - position: relative; - width: 100%; margin-right: 20px; display: flex; align-items: center; From 3c408d82a38e729fd2befea442633d726a02c56f Mon Sep 17 00:00:00 2001 From: Lucius Hu <1222865+lebensterben@users.noreply.github.com> Date: Tue, 31 Jan 2023 00:20:27 +0000 Subject: [PATCH 48/69] fix link in std::path::Path::display() The link `Debug` points to should be the trait `Debug`, not the macro `Debug`. --- library/std/src/path.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/library/std/src/path.rs b/library/std/src/path.rs index 2f53cf839369..e36e088896d0 100644 --- a/library/std/src/path.rs +++ b/library/std/src/path.rs @@ -2688,6 +2688,7 @@ impl Path { /// escapes the path please use [`Debug`] instead. /// /// [`Display`]: fmt::Display + /// [`Debug`]: fmt::Debug /// /// # Examples /// From 7892cc3c5f6532a18338ce989ea1639af5e417b4 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Tue, 31 Jan 2023 02:59:36 +0000 Subject: [PATCH 49/69] Do not depend on Generator trait when deducing closure signature --- compiler/rustc_hir_typeck/src/closure.rs | 20 +++++++++--------- .../lang-items/lang-item-missing-generator.rs | 21 ------------------- .../lang-item-missing-generator.stderr | 15 ------------- 3 files changed, 10 insertions(+), 46 deletions(-) delete mode 100644 tests/ui/lang-items/lang-item-missing-generator.rs delete mode 100644 tests/ui/lang-items/lang-item-missing-generator.stderr diff --git a/compiler/rustc_hir_typeck/src/closure.rs b/compiler/rustc_hir_typeck/src/closure.rs index 329b69eff54a..90c4e5b6540b 100644 --- a/compiler/rustc_hir_typeck/src/closure.rs +++ b/compiler/rustc_hir_typeck/src/closure.rs @@ -15,6 +15,7 @@ use rustc_middle::ty::visit::TypeVisitable; use rustc_middle::ty::{self, Ty, TypeSuperVisitable, TypeVisitor}; use rustc_span::def_id::LocalDefId; use rustc_span::source_map::Span; +use rustc_span::sym; use rustc_target::spec::abi::Abi; use rustc_trait_selection::traits; use rustc_trait_selection::traits::error_reporting::ArgKind; @@ -288,21 +289,20 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let trait_def_id = projection.trait_def_id(tcx); let is_fn = tcx.is_fn_trait(trait_def_id); - let gen_trait = tcx.require_lang_item(LangItem::Generator, cause_span); - let is_gen = gen_trait == trait_def_id; + + let gen_trait = tcx.lang_items().gen_trait(); + let is_gen = gen_trait == Some(trait_def_id); + if !is_fn && !is_gen { debug!("not fn or generator"); return None; } - if is_gen { - // Check that we deduce the signature from the `<_ as std::ops::Generator>::Return` - // associated item and not yield. - let return_assoc_item = self.tcx.associated_item_def_ids(gen_trait)[1]; - if return_assoc_item != projection.projection_def_id() { - debug!("not return assoc item of generator"); - return None; - } + // Check that we deduce the signature from the `<_ as std::ops::Generator>::Return` + // associated item and not yield. + if is_gen && self.tcx.associated_item(projection.projection_def_id()).name != sym::Return { + debug!("not `Return` assoc item of `Generator`"); + return None; } let input_tys = if is_fn { diff --git a/tests/ui/lang-items/lang-item-missing-generator.rs b/tests/ui/lang-items/lang-item-missing-generator.rs deleted file mode 100644 index 9b9aff38e524..000000000000 --- a/tests/ui/lang-items/lang-item-missing-generator.rs +++ /dev/null @@ -1,21 +0,0 @@ -// error-pattern: requires `generator` lang_item -#![feature(no_core, lang_items, unboxed_closures, tuple_trait)] -#![no_core] - -#[lang = "sized"] pub trait Sized { } - -#[lang = "tuple_trait"] pub trait Tuple { } - -#[lang = "fn_once"] -#[rustc_paren_sugar] -pub trait FnOnce { - type Output; - - extern "rust-call" fn call_once(self, args: Args) -> Self::Output; -} - -pub fn abc() -> impl FnOnce(f32) { - |_| {} -} - -fn main() {} diff --git a/tests/ui/lang-items/lang-item-missing-generator.stderr b/tests/ui/lang-items/lang-item-missing-generator.stderr deleted file mode 100644 index a24fdb5fb650..000000000000 --- a/tests/ui/lang-items/lang-item-missing-generator.stderr +++ /dev/null @@ -1,15 +0,0 @@ -error[E0635]: unknown feature `tuple_trait` - --> $DIR/lang-item-missing-generator.rs:2:51 - | -LL | #![feature(no_core, lang_items, unboxed_closures, tuple_trait)] - | ^^^^^^^^^^^ - -error: requires `generator` lang_item - --> $DIR/lang-item-missing-generator.rs:17:17 - | -LL | pub fn abc() -> impl FnOnce(f32) { - | ^^^^^^^^^^^^^^^^ - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0635`. From 340414ed7bbcdd28a6a5baa0e3229c07029387b4 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Tue, 31 Jan 2023 07:44:34 +0000 Subject: [PATCH 50/69] Review changes --- compiler/rustc_lint/src/builtin.rs | 2 +- compiler/rustc_middle/src/mir/mod.rs | 2 +- compiler/rustc_middle/src/mir/pretty.rs | 2 +- compiler/rustc_save_analysis/src/sig.rs | 5 ++--- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/compiler/rustc_lint/src/builtin.rs b/compiler/rustc_lint/src/builtin.rs index 697e90fdaa95..5d85cfe330ac 100644 --- a/compiler/rustc_lint/src/builtin.rs +++ b/compiler/rustc_lint/src/builtin.rs @@ -581,7 +581,7 @@ impl<'tcx> LateLintPass<'tcx> for MissingDoc { fn check_impl_item(&mut self, cx: &LateContext<'_>, impl_item: &hir::ImplItem<'_>) { let context = method_context(cx, impl_item.owner_id.def_id); - + match context { // If the method is an impl for a trait, don't doc. MethodLateContext::TraitImpl => return, diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index 872d3d2808be..05a9ec5e6d04 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -416,7 +416,7 @@ impl<'tcx> Body<'tcx> { (self.arg_count + 1..self.local_decls.len()).filter_map(move |index| { let local = Local::new(index); let decl = &self.local_decls[local]; - if decl.is_user_variable() && decl.mutability.is_mut() { Some(local) } else { None } + (decl.is_user_variable() && decl.mutability.is_mut()).then(|| local) }) } diff --git a/compiler/rustc_middle/src/mir/pretty.rs b/compiler/rustc_middle/src/mir/pretty.rs index 27141fd8eff2..16daf63b82d9 100644 --- a/compiler/rustc_middle/src/mir/pretty.rs +++ b/compiler/rustc_middle/src/mir/pretty.rs @@ -580,7 +580,7 @@ fn write_scope_tree( continue; } - let mut_str = if local_decl.mutability.is_mut() { "mut " } else { "" }; + let mut_str = local_decl.mutability.prefix_str(); let mut indented_decl = format!("{0:1$}let {2}{3:?}: {4:?}", INDENT, indent, mut_str, local, local_decl.ty); diff --git a/compiler/rustc_save_analysis/src/sig.rs b/compiler/rustc_save_analysis/src/sig.rs index 6d8a2b7c3eb3..a50a8178de38 100644 --- a/compiler/rustc_save_analysis/src/sig.rs +++ b/compiler/rustc_save_analysis/src/sig.rs @@ -768,9 +768,8 @@ impl<'hir> Sig for hir::ForeignItem<'hir> { } hir::ForeignItemKind::Static(ref ty, m) => { let mut text = "static ".to_owned(); - if m.is_mut() { - text.push_str("mut "); - } + text.push_str(m.prefix_str()); + let name = self.ident.to_string(); let defs = vec![SigElement { id: id_from_def_id(self.owner_id.to_def_id()), From fd5774a4d7093bf65309fc69e23c57f298b94526 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Tue, 31 Jan 2023 09:50:56 +0000 Subject: [PATCH 51/69] Use `Edition` methods a bit more --- compiler/rustc_ast_pretty/src/pprust/state.rs | 2 +- compiler/rustc_resolve/src/diagnostics.rs | 2 +- compiler/rustc_resolve/src/ident.rs | 3 +-- compiler/rustc_session/src/session.rs | 8 ++++---- compiler/rustc_span/src/lib.rs | 8 ++++---- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/compiler/rustc_ast_pretty/src/pprust/state.rs b/compiler/rustc_ast_pretty/src/pprust/state.rs index 6a8064b0e874..fa8567eac609 100644 --- a/compiler/rustc_ast_pretty/src/pprust/state.rs +++ b/compiler/rustc_ast_pretty/src/pprust/state.rs @@ -131,7 +131,7 @@ pub fn print_crate<'a>( // Currently, in Rust 2018 we don't have `extern crate std;` at the crate // root, so this is not needed, and actually breaks things. - if edition == Edition::Edition2015 { + if edition.rust_2015() { // `#![no_std]` let fake_attr = attr::mk_attr_word(g, ast::AttrStyle::Inner, sym::no_std, DUMMY_SP); s.print_attribute(&fake_attr); diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs index 366086152555..db28773cbdc2 100644 --- a/compiler/rustc_resolve/src/diagnostics.rs +++ b/compiler/rustc_resolve/src/diagnostics.rs @@ -1717,7 +1717,7 @@ impl<'a> Resolver<'a> { Applicability::MaybeIncorrect, )), ) - } else if self.session.edition() == Edition::Edition2015 { + } else if self.session.edition().rust_2015() { ( format!("maybe a missing crate `{ident}`?"), Some(( diff --git a/compiler/rustc_resolve/src/ident.rs b/compiler/rustc_resolve/src/ident.rs index a84652a315dc..1c985d43658a 100644 --- a/compiler/rustc_resolve/src/ident.rs +++ b/compiler/rustc_resolve/src/ident.rs @@ -7,7 +7,6 @@ use rustc_middle::ty; use rustc_session::lint::builtin::PROC_MACRO_DERIVE_RESOLUTION_FALLBACK; use rustc_session::lint::BuiltinLintDiagnostics; use rustc_span::def_id::LocalDefId; -use rustc_span::edition::Edition; use rustc_span::hygiene::{ExpnId, ExpnKind, LocalExpnId, MacroKind, SyntaxContext}; use rustc_span::symbol::{kw, Ident}; use rustc_span::{Span, DUMMY_SP}; @@ -86,7 +85,7 @@ impl<'a> Resolver<'a> { // 4c. Standard library prelude (de-facto closed, controlled). // 6. Language prelude: builtin attributes (closed, controlled). - let rust_2015 = ctxt.edition() == Edition::Edition2015; + let rust_2015 = ctxt.edition().rust_2015(); let (ns, macro_kind, is_absolute_path) = match scope_set { ScopeSet::All(ns, _) => (ns, None, false), ScopeSet::AbsolutePath(ns) => (ns, None, true), diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs index 95f199de6ff6..1c8a2ea575f2 100644 --- a/compiler/rustc_session/src/session.rs +++ b/compiler/rustc_session/src/session.rs @@ -900,22 +900,22 @@ impl Session { } pub fn rust_2015(&self) -> bool { - self.edition() == Edition::Edition2015 + self.edition().rust_2015() } /// Are we allowed to use features from the Rust 2018 edition? pub fn rust_2018(&self) -> bool { - self.edition() >= Edition::Edition2018 + self.edition().rust_2018() } /// Are we allowed to use features from the Rust 2021 edition? pub fn rust_2021(&self) -> bool { - self.edition() >= Edition::Edition2021 + self.edition().rust_2021() } /// Are we allowed to use features from the Rust 2024 edition? pub fn rust_2024(&self) -> bool { - self.edition() >= Edition::Edition2024 + self.edition().rust_2024() } /// Returns `true` if we cannot skip the PLT for shared library calls. diff --git a/compiler/rustc_span/src/lib.rs b/compiler/rustc_span/src/lib.rs index 7e61f2f9f73c..006102a5f2fc 100644 --- a/compiler/rustc_span/src/lib.rs +++ b/compiler/rustc_span/src/lib.rs @@ -706,22 +706,22 @@ impl Span { #[inline] pub fn rust_2015(self) -> bool { - self.edition() == edition::Edition::Edition2015 + self.edition().rust_2015() } #[inline] pub fn rust_2018(self) -> bool { - self.edition() >= edition::Edition::Edition2018 + self.edition().rust_2018() } #[inline] pub fn rust_2021(self) -> bool { - self.edition() >= edition::Edition::Edition2021 + self.edition().rust_2021() } #[inline] pub fn rust_2024(self) -> bool { - self.edition() >= edition::Edition::Edition2024 + self.edition().rust_2024() } /// Returns the source callee. From 5d90413d753b7c6a2cdab5c1df58cf52a38de33c Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Tue, 31 Jan 2023 09:52:54 +0000 Subject: [PATCH 52/69] Document `rust_2015` methods --- compiler/rustc_session/src/session.rs | 1 + compiler/rustc_span/src/edition.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs index 1c8a2ea575f2..6b8c82fde716 100644 --- a/compiler/rustc_session/src/session.rs +++ b/compiler/rustc_session/src/session.rs @@ -899,6 +899,7 @@ impl Session { ret } + /// Is this edition 2015? pub fn rust_2015(&self) -> bool { self.edition().rust_2015() } diff --git a/compiler/rustc_span/src/edition.rs b/compiler/rustc_span/src/edition.rs index b43183916bca..db1cde985d3f 100644 --- a/compiler/rustc_span/src/edition.rs +++ b/compiler/rustc_span/src/edition.rs @@ -76,6 +76,7 @@ impl Edition { } } + /// Is this edition 2015? pub fn rust_2015(&self) -> bool { *self == Edition::Edition2015 } From 03158f40d2fc66d41ae3432edbb644f939c892bf Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Tue, 31 Jan 2023 09:56:50 +0000 Subject: [PATCH 53/69] Don't do `.edition().rust_*()` --- compiler/rustc_resolve/src/diagnostics.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs index db28773cbdc2..a5c09b658fb5 100644 --- a/compiler/rustc_resolve/src/diagnostics.rs +++ b/compiler/rustc_resolve/src/diagnostics.rs @@ -1717,7 +1717,7 @@ impl<'a> Resolver<'a> { Applicability::MaybeIncorrect, )), ) - } else if self.session.edition().rust_2015() { + } else if self.session.rust_2015() { ( format!("maybe a missing crate `{ident}`?"), Some(( From ef6b583a80495ccbfd378eb19ebec3d633036790 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Tue, 31 Jan 2023 10:07:29 +0000 Subject: [PATCH 54/69] Don't accept `Edition` by ref --- compiler/rustc_span/src/edition.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/compiler/rustc_span/src/edition.rs b/compiler/rustc_span/src/edition.rs index db1cde985d3f..e66ec0790434 100644 --- a/compiler/rustc_span/src/edition.rs +++ b/compiler/rustc_span/src/edition.rs @@ -49,8 +49,8 @@ impl fmt::Display for Edition { } impl Edition { - pub fn lint_name(&self) -> &'static str { - match *self { + pub fn lint_name(self) -> &'static str { + match self { Edition::Edition2015 => "rust_2015_compatibility", Edition::Edition2018 => "rust_2018_compatibility", Edition::Edition2021 => "rust_2021_compatibility", @@ -58,8 +58,8 @@ impl Edition { } } - pub fn feature_name(&self) -> Symbol { - match *self { + pub fn feature_name(self) -> Symbol { + match self { Edition::Edition2015 => sym::rust_2015_preview, Edition::Edition2018 => sym::rust_2018_preview, Edition::Edition2021 => sym::rust_2021_preview, @@ -67,8 +67,8 @@ impl Edition { } } - pub fn is_stable(&self) -> bool { - match *self { + pub fn is_stable(self) -> bool { + match self { Edition::Edition2015 => true, Edition::Edition2018 => true, Edition::Edition2021 => true, @@ -77,23 +77,23 @@ impl Edition { } /// Is this edition 2015? - pub fn rust_2015(&self) -> bool { - *self == Edition::Edition2015 + pub fn rust_2015(self) -> bool { + self == Edition::Edition2015 } /// Are we allowed to use features from the Rust 2018 edition? - pub fn rust_2018(&self) -> bool { - *self >= Edition::Edition2018 + pub fn rust_2018(self) -> bool { + self >= Edition::Edition2018 } /// Are we allowed to use features from the Rust 2021 edition? - pub fn rust_2021(&self) -> bool { - *self >= Edition::Edition2021 + pub fn rust_2021(self) -> bool { + self >= Edition::Edition2021 } /// Are we allowed to use features from the Rust 2024 edition? - pub fn rust_2024(&self) -> bool { - *self >= Edition::Edition2024 + pub fn rust_2024(self) -> bool { + self >= Edition::Edition2024 } } From 0a1f14a0e6946d84a4f84ef5024803055f2e6df5 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Thu, 26 Jan 2023 18:03:37 +0100 Subject: [PATCH 55/69] Clean up eslint annotations and remove unused JS function --- src/librustdoc/html/static/js/main.js | 1 - src/librustdoc/html/static/js/storage.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/librustdoc/html/static/js/main.js b/src/librustdoc/html/static/js/main.js index b9ad8ef70e91..c66f500f4233 100644 --- a/src/librustdoc/html/static/js/main.js +++ b/src/librustdoc/html/static/js/main.js @@ -180,7 +180,6 @@ function browserSupportsHistoryApi() { return window.history && typeof window.history.pushState === "function"; } -// eslint-disable-next-line no-unused-vars function loadCss(cssUrl) { const link = document.createElement("link"); link.href = cssUrl; diff --git a/src/librustdoc/html/static/js/storage.js b/src/librustdoc/html/static/js/storage.js index 8836d1b2e464..c72ac254fc08 100644 --- a/src/librustdoc/html/static/js/storage.js +++ b/src/librustdoc/html/static/js/storage.js @@ -51,7 +51,6 @@ function hasClass(elem, className) { return elem && elem.classList && elem.classList.contains(className); } -// eslint-disable-next-line no-unused-vars function addClass(elem, className) { if (!elem || !elem.classList) { return; From 652f79e83543eab07c33840748cf5df37b42ac66 Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Wed, 25 Jan 2023 18:48:07 -0500 Subject: [PATCH 56/69] Download rustc component for rustfmt toolchain as well --- .../rustc_const_eval/src/interpret/intern.rs | 18 +- .../src/obligation_forest/mod.rs | 5 +- src/bootstrap/download.rs | 20 ++- src/stage0.json | 166 ++++++++++++------ src/tools/bump-stage0/src/main.rs | 2 +- 5 files changed, 137 insertions(+), 74 deletions(-) diff --git a/compiler/rustc_const_eval/src/interpret/intern.rs b/compiler/rustc_const_eval/src/interpret/intern.rs index 54528b1dbf4a..301bfcef78a5 100644 --- a/compiler/rustc_const_eval/src/interpret/intern.rs +++ b/compiler/rustc_const_eval/src/interpret/intern.rs @@ -30,15 +30,15 @@ use super::{ use crate::const_eval; pub trait CompileTimeMachine<'mir, 'tcx, T> = Machine< - 'mir, - 'tcx, - MemoryKind = T, - Provenance = AllocId, - ExtraFnVal = !, - FrameExtra = (), - AllocExtra = (), - MemoryMap = FxIndexMap, Allocation)>, ->; + 'mir, + 'tcx, + MemoryKind = T, + Provenance = AllocId, + ExtraFnVal = !, + FrameExtra = (), + AllocExtra = (), + MemoryMap = FxIndexMap, Allocation)>, + >; struct InternVisitor<'rt, 'mir, 'tcx, M: CompileTimeMachine<'mir, 'tcx, const_eval::MemoryKind>> { /// The ectx from which we intern. diff --git a/compiler/rustc_data_structures/src/obligation_forest/mod.rs b/compiler/rustc_data_structures/src/obligation_forest/mod.rs index 10e673cd9297..a7130abd7314 100644 --- a/compiler/rustc_data_structures/src/obligation_forest/mod.rs +++ b/compiler/rustc_data_structures/src/obligation_forest/mod.rs @@ -95,10 +95,7 @@ pub trait ForestObligation: Clone + Debug { pub trait ObligationProcessor { type Obligation: ForestObligation; type Error: Debug; - type OUT: OutcomeTrait< - Obligation = Self::Obligation, - Error = Error, - >; + type OUT: OutcomeTrait>; fn needs_process_obligation(&self, obligation: &Self::Obligation) -> bool; diff --git a/src/bootstrap/download.rs b/src/bootstrap/download.rs index 6ae283f32a5f..1be7c6777a79 100644 --- a/src/bootstrap/download.rs +++ b/src/bootstrap/download.rs @@ -318,15 +318,27 @@ impl Config { let channel = format!("{version}-{date}"); let host = self.build; - let rustfmt_path = self.initial_rustc.with_file_name(exe("rustfmt", host)); - let bin_root = self.out.join(host.triple).join("stage0"); + let bin_root = self.out.join(host.triple).join("rustfmt"); + let rustfmt_path = bin_root.join("bin").join(exe("rustfmt", host)); let rustfmt_stamp = bin_root.join(".rustfmt-stamp"); if rustfmt_path.exists() && !program_out_of_date(&rustfmt_stamp, &channel) { return Some(rustfmt_path); } - let filename = format!("rustfmt-{version}-{build}.tar.xz", build = host.triple); - self.download_component(DownloadSource::Dist, filename, "rustfmt-preview", &date, "stage0"); + self.download_component( + DownloadSource::Dist, + format!("rustfmt-{version}-{build}.tar.xz", build = host.triple), + "rustfmt-preview", + &date, + "rustfmt", + ); + self.download_component( + DownloadSource::Dist, + format!("rustc-{version}-{build}.tar.xz", build = host.triple), + "rustc", + &date, + "rustfmt", + ); self.fix_bin_or_dylib(&bin_root.join("bin").join("rustfmt")); self.fix_bin_or_dylib(&bin_root.join("bin").join("cargo-fmt")); diff --git a/src/stage0.json b/src/stage0.json index ee104b06f8a3..46f70b1ef4b0 100644 --- a/src/stage0.json +++ b/src/stage0.json @@ -21,64 +21,10 @@ "version": "beta" }, "rustfmt": { - "date": "2023-01-24", + "date": "2023-01-30", "version": "nightly" }, "checksums_sha256": { - "dist/2023-01-24/rustfmt-nightly-aarch64-apple-darwin.tar.gz": "dbfbc33fe90a67ee39e8c1ecf3015405c5cc6a3fd93ae3b004c54861b488b09b", - "dist/2023-01-24/rustfmt-nightly-aarch64-apple-darwin.tar.xz": "aca5cdb50aeacacbdaefc126c5f2236d4658939f18d1cadd68f120af7b4c3ecb", - "dist/2023-01-24/rustfmt-nightly-aarch64-pc-windows-msvc.tar.gz": "97b4f42d93dc10bb7f4a967f013be88a3c507815decdd93a2ea954b75b189cf0", - "dist/2023-01-24/rustfmt-nightly-aarch64-pc-windows-msvc.tar.xz": "25615f274ceef21054d081914244051d00322003ec40cf0c467abccd1037d8b4", - "dist/2023-01-24/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.gz": "02ab0d565707f2399326526ed66e197a8d919c66a0f21c7c3f95c840ac20244e", - "dist/2023-01-24/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.xz": "5f148006e087e7105b88cdb64f80e27b3c4d27c08944217ef889add6185f067d", - "dist/2023-01-24/rustfmt-nightly-aarch64-unknown-linux-musl.tar.gz": "8291ee3a006d8ba932fb9cdd0449f2caf690190ed87cf9ff81c32da510ce6b70", - "dist/2023-01-24/rustfmt-nightly-aarch64-unknown-linux-musl.tar.xz": "760aee321753c993c861292a014994193abfe1da85b91124d9c583646836d156", - "dist/2023-01-24/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.gz": "a3c8935265ef05f1e4a14ff22f4f4d57c6aa44816a6ca55a48af9c5449b3ae84", - "dist/2023-01-24/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.xz": "5cddc0649e59498fc887cbb9150ee16b55c8a72eb4f67a7e09b37a0ebfa30046", - "dist/2023-01-24/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.gz": "77b21f570054ef92c8e1b7d28d43e40064c97fd97e01e7ed6bc23c35e20786b7", - "dist/2023-01-24/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.xz": "b027d1a6a46631b1dcc5e62466b7a459443c4d2b01e7781e3a7a5520d3f79ece", - "dist/2023-01-24/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.gz": "cea014c2983692ca40f8e5d9e8fd2fbbe6d3f44a6ebcd554ce6c75316aa55e4f", - "dist/2023-01-24/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.xz": "bf3ad7d15b9b3c2a1db9c81c359e09a61bdc92932c6cef83073f886fdf138c38", - "dist/2023-01-24/rustfmt-nightly-i686-pc-windows-gnu.tar.gz": "13789d43a9552e490e7e90c23d6046245b5f858abde9aceb2038b1ed51530879", - "dist/2023-01-24/rustfmt-nightly-i686-pc-windows-gnu.tar.xz": "b1de4837aaf4dfcfde9eda904c5c2a506bbf45439c52740a1d465a5cf223bc07", - "dist/2023-01-24/rustfmt-nightly-i686-pc-windows-msvc.tar.gz": "7202987c56395d7742b1403866bc6d3f2fe844e77efc9b1abcff102ad7db8091", - "dist/2023-01-24/rustfmt-nightly-i686-pc-windows-msvc.tar.xz": "6cd740234171c3164bb2ee296d7afe02702d6dc1d75d49fbbd0e43a1c875aad9", - "dist/2023-01-24/rustfmt-nightly-i686-unknown-linux-gnu.tar.gz": "07c19deb3f3de9e6a149577fac37cecbefbb7db2a8ad27ec374fa4b04f9d7226", - "dist/2023-01-24/rustfmt-nightly-i686-unknown-linux-gnu.tar.xz": "1501bf589a2ece8d4cb70bcd582b5d0a7999140b2d2d6c56613f16c70831814c", - "dist/2023-01-24/rustfmt-nightly-mips-unknown-linux-gnu.tar.gz": "74bad9753ceb342fa11ec5fdcc78e97b0088587cbea8ade63a9d21d78a2b2722", - "dist/2023-01-24/rustfmt-nightly-mips-unknown-linux-gnu.tar.xz": "0c89c8f2a533db51d0d55dd783451a423de473eb9b0dd092a6e70cbf1424afc9", - "dist/2023-01-24/rustfmt-nightly-mips64-unknown-linux-gnuabi64.tar.gz": "b06d454a4d4e77c4e6e33a05cf74e7fbfc5c5cfe9f29a8340564bce7cfc9107c", - "dist/2023-01-24/rustfmt-nightly-mips64-unknown-linux-gnuabi64.tar.xz": "f3ff52f12ab81631a769431f6c815b70fc252087685a53d6718f67f49abcbc35", - "dist/2023-01-24/rustfmt-nightly-mips64el-unknown-linux-gnuabi64.tar.gz": "669ffedfc4db61034e8352f1359e135851b771a4ead0a2a4b2e2523305e0347c", - "dist/2023-01-24/rustfmt-nightly-mips64el-unknown-linux-gnuabi64.tar.xz": "8f079d3d4e508618291715db2181b1516edbd084909d727e5a15538ee4b7b24f", - "dist/2023-01-24/rustfmt-nightly-mipsel-unknown-linux-gnu.tar.gz": "9f12607d844249fcb89f0e879ce2c7f7eed3bec7213a01d4c7f156e2d0109564", - "dist/2023-01-24/rustfmt-nightly-mipsel-unknown-linux-gnu.tar.xz": "c65cfe59919178b4431f37d997d5e6e4af00d0ecdde50b7b9432a71e08aa79b3", - "dist/2023-01-24/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.gz": "ed7866cbfde12692438554f445a475fe3ded60210adffd34778e200e22730f36", - "dist/2023-01-24/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.xz": "8b082eeb39e67f1a9d601f4749b90a8f37f21026502595ca99f9ba6c8f00b510", - "dist/2023-01-24/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.gz": "02cdc38571616260749e04dc44f01e122d5388f682ec5ecde18d555bbf681c9b", - "dist/2023-01-24/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.xz": "ce72390e2116bd8ff4d1cf77e0ff760048464ab647e6d21d669a8e451e16c2fa", - "dist/2023-01-24/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.gz": "3ce12078c57df56569f2e6c13b24c6cbcae411a60a0ea386ccc514f1a4d05bf9", - "dist/2023-01-24/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.xz": "36a34f7fadaf3d5f6ab191a47de698b5574065b1b86b53668a6475ca7628a892", - "dist/2023-01-24/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.gz": "a6c6a5596f06fe1f7119d0befc208d646caa2be2841b219b6717c6c7f52d209e", - "dist/2023-01-24/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.xz": "248f4b77dbb659134f019c3819108c46c2d3a5d1c37ded7152fa6a86ee938e3c", - "dist/2023-01-24/rustfmt-nightly-s390x-unknown-linux-gnu.tar.gz": "da830d46e75cc7c795d722f0b52595031740c60c063bebae3921fc5bcb8691ee", - "dist/2023-01-24/rustfmt-nightly-s390x-unknown-linux-gnu.tar.xz": "5ca4d5c1f36950682903fa02d3f1a07fe6117eae0d2987743fdd835178bd1eb3", - "dist/2023-01-24/rustfmt-nightly-x86_64-apple-darwin.tar.gz": "9ac34c02e7fc80964d02815fff239c67abddd4de216fec4a43c7ece10c239228", - "dist/2023-01-24/rustfmt-nightly-x86_64-apple-darwin.tar.xz": "e63033c3ecc08347bd14ae25e497f8471419d6f110358d2993d4f24b9d5c35bb", - "dist/2023-01-24/rustfmt-nightly-x86_64-pc-windows-gnu.tar.gz": "ebd8db08c806ccf805428f454578ed52124a4a989be85a3c83a5f249af6109e4", - "dist/2023-01-24/rustfmt-nightly-x86_64-pc-windows-gnu.tar.xz": "c9c1779798b5412d66dc4cee0ecb15fd168862b150ed1ce0486d0c56258e34ff", - "dist/2023-01-24/rustfmt-nightly-x86_64-pc-windows-msvc.tar.gz": "3c55a8ea07044d7894e1a584ae216676fb26a83de41a1ad9fbfecf5a7ef3c317", - "dist/2023-01-24/rustfmt-nightly-x86_64-pc-windows-msvc.tar.xz": "b5be35b6b20b7f0a72c76fa6d76c55b16dfd86461018a623ccd289d0836523d5", - "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-freebsd.tar.gz": "9763003f2f0790cb379c238c73ca26a9683d6034f7aec1dacfc72a601e398271", - "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-freebsd.tar.xz": "8f7073076408d5880ec326ad673a5c33e023a2f1ddc92affa8cbf3aa2d2f1274", - "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-illumos.tar.gz": "d667651444a2fc3a87d3b5c427d35c1b2629f4c14d319c73e54c3efccd0f18ba", - "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-illumos.tar.xz": "8a57c358861edde8a1a59139609525c999f596034a3271661bb7eb573306e347", - "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.gz": "b56c7533697f3db80901d9012c4dedb7599d9d3f8489730d64e19d857552ff3d", - "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.xz": "0233142bb789b2a1cfa7f746cbd6d3f074c2a9c9925b9bac5def9a53bc6b6f55", - "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-linux-musl.tar.gz": "51978f029470ddbb5915bf6f4ca68d104f3b9ca36a3584ea14824c51e43afee6", - "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-linux-musl.tar.xz": "d27c5768be94e48ff37d56e41b67b81c909e7764f0d753089f4627864bb31bc9", - "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-netbsd.tar.gz": "6aa26a4bad451860941074576e2b56bb39cd033194b3d75df5a9c55745ec16aa", - "dist/2023-01-24/rustfmt-nightly-x86_64-unknown-netbsd.tar.xz": "0c6fe51cb3de9af84deea4cafb9e1734b4d5f7d62be42a36b85408e655ae3504", "dist/2023-01-25/cargo-beta-aarch64-apple-darwin.tar.gz": "323f3c4c41892765b24201aae83a54fcaef08e47b9b2912a2680528c6ed4f8f8", "dist/2023-01-25/cargo-beta-aarch64-apple-darwin.tar.xz": "2039157d9100ccadf4d3596f5d7b052e10ff997b59ac7619999969794fc51eae", "dist/2023-01-25/cargo-beta-aarch64-pc-windows-msvc.tar.gz": "ac3c88c99aed8d4547f8b0f857ec3538456f10223411580278eed10f6e2be30b", @@ -366,6 +312,114 @@ "dist/2023-01-25/rustc-beta-x86_64-unknown-linux-musl.tar.gz": "a649445f1676acafc59b4808211aa669c9fb8093cabb7007432d0ae2f6e21239", "dist/2023-01-25/rustc-beta-x86_64-unknown-linux-musl.tar.xz": "b6ed06a8df0de6b64099fba4d1ca9478e0802dfc086308f425692ee40faa8d2a", "dist/2023-01-25/rustc-beta-x86_64-unknown-netbsd.tar.gz": "d939bd071f42aa7657297110be68dd9d2aad840272bf881a1fdc82053914f970", - "dist/2023-01-25/rustc-beta-x86_64-unknown-netbsd.tar.xz": "5671084575291d8c4ef2ed0930b22815d6810e2378fb98ca5a0738faa76b525b" + "dist/2023-01-25/rustc-beta-x86_64-unknown-netbsd.tar.xz": "5671084575291d8c4ef2ed0930b22815d6810e2378fb98ca5a0738faa76b525b", + "dist/2023-01-30/rustc-nightly-aarch64-apple-darwin.tar.gz": "f634a282a8388aff57d988616f17f2c511253a02d45193b03fa87167448a8cd9", + "dist/2023-01-30/rustc-nightly-aarch64-apple-darwin.tar.xz": "4fd6a4ec8665ba71ccf3ac7d08f9010b4e130ce496bc62548d36170786f213ab", + "dist/2023-01-30/rustc-nightly-aarch64-pc-windows-msvc.tar.gz": "5b7fc325745b2f1e22b1a58ead8163314c3ec06f4a30483bf7ddfb57f811a2d4", + "dist/2023-01-30/rustc-nightly-aarch64-pc-windows-msvc.tar.xz": "4aa8d587ebd53bbd11c33f263991328576977d801d5b6eccf56147301ea0f52e", + "dist/2023-01-30/rustc-nightly-aarch64-unknown-linux-gnu.tar.gz": "7838bf7da92539b0329be0b9b80f0738df3617e982f539326a6a99892eb905f1", + "dist/2023-01-30/rustc-nightly-aarch64-unknown-linux-gnu.tar.xz": "636af094f94de9baa3edd5f9e1b7655e0bb7f6f23d24d6f389a3abeab7360e00", + "dist/2023-01-30/rustc-nightly-aarch64-unknown-linux-musl.tar.gz": "51b8a8a06244ee37d2c37e84154ff87132b4f90a1e62a8c9454ed5ea5c296c1f", + "dist/2023-01-30/rustc-nightly-aarch64-unknown-linux-musl.tar.xz": "cc18ce5f4f461a830c725ca8ddccda17bd726374198c487810eab8d36a8f7c98", + "dist/2023-01-30/rustc-nightly-arm-unknown-linux-gnueabi.tar.gz": "e2d7b96bf5e2feb47019c63067dbb1627bf26ac4e730774d29ea9f6967edae3a", + "dist/2023-01-30/rustc-nightly-arm-unknown-linux-gnueabi.tar.xz": "0483f07f1a53949c2f04e2766f53fe9138ce126059f650ac61215e6a84c5fd57", + "dist/2023-01-30/rustc-nightly-arm-unknown-linux-gnueabihf.tar.gz": "d3ad417041c432438f1ed56a2324ab412dca7631a74da03e0bc72cd28e69f197", + "dist/2023-01-30/rustc-nightly-arm-unknown-linux-gnueabihf.tar.xz": "f029fafa0635efec9065d76780f003e2c4220c7b6ea4b426ebcb57d943403998", + "dist/2023-01-30/rustc-nightly-armv7-unknown-linux-gnueabihf.tar.gz": "dd2ee13ccea00c23ca2f90872c7c31a3a1ef008962db9cf8066acc130bca778f", + "dist/2023-01-30/rustc-nightly-armv7-unknown-linux-gnueabihf.tar.xz": "dc23fa4c0268a7227e0f9e4941376ffc4c64c0614622f442da10dbb75e014dd4", + "dist/2023-01-30/rustc-nightly-i686-pc-windows-gnu.tar.gz": "d4b02e59373fe60ba06e979f784bf1b8c94ca4a5ee471ed83814623db9e14af6", + "dist/2023-01-30/rustc-nightly-i686-pc-windows-gnu.tar.xz": "5355e1bfdddd2a56dd0c882fc492e4d571e5b29636d381e848102e996ca9b680", + "dist/2023-01-30/rustc-nightly-i686-pc-windows-msvc.tar.gz": "02a43fb72394837461770c1b472afb534ac03bac9cf23bfdbba8227cf879dabe", + "dist/2023-01-30/rustc-nightly-i686-pc-windows-msvc.tar.xz": "78cbe74bd0f7029b01e3aeb451ea6bbc1656db1fb4a80caac4cc27b6e0144b79", + "dist/2023-01-30/rustc-nightly-i686-unknown-linux-gnu.tar.gz": "7fa9a3e3d70a6c15bfd00a0b5a83d73f4e952862b8ef1d6837d3598c4cee8752", + "dist/2023-01-30/rustc-nightly-i686-unknown-linux-gnu.tar.xz": "76b3abe5c532785ab80804461204280e6d853773c62956f283f5dc88130e310c", + "dist/2023-01-30/rustc-nightly-mips-unknown-linux-gnu.tar.gz": "2aa78ea99fceb90e568f6c46881623f5088afeaf47ba204abf2ef755397e84eb", + "dist/2023-01-30/rustc-nightly-mips-unknown-linux-gnu.tar.xz": "6abe1f28662aca904b1fd91e46e0441ba7b4f66f1e7757cab93a0d73012b36fc", + "dist/2023-01-30/rustc-nightly-mips64-unknown-linux-gnuabi64.tar.gz": "3afadbbe1b073ee2a81609c87c3d88a5d7344765b970b8c48dcdfe539c5ba540", + "dist/2023-01-30/rustc-nightly-mips64-unknown-linux-gnuabi64.tar.xz": "f1eb22696c376dfea266090320e7a941986f8de2176b6ceb6dc0f0452994ae4a", + "dist/2023-01-30/rustc-nightly-mips64el-unknown-linux-gnuabi64.tar.gz": "c7f548350e118d4281a8a6ac8044c19eb1583683490b0ea6fb9f5f27f5e3873a", + "dist/2023-01-30/rustc-nightly-mips64el-unknown-linux-gnuabi64.tar.xz": "aad40926a20ac8bda9e534d63e180adfa355e9df22a1068310cf9ae667ffd0ad", + "dist/2023-01-30/rustc-nightly-mipsel-unknown-linux-gnu.tar.gz": "4778f49dceea661baaf641531946dda47d8ddb7f801cc63afbec37a86d45a0f4", + "dist/2023-01-30/rustc-nightly-mipsel-unknown-linux-gnu.tar.xz": "1ba09bcefaf5ed5a3029230ebc3e9cad33626b38553451b952ef215c68a98e34", + "dist/2023-01-30/rustc-nightly-powerpc-unknown-linux-gnu.tar.gz": "6efe1f619ad49c94b3e6fef2a51893cec88ecacf31d963576e6343e8a050d20d", + "dist/2023-01-30/rustc-nightly-powerpc-unknown-linux-gnu.tar.xz": "971fdc824861c98bf223fb2c733e780cf87c90f3a5646561f4e35fa8cd068c7c", + "dist/2023-01-30/rustc-nightly-powerpc64-unknown-linux-gnu.tar.gz": "10741ef62e00541a85747db16f830c71ffa1dce036a95bc43df433e450f96602", + "dist/2023-01-30/rustc-nightly-powerpc64-unknown-linux-gnu.tar.xz": "b8bc80ee97c54e428c51f56e30cdd610fb07f41bead0409b089fe56237bb0421", + "dist/2023-01-30/rustc-nightly-powerpc64le-unknown-linux-gnu.tar.gz": "f8f52abf57943895d34ffe2157f863bbdabaf804969baa2624e38a13648d43de", + "dist/2023-01-30/rustc-nightly-powerpc64le-unknown-linux-gnu.tar.xz": "7dfb9af100df05b558c873b5440c532d28de44fbf8c7d933c29481eef6693539", + "dist/2023-01-30/rustc-nightly-riscv64gc-unknown-linux-gnu.tar.gz": "9454d78432ce8ad61f8cfbe448654d8acddda9c596c36c7863631c638aba949f", + "dist/2023-01-30/rustc-nightly-riscv64gc-unknown-linux-gnu.tar.xz": "c69f1b0062aaf566d6610e6b19335ed002a281aa65b34c1be001a875b85f76d2", + "dist/2023-01-30/rustc-nightly-s390x-unknown-linux-gnu.tar.gz": "92184254f00348bfaa7f40f8a07b585eeb6dabc02e4dff3351cb395b354a930a", + "dist/2023-01-30/rustc-nightly-s390x-unknown-linux-gnu.tar.xz": "b41eff99cf9b9851ffbf496ba6dc892d5dfd124da68c91db66d6fb77b19370d4", + "dist/2023-01-30/rustc-nightly-x86_64-apple-darwin.tar.gz": "8d901d7c2ed293a9e2d2fb8849edee50e6f6e3c5a049fa91cfb13f8f16571b7e", + "dist/2023-01-30/rustc-nightly-x86_64-apple-darwin.tar.xz": "d472dc97f3242d243f584efe113f23e62ac1f53677fb3b3cd1749adb65a6635c", + "dist/2023-01-30/rustc-nightly-x86_64-pc-windows-gnu.tar.gz": "9259adfb75f90cd43c99f253aaf4b242afe941c4075eabc6bce824c3337b4d2e", + "dist/2023-01-30/rustc-nightly-x86_64-pc-windows-gnu.tar.xz": "e42b3e9a462004296e53ed3e71403caff98b3718ff15508d913e0a25ad02ea3d", + "dist/2023-01-30/rustc-nightly-x86_64-pc-windows-msvc.tar.gz": "82f615142be1fed6ffd5c9a6f2d1d3fb73ebf32801348cf6279991c0a76b771c", + "dist/2023-01-30/rustc-nightly-x86_64-pc-windows-msvc.tar.xz": "2a4e2aad343062379334ee1a73b657656e0c03f0490c901806c864ea8a38ebe1", + "dist/2023-01-30/rustc-nightly-x86_64-unknown-freebsd.tar.gz": "2a8fa3a6a104bd35de9a83d98786e7acb7614e0b830336adda30e8d1f1cade69", + "dist/2023-01-30/rustc-nightly-x86_64-unknown-freebsd.tar.xz": "37327a8b756918c25cb799f2e5742a07145e4c1e424442a5d975e99aff1f303d", + "dist/2023-01-30/rustc-nightly-x86_64-unknown-illumos.tar.gz": "8be0295e8b89b6e8f465b0825b0625232c7624cb897efe3e0bf4da222799349c", + "dist/2023-01-30/rustc-nightly-x86_64-unknown-illumos.tar.xz": "8e515082490a64d83771131f4fa5fba8b021d205b56149459e2f2da7584407e3", + "dist/2023-01-30/rustc-nightly-x86_64-unknown-linux-gnu.tar.gz": "c105e3dabdc7bebebadc6ffa5b6f3f962057948cdac6647cd5adf16d66982701", + "dist/2023-01-30/rustc-nightly-x86_64-unknown-linux-gnu.tar.xz": "09b82ca24ff847e000aed1b2eaca74cdf0f6e533bd6655eaa302281eb7037163", + "dist/2023-01-30/rustc-nightly-x86_64-unknown-linux-musl.tar.gz": "e77d81b158b53a94065cd90f68e26dd12d156084b02c53c51172e02c4db58c1c", + "dist/2023-01-30/rustc-nightly-x86_64-unknown-linux-musl.tar.xz": "613c7eab1b998aec0673e1781e3ed78c4d038b449d879c11254b1b6d4345e34c", + "dist/2023-01-30/rustc-nightly-x86_64-unknown-netbsd.tar.gz": "ac8c53be048049118af9fd9d356dcc69ddfaafcd52020ea93703c94d6167b367", + "dist/2023-01-30/rustc-nightly-x86_64-unknown-netbsd.tar.xz": "28b1c8adfffa7863bcd8a46ef407044d06fc16b29f7b6f42072fcbfbdc779e79", + "dist/2023-01-30/rustfmt-nightly-aarch64-apple-darwin.tar.gz": "f7e585d9016a012e2cde4d7e0899e52e1c410c53ed9caf6db22d13f6791ffb0f", + "dist/2023-01-30/rustfmt-nightly-aarch64-apple-darwin.tar.xz": "bdea28e1700f34dc0a6e57db5f73caf6c8d1671a8356cc51096f8155f58690c8", + "dist/2023-01-30/rustfmt-nightly-aarch64-pc-windows-msvc.tar.gz": "e9988193283871e678a0d0e08cfb5bdab37d43cb0bec0e5f63a12a38c164936b", + "dist/2023-01-30/rustfmt-nightly-aarch64-pc-windows-msvc.tar.xz": "30d1bad2b730589f9d75ca3e2d410d0f9c90707526ed6a66edac92a19eb3716c", + "dist/2023-01-30/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.gz": "7c6c93fa25193360e28a90269439b28465b6693b6ce68ff2eb1c4209c36a9d60", + "dist/2023-01-30/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.xz": "4c8331d14ab428b922135690b433f97acd37291e1801635252ab5da849d42180", + "dist/2023-01-30/rustfmt-nightly-aarch64-unknown-linux-musl.tar.gz": "0fb5372bf4cc0b6388194021dc7b6a539bd413e89058c05cdc42c1dfe8d92edc", + "dist/2023-01-30/rustfmt-nightly-aarch64-unknown-linux-musl.tar.xz": "0e2452ff037698781157c30c5fd67f552e897feb1d86b7b074c195c70a6a1a3a", + "dist/2023-01-30/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.gz": "6c079c2dde918cf2d9f029dfb3a2a9bebba2504dfe97c5fdc0ef79022415b9f0", + "dist/2023-01-30/rustfmt-nightly-arm-unknown-linux-gnueabi.tar.xz": "5ab6fa16d7aaca7e6e36caea8e11b916c089dccb511f79b7f69bba667edabc50", + "dist/2023-01-30/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.gz": "7b919c9132269fcde24559af58d3d2fee56d93308d731d891f89dcee193bbbdb", + "dist/2023-01-30/rustfmt-nightly-arm-unknown-linux-gnueabihf.tar.xz": "53d7c7d03b64526e013c11c49519a63f51562f9682039479c377c92529e5e026", + "dist/2023-01-30/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.gz": "c19265cc3a85cd296a85b450e2f4e4b5f3646aa70d6c70dfdfe9ef222fd72136", + "dist/2023-01-30/rustfmt-nightly-armv7-unknown-linux-gnueabihf.tar.xz": "66159d87fd85a4534104da3f7f5c0a14403960ff2c836eb72e35bed6a1ebde32", + "dist/2023-01-30/rustfmt-nightly-i686-pc-windows-gnu.tar.gz": "be84f8558d15dcc802f399f44f0de58e93b28e99cf62e38c0d6e6078a8d73102", + "dist/2023-01-30/rustfmt-nightly-i686-pc-windows-gnu.tar.xz": "b4e8f18335aa3cba092df29c3aadef79c0b88e00f563604467cb2485e10cced6", + "dist/2023-01-30/rustfmt-nightly-i686-pc-windows-msvc.tar.gz": "43ce7581f50e05c775b39a6a6d297d6e8c56a40f5a5817ae4d996d319fbe96c1", + "dist/2023-01-30/rustfmt-nightly-i686-pc-windows-msvc.tar.xz": "2ca2b20996f1a4cbdb619393a3f544ada208caaf381748ee997a70139e52a591", + "dist/2023-01-30/rustfmt-nightly-i686-unknown-linux-gnu.tar.gz": "229fb281ec100e68445b5a402a3d39a0947475054c4f043d55ab2e33bd3d2a57", + "dist/2023-01-30/rustfmt-nightly-i686-unknown-linux-gnu.tar.xz": "65326115afcf1c8e07cfcb9ed294a1e5a136b998557cd60b4cb976520f84cfe1", + "dist/2023-01-30/rustfmt-nightly-mips-unknown-linux-gnu.tar.gz": "337bdf61237c8e47909c3f14b5c8fdf3b8b14f2b265e6da45cd6b4d8180d0afd", + "dist/2023-01-30/rustfmt-nightly-mips-unknown-linux-gnu.tar.xz": "d683349af8320d6bc9f16021fc8937920d70e99cf668ce64cad962705dd20ea5", + "dist/2023-01-30/rustfmt-nightly-mips64-unknown-linux-gnuabi64.tar.gz": "08a1ae9e61ef097c5d5ce83e5d2bdda62e72d07b4dd21aad286413c619fefa1a", + "dist/2023-01-30/rustfmt-nightly-mips64-unknown-linux-gnuabi64.tar.xz": "cc3f1f86997c5ccf5607c8f873c916d1158da76ff971d75e36ed8e3a87c86924", + "dist/2023-01-30/rustfmt-nightly-mips64el-unknown-linux-gnuabi64.tar.gz": "f4b7084fc67cf17b3cf1d36136aa03aa5b6af188d311684b15395f05104181f6", + "dist/2023-01-30/rustfmt-nightly-mips64el-unknown-linux-gnuabi64.tar.xz": "2ab645d5117606f2c7e8decbeae1d8855ec7ba53051144ba4783efee2c58d91d", + "dist/2023-01-30/rustfmt-nightly-mipsel-unknown-linux-gnu.tar.gz": "cfa8baa60cc59ac2750f799d33b06eb399d330f318783907717a9e360fd7d85f", + "dist/2023-01-30/rustfmt-nightly-mipsel-unknown-linux-gnu.tar.xz": "bf24570425c064aaef31788bbabd6c4938c9323eca2dedf2ac9084d125623544", + "dist/2023-01-30/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.gz": "f5437d81735fa67ef24c7b561d1c720395f5d8d4ddcfd88364717a7ed9b96a7d", + "dist/2023-01-30/rustfmt-nightly-powerpc-unknown-linux-gnu.tar.xz": "8e19c3c95d6445e1ef9b1735191f0d0bc33802bcfa138a9d676d9b266adab17c", + "dist/2023-01-30/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.gz": "7fd91c2ef7e26c08854c91969d167d1c97538d7678c6ed7914eb0f67290d8d5d", + "dist/2023-01-30/rustfmt-nightly-powerpc64-unknown-linux-gnu.tar.xz": "9e8ada358580b396054278972d532ce2044550071036e9da2eab598e2953a03a", + "dist/2023-01-30/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.gz": "eec8b1c24ccaea22eed7708e61bd32bac0850d0dff2b06f1a15a95ab86385363", + "dist/2023-01-30/rustfmt-nightly-powerpc64le-unknown-linux-gnu.tar.xz": "215f1f3bdd8f347af5969c66ff7f7cbf39753ae483e75e689ac581f9d35a64df", + "dist/2023-01-30/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.gz": "39460814c429b6a57ce72fafa583d04190053f2c2ce995c8bcb0799ecb7f8bd5", + "dist/2023-01-30/rustfmt-nightly-riscv64gc-unknown-linux-gnu.tar.xz": "6bd08db8702f2fcd9f4cd19a1d977962c84856f748552a96b564e5a77cf2fdfc", + "dist/2023-01-30/rustfmt-nightly-s390x-unknown-linux-gnu.tar.gz": "81d6335fa1265cdf99682503cfb236b914fa17d45f967e456ddbeb12bae2dcbf", + "dist/2023-01-30/rustfmt-nightly-s390x-unknown-linux-gnu.tar.xz": "d36b7517efac2c4a34a1055411f779c386c7a566e4eec408dbc8a319f67f5451", + "dist/2023-01-30/rustfmt-nightly-x86_64-apple-darwin.tar.gz": "1a34ec058cb45189c4062ad2a00ab33387a54716f75005d9959cf0691d06ae50", + "dist/2023-01-30/rustfmt-nightly-x86_64-apple-darwin.tar.xz": "a2fdcb7cc9fe7819699f511d52da0e8ed4e55ba42c63e7b1d61512e4e14e5c29", + "dist/2023-01-30/rustfmt-nightly-x86_64-pc-windows-gnu.tar.gz": "95e3f080394d2e4f9916f17c9cf5137d032da847d9ac1c04519b31177fb1618e", + "dist/2023-01-30/rustfmt-nightly-x86_64-pc-windows-gnu.tar.xz": "c306895982f92c24559b18f8ff9e011e8722c3310e5f70010fd04b0d044c49bb", + "dist/2023-01-30/rustfmt-nightly-x86_64-pc-windows-msvc.tar.gz": "36331cd76f8e918b73ebf6d9095efd0a07cc9f084f194f74c881c14fbc6e8a77", + "dist/2023-01-30/rustfmt-nightly-x86_64-pc-windows-msvc.tar.xz": "2e7caa7209e52a9df17254b17f1930afd5ae973826ce3293f29b8b878aa13042", + "dist/2023-01-30/rustfmt-nightly-x86_64-unknown-freebsd.tar.gz": "dec92f2c27f785f8ae0db18c2e8a9db87e1ae8addb4302f5cbe9f745cd92c4f2", + "dist/2023-01-30/rustfmt-nightly-x86_64-unknown-freebsd.tar.xz": "a8fef2e56d9d2be9072c17d75e7ac695eb8fc266fc35e1055fbb25757e6db29d", + "dist/2023-01-30/rustfmt-nightly-x86_64-unknown-illumos.tar.gz": "9b5f93f00f61def125436332e4b709bdfe74c441995bae49c0d482f24bd9f8f1", + "dist/2023-01-30/rustfmt-nightly-x86_64-unknown-illumos.tar.xz": "4f82313dce2e1315bd0d3ebf95f33bbdf7275c59205b0910bbc92d41c47c7c22", + "dist/2023-01-30/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.gz": "69efa04956d9bcf177a3bd9ba9541fa681b39416a1b7dd2b18415b72311897b9", + "dist/2023-01-30/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.xz": "0c3c33d744ec05e96298d0bdb9890654ab9ce3e9013b9af14c78683560456820", + "dist/2023-01-30/rustfmt-nightly-x86_64-unknown-linux-musl.tar.gz": "cba8b1f086c544d79aa09ac954374f44d5e7d38ad9bbc2f9e84723d0088592e5", + "dist/2023-01-30/rustfmt-nightly-x86_64-unknown-linux-musl.tar.xz": "ce73d1d03b62931d6eb9508b701e9dacc08b98b484af3daa79ae600c4883a9f4", + "dist/2023-01-30/rustfmt-nightly-x86_64-unknown-netbsd.tar.gz": "87e1018a3ee4f781b3c1b471fcdf80ebd70096ed58b29db00ad97573626294f4", + "dist/2023-01-30/rustfmt-nightly-x86_64-unknown-netbsd.tar.xz": "c6896ee319403ebb5c909b13feabc7411e3aa80523ef1bc84c8aae181514c923" } } diff --git a/src/tools/bump-stage0/src/main.rs b/src/tools/bump-stage0/src/main.rs index 530a80b1ed37..f530a4d73d36 100644 --- a/src/tools/bump-stage0/src/main.rs +++ b/src/tools/bump-stage0/src/main.rs @@ -6,7 +6,7 @@ use std::convert::TryInto; const PATH: &str = "src/stage0.json"; const COMPILER_COMPONENTS: &[&str] = &["rustc", "rust-std", "cargo"]; -const RUSTFMT_COMPONENTS: &[&str] = &["rustfmt-preview"]; +const RUSTFMT_COMPONENTS: &[&str] = &["rustfmt-preview", "rustc"]; struct Tool { config: Config, From 043c634a9cbe6ee303eadd0a31b11203b9ef9386 Mon Sep 17 00:00:00 2001 From: KaDiWa Date: Mon, 30 Jan 2023 17:30:39 +0100 Subject: [PATCH 57/69] assert that `should_fix_bins_and_dylibs` has been run --- src/bootstrap/bootstrap.py | 89 +++++++++++++++++++++----------------- src/bootstrap/download.rs | 7 +-- x.py | 3 +- 3 files changed, 56 insertions(+), 43 deletions(-) diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py index 0f793c9327f5..5b19a658fb54 100644 --- a/src/bootstrap/bootstrap.py +++ b/src/bootstrap/bootstrap.py @@ -402,9 +402,10 @@ class RustBuild(object): self.rust_root = '' self.use_locked_deps = False self.use_vendored_sources = False - self.verbose = 0 + self.verbose = False self.git_version = None self.nix_deps_dir = None + self._should_fix_bins_and_dylibs = None def download_toolchain(self): """Fetch the build system for Rust, written in Rust @@ -466,46 +467,54 @@ class RustBuild(object): "dist/{}/{}".format(key, filename), tarball, self.checksums_sha256, - verbose=self.verbose != 0, + verbose=self.verbose, ) - unpack(tarball, tarball_suffix, self.bin_root(), match=pattern, verbose=self.verbose != 0) + unpack(tarball, tarball_suffix, self.bin_root(), match=pattern, verbose=self.verbose) def should_fix_bins_and_dylibs(self): """Whether or not `fix_bin_or_dylib` needs to be run; can only be True on NixOS. """ - default_encoding = sys.getdefaultencoding() - try: - ostype = subprocess.check_output( - ['uname', '-s']).strip().decode(default_encoding) - except subprocess.CalledProcessError: - return False - except OSError as reason: - if getattr(reason, 'winerror', None) is not None: + if self._should_fix_bins_and_dylibs is not None: + return self._should_fix_bins_and_dylibs + + def get_answer(): + default_encoding = sys.getdefaultencoding() + try: + ostype = subprocess.check_output( + ['uname', '-s']).strip().decode(default_encoding) + except subprocess.CalledProcessError: return False - raise reason + except OSError as reason: + if getattr(reason, 'winerror', None) is not None: + return False + raise reason - if ostype != "Linux": - return False + if ostype != "Linux": + return False + + # If the user has asked binaries to be patched for Nix, then + # don't check for NixOS or `/lib`. + if self.get_toml("patch-binaries-for-nix", "build") == "true": + return True + + # Use `/etc/os-release` instead of `/etc/NIXOS`. + # The latter one does not exist on NixOS when using tmpfs as root. + try: + with open("/etc/os-release", "r") as f: + if not any(l.strip() in ("ID=nixos", "ID='nixos'", 'ID="nixos"') for l in f): + return False + except FileNotFoundError: + return False + if os.path.exists("/lib"): + return False - # If the user has asked binaries to be patched for Nix, then - # don't check for NixOS or `/lib`. - if self.get_toml("patch-binaries-for-nix", "build") == "true": return True - # Use `/etc/os-release` instead of `/etc/NIXOS`. - # The latter one does not exist on NixOS when using tmpfs as root. - try: - with open("/etc/os-release", "r") as f: - if not any(l.strip() in ("ID=nixos", "ID='nixos'", 'ID="nixos"') for l in f): - return False - except FileNotFoundError: - return False - if os.path.exists("/lib"): - return False - - print("info: You seem to be using Nix.") - return True + answer = self._should_fix_bins_and_dylibs = get_answer() + if answer: + print("info: You seem to be using Nix.") + return answer def fix_bin_or_dylib(self, fname): """Modifies the interpreter section of 'fname' to fix the dynamic linker, @@ -516,6 +525,7 @@ class RustBuild(object): Please see https://nixos.org/patchelf.html for more information """ + assert self._should_fix_bins_and_dylibs is True print("attempting to patch", fname) # Only build `.nix-deps` once. @@ -707,7 +717,7 @@ class RustBuild(object): """ return os.path.join(self.build_dir, "bootstrap", "debug", "bootstrap") - def build_bootstrap(self, color): + def build_bootstrap(self, color, verbose_count): """Build bootstrap""" print("Building bootstrap") build_dir = os.path.join(self.build_dir, "bootstrap") @@ -764,7 +774,7 @@ class RustBuild(object): self.cargo())) args = [self.cargo(), "build", "--manifest-path", os.path.join(self.rust_root, "src/bootstrap/Cargo.toml")] - args.extend("--verbose" for _ in range(self.verbose)) + args.extend("--verbose" for _ in range(verbose_count)) if self.use_locked_deps: args.append("--locked") if self.use_vendored_sources: @@ -778,7 +788,7 @@ class RustBuild(object): args.append("--color=never") # Run this from the source directory so cargo finds .cargo/config - run(args, env=env, verbose=self.verbose != 0, cwd=self.rust_root) + run(args, env=env, verbose=self.verbose, cwd=self.rust_root) def build_triple(self): """Build triple as in LLVM @@ -787,7 +797,7 @@ class RustBuild(object): so use `self.build` where possible. """ config = self.get_toml('build') - return config or default_build_triple(self.verbose != 0) + return config or default_build_triple(self.verbose) def check_vendored_status(self): """Check that vendoring is configured properly""" @@ -838,7 +848,7 @@ def bootstrap(args): # Configure initial bootstrap build = RustBuild() build.rust_root = os.path.abspath(os.path.join(__file__, '../../..')) - build.verbose = args.verbose + build.verbose = args.verbose != 0 build.clean = args.clean # Read from `--config`, then `RUST_BOOTSTRAP_CONFIG`, then `./config.toml`, @@ -866,9 +876,10 @@ def bootstrap(args): with open(include_path) as included_toml: build.config_toml += os.linesep + included_toml.read() - config_verbose = build.get_toml('verbose', 'build') - if config_verbose is not None: - build.verbose = max(build.verbose, int(config_verbose)) + verbose_count = args.verbose + config_verbose_count = build.get_toml('verbose', 'build') + if config_verbose_count is not None: + verbose_count = max(args.verbose, int(config_verbose_count)) build.use_vendored_sources = build.get_toml('vendor', 'build') == 'true' build.use_locked_deps = build.get_toml('locked-deps', 'build') == 'true' @@ -892,7 +903,7 @@ def bootstrap(args): # Fetch/build the bootstrap build.download_toolchain() sys.stdout.flush() - build.build_bootstrap(args.color) + build.build_bootstrap(args.color, verbose_count) sys.stdout.flush() # Run the bootstrap diff --git a/src/bootstrap/download.rs b/src/bootstrap/download.rs index 626e20754bc0..108b9636cda4 100644 --- a/src/bootstrap/download.rs +++ b/src/bootstrap/download.rs @@ -18,6 +18,8 @@ use crate::{ Config, }; +static SHOULD_FIX_BINS_AND_DYLIBS: OnceCell = OnceCell::new(); + /// Generic helpers that are useful anywhere in bootstrap. impl Config { pub fn is_verbose(&self) -> bool { @@ -73,9 +75,7 @@ impl Config { /// Whether or not `fix_bin_or_dylib` needs to be run; can only be true /// on NixOS fn should_fix_bins_and_dylibs(&self) -> bool { - static CACHED: OnceCell = OnceCell::new(); - - let val = *CACHED.get_or_init(|| { + let val = *SHOULD_FIX_BINS_AND_DYLIBS.get_or_init(|| { match Command::new("uname").arg("-s").stderr(Stdio::inherit()).output() { Err(_) => return false, Ok(output) if !output.status.success() => return false, @@ -125,6 +125,7 @@ impl Config { /// /// Please see https://nixos.org/patchelf.html for more information fn fix_bin_or_dylib(&self, fname: &Path) { + assert_eq!(SHOULD_FIX_BINS_AND_DYLIBS.get(), Some(&true)); println!("attempting to patch {}", fname.display()); // Only build `.nix-deps` once. diff --git a/x.py b/x.py index b7df39c7bc9e..5dee953a3189 100755 --- a/x.py +++ b/x.py @@ -22,7 +22,8 @@ if sys.version_info.major < 3: pass rust_dir = os.path.dirname(os.path.abspath(__file__)) -sys.path[:0] = [os.path.join(rust_dir, "src", "bootstrap")] +# For the import below, have Python search in src/bootstrap first. +sys.path.insert(0, os.path.join(rust_dir, "src", "bootstrap")) import bootstrap bootstrap.main() From c8e8d6e7f667edbdf5ca97afe2ec877fd9eff480 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Tue, 31 Jan 2023 18:49:03 +0100 Subject: [PATCH 58/69] PointeeInfo is advisory only --- compiler/rustc_abi/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/compiler/rustc_abi/src/lib.rs b/compiler/rustc_abi/src/lib.rs index fe65ad9c6cb0..5af6206c0bb8 100644 --- a/compiler/rustc_abi/src/lib.rs +++ b/compiler/rustc_abi/src/lib.rs @@ -1456,6 +1456,8 @@ pub enum PointerKind { UniqueOwned, } +/// Note that this information is advisory only, and backends are free to ignore it. +/// It can only be used to encode potential optimizations, but no critical information. #[derive(Copy, Clone, Debug)] pub struct PointeeInfo { pub size: Size, From f75b35046777c6a4aa9245edbbc5ca7a340687f5 Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Tue, 31 Jan 2023 11:27:09 -0700 Subject: [PATCH 59/69] rustdoc: stop making unstable items transparent Fixes #93393 --- src/librustdoc/html/render/print_item.rs | 19 +++++-------------- src/librustdoc/html/static/css/rustdoc.css | 4 ---- tests/rustdoc/inline_cross/macros.rs | 4 ++-- tests/rustdoc/issue-32374.rs | 4 ++-- tests/rustdoc/reexport-check.rs | 4 +++- 5 files changed, 12 insertions(+), 23 deletions(-) diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs index 71cde1f964cd..bd7548003ad3 100644 --- a/src/librustdoc/html/render/print_item.rs +++ b/src/librustdoc/html/render/print_item.rs @@ -355,7 +355,7 @@ fn item_module(w: &mut Buffer, cx: &mut Context<'_>, item: &clean::Item, items: } clean::ImportItem(ref import) => { - let (stab, stab_tags) = if let Some(import_def_id) = import.source.did { + let stab_tags = if let Some(import_def_id) = import.source.did { let ast_attrs = cx.tcx().get_attrs_unchecked(import_def_id); let import_attrs = Box::new(clean::Attributes::from_ast(ast_attrs)); @@ -367,15 +367,12 @@ fn item_module(w: &mut Buffer, cx: &mut Context<'_>, item: &clean::Item, items: ..myitem.clone() }; - let stab = import_item.stability_class(cx.tcx()); let stab_tags = Some(extra_info_tags(&import_item, item, cx.tcx())); - (stab, stab_tags) + stab_tags } else { - (None, None) + None }; - let add = if stab.is_some() { " " } else { "" }; - w.write_str(ITEM_TABLE_ROW_OPEN); let id = match import.kind { clean::ImportKind::Simple(s) => { @@ -391,11 +388,10 @@ fn item_module(w: &mut Buffer, cx: &mut Context<'_>, item: &clean::Item, items: }; write!( w, - "

\ + "
\ {vis}{imp}\
\ {stab_tags_before}{stab_tags}{stab_tags_after}", - stab = stab.unwrap_or_default(), vis = visibility_print_with_space(myitem.visibility(tcx), myitem.item_id, cx), imp = import.print(cx), ); @@ -417,9 +413,6 @@ fn item_module(w: &mut Buffer, cx: &mut Context<'_>, item: &clean::Item, items: _ => "", }; - let stab = myitem.stability_class(cx.tcx()); - let add = if stab.is_some() { " " } else { "" }; - let visibility_emoji = match myitem.visibility(tcx) { Some(ty::Visibility::Restricted(_)) => { " ðŸ”’ " @@ -437,7 +430,7 @@ fn item_module(w: &mut Buffer, cx: &mut Context<'_>, item: &clean::Item, items: }; write!( w, - "
\ + "
\ {name}\ {visibility_emoji}\ {unsafety_flag}\ @@ -448,8 +441,6 @@ fn item_module(w: &mut Buffer, cx: &mut Context<'_>, item: &clean::Item, items: visibility_emoji = visibility_emoji, stab_tags = extra_info_tags(myitem, item, cx.tcx()), class = myitem.type_(), - add = add, - stab = stab.unwrap_or_default(), unsafety_flag = unsafety_flag, href = item_path(myitem.type_(), myitem.name.unwrap().as_str()), title = [myitem.type_().to_string(), full_path(cx, myitem)] diff --git a/src/librustdoc/html/static/css/rustdoc.css b/src/librustdoc/html/static/css/rustdoc.css index c8ab3ef70d7b..ae7d65efa557 100644 --- a/src/librustdoc/html/static/css/rustdoc.css +++ b/src/librustdoc/html/static/css/rustdoc.css @@ -977,10 +977,6 @@ so that we can apply CSS-filters to change the arrow color in themes */ 0 -1px 0 black; } -.item-left.unstable { - opacity: 0.65; -} - .since { font-weight: normal; font-size: initial; diff --git a/tests/rustdoc/inline_cross/macros.rs b/tests/rustdoc/inline_cross/macros.rs index d5b0de5725bc..b11d5b6c4fa2 100644 --- a/tests/rustdoc/inline_cross/macros.rs +++ b/tests/rustdoc/inline_cross/macros.rs @@ -6,9 +6,9 @@ extern crate macros; -// @has foo/index.html '//*[@class="item-left unstable deprecated"]/span[@class="stab deprecated"]' \ +// @has foo/index.html '//*[@class="item-left"]/span[@class="stab deprecated"]' \ // Deprecated -// @has - '//*[@class="item-left unstable deprecated"]/span[@class="stab unstable"]' \ +// @has - '//*[@class="item-left"]/span[@class="stab unstable"]' \ // Experimental // @has foo/macro.my_macro.html diff --git a/tests/rustdoc/issue-32374.rs b/tests/rustdoc/issue-32374.rs index 8296d7a81f2b..1153a745b0bf 100644 --- a/tests/rustdoc/issue-32374.rs +++ b/tests/rustdoc/issue-32374.rs @@ -2,9 +2,9 @@ #![doc(issue_tracker_base_url = "https://issue_url/")] #![unstable(feature = "test", issue = "32374")] -// @matches issue_32374/index.html '//*[@class="item-left unstable deprecated"]/span[@class="stab deprecated"]' \ +// @matches issue_32374/index.html '//*[@class="item-left"]/span[@class="stab deprecated"]' \ // 'Deprecated' -// @matches issue_32374/index.html '//*[@class="item-left unstable deprecated"]/span[@class="stab unstable"]' \ +// @matches issue_32374/index.html '//*[@class="item-left"]/span[@class="stab unstable"]' \ // 'Experimental' // @matches issue_32374/index.html '//*[@class="item-right docblock-short"]/text()' 'Docs' diff --git a/tests/rustdoc/reexport-check.rs b/tests/rustdoc/reexport-check.rs index acac0c991971..94fa03385322 100644 --- a/tests/rustdoc/reexport-check.rs +++ b/tests/rustdoc/reexport-check.rs @@ -4,7 +4,6 @@ extern crate reexport_check; // @!has 'foo/index.html' '//code' 'pub use self::i32;' -// @has 'foo/index.html' '//div[@class="item-left deprecated"]' 'i32' // @has 'foo/i32/index.html' #[allow(deprecated, deprecated_in_future)] pub use std::i32; @@ -12,6 +11,9 @@ pub use std::i32; // @has 'foo/index.html' '//div[@class="item-left"]' 'String' pub use std::string::String; +// i32 is deprecated, String is not +// @count 'foo/index.html' '//span[@class="stab deprecated"]' 1 + // @has 'foo/index.html' '//div[@class="item-right docblock-short"]' 'Docs in original' // this is a no-op, but shows what happens if there's an attribute that isn't a doc-comment #[doc(inline)] From dfc4a7b2d02528f246e455f587605cce224bb99c Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Fri, 30 Sep 2022 14:54:30 +0200 Subject: [PATCH 60/69] make unaligned_reference a hard error --- compiler/rustc_error_codes/src/error_codes.rs | 3 +- .../src/error_codes/E0793.md | 64 ++++++ compiler/rustc_lint/src/lib.rs | 11 +- compiler/rustc_lint_defs/src/builtin.rs | 46 ---- .../src/check_packed_ref.rs | 43 ++-- .../unaligned_pointers/reference_to_packed.rs | 13 +- .../reference_to_packed.stderr | 4 +- tests/ui/binding/issue-53114-safety-checks.rs | 4 - .../binding/issue-53114-safety-checks.stderr | 92 ++------ .../diagnostics/repr_packed.rs | 1 - .../diagnostics/repr_packed.stderr | 20 +- .../ui/derives/deriving-with-repr-packed-2.rs | 2 - .../deriving-with-repr-packed-2.stderr | 4 +- tests/ui/derives/deriving-with-repr-packed.rs | 2 - .../derives/deriving-with-repr-packed.stderr | 6 +- tests/ui/lint/unaligned_references.rs | 11 - tests/ui/lint/unaligned_references.stderr | 213 ++---------------- .../unaligned_references_external_macro.rs | 1 - ...unaligned_references_external_macro.stderr | 47 +--- tests/ui/packed/issue-27060-rpass.rs | 23 -- tests/ui/packed/issue-27060-rpass.stderr | 68 ------ tests/ui/packed/issue-27060.rs | 4 - tests/ui/packed/issue-27060.stderr | 76 +------ .../packed-struct-borrow-element-64bit.rs | 5 +- .../packed-struct-borrow-element-64bit.stderr | 31 +-- .../ui/packed/packed-struct-borrow-element.rs | 8 +- .../packed-struct-borrow-element.stderr | 54 +---- 27 files changed, 170 insertions(+), 686 deletions(-) create mode 100644 compiler/rustc_error_codes/src/error_codes/E0793.md delete mode 100644 tests/ui/packed/issue-27060-rpass.rs delete mode 100644 tests/ui/packed/issue-27060-rpass.stderr diff --git a/compiler/rustc_error_codes/src/error_codes.rs b/compiler/rustc_error_codes/src/error_codes.rs index 4ae372bb9043..072b0f2fccea 100644 --- a/compiler/rustc_error_codes/src/error_codes.rs +++ b/compiler/rustc_error_codes/src/error_codes.rs @@ -5,7 +5,7 @@ // /!\ IMPORTANT /!\ // // Error messages' format must follow the RFC 1567 available here: -// https://github.com/rust-lang/rfcs/pull/1567 +// https://rust-lang.github.io/rfcs/1567-long-error-codes-explanation-normalization.html register_diagnostics! { E0001: include_str!("./error_codes/E0001.md"), @@ -510,6 +510,7 @@ E0789: include_str!("./error_codes/E0789.md"), E0790: include_str!("./error_codes/E0790.md"), E0791: include_str!("./error_codes/E0791.md"), E0792: include_str!("./error_codes/E0792.md"), +E0793: include_str!("./error_codes/E0793.md"), ; // E0006, // merged with E0005 // E0008, // cannot bind by-move into a pattern guard diff --git a/compiler/rustc_error_codes/src/error_codes/E0793.md b/compiler/rustc_error_codes/src/error_codes/E0793.md new file mode 100644 index 000000000000..b2e51e24e141 --- /dev/null +++ b/compiler/rustc_error_codes/src/error_codes/E0793.md @@ -0,0 +1,64 @@ +An unaligned references to a field of a [packed] struct got created. + +Erroneous code example: + +```compile_fail,E0793 +#[repr(packed)] +pub struct Foo { + field1: u64, + field2: u8, +} + +unsafe { + let foo = Foo { field1: 0, field2: 0 }; + // Accessing the field directly is fine. + let val = foo.field1; + // A reference to a packed field causes a error. + let val = &foo.field1; // ERROR + // An implicit `&` is added in format strings, causing the same error. + println!("{}", foo.field1); // ERROR +} +``` + +Creating a reference to an insufficiently aligned packed field is +[undefined behavior] and therefore disallowed. Using an `unsafe` block does not +change anything about this. Instead, the code should do a copy of the data in +the packed field or use raw pointers and unaligned accesses. + +``` +#[repr(packed)] +pub struct Foo { + field1: u64, + field2: u8, +} + +unsafe { + let foo = Foo { field1: 0, field2: 0 }; + + // Instead of a reference, we can create a raw pointer... + let ptr = std::ptr::addr_of!(foo.field1); + // ... and then (crucially!) access it in an explicitly unaligned way. + let val = unsafe { ptr.read_unaligned() }; + // This would *NOT* be correct: + // let val = unsafe { *ptr }; // Undefined Behavior due to unaligned load! + + // For formatting, we can create a copy to avoid the direct reference. + let copy = foo.field1; + println!("{}", copy); + // Creating a copy can be written in a single line with curly braces. + // (This is equivalent to the two lines above.) + println!("{}", { foo.field1 }); +} +``` + +### Additional information + +Note that this error is specifically about *references* to packed fields. +Direct by-value access of those fields is fine, since then the compiler has +enough information to generate the correct kind of access. + +See [issue #82523] for more information. + +[packed]: https://doc.rust-lang.org/reference/type-layout.html#the-alignment-modifiers +[undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html +[issue #82523]: https://github.com/rust-lang/rust/issues/82523 diff --git a/compiler/rustc_lint/src/lib.rs b/compiler/rustc_lint/src/lib.rs index ba15dbd86cfa..4ca37ef6850c 100644 --- a/compiler/rustc_lint/src/lib.rs +++ b/compiler/rustc_lint/src/lib.rs @@ -324,7 +324,6 @@ fn register_builtins(store: &mut LintStore) { store.register_renamed("exceeding_bitshifts", "arithmetic_overflow"); store.register_renamed("redundant_semicolon", "redundant_semicolons"); store.register_renamed("overlapping_patterns", "overlapping_range_endpoints"); - store.register_renamed("safe_packed_borrows", "unaligned_references"); store.register_renamed("disjoint_capture_migration", "rust_2021_incompatible_closure_captures"); store.register_renamed("or_patterns_back_compat", "rust_2021_incompatible_or_patterns"); store.register_renamed("non_fmt_panic", "non_fmt_panics"); @@ -487,6 +486,16 @@ fn register_builtins(store: &mut LintStore) { "converted into hard error, see issue #71800 \ for more information", ); + store.register_removed( + "safe_packed_borrows", + "converted into hard error, see issue #82523 \ + for more information", + ); + store.register_removed( + "unaligned_references", + "converted into hard error, see issue #82523 \ + for more information", + ); } fn register_internals(store: &mut LintStore) { diff --git a/compiler/rustc_lint_defs/src/builtin.rs b/compiler/rustc_lint_defs/src/builtin.rs index d731c10f46e2..7e9ba4cd22b8 100644 --- a/compiler/rustc_lint_defs/src/builtin.rs +++ b/compiler/rustc_lint_defs/src/builtin.rs @@ -1187,51 +1187,6 @@ declare_lint! { "lints that have been renamed or removed" } -declare_lint! { - /// The `unaligned_references` lint detects unaligned references to fields - /// of [packed] structs. - /// - /// [packed]: https://doc.rust-lang.org/reference/type-layout.html#the-alignment-modifiers - /// - /// ### Example - /// - /// ```rust,compile_fail - /// #[repr(packed)] - /// pub struct Foo { - /// field1: u64, - /// field2: u8, - /// } - /// - /// fn main() { - /// unsafe { - /// let foo = Foo { field1: 0, field2: 0 }; - /// let _ = &foo.field1; - /// println!("{}", foo.field1); // An implicit `&` is added here, triggering the lint. - /// } - /// } - /// ``` - /// - /// {{produces}} - /// - /// ### Explanation - /// - /// Creating a reference to an insufficiently aligned packed field is [undefined behavior] and - /// should be disallowed. Using an `unsafe` block does not change anything about this. Instead, - /// the code should do a copy of the data in the packed field or use raw pointers and unaligned - /// accesses. See [issue #82523] for more information. - /// - /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - /// [issue #82523]: https://github.com/rust-lang/rust/issues/82523 - pub UNALIGNED_REFERENCES, - Deny, - "detects unaligned references to fields of packed structs", - @future_incompatible = FutureIncompatibleInfo { - reference: "issue #82523 ", - reason: FutureIncompatibilityReason::FutureReleaseErrorReportNow, - }; - report_in_external_macro -} - declare_lint! { /// The `const_item_mutation` lint detects attempts to mutate a `const` /// item. @@ -3308,7 +3263,6 @@ declare_lint_pass! { PUB_USE_OF_PRIVATE_EXTERN_CRATE, INVALID_TYPE_PARAM_DEFAULT, RENAMED_AND_REMOVED_LINTS, - UNALIGNED_REFERENCES, CONST_ITEM_MUTATION, PATTERNS_IN_FNS_WITHOUT_BODY, MISSING_FRAGMENT_SPECIFIER, diff --git a/compiler/rustc_mir_transform/src/check_packed_ref.rs b/compiler/rustc_mir_transform/src/check_packed_ref.rs index 3e7571aa7a2e..9dc8dba23a4e 100644 --- a/compiler/rustc_mir_transform/src/check_packed_ref.rs +++ b/compiler/rustc_mir_transform/src/check_packed_ref.rs @@ -1,7 +1,7 @@ +use rustc_errors::struct_span_err; use rustc_middle::mir::visit::{PlaceContext, Visitor}; use rustc_middle::mir::*; use rustc_middle::ty::{self, TyCtxt}; -use rustc_session::lint::builtin::UNALIGNED_REFERENCES; use crate::util; use crate::MirLint; @@ -49,31 +49,22 @@ impl<'tcx> Visitor<'tcx> for PackedRefChecker<'_, 'tcx> { // shouldn't do. unreachable!(); } else { - let source_info = self.source_info; - let lint_root = self.body.source_scopes[source_info.scope] - .local_data - .as_ref() - .assert_crate_local() - .lint_root; - self.tcx.struct_span_lint_hir( - UNALIGNED_REFERENCES, - lint_root, - source_info.span, - "reference to packed field is unaligned", - |lint| { - lint - .note( - "fields of packed structs are not properly aligned, and creating \ - a misaligned reference is undefined behavior (even if that \ - reference is never dereferenced)", - ) - .help( - "copy the field contents to a local variable, or replace the \ - reference with a raw pointer and use `read_unaligned`/`write_unaligned` \ - (loads and stores via `*p` must be properly aligned even when using raw pointers)" - ) - }, - ); + struct_span_err!( + self.tcx.sess, + self.source_info.span, + E0793, + "reference to packed field is unaligned" + ) + .note( + "fields of packed structs are not properly aligned, and creating \ + a misaligned reference is undefined behavior (even if that \ + reference is never dereferenced)", + ).help( + "copy the field contents to a local variable, or replace the \ + reference with a raw pointer and use `read_unaligned`/`write_unaligned` \ + (loads and stores via `*p` must be properly aligned even when using raw pointers)" + ) + .emit(); } } } diff --git a/src/tools/miri/tests/fail/unaligned_pointers/reference_to_packed.rs b/src/tools/miri/tests/fail/unaligned_pointers/reference_to_packed.rs index a807200771d6..816b6ab9fb32 100644 --- a/src/tools/miri/tests/fail/unaligned_pointers/reference_to_packed.rs +++ b/src/tools/miri/tests/fail/unaligned_pointers/reference_to_packed.rs @@ -1,7 +1,9 @@ // This should fail even without validation/SB //@compile-flags: -Zmiri-disable-validation -Zmiri-disable-stacked-borrows -#![allow(dead_code, unused_variables, unaligned_references)] +#![allow(dead_code, unused_variables)] + +use std::{ptr, mem}; #[repr(packed)] struct Foo { @@ -9,11 +11,16 @@ struct Foo { y: i32, } +unsafe fn raw_to_ref<'a, T>(x: *const T) -> &'a T { + mem::transmute(x) +} + fn main() { // Try many times as this might work by chance. for _ in 0..20 { let foo = Foo { x: 42, y: 99 }; - let p = &foo.x; - let i = *p; //~ERROR: alignment 4 is required + // There seem to be implicit reborrows, which make the error already appear here + let p: &i32 = unsafe { raw_to_ref(ptr::addr_of!(foo.x)) }; //~ERROR: alignment 4 is required + let i = *p; } } diff --git a/src/tools/miri/tests/fail/unaligned_pointers/reference_to_packed.stderr b/src/tools/miri/tests/fail/unaligned_pointers/reference_to_packed.stderr index 6c2a3dca2dee..7c246706dba5 100644 --- a/src/tools/miri/tests/fail/unaligned_pointers/reference_to_packed.stderr +++ b/src/tools/miri/tests/fail/unaligned_pointers/reference_to_packed.stderr @@ -1,8 +1,8 @@ error: Undefined Behavior: accessing memory with alignment ALIGN, but alignment ALIGN is required --> $DIR/reference_to_packed.rs:LL:CC | -LL | let i = *p; - | ^^ accessing memory with alignment ALIGN, but alignment ALIGN is required +LL | let p: &i32 = unsafe { raw_to_ref(ptr::addr_of!(foo.x)) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ accessing memory with alignment ALIGN, but alignment ALIGN is required | = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information diff --git a/tests/ui/binding/issue-53114-safety-checks.rs b/tests/ui/binding/issue-53114-safety-checks.rs index d0eb28c57141..e234db516c7d 100644 --- a/tests/ui/binding/issue-53114-safety-checks.rs +++ b/tests/ui/binding/issue-53114-safety-checks.rs @@ -21,13 +21,11 @@ fn let_wild_gets_unsafe_field() { let u2 = U { a: I(1) }; let p = P { a: &2, b: &3 }; let _ = &p.b; //~ ERROR reference to packed field - //~^ WARN will become a hard error let _ = u1.a; // #53114: should eventually signal error as well let _ = &u2.a; //~ ERROR [E0133] // variation on above with `_` in substructure let (_,) = (&p.b,); //~ ERROR reference to packed field - //~^ WARN will become a hard error let (_,) = (u1.a,); //~ ERROR [E0133] let (_,) = (&u2.a,); //~ ERROR [E0133] } @@ -37,13 +35,11 @@ fn match_unsafe_field_to_wild() { let u2 = U { a: I(1) }; let p = P { a: &2, b: &3 }; match &p.b { _ => { } } //~ ERROR reference to packed field - //~^ WARN will become a hard error match u1.a { _ => { } } //~ ERROR [E0133] match &u2.a { _ => { } } //~ ERROR [E0133] // variation on above with `_` in substructure match (&p.b,) { (_,) => { } } //~ ERROR reference to packed field - //~^ WARN will become a hard error match (u1.a,) { (_,) => { } } //~ ERROR [E0133] match (&u2.a,) { (_,) => { } } //~ ERROR [E0133] } diff --git a/tests/ui/binding/issue-53114-safety-checks.stderr b/tests/ui/binding/issue-53114-safety-checks.stderr index 57a065d6d4d2..5c9d78772477 100644 --- a/tests/ui/binding/issue-53114-safety-checks.stderr +++ b/tests/ui/binding/issue-53114-safety-checks.stderr @@ -1,50 +1,41 @@ -error: reference to packed field is unaligned +error[E0793]: reference to packed field is unaligned --> $DIR/issue-53114-safety-checks.rs:23:13 | LL | let _ = &p.b; | ^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) - = note: `#[deny(unaligned_references)]` on by default -error: reference to packed field is unaligned - --> $DIR/issue-53114-safety-checks.rs:29:17 +error[E0793]: reference to packed field is unaligned + --> $DIR/issue-53114-safety-checks.rs:28:17 | LL | let (_,) = (&p.b,); | ^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -error: reference to packed field is unaligned - --> $DIR/issue-53114-safety-checks.rs:39:11 +error[E0793]: reference to packed field is unaligned + --> $DIR/issue-53114-safety-checks.rs:37:11 | LL | match &p.b { _ => { } } | ^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -error: reference to packed field is unaligned - --> $DIR/issue-53114-safety-checks.rs:45:12 +error[E0793]: reference to packed field is unaligned + --> $DIR/issue-53114-safety-checks.rs:42:12 | LL | match (&p.b,) { (_,) => { } } | ^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/issue-53114-safety-checks.rs:26:13 + --> $DIR/issue-53114-safety-checks.rs:25:13 | LL | let _ = &u2.a; | ^^^^^ access to union field @@ -52,7 +43,7 @@ LL | let _ = &u2.a; = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/issue-53114-safety-checks.rs:31:17 + --> $DIR/issue-53114-safety-checks.rs:29:17 | LL | let (_,) = (u1.a,); | ^^^^ access to union field @@ -60,7 +51,7 @@ LL | let (_,) = (u1.a,); = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/issue-53114-safety-checks.rs:32:17 + --> $DIR/issue-53114-safety-checks.rs:30:17 | LL | let (_,) = (&u2.a,); | ^^^^^ access to union field @@ -68,7 +59,7 @@ LL | let (_,) = (&u2.a,); = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/issue-53114-safety-checks.rs:41:11 + --> $DIR/issue-53114-safety-checks.rs:38:11 | LL | match u1.a { _ => { } } | ^^^^ access to union field @@ -76,7 +67,7 @@ LL | match u1.a { _ => { } } = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/issue-53114-safety-checks.rs:42:11 + --> $DIR/issue-53114-safety-checks.rs:39:11 | LL | match &u2.a { _ => { } } | ^^^^^ access to union field @@ -84,7 +75,7 @@ LL | match &u2.a { _ => { } } = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/issue-53114-safety-checks.rs:47:12 + --> $DIR/issue-53114-safety-checks.rs:43:12 | LL | match (u1.a,) { (_,) => { } } | ^^^^ access to union field @@ -92,7 +83,7 @@ LL | match (u1.a,) { (_,) => { } } = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/issue-53114-safety-checks.rs:48:12 + --> $DIR/issue-53114-safety-checks.rs:44:12 | LL | match (&u2.a,) { (_,) => { } } | ^^^^^ access to union field @@ -101,56 +92,5 @@ LL | match (&u2.a,) { (_,) => { } } error: aborting due to 11 previous errors -For more information about this error, try `rustc --explain E0133`. -Future incompatibility report: Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/issue-53114-safety-checks.rs:23:13 - | -LL | let _ = &p.b; - | ^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) - = note: `#[deny(unaligned_references)]` on by default - -Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/issue-53114-safety-checks.rs:29:17 - | -LL | let (_,) = (&p.b,); - | ^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) - = note: `#[deny(unaligned_references)]` on by default - -Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/issue-53114-safety-checks.rs:39:11 - | -LL | match &p.b { _ => { } } - | ^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) - = note: `#[deny(unaligned_references)]` on by default - -Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/issue-53114-safety-checks.rs:45:12 - | -LL | match (&p.b,) { (_,) => { } } - | ^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) - = note: `#[deny(unaligned_references)]` on by default - +Some errors have detailed explanations: E0133, E0793. +For more information about an error, try `rustc --explain E0133`. diff --git a/tests/ui/closures/2229_closure_analysis/diagnostics/repr_packed.rs b/tests/ui/closures/2229_closure_analysis/diagnostics/repr_packed.rs index 1488f329648b..c7ee90ea73fd 100644 --- a/tests/ui/closures/2229_closure_analysis/diagnostics/repr_packed.rs +++ b/tests/ui/closures/2229_closure_analysis/diagnostics/repr_packed.rs @@ -20,7 +20,6 @@ fn test_missing_unsafe_warning_on_repr_packed() { let c = || { println!("{}", foo.x); //~^ ERROR: reference to packed field is unaligned - //~| WARNING: this was previously accepted by the compiler but is being phased out let _z = foo.x; }; diff --git a/tests/ui/closures/2229_closure_analysis/diagnostics/repr_packed.stderr b/tests/ui/closures/2229_closure_analysis/diagnostics/repr_packed.stderr index 508c4b911b70..9c2c434572ae 100644 --- a/tests/ui/closures/2229_closure_analysis/diagnostics/repr_packed.stderr +++ b/tests/ui/closures/2229_closure_analysis/diagnostics/repr_packed.stderr @@ -1,29 +1,13 @@ -error: reference to packed field is unaligned +error[E0793]: reference to packed field is unaligned --> $DIR/repr_packed.rs:21:24 | LL | println!("{}", foo.x); | ^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) - = note: `#[deny(unaligned_references)]` on by default = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to previous error -Future incompatibility report: Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/repr_packed.rs:21:24 - | -LL | println!("{}", foo.x); - | ^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) - = note: `#[deny(unaligned_references)]` on by default - = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info) - +For more information about this error, try `rustc --explain E0793`. diff --git a/tests/ui/derives/deriving-with-repr-packed-2.rs b/tests/ui/derives/deriving-with-repr-packed-2.rs index cbd7432fce4e..79aca74dfd41 100644 --- a/tests/ui/derives/deriving-with-repr-packed-2.rs +++ b/tests/ui/derives/deriving-with-repr-packed-2.rs @@ -1,5 +1,3 @@ -#![deny(unaligned_references)] - // Check that deriving certain builtin traits on certain packed structs cause // errors. To avoid potentially misaligned references, field copies must be // used, which involves adding `T: Copy` bounds. diff --git a/tests/ui/derives/deriving-with-repr-packed-2.stderr b/tests/ui/derives/deriving-with-repr-packed-2.stderr index 83540739ee3d..ab3646057a55 100644 --- a/tests/ui/derives/deriving-with-repr-packed-2.stderr +++ b/tests/ui/derives/deriving-with-repr-packed-2.stderr @@ -1,5 +1,5 @@ error[E0599]: the method `clone` exists for struct `Foo`, but its trait bounds were not satisfied - --> $DIR/deriving-with-repr-packed-2.rs:20:11 + --> $DIR/deriving-with-repr-packed-2.rs:18:11 | LL | pub struct Foo(T, T, T); | ----------------- @@ -19,7 +19,7 @@ LL | _ = x.clone(); note: the following trait bounds were not satisfied: `NonCopy: Clone` `NonCopy: Copy` - --> $DIR/deriving-with-repr-packed-2.rs:7:16 + --> $DIR/deriving-with-repr-packed-2.rs:5:16 | LL | #[derive(Copy, Clone, Default, PartialEq, Eq)] | ^^^^^ unsatisfied trait bound introduced in this `derive` macro diff --git a/tests/ui/derives/deriving-with-repr-packed.rs b/tests/ui/derives/deriving-with-repr-packed.rs index eddf41f55536..afa91da133dc 100644 --- a/tests/ui/derives/deriving-with-repr-packed.rs +++ b/tests/ui/derives/deriving-with-repr-packed.rs @@ -1,5 +1,3 @@ -#![deny(unaligned_references)] - // Check that deriving certain builtin traits on certain packed structs cause // errors. To avoid potentially misaligned references, field copies must be // used, which involves adding `T: Copy` bounds. diff --git a/tests/ui/derives/deriving-with-repr-packed.stderr b/tests/ui/derives/deriving-with-repr-packed.stderr index 2cb2a696d974..7ed84af91bdc 100644 --- a/tests/ui/derives/deriving-with-repr-packed.stderr +++ b/tests/ui/derives/deriving-with-repr-packed.stderr @@ -1,5 +1,5 @@ warning: byte slice in a packed struct that derives a built-in trait - --> $DIR/deriving-with-repr-packed.rs:33:5 + --> $DIR/deriving-with-repr-packed.rs:31:5 | LL | #[derive(Debug)] | ----- in this derive macro expansion @@ -14,7 +14,7 @@ LL | data: [u8], = note: this warning originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info) error[E0507]: cannot move out of `self` which is behind a shared reference - --> $DIR/deriving-with-repr-packed.rs:24:10 + --> $DIR/deriving-with-repr-packed.rs:22:10 | LL | #[derive(Debug, Default)] | ----- in this derive macro expansion @@ -29,7 +29,7 @@ error: aborting due to previous error; 1 warning emitted For more information about this error, try `rustc --explain E0507`. Future incompatibility report: Future breakage diagnostic: warning: byte slice in a packed struct that derives a built-in trait - --> $DIR/deriving-with-repr-packed.rs:33:5 + --> $DIR/deriving-with-repr-packed.rs:31:5 | LL | #[derive(Debug)] | ----- in this derive macro expansion diff --git a/tests/ui/lint/unaligned_references.rs b/tests/ui/lint/unaligned_references.rs index e547f031a9cf..04b66885e852 100644 --- a/tests/ui/lint/unaligned_references.rs +++ b/tests/ui/lint/unaligned_references.rs @@ -1,5 +1,3 @@ -#![deny(unaligned_references)] - #[repr(packed)] pub struct Good { data: u64, @@ -20,20 +18,14 @@ fn main() { let good = Good { data: 0, ptr: &0, data2: [0, 0], aligned: [0; 32] }; let _ = &good.ptr; //~ ERROR reference to packed field - //~^ previously accepted let _ = &good.data; //~ ERROR reference to packed field - //~^ previously accepted // Error even when turned into raw pointer immediately. let _ = &good.data as *const _; //~ ERROR reference to packed field - //~^ previously accepted let _: *const _ = &good.data; //~ ERROR reference to packed field - //~^ previously accepted // Error on method call. let _ = good.data.clone(); //~ ERROR reference to packed field - //~^ previously accepted // Error for nested fields. let _ = &good.data2[0]; //~ ERROR reference to packed field - //~^ previously accepted let _ = &*good.ptr; // ok, behind a pointer let _ = &good.aligned; // ok, has align 1 @@ -43,7 +35,6 @@ fn main() { unsafe { let packed2 = Packed2 { x: 0, y: 0, z: 0 }; let _ = &packed2.x; //~ ERROR reference to packed field - //~^ previously accepted let _ = &packed2.y; // ok, has align 2 in packed(2) struct let _ = &packed2.z; // ok, has align 1 } @@ -88,7 +79,6 @@ fn main() { }, ); let _ref = &m1.1.a; //~ ERROR reference to packed field - //~^ previously accepted let m2 = Misalign( 0, @@ -98,6 +88,5 @@ fn main() { }, ); let _ref = &m2.1.a; //~ ERROR reference to packed field - //~^ previously accepted } } diff --git a/tests/ui/lint/unaligned_references.stderr b/tests/ui/lint/unaligned_references.stderr index 346f49b921e5..07b59464bdec 100644 --- a/tests/ui/lint/unaligned_references.stderr +++ b/tests/ui/lint/unaligned_references.stderr @@ -1,259 +1,84 @@ -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:22:17 +error[E0793]: reference to packed field is unaligned + --> $DIR/unaligned_references.rs:20:17 | LL | let _ = &good.ptr; | ^^^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/unaligned_references.rs:1:9 - | -LL | #![deny(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:24:17 +error[E0793]: reference to packed field is unaligned + --> $DIR/unaligned_references.rs:21:17 | LL | let _ = &good.data; | ^^^^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:27:17 +error[E0793]: reference to packed field is unaligned + --> $DIR/unaligned_references.rs:23:17 | LL | let _ = &good.data as *const _; | ^^^^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:29:27 +error[E0793]: reference to packed field is unaligned + --> $DIR/unaligned_references.rs:24:27 | LL | let _: *const _ = &good.data; | ^^^^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:32:17 +error[E0793]: reference to packed field is unaligned + --> $DIR/unaligned_references.rs:26:17 | LL | let _ = good.data.clone(); | ^^^^^^^^^^^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:35:17 +error[E0793]: reference to packed field is unaligned + --> $DIR/unaligned_references.rs:28:17 | LL | let _ = &good.data2[0]; | ^^^^^^^^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:45:17 +error[E0793]: reference to packed field is unaligned + --> $DIR/unaligned_references.rs:37:17 | LL | let _ = &packed2.x; | ^^^^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:90:20 +error[E0793]: reference to packed field is unaligned + --> $DIR/unaligned_references.rs:81:20 | LL | let _ref = &m1.1.a; | ^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:100:20 +error[E0793]: reference to packed field is unaligned + --> $DIR/unaligned_references.rs:90:20 | LL | let _ref = &m2.1.a; | ^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) error: aborting due to 9 previous errors -Future incompatibility report: Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:22:17 - | -LL | let _ = &good.ptr; - | ^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/unaligned_references.rs:1:9 - | -LL | #![deny(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ - -Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:24:17 - | -LL | let _ = &good.data; - | ^^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/unaligned_references.rs:1:9 - | -LL | #![deny(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ - -Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:27:17 - | -LL | let _ = &good.data as *const _; - | ^^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/unaligned_references.rs:1:9 - | -LL | #![deny(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ - -Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:29:27 - | -LL | let _: *const _ = &good.data; - | ^^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/unaligned_references.rs:1:9 - | -LL | #![deny(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ - -Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:32:17 - | -LL | let _ = good.data.clone(); - | ^^^^^^^^^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/unaligned_references.rs:1:9 - | -LL | #![deny(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ - -Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:35:17 - | -LL | let _ = &good.data2[0]; - | ^^^^^^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/unaligned_references.rs:1:9 - | -LL | #![deny(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ - -Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:45:17 - | -LL | let _ = &packed2.x; - | ^^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/unaligned_references.rs:1:9 - | -LL | #![deny(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ - -Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:90:20 - | -LL | let _ref = &m1.1.a; - | ^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/unaligned_references.rs:1:9 - | -LL | #![deny(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ - -Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/unaligned_references.rs:100:20 - | -LL | let _ref = &m2.1.a; - | ^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/unaligned_references.rs:1:9 - | -LL | #![deny(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ - +For more information about this error, try `rustc --explain E0793`. diff --git a/tests/ui/lint/unaligned_references_external_macro.rs b/tests/ui/lint/unaligned_references_external_macro.rs index cb597c38e779..b655a2a8f63a 100644 --- a/tests/ui/lint/unaligned_references_external_macro.rs +++ b/tests/ui/lint/unaligned_references_external_macro.rs @@ -3,7 +3,6 @@ extern crate unaligned_references_external_crate; unaligned_references_external_crate::mac! { //~ERROR reference to packed field is unaligned - //~^ previously accepted #[repr(packed)] pub struct X { pub field: u16 diff --git a/tests/ui/lint/unaligned_references_external_macro.stderr b/tests/ui/lint/unaligned_references_external_macro.stderr index c46ca6742a50..5b08f433e328 100644 --- a/tests/ui/lint/unaligned_references_external_macro.stderr +++ b/tests/ui/lint/unaligned_references_external_macro.stderr @@ -1,8 +1,7 @@ -error: reference to packed field is unaligned +error[E0793]: reference to packed field is unaligned --> $DIR/unaligned_references_external_macro.rs:5:1 | LL | / unaligned_references_external_crate::mac! { -LL | | LL | | #[repr(packed)] LL | | pub struct X { LL | | pub field: u16 @@ -10,52 +9,10 @@ LL | | } LL | | } | |_^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/unaligned_references_external_macro.rs:5:1 - | -LL | / unaligned_references_external_crate::mac! { -LL | | -LL | | #[repr(packed)] -LL | | pub struct X { -LL | | pub field: u16 -LL | | } -LL | | } - | |_^ = note: this error originates in the macro `unaligned_references_external_crate::mac` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to previous error -Future incompatibility report: Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/unaligned_references_external_macro.rs:5:1 - | -LL | / unaligned_references_external_crate::mac! { -LL | | -LL | | #[repr(packed)] -LL | | pub struct X { -LL | | pub field: u16 -LL | | } -LL | | } - | |_^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/unaligned_references_external_macro.rs:5:1 - | -LL | / unaligned_references_external_crate::mac! { -LL | | -LL | | #[repr(packed)] -LL | | pub struct X { -LL | | pub field: u16 -LL | | } -LL | | } - | |_^ - = note: this error originates in the macro `unaligned_references_external_crate::mac` (in Nightly builds, run with -Z macro-backtrace for more info) - +For more information about this error, try `rustc --explain E0793`. diff --git a/tests/ui/packed/issue-27060-rpass.rs b/tests/ui/packed/issue-27060-rpass.rs deleted file mode 100644 index d9159f6669d6..000000000000 --- a/tests/ui/packed/issue-27060-rpass.rs +++ /dev/null @@ -1,23 +0,0 @@ -// run-pass -#![allow(dead_code)] -#[repr(packed)] -pub struct Good { - data: &'static u32, - data2: [&'static u32; 2], - aligned: [u8; 32], -} - -// kill this test when that turns to a hard error -#[allow(unaligned_references)] -fn main() { - let good = Good { data: &0, data2: [&0, &0], aligned: [0; 32] }; - - let _ = &good.data; // ok - let _ = &good.data2[0]; // ok - - let _ = &good.data; - let _ = &good.data2[0]; - let _ = &*good.data; // ok, behind a pointer - let _ = &good.aligned; // ok, has align 1 - let _ = &good.aligned[2]; // ok, has align 1 -} diff --git a/tests/ui/packed/issue-27060-rpass.stderr b/tests/ui/packed/issue-27060-rpass.stderr deleted file mode 100644 index adf9ae9f56f5..000000000000 --- a/tests/ui/packed/issue-27060-rpass.stderr +++ /dev/null @@ -1,68 +0,0 @@ -Future incompatibility report: Future breakage diagnostic: -warning: reference to packed field is unaligned - --> $DIR/issue-27060-rpass.rs:15:13 - | -LL | let _ = &good.data; // ok - | ^^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/issue-27060-rpass.rs:11:9 - | -LL | #[allow(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ - -Future breakage diagnostic: -warning: reference to packed field is unaligned - --> $DIR/issue-27060-rpass.rs:16:13 - | -LL | let _ = &good.data2[0]; // ok - | ^^^^^^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/issue-27060-rpass.rs:11:9 - | -LL | #[allow(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ - -Future breakage diagnostic: -warning: reference to packed field is unaligned - --> $DIR/issue-27060-rpass.rs:18:13 - | -LL | let _ = &good.data; - | ^^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/issue-27060-rpass.rs:11:9 - | -LL | #[allow(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ - -Future breakage diagnostic: -warning: reference to packed field is unaligned - --> $DIR/issue-27060-rpass.rs:19:13 - | -LL | let _ = &good.data2[0]; - | ^^^^^^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/issue-27060-rpass.rs:11:9 - | -LL | #[allow(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ - diff --git a/tests/ui/packed/issue-27060.rs b/tests/ui/packed/issue-27060.rs index 886a00239f98..a0e944caa0b5 100644 --- a/tests/ui/packed/issue-27060.rs +++ b/tests/ui/packed/issue-27060.rs @@ -13,14 +13,10 @@ fn main() { }; let _ = &good.data; //~ ERROR reference to packed field - //~| hard error let _ = &good.data2[0]; //~ ERROR reference to packed field - //~| hard error let _ = &good.data; //~ ERROR reference to packed field - //~| hard error let _ = &good.data2[0]; //~ ERROR reference to packed field - //~| hard error let _ = &*good.data; // ok, behind a pointer let _ = &good.aligned; // ok, has align 1 let _ = &good.aligned[2]; // ok, has align 1 diff --git a/tests/ui/packed/issue-27060.stderr b/tests/ui/packed/issue-27060.stderr index 85e08fa02dd1..b4753284f725 100644 --- a/tests/ui/packed/issue-27060.stderr +++ b/tests/ui/packed/issue-27060.stderr @@ -1,99 +1,39 @@ -error: reference to packed field is unaligned +error[E0793]: reference to packed field is unaligned --> $DIR/issue-27060.rs:15:13 | LL | let _ = &good.data; | ^^^^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) - = note: `#[deny(unaligned_references)]` on by default -error: reference to packed field is unaligned - --> $DIR/issue-27060.rs:17:13 +error[E0793]: reference to packed field is unaligned + --> $DIR/issue-27060.rs:16:13 | LL | let _ = &good.data2[0]; | ^^^^^^^^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -error: reference to packed field is unaligned - --> $DIR/issue-27060.rs:20:13 +error[E0793]: reference to packed field is unaligned + --> $DIR/issue-27060.rs:18:13 | LL | let _ = &good.data; | ^^^^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -error: reference to packed field is unaligned - --> $DIR/issue-27060.rs:22:13 +error[E0793]: reference to packed field is unaligned + --> $DIR/issue-27060.rs:19:13 | LL | let _ = &good.data2[0]; | ^^^^^^^^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) error: aborting due to 4 previous errors -Future incompatibility report: Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/issue-27060.rs:15:13 - | -LL | let _ = &good.data; - | ^^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) - = note: `#[deny(unaligned_references)]` on by default - -Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/issue-27060.rs:17:13 - | -LL | let _ = &good.data2[0]; - | ^^^^^^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) - = note: `#[deny(unaligned_references)]` on by default - -Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/issue-27060.rs:20:13 - | -LL | let _ = &good.data; - | ^^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) - = note: `#[deny(unaligned_references)]` on by default - -Future breakage diagnostic: -error: reference to packed field is unaligned - --> $DIR/issue-27060.rs:22:13 - | -LL | let _ = &good.data2[0]; - | ^^^^^^^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) - = note: `#[deny(unaligned_references)]` on by default - +For more information about this error, try `rustc --explain E0793`. diff --git a/tests/ui/packed/packed-struct-borrow-element-64bit.rs b/tests/ui/packed/packed-struct-borrow-element-64bit.rs index 00bddfe40b25..63315ea66737 100644 --- a/tests/ui/packed/packed-struct-borrow-element-64bit.rs +++ b/tests/ui/packed/packed-struct-borrow-element-64bit.rs @@ -1,4 +1,3 @@ -// run-pass (note: this is spec-UB, but it works for now) // ignore-32bit (needs `usize` to be 8-aligned to reproduce all the errors below) #![allow(dead_code)] // ignore-emscripten weird assertion? @@ -9,10 +8,8 @@ struct Foo4C { baz: usize } -#[warn(unaligned_references)] pub fn main() { let foo = Foo4C { bar: 1, baz: 2 }; - let brw = &foo.baz; //~WARN reference to packed field is unaligned - //~^ previously accepted + let brw = &foo.baz; //~ERROR reference to packed field is unaligned assert_eq!(*brw, 2); } diff --git a/tests/ui/packed/packed-struct-borrow-element-64bit.stderr b/tests/ui/packed/packed-struct-borrow-element-64bit.stderr index fb2f5615c539..32943b0f07b8 100644 --- a/tests/ui/packed/packed-struct-borrow-element-64bit.stderr +++ b/tests/ui/packed/packed-struct-borrow-element-64bit.stderr @@ -1,35 +1,12 @@ -warning: reference to packed field is unaligned - --> $DIR/packed-struct-borrow-element-64bit.rs:15:15 +error[E0793]: reference to packed field is unaligned + --> $DIR/packed-struct-borrow-element-64bit.rs:13:15 | LL | let brw = &foo.baz; | ^^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/packed-struct-borrow-element-64bit.rs:12:8 - | -LL | #[warn(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ -warning: 1 warning emitted - -Future incompatibility report: Future breakage diagnostic: -warning: reference to packed field is unaligned - --> $DIR/packed-struct-borrow-element-64bit.rs:15:15 - | -LL | let brw = &foo.baz; - | ^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/packed-struct-borrow-element-64bit.rs:12:8 - | -LL | #[warn(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ +error: aborting due to previous error +For more information about this error, try `rustc --explain E0793`. diff --git a/tests/ui/packed/packed-struct-borrow-element.rs b/tests/ui/packed/packed-struct-borrow-element.rs index a6ee90cef44f..6cbeca44bbcb 100644 --- a/tests/ui/packed/packed-struct-borrow-element.rs +++ b/tests/ui/packed/packed-struct-borrow-element.rs @@ -1,4 +1,3 @@ -// run-pass (note: this is spec-UB, but it works for now) #![allow(dead_code)] // ignore-emscripten weird assertion? @@ -20,15 +19,12 @@ struct Foo4C { baz: usize } -#[warn(unaligned_references)] pub fn main() { let foo = Foo1 { bar: 1, baz: 2 }; - let brw = &foo.baz; //~WARN reference to packed field is unaligned - //~^ previously accepted + let brw = &foo.baz; //~ERROR reference to packed field is unaligned assert_eq!(*brw, 2); let foo = Foo2 { bar: 1, baz: 2 }; - let brw = &foo.baz; //~WARN reference to packed field is unaligned - //~^ previously accepted + let brw = &foo.baz; //~ERROR reference to packed field is unaligned assert_eq!(*brw, 2); } diff --git a/tests/ui/packed/packed-struct-borrow-element.stderr b/tests/ui/packed/packed-struct-borrow-element.stderr index 75d55c4f6930..29d867fc5b9a 100644 --- a/tests/ui/packed/packed-struct-borrow-element.stderr +++ b/tests/ui/packed/packed-struct-borrow-element.stderr @@ -1,63 +1,21 @@ -warning: reference to packed field is unaligned - --> $DIR/packed-struct-borrow-element.rs:26:15 +error[E0793]: reference to packed field is unaligned + --> $DIR/packed-struct-borrow-element.rs:24:15 | LL | let brw = &foo.baz; | ^^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/packed-struct-borrow-element.rs:23:8 - | -LL | #[warn(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ -warning: reference to packed field is unaligned - --> $DIR/packed-struct-borrow-element.rs:31:15 +error[E0793]: reference to packed field is unaligned + --> $DIR/packed-struct-borrow-element.rs:28:15 | LL | let brw = &foo.baz; | ^^^^^^^^ | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -warning: 2 warnings emitted - -Future incompatibility report: Future breakage diagnostic: -warning: reference to packed field is unaligned - --> $DIR/packed-struct-borrow-element.rs:26:15 - | -LL | let brw = &foo.baz; - | ^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/packed-struct-borrow-element.rs:23:8 - | -LL | #[warn(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ - -Future breakage diagnostic: -warning: reference to packed field is unaligned - --> $DIR/packed-struct-borrow-element.rs:31:15 - | -LL | let brw = &foo.baz; - | ^^^^^^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #82523 - = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) - = help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers) -note: the lint level is defined here - --> $DIR/packed-struct-borrow-element.rs:23:8 - | -LL | #[warn(unaligned_references)] - | ^^^^^^^^^^^^^^^^^^^^ +error: aborting due to 2 previous errors +For more information about this error, try `rustc --explain E0793`. From a37b3061fce5a56d0ed11c79e2c887ab8aa56827 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Tue, 31 Jan 2023 15:59:29 -0500 Subject: [PATCH 61/69] Extend `-Z print-type-sizes` to distinguish generator upvars and locals from "normal" ADT fields. --- compiler/rustc_session/src/code_stats.rs | 26 ++++++++++++++++++++---- compiler/rustc_session/src/session.rs | 2 +- compiler/rustc_ty_utils/src/layout.rs | 5 ++++- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/compiler/rustc_session/src/code_stats.rs b/compiler/rustc_session/src/code_stats.rs index 1085bce44758..f0cd7d9322be 100644 --- a/compiler/rustc_session/src/code_stats.rs +++ b/compiler/rustc_session/src/code_stats.rs @@ -19,8 +19,26 @@ pub enum SizeKind { Min, } +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub enum FieldKind { + AdtField, + Upvar, + GeneratorLocal, +} + +impl std::fmt::Display for FieldKind { + fn fmt(&self, w: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + FieldKind::AdtField => { write!(w, "field") } + FieldKind::Upvar => { write!(w, "upvar") } + FieldKind::GeneratorLocal => { write!(w, "local") } + } + } +} + #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] pub struct FieldInfo { + pub kind: FieldKind, pub name: Symbol, pub offset: u64, pub size: u64, @@ -145,7 +163,7 @@ impl CodeStats { fields.sort_by_key(|f| (f.offset, f.size)); for field in fields { - let FieldInfo { ref name, offset, size, align } = field; + let FieldInfo { kind, ref name, offset, size, align } = field; if offset > min_offset { let pad = offset - min_offset; @@ -155,16 +173,16 @@ impl CodeStats { if offset < min_offset { // If this happens it's probably a union. println!( - "print-type-size {indent}field `.{name}`: {size} bytes, \ + "print-type-size {indent}{kind} `.{name}`: {size} bytes, \ offset: {offset} bytes, \ alignment: {align} bytes" ); } else if info.packed || offset == min_offset { - println!("print-type-size {indent}field `.{name}`: {size} bytes"); + println!("print-type-size {indent}{kind} `.{name}`: {size} bytes"); } else { // Include field alignment in output only if it caused padding injection println!( - "print-type-size {indent}field `.{name}`: {size} bytes, \ + "print-type-size {indent}{kind} `.{name}`: {size} bytes, \ alignment: {align} bytes" ); } diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs index 91d23f1041fe..7cf9b0fd1fa0 100644 --- a/compiler/rustc_session/src/session.rs +++ b/compiler/rustc_session/src/session.rs @@ -1,6 +1,6 @@ use crate::cgu_reuse_tracker::CguReuseTracker; use crate::code_stats::CodeStats; -pub use crate::code_stats::{DataTypeKind, FieldInfo, SizeKind, VariantInfo}; +pub use crate::code_stats::{DataTypeKind, FieldInfo, FieldKind, SizeKind, VariantInfo}; use crate::config::Input; use crate::config::{self, CrateType, InstrumentCoverage, OptLevel, OutputType, SwitchWithOptPath}; use crate::errors::{ diff --git a/compiler/rustc_ty_utils/src/layout.rs b/compiler/rustc_ty_utils/src/layout.rs index 378cd5a99ed8..93c9c675c9a6 100644 --- a/compiler/rustc_ty_utils/src/layout.rs +++ b/compiler/rustc_ty_utils/src/layout.rs @@ -9,7 +9,7 @@ use rustc_middle::ty::layout::{ use rustc_middle::ty::{ self, subst::SubstsRef, AdtDef, EarlyBinder, ReprOptions, Ty, TyCtxt, TypeVisitable, }; -use rustc_session::{DataTypeKind, FieldInfo, SizeKind, VariantInfo}; +use rustc_session::{DataTypeKind, FieldInfo, FieldKind, SizeKind, VariantInfo}; use rustc_span::symbol::Symbol; use rustc_span::DUMMY_SP; use rustc_target::abi::*; @@ -881,6 +881,7 @@ fn variant_info_for_adt<'tcx>( let offset = layout.fields.offset(i); min_size = min_size.max(offset + field_layout.size); FieldInfo { + kind: FieldKind::AdtField, name, offset: offset.bytes(), size: field_layout.size.bytes(), @@ -960,6 +961,7 @@ fn variant_info_for_generator<'tcx>( let offset = layout.fields.offset(field_idx); upvars_size = upvars_size.max(offset + field_layout.size); FieldInfo { + kind: FieldKind::Upvar, name: Symbol::intern(&name), offset: offset.bytes(), size: field_layout.size.bytes(), @@ -983,6 +985,7 @@ fn variant_info_for_generator<'tcx>( // The struct is as large as the last field's end variant_size = variant_size.max(offset + field_layout.size); FieldInfo { + kind: FieldKind::GeneratorLocal, name: state_specific_names.get(*local).copied().flatten().unwrap_or( Symbol::intern(&format!(".generator_field{}", local.as_usize())), ), From 943f833314575f0e72b3af287258a49d73ee30e0 Mon Sep 17 00:00:00 2001 From: Daniel Chmielewski Date: Tue, 31 Jan 2023 21:04:49 +0000 Subject: [PATCH 62/69] Replace unwrap with ? in TcpListener doc --- library/std/src/net/tcp.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/std/src/net/tcp.rs b/library/std/src/net/tcp.rs index 69b72a81c5b6..ac09a805975e 100644 --- a/library/std/src/net/tcp.rs +++ b/library/std/src/net/tcp.rs @@ -829,7 +829,7 @@ impl TcpListener { /// } /// /// fn main() -> std::io::Result<()> { - /// let listener = TcpListener::bind("127.0.0.1:80").unwrap(); + /// let listener = TcpListener::bind("127.0.0.1:80")?; /// /// for stream in listener.incoming() { /// match stream { From 91f1b224eeff3471dc77defc0a7a3b3eecf11abb Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Tue, 31 Jan 2023 17:08:17 -0500 Subject: [PATCH 63/69] placate tidy. --- compiler/rustc_session/src/code_stats.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/compiler/rustc_session/src/code_stats.rs b/compiler/rustc_session/src/code_stats.rs index f0cd7d9322be..87dfccdef2f1 100644 --- a/compiler/rustc_session/src/code_stats.rs +++ b/compiler/rustc_session/src/code_stats.rs @@ -29,9 +29,9 @@ pub enum FieldKind { impl std::fmt::Display for FieldKind { fn fmt(&self, w: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - FieldKind::AdtField => { write!(w, "field") } - FieldKind::Upvar => { write!(w, "upvar") } - FieldKind::GeneratorLocal => { write!(w, "local") } + FieldKind::AdtField => write!(w, "field"), + FieldKind::Upvar => write!(w, "upvar"), + FieldKind::GeneratorLocal => write!(w, "local"), } } } From 2fbe9274aae88709cb7aefada157c47e4232e2eb Mon Sep 17 00:00:00 2001 From: Lukas Markeffsky <@> Date: Sun, 29 Jan 2023 14:33:57 +0100 Subject: [PATCH 64/69] improve panic message for slice windows and chunks --- library/core/src/slice/mod.rs | 48 +++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/library/core/src/slice/mod.rs b/library/core/src/slice/mod.rs index d93a3a57ecd2..6ea16bf64307 100644 --- a/library/core/src/slice/mod.rs +++ b/library/core/src/slice/mod.rs @@ -805,8 +805,9 @@ impl [T] { /// ``` #[stable(feature = "rust1", since = "1.0.0")] #[inline] + #[track_caller] pub fn windows(&self, size: usize) -> Windows<'_, T> { - let size = NonZeroUsize::new(size).expect("size is zero"); + let size = NonZeroUsize::new(size).expect("window size must be non-zero"); Windows::new(self, size) } @@ -839,8 +840,9 @@ impl [T] { /// [`rchunks`]: slice::rchunks #[stable(feature = "rust1", since = "1.0.0")] #[inline] + #[track_caller] pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T> { - assert_ne!(chunk_size, 0, "chunks cannot have a size of zero"); + assert!(chunk_size != 0, "chunk size must be non-zero"); Chunks::new(self, chunk_size) } @@ -877,8 +879,9 @@ impl [T] { /// [`rchunks_mut`]: slice::rchunks_mut #[stable(feature = "rust1", since = "1.0.0")] #[inline] + #[track_caller] pub fn chunks_mut(&mut self, chunk_size: usize) -> ChunksMut<'_, T> { - assert_ne!(chunk_size, 0, "chunks cannot have a size of zero"); + assert!(chunk_size != 0, "chunk size must be non-zero"); ChunksMut::new(self, chunk_size) } @@ -914,8 +917,9 @@ impl [T] { /// [`rchunks_exact`]: slice::rchunks_exact #[stable(feature = "chunks_exact", since = "1.31.0")] #[inline] + #[track_caller] pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T> { - assert_ne!(chunk_size, 0, "chunks cannot have a size of zero"); + assert!(chunk_size != 0, "chunk size must be non-zero"); ChunksExact::new(self, chunk_size) } @@ -956,8 +960,9 @@ impl [T] { /// [`rchunks_exact_mut`]: slice::rchunks_exact_mut #[stable(feature = "chunks_exact", since = "1.31.0")] #[inline] + #[track_caller] pub fn chunks_exact_mut(&mut self, chunk_size: usize) -> ChunksExactMut<'_, T> { - assert_ne!(chunk_size, 0, "chunks cannot have a size of zero"); + assert!(chunk_size != 0, "chunk size must be non-zero"); ChunksExactMut::new(self, chunk_size) } @@ -1037,9 +1042,10 @@ impl [T] { /// ``` #[unstable(feature = "slice_as_chunks", issue = "74985")] #[inline] + #[track_caller] #[must_use] pub fn as_chunks(&self) -> (&[[T; N]], &[T]) { - assert_ne!(N, 0, "chunks cannot have a size of zero"); + assert!(N != 0, "chunk size must be non-zero"); let len = self.len() / N; let (multiple_of_n, remainder) = self.split_at(len * N); // SAFETY: We already panicked for zero, and ensured by construction @@ -1068,9 +1074,10 @@ impl [T] { /// ``` #[unstable(feature = "slice_as_chunks", issue = "74985")] #[inline] + #[track_caller] #[must_use] pub fn as_rchunks(&self) -> (&[T], &[[T; N]]) { - assert_ne!(N, 0, "chunks cannot have a size of zero"); + assert!(N != 0, "chunk size must be non-zero"); let len = self.len() / N; let (remainder, multiple_of_n) = self.split_at(self.len() - len * N); // SAFETY: We already panicked for zero, and ensured by construction @@ -1108,8 +1115,9 @@ impl [T] { /// [`chunks_exact`]: slice::chunks_exact #[unstable(feature = "array_chunks", issue = "74985")] #[inline] + #[track_caller] pub fn array_chunks(&self) -> ArrayChunks<'_, T, N> { - assert_ne!(N, 0, "chunks cannot have a size of zero"); + assert!(N != 0, "chunk size must be non-zero"); ArrayChunks::new(self) } @@ -1186,9 +1194,10 @@ impl [T] { /// ``` #[unstable(feature = "slice_as_chunks", issue = "74985")] #[inline] + #[track_caller] #[must_use] pub fn as_chunks_mut(&mut self) -> (&mut [[T; N]], &mut [T]) { - assert_ne!(N, 0, "chunks cannot have a size of zero"); + assert!(N != 0, "chunk size must be non-zero"); let len = self.len() / N; let (multiple_of_n, remainder) = self.split_at_mut(len * N); // SAFETY: We already panicked for zero, and ensured by construction @@ -1223,9 +1232,10 @@ impl [T] { /// ``` #[unstable(feature = "slice_as_chunks", issue = "74985")] #[inline] + #[track_caller] #[must_use] pub fn as_rchunks_mut(&mut self) -> (&mut [T], &mut [[T; N]]) { - assert_ne!(N, 0, "chunks cannot have a size of zero"); + assert!(N != 0, "chunk size must be non-zero"); let len = self.len() / N; let (remainder, multiple_of_n) = self.split_at_mut(self.len() - len * N); // SAFETY: We already panicked for zero, and ensured by construction @@ -1265,8 +1275,9 @@ impl [T] { /// [`chunks_exact_mut`]: slice::chunks_exact_mut #[unstable(feature = "array_chunks", issue = "74985")] #[inline] + #[track_caller] pub fn array_chunks_mut(&mut self) -> ArrayChunksMut<'_, T, N> { - assert_ne!(N, 0, "chunks cannot have a size of zero"); + assert!(N != 0, "chunk size must be non-zero"); ArrayChunksMut::new(self) } @@ -1297,8 +1308,9 @@ impl [T] { /// [`windows`]: slice::windows #[unstable(feature = "array_windows", issue = "75027")] #[inline] + #[track_caller] pub fn array_windows(&self) -> ArrayWindows<'_, T, N> { - assert_ne!(N, 0, "windows cannot have a size of zero"); + assert!(N != 0, "window size must be non-zero"); ArrayWindows::new(self) } @@ -1331,8 +1343,9 @@ impl [T] { /// [`chunks`]: slice::chunks #[stable(feature = "rchunks", since = "1.31.0")] #[inline] + #[track_caller] pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T> { - assert!(chunk_size != 0); + assert!(chunk_size != 0, "chunk size must be non-zero"); RChunks::new(self, chunk_size) } @@ -1369,8 +1382,9 @@ impl [T] { /// [`chunks_mut`]: slice::chunks_mut #[stable(feature = "rchunks", since = "1.31.0")] #[inline] + #[track_caller] pub fn rchunks_mut(&mut self, chunk_size: usize) -> RChunksMut<'_, T> { - assert!(chunk_size != 0); + assert!(chunk_size != 0, "chunk size must be non-zero"); RChunksMut::new(self, chunk_size) } @@ -1408,8 +1422,9 @@ impl [T] { /// [`chunks_exact`]: slice::chunks_exact #[stable(feature = "rchunks", since = "1.31.0")] #[inline] + #[track_caller] pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T> { - assert!(chunk_size != 0); + assert!(chunk_size != 0, "chunk size must be non-zero"); RChunksExact::new(self, chunk_size) } @@ -1451,8 +1466,9 @@ impl [T] { /// [`chunks_exact_mut`]: slice::chunks_exact_mut #[stable(feature = "rchunks", since = "1.31.0")] #[inline] + #[track_caller] pub fn rchunks_exact_mut(&mut self, chunk_size: usize) -> RChunksExactMut<'_, T> { - assert!(chunk_size != 0); + assert!(chunk_size != 0, "chunk size must be non-zero"); RChunksExactMut::new(self, chunk_size) } From bb2af4f28ca89b5088db433645f9e61f03c9ac2c Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Wed, 1 Feb 2023 00:20:38 +0000 Subject: [PATCH 65/69] Update cargo 18 commits in 3c5af6bed9a1a243a693e8e22ee2486bd5b82a6c..e84a7928d93a31f284b497c214a2ece69b4d7719 2023-01-24 15:48:15 +0000 to 2023-01-31 22:18:09 +0000 - chore: Add autolabel for `Command-*` labels (rust-lang/cargo#11664) - Update cross test instructions for aarch64-apple-darwin (rust-lang/cargo#11663) - Make cargo install report needed features (rust-lang/cargo#11647) - docs(contrib): Remove out-of-date process step (rust-lang/cargo#11662) - Do not error for `auth-required: true` without `-Z sparse-registry` (rust-lang/cargo#11661) - Warn on commits to non-default branches. (rust-lang/cargo#11655) - Avoid saving the same future_incompat warning multiple times (rust-lang/cargo#11648) - Mention current default value in `publish.timeout` docs (rust-lang/cargo#11652) - Make cargo aware of dwp files. (rust-lang/cargo#11572) - Reduce target info rustc query calls (rust-lang/cargo#11633) - Bump to 0.70.0; update changelog (rust-lang/cargo#11640) - Enable sparse protocol in CI (rust-lang/cargo#11632) - Fix split-debuginfo support detection (rust-lang/cargo#11347) - refactor(toml): Move `TomlWorkspaceDependency` out of `TomlDependency` (rust-lang/cargo#11565) - book: describe how the current resolver sometimes duplicates deps (rust-lang/cargo#11604) - `cargo add` check `[dependencies]` order without considering the dotted item (rust-lang/cargo#11612) - Link CoC to www.rust-lang.org/conduct.html (rust-lang/cargo#11622) - Add more labels to triagebot (rust-lang/cargo#11621) --- Cargo.lock | 2 +- src/tools/cargo | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b35892ccd523..14758d0f07ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -342,7 +342,7 @@ dependencies = [ [[package]] name = "cargo" -version = "0.69.0" +version = "0.70.0" dependencies = [ "anyhow", "base64", diff --git a/src/tools/cargo b/src/tools/cargo index 3c5af6bed9a1..e84a7928d93a 160000 --- a/src/tools/cargo +++ b/src/tools/cargo @@ -1 +1 @@ -Subproject commit 3c5af6bed9a1a243a693e8e22ee2486bd5b82a6c +Subproject commit e84a7928d93a31f284b497c214a2ece69b4d7719 From 362c4fa755a52891f79b00a0bac53b6a597f2b72 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Tue, 31 Jan 2023 20:00:54 -0500 Subject: [PATCH 66/69] Bless updated output from print-type-sizes tests. --- tests/ui/print_type_sizes/async.stdout | 12 ++++++------ tests/ui/print_type_sizes/generator.stdout | 8 ++++---- .../generator_discr_placement.stdout | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/ui/print_type_sizes/async.stdout b/tests/ui/print_type_sizes/async.stdout index 6e47bb4930dc..4588c0ebd81b 100644 --- a/tests/ui/print_type_sizes/async.stdout +++ b/tests/ui/print_type_sizes/async.stdout @@ -1,15 +1,15 @@ print-type-size type: `[async fn body@$DIR/async.rs:8:36: 11:2]`: 16386 bytes, alignment: 1 bytes print-type-size discriminant: 1 bytes print-type-size variant `Suspend0`: 16385 bytes -print-type-size field `.arg`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes -print-type-size field `.arg`: 8192 bytes -print-type-size field `.__awaitee`: 1 bytes +print-type-size upvar `.arg`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes +print-type-size local `.arg`: 8192 bytes +print-type-size local `.__awaitee`: 1 bytes print-type-size variant `Unresumed`: 8192 bytes -print-type-size field `.arg`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes +print-type-size upvar `.arg`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes print-type-size variant `Returned`: 8192 bytes -print-type-size field `.arg`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes +print-type-size upvar `.arg`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes print-type-size variant `Panicked`: 8192 bytes -print-type-size field `.arg`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes +print-type-size upvar `.arg`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes print-type-size type: `std::mem::ManuallyDrop<[u8; 8192]>`: 8192 bytes, alignment: 1 bytes print-type-size field `.value`: 8192 bytes print-type-size type: `std::mem::MaybeUninit<[u8; 8192]>`: 8192 bytes, alignment: 1 bytes diff --git a/tests/ui/print_type_sizes/generator.stdout b/tests/ui/print_type_sizes/generator.stdout index 28d4a6e6cff4..13d850a66902 100644 --- a/tests/ui/print_type_sizes/generator.stdout +++ b/tests/ui/print_type_sizes/generator.stdout @@ -1,10 +1,10 @@ print-type-size type: `[generator@$DIR/generator.rs:10:5: 10:14]`: 8193 bytes, alignment: 1 bytes print-type-size discriminant: 1 bytes print-type-size variant `Unresumed`: 8192 bytes -print-type-size field `.array`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes +print-type-size upvar `.array`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes print-type-size variant `Returned`: 8192 bytes -print-type-size field `.array`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes +print-type-size upvar `.array`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes print-type-size variant `Panicked`: 8192 bytes -print-type-size field `.array`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes +print-type-size upvar `.array`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes print-type-size variant `Suspend0`: 8192 bytes -print-type-size field `.array`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes +print-type-size upvar `.array`: 8192 bytes, offset: 0 bytes, alignment: 1 bytes diff --git a/tests/ui/print_type_sizes/generator_discr_placement.stdout b/tests/ui/print_type_sizes/generator_discr_placement.stdout index 7f8f4ccae7c1..b294b2d139c3 100644 --- a/tests/ui/print_type_sizes/generator_discr_placement.stdout +++ b/tests/ui/print_type_sizes/generator_discr_placement.stdout @@ -2,10 +2,10 @@ print-type-size type: `[generator@$DIR/generator_discr_placement.rs:11:13: 11:15 print-type-size discriminant: 1 bytes print-type-size variant `Suspend0`: 7 bytes print-type-size padding: 3 bytes -print-type-size field `.w`: 4 bytes, alignment: 4 bytes +print-type-size local `.w`: 4 bytes, alignment: 4 bytes print-type-size variant `Suspend1`: 7 bytes print-type-size padding: 3 bytes -print-type-size field `.z`: 4 bytes, alignment: 4 bytes +print-type-size local `.z`: 4 bytes, alignment: 4 bytes print-type-size variant `Unresumed`: 0 bytes print-type-size variant `Returned`: 0 bytes print-type-size variant `Panicked`: 0 bytes From 6b3e49694d55e803aba4344e70e9d69e17b1f3e3 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Wed, 1 Feb 2023 11:10:15 +0100 Subject: [PATCH 67/69] Preparing for merge from rustc --- src/tools/miri/rust-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/miri/rust-version b/src/tools/miri/rust-version index f1f26e4e3104..d7de41435aa9 100644 --- a/src/tools/miri/rust-version +++ b/src/tools/miri/rust-version @@ -1 +1 @@ -a322848c6b0e037c1f0209387558ecb6ab763714 +0d32c8f2ce10710b6560dcb75f32f79c378410d0 From 3a75f10af12e959273d19cf0f867f066e3db8add Mon Sep 17 00:00:00 2001 From: Arpad Borsos Date: Tue, 31 Jan 2023 12:09:54 +0100 Subject: [PATCH 68/69] Improve pretty-printing of `HirIdValidator` errors This now uses `node_to_string` for both missing and seen Ids, which includes the snippet of code for which the Id was allocated. Also removes the duplicated printing of `HirId`, as `node_to_string` includes that already. Similarly, changes all other users of `node_to_string` that do so, and changes the output of `node_to_string`, which is now "$hirid ($what `$span` in $path)". --- .../rustc_hir_typeck/src/fn_ctxt/_impl.rs | 3 +- .../src/mem_categorization.rs | 3 +- compiler/rustc_middle/src/hir/map/mod.rs | 27 ++++++------- compiler/rustc_middle/src/ty/context.rs | 2 +- .../rustc_middle/src/ty/typeck_results.rs | 5 +-- compiler/rustc_passes/src/hir_id_validator.rs | 39 +++++++------------ .../src/traits/error_reporting/suggestions.rs | 2 +- 7 files changed, 32 insertions(+), 49 deletions(-) diff --git a/compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs b/compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs index a355a54d6959..237142acca66 100644 --- a/compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs +++ b/compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs @@ -454,8 +454,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { None if let Some(e) = self.tainted_by_errors() => self.tcx.ty_error_with_guaranteed(e), None => { bug!( - "no type for node {}: {} in fcx {}", - id, + "no type for node {} in fcx {}", self.tcx.hir().node_to_string(id), self.tag() ); diff --git a/compiler/rustc_hir_typeck/src/mem_categorization.rs b/compiler/rustc_hir_typeck/src/mem_categorization.rs index 48c75cde9a5f..92240b66eb1d 100644 --- a/compiler/rustc_hir_typeck/src/mem_categorization.rs +++ b/compiler/rustc_hir_typeck/src/mem_categorization.rs @@ -155,8 +155,7 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> { None if self.is_tainted_by_errors() => Err(()), None => { bug!( - "no type for node {}: {} in mem_categorization", - id, + "no type for node {} in mem_categorization", self.tcx().hir().node_to_string(id) ); } diff --git a/compiler/rustc_middle/src/hir/map/mod.rs b/compiler/rustc_middle/src/hir/map/mod.rs index 5bd6b0704426..7f2994fd79b9 100644 --- a/compiler/rustc_middle/src/hir/map/mod.rs +++ b/compiler/rustc_middle/src/hir/map/mod.rs @@ -290,7 +290,7 @@ impl<'hir> Map<'hir> { #[track_caller] pub fn parent_id(self, hir_id: HirId) -> HirId { self.opt_parent_id(hir_id) - .unwrap_or_else(|| bug!("No parent for node {:?}", self.node_to_string(hir_id))) + .unwrap_or_else(|| bug!("No parent for node {}", self.node_to_string(hir_id))) } pub fn get_parent(self, hir_id: HirId) -> Node<'hir> { @@ -1191,12 +1191,10 @@ fn upstream_crates(tcx: TyCtxt<'_>) -> Vec<(StableCrateId, Svh)> { } fn hir_id_to_string(map: Map<'_>, id: HirId) -> String { - let id_str = format!(" (hir_id={})", id); - let path_str = |def_id: LocalDefId| map.tcx.def_path_str(def_id.to_def_id()); let span_str = || map.tcx.sess.source_map().span_to_snippet(map.span(id)).unwrap_or_default(); - let node_str = |prefix| format!("{} {}{}", prefix, span_str(), id_str); + let node_str = |prefix| format!("{id} ({prefix} `{}`)", span_str()); match map.find(id) { Some(Node::Item(item)) => { @@ -1225,10 +1223,10 @@ fn hir_id_to_string(map: Map<'_>, id: HirId) -> String { ItemKind::TraitAlias(..) => "trait alias", ItemKind::Impl { .. } => "impl", }; - format!("{} {}{}", item_str, path_str(item.owner_id.def_id), id_str) + format!("{id} ({item_str} {})", path_str(item.owner_id.def_id)) } Some(Node::ForeignItem(item)) => { - format!("foreign item {}{}", path_str(item.owner_id.def_id), id_str) + format!("{id} (foreign item {})", path_str(item.owner_id.def_id)) } Some(Node::ImplItem(ii)) => { let kind = match ii.kind { @@ -1236,7 +1234,7 @@ fn hir_id_to_string(map: Map<'_>, id: HirId) -> String { ImplItemKind::Fn(..) => "method", ImplItemKind::Type(_) => "assoc type", }; - format!("{} {} in {}{}", kind, ii.ident, path_str(ii.owner_id.def_id), id_str) + format!("{id} ({kind} `{}` in {})", ii.ident, path_str(ii.owner_id.def_id)) } Some(Node::TraitItem(ti)) => { let kind = match ti.kind { @@ -1245,13 +1243,13 @@ fn hir_id_to_string(map: Map<'_>, id: HirId) -> String { TraitItemKind::Type(..) => "assoc type", }; - format!("{} {} in {}{}", kind, ti.ident, path_str(ti.owner_id.def_id), id_str) + format!("{id} ({kind} `{}` in {})", ti.ident, path_str(ti.owner_id.def_id)) } Some(Node::Variant(ref variant)) => { - format!("variant {} in {}{}", variant.ident, path_str(variant.def_id), id_str) + format!("{id} (variant `{}` in {})", variant.ident, path_str(variant.def_id)) } Some(Node::Field(ref field)) => { - format!("field {} in {}{}", field.ident, path_str(field.def_id), id_str) + format!("{id} (field `{}` in {})", field.ident, path_str(field.def_id)) } Some(Node::AnonConst(_)) => node_str("const"), Some(Node::Expr(_)) => node_str("expr"), @@ -1269,16 +1267,15 @@ fn hir_id_to_string(map: Map<'_>, id: HirId) -> String { Some(Node::Infer(_)) => node_str("infer"), Some(Node::Local(_)) => node_str("local"), Some(Node::Ctor(ctor)) => format!( - "ctor {}{}", + "{id} (ctor {})", ctor.ctor_def_id().map_or("".into(), |def_id| path_str(def_id)), - id_str ), Some(Node::Lifetime(_)) => node_str("lifetime"), Some(Node::GenericParam(ref param)) => { - format!("generic_param {}{}", path_str(param.def_id), id_str) + format!("{id} (generic_param {})", path_str(param.def_id)) } - Some(Node::Crate(..)) => String::from("root_crate"), - None => format!("unknown node{}", id_str), + Some(Node::Crate(..)) => String::from("(root_crate)"), + None => format!("{id} (unknown node)"), } } diff --git a/compiler/rustc_middle/src/ty/context.rs b/compiler/rustc_middle/src/ty/context.rs index b63b9e754cf4..f98172e42016 100644 --- a/compiler/rustc_middle/src/ty/context.rs +++ b/compiler/rustc_middle/src/ty/context.rs @@ -2171,7 +2171,7 @@ impl<'tcx> TyCtxt<'tcx> { self.late_bound_vars_map(id.owner) .and_then(|map| map.get(&id.local_id).cloned()) .unwrap_or_else(|| { - bug!("No bound vars found for {:?} ({:?})", self.hir().node_to_string(id), id) + bug!("No bound vars found for {}", self.hir().node_to_string(id)) }) .iter(), ) diff --git a/compiler/rustc_middle/src/ty/typeck_results.rs b/compiler/rustc_middle/src/ty/typeck_results.rs index 79a6c730d715..9beaac87183a 100644 --- a/compiler/rustc_middle/src/ty/typeck_results.rs +++ b/compiler/rustc_middle/src/ty/typeck_results.rs @@ -372,7 +372,7 @@ impl<'tcx> TypeckResults<'tcx> { pub fn node_type(&self, id: hir::HirId) -> Ty<'tcx> { self.node_type_opt(id).unwrap_or_else(|| { - bug!("node_type: no type for node `{}`", tls::with(|tcx| tcx.hir().node_to_string(id))) + bug!("node_type: no type for node {}", tls::with(|tcx| tcx.hir().node_to_string(id))) }) } @@ -551,9 +551,8 @@ fn validate_hir_id_for_typeck_results(hir_owner: OwnerId, hir_id: hir::HirId) { fn invalid_hir_id_for_typeck_results(hir_owner: OwnerId, hir_id: hir::HirId) { ty::tls::with(|tcx| { bug!( - "node {} with HirId::owner {:?} cannot be placed in TypeckResults with hir_owner {:?}", + "node {} cannot be placed in TypeckResults with hir_owner {:?}", tcx.hir().node_to_string(hir_id), - hir_id.owner, hir_owner ) }); diff --git a/compiler/rustc_passes/src/hir_id_validator.rs b/compiler/rustc_passes/src/hir_id_validator.rs index d143adb2eb94..de0e50a65de6 100644 --- a/compiler/rustc_passes/src/hir_id_validator.rs +++ b/compiler/rustc_passes/src/hir_id_validator.rs @@ -74,37 +74,26 @@ impl<'a, 'hir> HirIdValidator<'a, 'hir> { .expect("owning item has no entry"); if max != self.hir_ids_seen.len() - 1 { - // Collect the missing ItemLocalIds - let missing: Vec<_> = (0..=max as u32) - .filter(|&i| !self.hir_ids_seen.contains(ItemLocalId::from_u32(i))) + let hir = self.tcx.hir(); + let pretty_owner = hir.def_path(owner.def_id).to_string_no_crate_verbose(); + + let missing_items: Vec<_> = (0..=max as u32) + .map(|i| ItemLocalId::from_u32(i)) + .filter(|&local_id| !self.hir_ids_seen.contains(local_id)) + .map(|local_id| hir.node_to_string(HirId { owner, local_id })) .collect(); - // Try to map those to something more useful - let mut missing_items = Vec::with_capacity(missing.len()); + let seen_items: Vec<_> = self + .hir_ids_seen + .iter() + .map(|local_id| hir.node_to_string(HirId { owner, local_id })) + .collect(); - for local_id in missing { - let hir_id = HirId { owner, local_id: ItemLocalId::from_u32(local_id) }; - - trace!("missing hir id {:#?}", hir_id); - - missing_items.push(format!( - "[local_id: {}, owner: {}]", - local_id, - self.tcx.hir().def_path(owner.def_id).to_string_no_crate_verbose() - )); - } self.error(|| { format!( "ItemLocalIds not assigned densely in {}. \ - Max ItemLocalId = {}, missing IDs = {:#?}; seens IDs = {:#?}", - self.tcx.hir().def_path(owner.def_id).to_string_no_crate_verbose(), - max, - missing_items, - self.hir_ids_seen - .iter() - .map(|local_id| HirId { owner, local_id }) - .map(|h| format!("({:?} {})", h, self.tcx.hir().node_to_string(h))) - .collect::>() + Max ItemLocalId = {}, missing IDs = {:#?}; seen IDs = {:#?}", + pretty_owner, max, missing_items, seen_items ) }); } diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs index b35b9d62759c..87dbf7c3fd69 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs @@ -133,7 +133,7 @@ impl<'tcx, 'a> GeneratorData<'tcx, 'a> { .cloned() .unwrap_or_else(|| { bug!( - "node_type: no type for node `{}`", + "node_type: no type for node {}", ty::tls::with(|tcx| tcx .hir() .node_to_string(await_expr.hir_id)) From 40cbe491f4e780f20f1e2cba4b8af2ecc8dabb13 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Wed, 1 Feb 2023 11:51:32 +0100 Subject: [PATCH 69/69] fmt --- .../miri/tests/fail/unaligned_pointers/reference_to_packed.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/miri/tests/fail/unaligned_pointers/reference_to_packed.rs b/src/tools/miri/tests/fail/unaligned_pointers/reference_to_packed.rs index 816b6ab9fb32..4a43db0aac50 100644 --- a/src/tools/miri/tests/fail/unaligned_pointers/reference_to_packed.rs +++ b/src/tools/miri/tests/fail/unaligned_pointers/reference_to_packed.rs @@ -3,7 +3,7 @@ #![allow(dead_code, unused_variables)] -use std::{ptr, mem}; +use std::{mem, ptr}; #[repr(packed)] struct Foo {

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 bu|mph$&(HUWF(dUHMA0&Dk&@;d5-}Ad{}Pp From 1c3fc9da713de3a14bb41fa56cc5b56f02d58733 Mon Sep 17 00:00:00 2001 From: Trevor Spiteri Date: Fri, 27 Jan 2023 15:49:08 +0100 Subject: [PATCH 08/69] add comment to rustdoc.css on updating filename suffixes --- src/librustdoc/html/static/css/rustdoc.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/librustdoc/html/static/css/rustdoc.css b/src/librustdoc/html/static/css/rustdoc.css index 0ee1207511dc..32025c078b4e 100644 --- a/src/librustdoc/html/static/css/rustdoc.css +++ b/src/librustdoc/html/static/css/rustdoc.css @@ -1,3 +1,11 @@ +/* When static files are updated, their suffixes need to be updated. + 1. In the top directory run: + ./x.py doc --stage 1 library/core + 2. Find the directory containing files named with updated suffixes: + find build -path '*'/stage1-std/'*'/static.files + 3. Copy the filenames with updated suffixes from the directory. +*/ + /* See FiraSans-LICENSE.txt for the Fira Sans license. */ @font-face { font-family: 'Fira Sans'; From e02517d753bae44b2150aa23ab3bca694097ac96 Mon Sep 17 00:00:00 2001 From: Matthias Kaak Date: Fri, 27 Jan 2023 21:01:07 +0000 Subject: [PATCH 09/69] Fixed confusement between mod and remainder --- compiler/rustc_hir_typeck/src/op.rs | 2 +- library/core/src/ops/arith.rs | 4 ++-- tests/ui/binop/binary-op-on-double-ref.fixed | 2 +- tests/ui/binop/binary-op-on-double-ref.rs | 2 +- tests/ui/binop/binary-op-on-double-ref.stderr | 2 +- tests/ui/binop/issue-28837.rs | 2 +- tests/ui/binop/issue-28837.stderr | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_hir_typeck/src/op.rs b/compiler/rustc_hir_typeck/src/op.rs index 78cea1f4d8d3..60c8c0f64fe2 100644 --- a/compiler/rustc_hir_typeck/src/op.rs +++ b/compiler/rustc_hir_typeck/src/op.rs @@ -335,7 +335,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { format!("cannot divide `{lhs_ty}` by `{rhs_ty}`") } hir::BinOpKind::Rem => { - format!("cannot mod `{lhs_ty}` by `{rhs_ty}`") + format!("cannot rem `{lhs_ty}` by `{rhs_ty}`") } hir::BinOpKind::BitAnd => { format!("no implementation for `{lhs_ty} & {rhs_ty}`") diff --git a/library/core/src/ops/arith.rs b/library/core/src/ops/arith.rs index 75c52d3ecfc8..b9803c957b16 100644 --- a/library/core/src/ops/arith.rs +++ b/library/core/src/ops/arith.rs @@ -545,7 +545,7 @@ div_impl_float! { f32 f64 } #[lang = "rem"] #[stable(feature = "rust1", since = "1.0.0")] #[rustc_on_unimplemented( - message = "cannot mod `{Self}` by `{Rhs}`", + message = "cannot rem `{Self}` by `{Rhs}`", label = "no implementation for `{Self} % {Rhs}`" )] #[doc(alias = "%")] @@ -981,7 +981,7 @@ div_assign_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 } #[lang = "rem_assign"] #[stable(feature = "op_assign_traits", since = "1.8.0")] #[rustc_on_unimplemented( - message = "cannot mod-assign `{Self}` by `{Rhs}``", + message = "cannot rem-assign `{Self}` by `{Rhs}``", label = "no implementation for `{Self} %= {Rhs}`" )] #[doc(alias = "%")] diff --git a/tests/ui/binop/binary-op-on-double-ref.fixed b/tests/ui/binop/binary-op-on-double-ref.fixed index de9dc19af29b..89829efeaeb3 100644 --- a/tests/ui/binop/binary-op-on-double-ref.fixed +++ b/tests/ui/binop/binary-op-on-double-ref.fixed @@ -3,7 +3,7 @@ fn main() { let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9]; let vr = v.iter().filter(|x| { *x % 2 == 0 - //~^ ERROR cannot mod `&&{integer}` by `{integer}` + //~^ ERROR cannot rem `&&{integer}` by `{integer}` }); println!("{:?}", vr); } diff --git a/tests/ui/binop/binary-op-on-double-ref.rs b/tests/ui/binop/binary-op-on-double-ref.rs index 2616c560cbef..57c5d8b52c8d 100644 --- a/tests/ui/binop/binary-op-on-double-ref.rs +++ b/tests/ui/binop/binary-op-on-double-ref.rs @@ -3,7 +3,7 @@ fn main() { let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9]; let vr = v.iter().filter(|x| { x % 2 == 0 - //~^ ERROR cannot mod `&&{integer}` by `{integer}` + //~^ ERROR cannot rem `&&{integer}` by `{integer}` }); println!("{:?}", vr); } diff --git a/tests/ui/binop/binary-op-on-double-ref.stderr b/tests/ui/binop/binary-op-on-double-ref.stderr index 34826d2f4bf7..e597e1b27e0c 100644 --- a/tests/ui/binop/binary-op-on-double-ref.stderr +++ b/tests/ui/binop/binary-op-on-double-ref.stderr @@ -1,4 +1,4 @@ -error[E0369]: cannot mod `&&{integer}` by `{integer}` +error[E0369]: cannot rem `&&{integer}` by `{integer}` --> $DIR/binary-op-on-double-ref.rs:5:11 | LL | x % 2 == 0 diff --git a/tests/ui/binop/issue-28837.rs b/tests/ui/binop/issue-28837.rs index 9719c3afa68c..002a5b94565b 100644 --- a/tests/ui/binop/issue-28837.rs +++ b/tests/ui/binop/issue-28837.rs @@ -11,7 +11,7 @@ fn main() { a / a; //~ ERROR cannot divide `A` by `A` - a % a; //~ ERROR cannot mod `A` by `A` + a % a; //~ ERROR cannot rem `A` by `A` a & a; //~ ERROR no implementation for `A & A` diff --git a/tests/ui/binop/issue-28837.stderr b/tests/ui/binop/issue-28837.stderr index 6e236ca5296a..2d4849ca5cb8 100644 --- a/tests/ui/binop/issue-28837.stderr +++ b/tests/ui/binop/issue-28837.stderr @@ -62,7 +62,7 @@ LL | struct A; note: the trait `Div` must be implemented --> $SRC_DIR/core/src/ops/arith.rs:LL:COL -error[E0369]: cannot mod `A` by `A` +error[E0369]: cannot rem `A` by `A` --> $DIR/issue-28837.rs:14:7 | LL | a % a; From a8418c0370f5f8a63aeeea9c4b791cb0474d5573 Mon Sep 17 00:00:00 2001 From: Tshepang Mbambo Date: Sat, 28 Jan 2023 16:33:35 +0200 Subject: [PATCH 10/69] avoid needless checks --- compiler/rustc_codegen_llvm/src/context.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/compiler/rustc_codegen_llvm/src/context.rs b/compiler/rustc_codegen_llvm/src/context.rs index d9ccba07a346..53bd45501319 100644 --- a/compiler/rustc_codegen_llvm/src/context.rs +++ b/compiler/rustc_codegen_llvm/src/context.rs @@ -150,17 +150,14 @@ pub unsafe fn create_module<'ll>( target_data_layout = "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:32-n8:16:32-a:0:32-S32" .to_string(); - } - if sess.target.arch == "wasm32" { + } else if sess.target.arch == "wasm32" { target_data_layout = target_data_layout.replace("-p10:8:8-p20:8:8", ""); } } if llvm_version < (16, 0, 0) { if sess.target.arch == "s390x" { target_data_layout = target_data_layout.replace("-v128:64", ""); - } - - if sess.target.arch == "riscv64" { + } else if sess.target.arch == "riscv64" { target_data_layout = target_data_layout.replace("-n32:64-", "-n64-"); } } From 1d3f5b49d6bdfb2a051ddbfb7ad4b4ad603e9908 Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Sun, 29 Jan 2023 13:46:55 +0000 Subject: [PATCH 11/69] Test drop_tracking_mir before querying generator. --- compiler/rustc_metadata/src/rmeta/encoder.rs | 2 +- compiler/rustc_mir_transform/src/lib.rs | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs index 29507ff3a86c..9d8f14058f68 100644 --- a/compiler/rustc_metadata/src/rmeta/encoder.rs +++ b/compiler/rustc_metadata/src/rmeta/encoder.rs @@ -1415,7 +1415,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { if encode_opt { record!(self.tables.optimized_mir[def_id.to_def_id()] <- tcx.optimized_mir(def_id)); - if let DefKind::Generator = self.tcx.def_kind(def_id) && tcx.sess.opts.unstable_opts.drop_tracking_mir { + if tcx.sess.opts.unstable_opts.drop_tracking_mir && let DefKind::Generator = self.tcx.def_kind(def_id) { record!(self.tables.mir_generator_witnesses[def_id.to_def_id()] <- tcx.mir_generator_witnesses(def_id)); } } diff --git a/compiler/rustc_mir_transform/src/lib.rs b/compiler/rustc_mir_transform/src/lib.rs index 6858fa8e524f..efeefdcaabb4 100644 --- a/compiler/rustc_mir_transform/src/lib.rs +++ b/compiler/rustc_mir_transform/src/lib.rs @@ -23,6 +23,7 @@ use rustc_const_eval::util; use rustc_data_structures::fx::FxIndexSet; use rustc_data_structures::steal::Steal; use rustc_hir as hir; +use rustc_hir::def::DefKind; use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::intravisit::{self, Visitor}; use rustc_index::vec::IndexVec; @@ -429,7 +430,9 @@ fn mir_drops_elaborated_and_const_checked( return tcx.mir_drops_elaborated_and_const_checked(def); } - if tcx.generator_kind(def.did).is_some() && tcx.sess.opts.unstable_opts.drop_tracking_mir { + if tcx.sess.opts.unstable_opts.drop_tracking_mir + && let DefKind::Generator = tcx.def_kind(def.did) + { tcx.ensure().mir_generator_witnesses(def.did); } let mir_borrowck = tcx.mir_borrowck_opt_const_arg(def); From 5372e66884b7962acfce99d5dd8aef7e48d0257e Mon Sep 17 00:00:00 2001 From: Arpad Borsos Date: Sun, 29 Jan 2023 15:20:03 +0100 Subject: [PATCH 12/69] Remove `GenFuture` from core The handling of async constructs in the compiler does not rely on `GenFuture` anymore since `1.67`, so this code can now be removed from `core`. --- library/core/src/future/mod.rs | 45 ---------------------------------- 1 file changed, 45 deletions(-) diff --git a/library/core/src/future/mod.rs b/library/core/src/future/mod.rs index c4fb36209466..46cbcd43530d 100644 --- a/library/core/src/future/mod.rs +++ b/library/core/src/future/mod.rs @@ -56,51 +56,6 @@ unsafe impl Send for ResumeTy {} #[unstable(feature = "gen_future", issue = "50547")] unsafe impl Sync for ResumeTy {} -/// Wrap a generator in a future. -/// -/// This function returns a `GenFuture` underneath, but hides it in `impl Trait` to give -/// better error messages (`impl Future` rather than `GenFuture<[closure.....]>`). -// This is `const` to avoid extra errors after we recover from `const async fn` -#[doc(hidden)] -#[unstable(feature = "gen_future", issue = "50547")] -#[rustc_const_unstable(feature = "gen_future", issue = "50547")] -#[inline] -pub const fn from_generator(gen: T) -> impl Future -where - T: crate::ops::Generator, -{ - use crate::{ - ops::{Generator, GeneratorState}, - pin::Pin, - task::Poll, - }; - - #[rustc_diagnostic_item = "gen_future"] - struct GenFuture>(T); - - // We rely on the fact that async/await futures are immovable in order to create - // self-referential borrows in the underlying generator. - impl> !Unpin for GenFuture {} - - impl> Future for GenFuture { - type Output = T::Return; - #[track_caller] - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - // SAFETY: Safe because we're !Unpin + !Drop, and this is just a field projection. - let gen = unsafe { Pin::map_unchecked_mut(self, |s| &mut s.0) }; - - // Resume the generator, turning the `&mut Context` into a `NonNull` raw pointer. The - // `.await` lowering will safely cast that back to a `&mut Context`. - match gen.resume(ResumeTy(NonNull::from(cx).cast::>())) { - GeneratorState::Yielded(()) => Poll::Pending, - GeneratorState::Complete(x) => Poll::Ready(x), - } - } - } - - GenFuture(gen) -} - #[lang = "get_context"] #[doc(hidden)] #[unstable(feature = "gen_future", issue = "50547")] From fd649a3cc5e9f17c8aee070227e8c71f094560b7 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Mon, 30 Jan 2023 11:03:32 +0000 Subject: [PATCH 13/69] Replace enum `==`s with `match`es where it makes sense --- compiler/rustc_ast/src/util/comments.rs | 31 +++--- .../src/const_eval/machine.rs | 7 +- compiler/rustc_errors/src/emitter.rs | 54 +++++---- .../src/astconv/generics.rs | 7 +- .../rustc_hir_analysis/src/check/check.rs | 105 ++++++++++-------- compiler/rustc_hir_typeck/src/method/probe.rs | 7 +- compiler/rustc_lint/src/builtin.rs | 41 +++---- .../rustc_metadata/src/dependency_format.rs | 65 ++++++----- compiler/rustc_middle/src/mir/coverage.rs | 5 +- .../rustc_mir_transform/src/coverage/debug.rs | 5 +- compiler/rustc_parse/src/parser/stmt.rs | 22 ++-- compiler/rustc_parse/src/parser/ty.rs | 22 ++-- compiler/rustc_passes/src/check_attr.rs | 58 +++++----- .../rustc_resolve/src/build_reduced_graph.rs | 17 +-- compiler/rustc_resolve/src/diagnostics.rs | 12 +- .../src/traits/error_reporting/mod.rs | 31 +++--- 16 files changed, 258 insertions(+), 231 deletions(-) diff --git a/compiler/rustc_ast/src/util/comments.rs b/compiler/rustc_ast/src/util/comments.rs index 275ed02c2b9f..eece99a3eef0 100644 --- a/compiler/rustc_ast/src/util/comments.rs +++ b/compiler/rustc_ast/src/util/comments.rs @@ -58,23 +58,24 @@ pub fn beautify_doc_string(data: Symbol, kind: CommentKind) -> Symbol { // In case we have doc comments like `/**` or `/*!`, we want to remove stars if they are // present. However, we first need to strip the empty lines so they don't get in the middle // when we try to compute the "horizontal trim". - let lines = if kind == CommentKind::Block { - // Whatever happens, we skip the first line. - let mut i = lines - .get(0) - .map(|l| if l.trim_start().starts_with('*') { 0 } else { 1 }) - .unwrap_or(0); - let mut j = lines.len(); + let lines = match kind { + CommentKind::Block => { + // Whatever happens, we skip the first line. + let mut i = lines + .get(0) + .map(|l| if l.trim_start().starts_with('*') { 0 } else { 1 }) + .unwrap_or(0); + let mut j = lines.len(); - while i < j && lines[i].trim().is_empty() { - i += 1; + while i < j && lines[i].trim().is_empty() { + i += 1; + } + while j > i && lines[j - 1].trim().is_empty() { + j -= 1; + } + &lines[i..j] } - while j > i && lines[j - 1].trim().is_empty() { - j -= 1; - } - &lines[i..j] - } else { - lines + CommentKind::Line => lines, }; for line in lines { diff --git a/compiler/rustc_const_eval/src/const_eval/machine.rs b/compiler/rustc_const_eval/src/const_eval/machine.rs index a5bc121485d8..d865d5bc974e 100644 --- a/compiler/rustc_const_eval/src/const_eval/machine.rs +++ b/compiler/rustc_const_eval/src/const_eval/machine.rs @@ -622,10 +622,9 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir, let alloc = alloc.inner(); if is_write { // Write access. These are never allowed, but we give a targeted error message. - if alloc.mutability == Mutability::Not { - Err(err_ub!(WriteToReadOnly(alloc_id)).into()) - } else { - Err(ConstEvalErrKind::ModifiedGlobal.into()) + match alloc.mutability { + Mutability::Not => Err(err_ub!(WriteToReadOnly(alloc_id)).into()), + Mutability::Mut => Err(ConstEvalErrKind::ModifiedGlobal.into()), } } else { // Read access. These are usually allowed, with some exceptions. diff --git a/compiler/rustc_errors/src/emitter.rs b/compiler/rustc_errors/src/emitter.rs index 628e19999215..faeaa5486197 100644 --- a/compiler/rustc_errors/src/emitter.rs +++ b/compiler/rustc_errors/src/emitter.rs @@ -2113,30 +2113,38 @@ impl EmitterWriter { } } for sugg in suggestions { - if sugg.style == SuggestionStyle::CompletelyHidden { - // do not display this suggestion, it is meant only for tools - } else if sugg.style == SuggestionStyle::HideCodeAlways { - if let Err(e) = self.emit_message_default( - &MultiSpan::new(), - &[(sugg.msg.to_owned(), Style::HeaderMsg)], - args, - &None, - &Level::Help, - max_line_num_len, - true, - None, - ) { - panic!("failed to emit error: {}", e); + match sugg.style { + SuggestionStyle::CompletelyHidden => { + // do not display this suggestion, it is meant only for tools } - } else if let Err(e) = self.emit_suggestion_default( - span, - sugg, - args, - &Level::Help, - max_line_num_len, - ) { - panic!("failed to emit error: {}", e); - }; + SuggestionStyle::HideCodeAlways => { + if let Err(e) = self.emit_message_default( + &MultiSpan::new(), + &[(sugg.msg.to_owned(), Style::HeaderMsg)], + args, + &None, + &Level::Help, + max_line_num_len, + true, + None, + ) { + panic!("failed to emit error: {}", e); + } + } + SuggestionStyle::HideCodeInline + | SuggestionStyle::ShowCode + | SuggestionStyle::ShowAlways => { + if let Err(e) = self.emit_suggestion_default( + span, + sugg, + args, + &Level::Help, + max_line_num_len, + ) { + panic!("failed to emit error: {}", e); + } + } + } } } } diff --git a/compiler/rustc_hir_analysis/src/astconv/generics.rs b/compiler/rustc_hir_analysis/src/astconv/generics.rs index 7a499327dbf2..5e8f727df69d 100644 --- a/compiler/rustc_hir_analysis/src/astconv/generics.rs +++ b/compiler/rustc_hir_analysis/src/astconv/generics.rs @@ -385,10 +385,9 @@ pub fn check_generic_arg_count_for_call( ) -> GenericArgCountResult { let empty_args = hir::GenericArgs::none(); let gen_args = seg.args.unwrap_or(&empty_args); - let gen_pos = if is_method_call == IsMethodCall::Yes { - GenericArgPosition::MethodCall - } else { - GenericArgPosition::Value + let gen_pos = match is_method_call { + IsMethodCall::Yes => GenericArgPosition::MethodCall, + IsMethodCall::No => GenericArgPosition::Value, }; let has_self = generics.parent.is_none() && generics.has_self; diff --git a/compiler/rustc_hir_analysis/src/check/check.rs b/compiler/rustc_hir_analysis/src/check/check.rs index 6f4ebc987e6a..8609afc50680 100644 --- a/compiler/rustc_hir_analysis/src/check/check.rs +++ b/compiler/rustc_hir_analysis/src/check/check.rs @@ -605,59 +605,66 @@ fn check_item_type(tcx: TyCtxt<'_>, id: hir::ItemId) { }; check_abi(tcx, it.hir_id(), it.span, abi); - if abi == Abi::RustIntrinsic { - for item in items { - let item = tcx.hir().foreign_item(item.id); - intrinsic::check_intrinsic_type(tcx, item); - } - } else if abi == Abi::PlatformIntrinsic { - for item in items { - let item = tcx.hir().foreign_item(item.id); - intrinsic::check_platform_intrinsic_type(tcx, item); - } - } else { - for item in items { - let def_id = item.id.owner_id.def_id; - let generics = tcx.generics_of(def_id); - let own_counts = generics.own_counts(); - if generics.params.len() - own_counts.lifetimes != 0 { - let (kinds, kinds_pl, egs) = match (own_counts.types, own_counts.consts) { - (_, 0) => ("type", "types", Some("u32")), - // We don't specify an example value, because we can't generate - // a valid value for any type. - (0, _) => ("const", "consts", None), - _ => ("type or const", "types or consts", None), - }; - struct_span_err!( - tcx.sess, - item.span, - E0044, - "foreign items may not have {kinds} parameters", - ) - .span_label(item.span, &format!("can't have {kinds} parameters")) - .help( - // FIXME: once we start storing spans for type arguments, turn this - // into a suggestion. - &format!( - "replace the {} parameters with concrete {}{}", - kinds, - kinds_pl, - egs.map(|egs| format!(" like `{}`", egs)).unwrap_or_default(), - ), - ) - .emit(); + match abi { + Abi::RustIntrinsic => { + for item in items { + let item = tcx.hir().foreign_item(item.id); + intrinsic::check_intrinsic_type(tcx, item); } + } - let item = tcx.hir().foreign_item(item.id); - match &item.kind { - hir::ForeignItemKind::Fn(fn_decl, _, _) => { - require_c_abi_if_c_variadic(tcx, fn_decl, abi, item.span); + Abi::PlatformIntrinsic => { + for item in items { + let item = tcx.hir().foreign_item(item.id); + intrinsic::check_platform_intrinsic_type(tcx, item); + } + } + + _ => { + for item in items { + let def_id = item.id.owner_id.def_id; + let generics = tcx.generics_of(def_id); + let own_counts = generics.own_counts(); + if generics.params.len() - own_counts.lifetimes != 0 { + let (kinds, kinds_pl, egs) = match (own_counts.types, own_counts.consts) + { + (_, 0) => ("type", "types", Some("u32")), + // We don't specify an example value, because we can't generate + // a valid value for any type. + (0, _) => ("const", "consts", None), + _ => ("type or const", "types or consts", None), + }; + struct_span_err!( + tcx.sess, + item.span, + E0044, + "foreign items may not have {kinds} parameters", + ) + .span_label(item.span, &format!("can't have {kinds} parameters")) + .help( + // FIXME: once we start storing spans for type arguments, turn this + // into a suggestion. + &format!( + "replace the {} parameters with concrete {}{}", + kinds, + kinds_pl, + egs.map(|egs| format!(" like `{}`", egs)).unwrap_or_default(), + ), + ) + .emit(); } - hir::ForeignItemKind::Static(..) => { - check_static_inhabited(tcx, def_id); - check_static_linkage(tcx, def_id); + + let item = tcx.hir().foreign_item(item.id); + match &item.kind { + hir::ForeignItemKind::Fn(fn_decl, _, _) => { + require_c_abi_if_c_variadic(tcx, fn_decl, abi, item.span); + } + hir::ForeignItemKind::Static(..) => { + check_static_inhabited(tcx, def_id); + check_static_linkage(tcx, def_id); + } + _ => {} } - _ => {} } } } diff --git a/compiler/rustc_hir_typeck/src/method/probe.rs b/compiler/rustc_hir_typeck/src/method/probe.rs index 9fc4c16fb071..0b30bf957a3d 100644 --- a/compiler/rustc_hir_typeck/src/method/probe.rs +++ b/compiler/rustc_hir_typeck/src/method/probe.rs @@ -1354,13 +1354,12 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> { return Some(Err(MethodError::Ambiguity(sources))); } - applicable_candidates.pop().map(|(probe, status)| { - if status == ProbeResult::Match { + applicable_candidates.pop().map(|(probe, status)| match status { + ProbeResult::Match => { Ok(probe .to_unadjusted_pick(self_ty, unstable_candidates.cloned().unwrap_or_default())) - } else { - Err(MethodError::BadReturnType) } + ProbeResult::NoMatch | ProbeResult::BadReturnType => Err(MethodError::BadReturnType), }) } } diff --git a/compiler/rustc_lint/src/builtin.rs b/compiler/rustc_lint/src/builtin.rs index 8361c81f0efe..697e90fdaa95 100644 --- a/compiler/rustc_lint/src/builtin.rs +++ b/compiler/rustc_lint/src/builtin.rs @@ -580,27 +580,28 @@ impl<'tcx> LateLintPass<'tcx> for MissingDoc { } fn check_impl_item(&mut self, cx: &LateContext<'_>, impl_item: &hir::ImplItem<'_>) { - // If the method is an impl for a trait, don't doc. let context = method_context(cx, impl_item.owner_id.def_id); - if context == MethodLateContext::TraitImpl { - return; - } - - // If the method is an impl for an item with docs_hidden, don't doc. - if context == MethodLateContext::PlainImpl { - let parent = cx.tcx.hir().get_parent_item(impl_item.hir_id()); - let impl_ty = cx.tcx.type_of(parent); - let outerdef = match impl_ty.kind() { - ty::Adt(def, _) => Some(def.did()), - ty::Foreign(def_id) => Some(*def_id), - _ => None, - }; - let is_hidden = match outerdef { - Some(id) => cx.tcx.is_doc_hidden(id), - None => false, - }; - if is_hidden { - return; + + match context { + // If the method is an impl for a trait, don't doc. + MethodLateContext::TraitImpl => return, + MethodLateContext::TraitAutoImpl => {} + // If the method is an impl for an item with docs_hidden, don't doc. + MethodLateContext::PlainImpl => { + let parent = cx.tcx.hir().get_parent_item(impl_item.hir_id()); + let impl_ty = cx.tcx.type_of(parent); + let outerdef = match impl_ty.kind() { + ty::Adt(def, _) => Some(def.did()), + ty::Foreign(def_id) => Some(*def_id), + _ => None, + }; + let is_hidden = match outerdef { + Some(id) => cx.tcx.is_doc_hidden(id), + None => false, + }; + if is_hidden { + return; + } } } diff --git a/compiler/rustc_metadata/src/dependency_format.rs b/compiler/rustc_metadata/src/dependency_format.rs index cee4ba56a9d8..39ef4276faf1 100644 --- a/compiler/rustc_metadata/src/dependency_format.rs +++ b/compiler/rustc_metadata/src/dependency_format.rs @@ -113,37 +113,37 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: CrateType) -> DependencyList { CrateType::Staticlib => Linkage::Static, }; - if preferred_linkage == Linkage::NotLinked { + match preferred_linkage { // If the crate is not linked, there are no link-time dependencies. - return Vec::new(); - } - - if preferred_linkage == Linkage::Static { - // Attempt static linkage first. For dylibs and executables, we may be - // able to retry below with dynamic linkage. - if let Some(v) = attempt_static(tcx) { - return v; - } - - // Staticlibs and static executables must have all static dependencies. - // If any are not found, generate some nice pretty errors. - if ty == CrateType::Staticlib - || (ty == CrateType::Executable - && sess.crt_static(Some(ty)) - && !sess.target.crt_static_allows_dylibs) - { - for &cnum in tcx.crates(()).iter() { - if tcx.dep_kind(cnum).macros_only() { - continue; - } - let src = tcx.used_crate_source(cnum); - if src.rlib.is_some() { - continue; - } - sess.emit_err(RlibRequired { crate_name: tcx.crate_name(cnum) }); + Linkage::NotLinked => return Vec::new(), + Linkage::Static => { + // Attempt static linkage first. For dylibs and executables, we may be + // able to retry below with dynamic linkage. + if let Some(v) = attempt_static(tcx) { + return v; + } + + // Staticlibs and static executables must have all static dependencies. + // If any are not found, generate some nice pretty errors. + if ty == CrateType::Staticlib + || (ty == CrateType::Executable + && sess.crt_static(Some(ty)) + && !sess.target.crt_static_allows_dylibs) + { + for &cnum in tcx.crates(()).iter() { + if tcx.dep_kind(cnum).macros_only() { + continue; + } + let src = tcx.used_crate_source(cnum); + if src.rlib.is_some() { + continue; + } + sess.emit_err(RlibRequired { crate_name: tcx.crate_name(cnum) }); + } + return Vec::new(); } - return Vec::new(); } + Linkage::Dynamic | Linkage::IncludedFromDylib => {} } let mut formats = FxHashMap::default(); @@ -283,12 +283,9 @@ fn attempt_static(tcx: TyCtxt<'_>) -> Option { let mut ret = tcx .crates(()) .iter() - .map(|&cnum| { - if tcx.dep_kind(cnum) == CrateDepKind::Explicit { - Linkage::Static - } else { - Linkage::NotLinked - } + .map(|&cnum| match tcx.dep_kind(cnum) { + CrateDepKind::Explicit => Linkage::Static, + CrateDepKind::MacrosOnly | CrateDepKind::Implicit => Linkage::NotLinked, }) .collect::>(); diff --git a/compiler/rustc_middle/src/mir/coverage.rs b/compiler/rustc_middle/src/mir/coverage.rs index e7bb3ab0bc35..db24dae11304 100644 --- a/compiler/rustc_middle/src/mir/coverage.rs +++ b/compiler/rustc_middle/src/mir/coverage.rs @@ -135,7 +135,10 @@ impl Debug for CoverageKind { "Expression({:?}) = {} {} {}", id.index(), lhs.index(), - if *op == Op::Add { "+" } else { "-" }, + match op { + Op::Add => "+", + Op::Subtract => "-", + }, rhs.index(), ), Unreachable => write!(fmt, "Unreachable"), diff --git a/compiler/rustc_mir_transform/src/coverage/debug.rs b/compiler/rustc_mir_transform/src/coverage/debug.rs index d6a298fade42..22ea8710e6a9 100644 --- a/compiler/rustc_mir_transform/src/coverage/debug.rs +++ b/compiler/rustc_mir_transform/src/coverage/debug.rs @@ -323,7 +323,10 @@ impl DebugCounters { String::new() }, self.format_operand(lhs), - if op == Op::Add { "+" } else { "-" }, + match op { + Op::Add => "+", + Op::Subtract => "-", + }, self.format_operand(rhs), ); } diff --git a/compiler/rustc_parse/src/parser/stmt.rs b/compiler/rustc_parse/src/parser/stmt.rs index 4ff9927aab51..58c7a398f142 100644 --- a/compiler/rustc_parse/src/parser/stmt.rs +++ b/compiler/rustc_parse/src/parser/stmt.rs @@ -93,11 +93,12 @@ impl<'a> Parser<'a> { // or `auto trait` items. We aim to parse an arbitrary path `a::b` but not something // that starts like a path (1 token), but it fact not a path. // Also, we avoid stealing syntax from `parse_item_`. - if force_collect == ForceCollect::Yes { - self.collect_tokens_no_attrs(|this| this.parse_stmt_path_start(lo, attrs)) - } else { - self.parse_stmt_path_start(lo, attrs) - }? + match force_collect { + ForceCollect::Yes => { + self.collect_tokens_no_attrs(|this| this.parse_stmt_path_start(lo, attrs))? + } + ForceCollect::No => self.parse_stmt_path_start(lo, attrs)?, + } } else if let Some(item) = self.parse_item_common( attrs.clone(), false, @@ -113,13 +114,12 @@ impl<'a> Parser<'a> { self.mk_stmt(lo, StmtKind::Empty) } else if self.token != token::CloseDelim(Delimiter::Brace) { // Remainder are line-expr stmts. - let e = if force_collect == ForceCollect::Yes { - self.collect_tokens_no_attrs(|this| { + let e = match force_collect { + ForceCollect::Yes => self.collect_tokens_no_attrs(|this| { this.parse_expr_res(Restrictions::STMT_EXPR, Some(attrs)) - }) - } else { - self.parse_expr_res(Restrictions::STMT_EXPR, Some(attrs)) - }?; + })?, + ForceCollect::No => self.parse_expr_res(Restrictions::STMT_EXPR, Some(attrs))?, + }; if matches!(e.kind, ExprKind::Assign(..)) && self.eat_keyword(kw::Else) { let bl = self.parse_block()?; // Destructuring assignment ... else. diff --git a/compiler/rustc_parse/src/parser/ty.rs b/compiler/rustc_parse/src/parser/ty.rs index 82d9138c7a33..8b4f0ab8feb8 100644 --- a/compiler/rustc_parse/src/parser/ty.rs +++ b/compiler/rustc_parse/src/parser/ty.rs @@ -323,13 +323,14 @@ impl<'a> Parser<'a> { } else if self.can_begin_bound() { self.parse_bare_trait_object(lo, allow_plus)? } else if self.eat(&token::DotDotDot) { - if allow_c_variadic == AllowCVariadic::Yes { - TyKind::CVarArgs - } else { - // FIXME(Centril): Should we just allow `...` syntactically - // anywhere in a type and use semantic restrictions instead? - self.error_illegal_c_varadic_ty(lo); - TyKind::Err + match allow_c_variadic { + AllowCVariadic::Yes => TyKind::CVarArgs, + AllowCVariadic::No => { + // FIXME(Centril): Should we just allow `...` syntactically + // anywhere in a type and use semantic restrictions instead? + self.error_illegal_c_varadic_ty(lo); + TyKind::Err + } } } else { let msg = format!("expected type, found {}", super::token_descr(&self.token)); @@ -343,10 +344,9 @@ impl<'a> Parser<'a> { let mut ty = self.mk_ty(span, kind); // Try to recover from use of `+` with incorrect priority. - if allow_plus == AllowPlus::Yes { - self.maybe_recover_from_bad_type_plus(&ty)?; - } else { - self.maybe_report_ambiguous_plus(impl_dyn_multi, &ty); + match allow_plus { + AllowPlus::Yes => self.maybe_recover_from_bad_type_plus(&ty)?, + AllowPlus::No => self.maybe_report_ambiguous_plus(impl_dyn_multi, &ty), } if RecoverQuestionMark::Yes == recover_question_mark { ty = self.maybe_recover_from_question_mark(ty); diff --git a/compiler/rustc_passes/src/check_attr.rs b/compiler/rustc_passes/src/check_attr.rs index 25cc65ba04c8..d67d52da4974 100644 --- a/compiler/rustc_passes/src/check_attr.rs +++ b/compiler/rustc_passes/src/check_attr.rs @@ -864,33 +864,39 @@ impl CheckAttrVisitor<'_> { target: Target, specified_inline: &mut Option<(bool, Span)>, ) -> bool { - if target == Target::Use || target == Target::ExternCrate { - let do_inline = meta.name_or_empty() == sym::inline; - if let Some((prev_inline, prev_span)) = *specified_inline { - if do_inline != prev_inline { - let mut spans = MultiSpan::from_spans(vec![prev_span, meta.span()]); - spans.push_span_label(prev_span, fluent::passes_doc_inline_conflict_first); - spans.push_span_label(meta.span(), fluent::passes_doc_inline_conflict_second); - self.tcx.sess.emit_err(errors::DocKeywordConflict { spans }); - return false; + match target { + Target::Use | Target::ExternCrate => { + let do_inline = meta.name_or_empty() == sym::inline; + if let Some((prev_inline, prev_span)) = *specified_inline { + if do_inline != prev_inline { + let mut spans = MultiSpan::from_spans(vec![prev_span, meta.span()]); + spans.push_span_label(prev_span, fluent::passes_doc_inline_conflict_first); + spans.push_span_label( + meta.span(), + fluent::passes_doc_inline_conflict_second, + ); + self.tcx.sess.emit_err(errors::DocKeywordConflict { spans }); + return false; + } + true + } else { + *specified_inline = Some((do_inline, meta.span())); + true } - true - } else { - *specified_inline = Some((do_inline, meta.span())); - true } - } else { - self.tcx.emit_spanned_lint( - INVALID_DOC_ATTRIBUTES, - hir_id, - meta.span(), - errors::DocInlineOnlyUse { - attr_span: meta.span(), - item_span: (attr.style == AttrStyle::Outer) - .then(|| self.tcx.hir().span(hir_id)), - }, - ); - false + _ => { + self.tcx.emit_spanned_lint( + INVALID_DOC_ATTRIBUTES, + hir_id, + meta.span(), + errors::DocInlineOnlyUse { + attr_span: meta.span(), + item_span: (attr.style == AttrStyle::Outer) + .then(|| self.tcx.hir().span(hir_id)), + }, + ); + false + } } } @@ -1137,7 +1143,7 @@ impl CheckAttrVisitor<'_> { errors::DocTestUnknownInclude { path, value: value.to_string(), - inner: if attr.style == AttrStyle::Inner { "!" } else { "" }, + inner: match attr.style { AttrStyle::Inner=> "!" , AttrStyle::Outer => "" }, sugg: (attr.meta().unwrap().span, applicability), } ); diff --git a/compiler/rustc_resolve/src/build_reduced_graph.rs b/compiler/rustc_resolve/src/build_reduced_graph.rs index b1b04c92a750..84421dc1f622 100644 --- a/compiler/rustc_resolve/src/build_reduced_graph.rs +++ b/compiler/rustc_resolve/src/build_reduced_graph.rs @@ -298,14 +298,15 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> { self.r.record_partial_res(id, PartialRes::new(res)); } if module.is_normal() { - if res == Res::Err { - Ok(ty::Visibility::Public) - } else { - let vis = ty::Visibility::Restricted(res.def_id()); - if self.r.is_accessible_from(vis, parent_scope.module) { - Ok(vis.expect_local()) - } else { - Err(VisResolutionError::AncestorOnly(path.span)) + match res { + Res::Err => Ok(ty::Visibility::Public), + _ => { + let vis = ty::Visibility::Restricted(res.def_id()); + if self.r.is_accessible_from(vis, parent_scope.module) { + Ok(vis.expect_local()) + } else { + Err(VisResolutionError::AncestorOnly(path.span)) + } } } } else { diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs index 366086152555..7375df451e89 100644 --- a/compiler/rustc_resolve/src/diagnostics.rs +++ b/compiler/rustc_resolve/src/diagnostics.rs @@ -1552,12 +1552,12 @@ impl<'a> Resolver<'a> { if b.is_extern_crate() && ident.span.rust_2018() { help_msgs.push(format!("use `::{ident}` to refer to this {thing} unambiguously")) } - if misc == AmbiguityErrorMisc::SuggestCrate { - help_msgs - .push(format!("use `crate::{ident}` to refer to this {thing} unambiguously")) - } else if misc == AmbiguityErrorMisc::SuggestSelf { - help_msgs - .push(format!("use `self::{ident}` to refer to this {thing} unambiguously")) + match misc { + AmbiguityErrorMisc::SuggestCrate => help_msgs + .push(format!("use `crate::{ident}` to refer to this {thing} unambiguously")), + AmbiguityErrorMisc::SuggestSelf => help_msgs + .push(format!("use `self::{ident}` to refer to this {thing} unambiguously")), + AmbiguityErrorMisc::FromPrelude | AmbiguityErrorMisc::None => {} } err.span_note(b.span, ¬e_msg); diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs index e9842b2cba51..e35ffd154bb9 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs @@ -1230,20 +1230,23 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> { } ty::PredicateKind::WellFormed(ty) => { - if self.tcx.sess.opts.unstable_opts.trait_solver == TraitSolver::Classic { - // WF predicates cannot themselves make - // errors. They can only block due to - // ambiguity; otherwise, they always - // degenerate into other obligations - // (which may fail). - span_bug!(span, "WF predicate not satisfied for {:?}", ty); - } else { - // FIXME: we'll need a better message which takes into account - // which bounds actually failed to hold. - self.tcx.sess.struct_span_err( - span, - &format!("the type `{}` is not well-formed", ty), - ) + match self.tcx.sess.opts.unstable_opts.trait_solver { + TraitSolver::Classic => { + // WF predicates cannot themselves make + // errors. They can only block due to + // ambiguity; otherwise, they always + // degenerate into other obligations + // (which may fail). + span_bug!(span, "WF predicate not satisfied for {:?}", ty); + } + TraitSolver::Chalk | TraitSolver::Next => { + // FIXME: we'll need a better message which takes into account + // which bounds actually failed to hold. + self.tcx.sess.struct_span_err( + span, + &format!("the type `{}` is not well-formed", ty), + ) + } } } From 4d75f618323cb26a31396f20fe91c35efba9b823 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Mon, 30 Jan 2023 12:00:11 +0000 Subject: [PATCH 14/69] Use `Mutability::{is_mut, is_not}` --- .../rustc_borrowck/src/diagnostics/mutability_errors.rs | 2 +- compiler/rustc_borrowck/src/type_check/mod.rs | 2 +- compiler/rustc_const_eval/src/interpret/memory.rs | 4 ++-- compiler/rustc_hir_pretty/src/lib.rs | 6 ++---- compiler/rustc_middle/src/mir/graphviz.rs | 2 +- compiler/rustc_middle/src/mir/mod.rs | 6 +----- compiler/rustc_middle/src/mir/pretty.rs | 2 +- compiler/rustc_mir_build/src/build/expr/as_temp.rs | 2 +- compiler/rustc_mir_transform/src/const_prop.rs | 3 +-- compiler/rustc_mir_transform/src/shim.rs | 2 +- compiler/rustc_save_analysis/src/sig.rs | 3 +-- 11 files changed, 13 insertions(+), 21 deletions(-) diff --git a/compiler/rustc_borrowck/src/diagnostics/mutability_errors.rs b/compiler/rustc_borrowck/src/diagnostics/mutability_errors.rs index 45b15c2c5bd7..40f518b33cfb 100644 --- a/compiler/rustc_borrowck/src/diagnostics/mutability_errors.rs +++ b/compiler/rustc_borrowck/src/diagnostics/mutability_errors.rs @@ -344,7 +344,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { } else { err.span_help(source_info.span, "try removing `&mut` here"); } - } else if decl.mutability == Mutability::Not { + } else if decl.mutability.is_not() { if matches!( decl.local_info, Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::ImplicitSelf( diff --git a/compiler/rustc_borrowck/src/type_check/mod.rs b/compiler/rustc_borrowck/src/type_check/mod.rs index 06087b0c579d..2605a1491fb3 100644 --- a/compiler/rustc_borrowck/src/type_check/mod.rs +++ b/compiler/rustc_borrowck/src/type_check/mod.rs @@ -2028,7 +2028,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { } }; - if ty_to_mut == Mutability::Mut && ty_mut == Mutability::Not { + if ty_to_mut.is_mut() && ty_mut.is_not() { span_mirbug!( self, rvalue, diff --git a/compiler/rustc_const_eval/src/interpret/memory.rs b/compiler/rustc_const_eval/src/interpret/memory.rs index 291bfb2b5589..a87ce0053e8a 100644 --- a/compiler/rustc_const_eval/src/interpret/memory.rs +++ b/compiler/rustc_const_eval/src/interpret/memory.rs @@ -304,7 +304,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { .into()); }; - if alloc.mutability == Mutability::Not { + if alloc.mutability.is_not() { throw_ub_format!("deallocating immutable allocation {alloc_id:?}"); } if alloc_kind != kind { @@ -631,7 +631,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } let (_kind, alloc) = self.memory.alloc_map.get_mut(id).unwrap(); - if alloc.mutability == Mutability::Not { + if alloc.mutability.is_not() { throw_ub!(WriteToReadOnly(id)) } Ok((alloc, &mut self.machine)) diff --git a/compiler/rustc_hir_pretty/src/lib.rs b/compiler/rustc_hir_pretty/src/lib.rs index f74c551a45b6..7dcf9d8299f1 100644 --- a/compiler/rustc_hir_pretty/src/lib.rs +++ b/compiler/rustc_hir_pretty/src/lib.rs @@ -9,9 +9,7 @@ use rustc_ast_pretty::pp::{self, Breaks}; use rustc_ast_pretty::pprust::{Comments, PrintState}; use rustc_hir as hir; use rustc_hir::LifetimeParamKind; -use rustc_hir::{ - BindingAnnotation, ByRef, GenericArg, GenericParam, GenericParamKind, Mutability, Node, Term, -}; +use rustc_hir::{BindingAnnotation, ByRef, GenericArg, GenericParam, GenericParamKind, Node, Term}; use rustc_hir::{GenericBound, PatKind, RangeEnd, TraitBoundModifier}; use rustc_span::source_map::SourceMap; use rustc_span::symbol::{kw, Ident, IdentPrinter, Symbol}; @@ -1746,7 +1744,7 @@ impl<'a> State<'a> { if by_ref == ByRef::Yes { self.word_nbsp("ref"); } - if mutbl == Mutability::Mut { + if mutbl.is_mut() { self.word_nbsp("mut"); } self.print_ident(ident); diff --git a/compiler/rustc_middle/src/mir/graphviz.rs b/compiler/rustc_middle/src/mir/graphviz.rs index 5de56dad07a4..cf6d46e1e2c8 100644 --- a/compiler/rustc_middle/src/mir/graphviz.rs +++ b/compiler/rustc_middle/src/mir/graphviz.rs @@ -110,7 +110,7 @@ fn write_graph_label<'tcx, W: std::fmt::Write>( let decl = &body.local_decls[local]; write!(w, "let ")?; - if decl.mutability == Mutability::Mut { + if decl.mutability.is_mut() { write!(w, "mut ")?; } diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index 552af589bec5..872d3d2808be 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -416,11 +416,7 @@ impl<'tcx> Body<'tcx> { (self.arg_count + 1..self.local_decls.len()).filter_map(move |index| { let local = Local::new(index); let decl = &self.local_decls[local]; - if decl.is_user_variable() && decl.mutability == Mutability::Mut { - Some(local) - } else { - None - } + if decl.is_user_variable() && decl.mutability.is_mut() { Some(local) } else { None } }) } diff --git a/compiler/rustc_middle/src/mir/pretty.rs b/compiler/rustc_middle/src/mir/pretty.rs index 40289af257ff..27141fd8eff2 100644 --- a/compiler/rustc_middle/src/mir/pretty.rs +++ b/compiler/rustc_middle/src/mir/pretty.rs @@ -580,7 +580,7 @@ fn write_scope_tree( continue; } - let mut_str = if local_decl.mutability == Mutability::Mut { "mut " } else { "" }; + let mut_str = if local_decl.mutability.is_mut() { "mut " } else { "" }; let mut indented_decl = format!("{0:1$}let {2}{3:?}: {4:?}", INDENT, indent, mut_str, local, local_decl.ty); diff --git a/compiler/rustc_mir_build/src/build/expr/as_temp.rs b/compiler/rustc_mir_build/src/build/expr/as_temp.rs index 0ca4e3745199..3d3cf75559e3 100644 --- a/compiler/rustc_mir_build/src/build/expr/as_temp.rs +++ b/compiler/rustc_mir_build/src/build/expr/as_temp.rs @@ -44,7 +44,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let expr_ty = expr.ty; let temp = { let mut local_decl = LocalDecl::new(expr_ty, expr_span); - if mutability == Mutability::Not { + if mutability.is_not() { local_decl = local_decl.immutable(); } diff --git a/compiler/rustc_mir_transform/src/const_prop.rs b/compiler/rustc_mir_transform/src/const_prop.rs index 5c45abc5a170..9699611e9b0a 100644 --- a/compiler/rustc_mir_transform/src/const_prop.rs +++ b/compiler/rustc_mir_transform/src/const_prop.rs @@ -5,7 +5,6 @@ use std::cell::Cell; use either::Right; -use rustc_ast::Mutability; use rustc_const_eval::const_eval::CheckAlignment; use rustc_data_structures::fx::FxHashSet; use rustc_hir::def::DefKind; @@ -289,7 +288,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine<'mir, 'tcx> } // If the static allocation is mutable, then we can't const prop it as its content // might be different at runtime. - if alloc.inner().mutability == Mutability::Mut { + if alloc.inner().mutability.is_mut() { throw_machine_stop_str!("can't access mutable globals in ConstProp"); } diff --git a/compiler/rustc_mir_transform/src/shim.rs b/compiler/rustc_mir_transform/src/shim.rs index 8d4fe74e7d39..e9ca6f7c93c4 100644 --- a/compiler/rustc_mir_transform/src/shim.rs +++ b/compiler/rustc_mir_transform/src/shim.rs @@ -427,7 +427,7 @@ impl<'tcx> CloneShimBuilder<'tcx> { fn make_place(&mut self, mutability: Mutability, ty: Ty<'tcx>) -> Place<'tcx> { let span = self.span; let mut local = LocalDecl::new(ty, span); - if mutability == Mutability::Not { + if mutability.is_not() { local = local.immutable(); } Place::from(self.local_decls.push(local)) diff --git a/compiler/rustc_save_analysis/src/sig.rs b/compiler/rustc_save_analysis/src/sig.rs index 979305547c14..6d8a2b7c3eb3 100644 --- a/compiler/rustc_save_analysis/src/sig.rs +++ b/compiler/rustc_save_analysis/src/sig.rs @@ -29,7 +29,6 @@ use crate::{id_from_def_id, SaveContext}; use rls_data::{SigElement, Signature}; -use rustc_ast::Mutability; use rustc_hir as hir; use rustc_hir::def::{DefKind, Res}; use rustc_hir_pretty::id_to_string; @@ -769,7 +768,7 @@ impl<'hir> Sig for hir::ForeignItem<'hir> { } hir::ForeignItemKind::Static(ref ty, m) => { let mut text = "static ".to_owned(); - if m == Mutability::Mut { + if m.is_mut() { text.push_str("mut "); } let name = self.ident.to_string(); From f1d273cbfbebe108306455b7b34bbc625a24fa7a Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Mon, 30 Jan 2023 12:01:09 +0000 Subject: [PATCH 15/69] Replace some `_ == _ || _ == _`s with `matches!(_, _ | _)`s --- compiler/rustc_const_eval/src/transform/validate.rs | 2 +- compiler/rustc_errors/src/styled_buffer.rs | 2 +- compiler/rustc_expand/src/mbe/macro_parser.rs | 2 +- compiler/rustc_metadata/src/native_libs.rs | 2 +- compiler/rustc_mir_transform/src/const_prop.rs | 2 +- compiler/rustc_mir_transform/src/const_prop_lint.rs | 2 +- compiler/rustc_passes/src/stability.rs | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/compiler/rustc_const_eval/src/transform/validate.rs b/compiler/rustc_const_eval/src/transform/validate.rs index a2f2457487a4..72f456138ef5 100644 --- a/compiler/rustc_const_eval/src/transform/validate.rs +++ b/compiler/rustc_const_eval/src/transform/validate.rs @@ -754,7 +754,7 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> { // FIXME(JakobDegen) The validator should check that `self.mir_phase < // DropsLowered`. However, this causes ICEs with generation of drop shims, which // seem to fail to set their `MirPhase` correctly. - if *kind == RetagKind::Raw || *kind == RetagKind::TwoPhase { + if matches!(kind, RetagKind::Raw | RetagKind::TwoPhase) { self.fail(location, format!("explicit `{:?}` is forbidden", kind)); } } diff --git a/compiler/rustc_errors/src/styled_buffer.rs b/compiler/rustc_errors/src/styled_buffer.rs index 9abdb5fc97c6..9aa14e1f2148 100644 --- a/compiler/rustc_errors/src/styled_buffer.rs +++ b/compiler/rustc_errors/src/styled_buffer.rs @@ -142,7 +142,7 @@ impl StyledBuffer { pub fn set_style(&mut self, line: usize, col: usize, style: Style, overwrite: bool) { if let Some(ref mut line) = self.lines.get_mut(line) { if let Some(StyledChar { style: s, .. }) = line.get_mut(col) { - if overwrite || *s == Style::NoStyle || *s == Style::Quotation { + if overwrite || matches!(s, Style::NoStyle | Style::Quotation) { *s = style; } } diff --git a/compiler/rustc_expand/src/mbe/macro_parser.rs b/compiler/rustc_expand/src/mbe/macro_parser.rs index 2e199541b92b..283e68a68b5d 100644 --- a/compiler/rustc_expand/src/mbe/macro_parser.rs +++ b/compiler/rustc_expand/src/mbe/macro_parser.rs @@ -503,7 +503,7 @@ impl TtParser { mp.push_match(metavar_idx, seq_depth, MatchedSeq(vec![])); } - if op == KleeneOp::ZeroOrMore || op == KleeneOp::ZeroOrOne { + if matches!(op, KleeneOp::ZeroOrMore | KleeneOp::ZeroOrOne) { // Try zero matches of this sequence, by skipping over it. self.cur_mps.push(MatcherPos { idx: idx_first_after, diff --git a/compiler/rustc_metadata/src/native_libs.rs b/compiler/rustc_metadata/src/native_libs.rs index 6f05c76e89de..a5910100786e 100644 --- a/compiler/rustc_metadata/src/native_libs.rs +++ b/compiler/rustc_metadata/src/native_libs.rs @@ -107,7 +107,7 @@ impl<'tcx> Collector<'tcx> { return; }; - if abi == Abi::Rust || abi == Abi::RustIntrinsic || abi == Abi::PlatformIntrinsic { + if matches!(abi, Abi::Rust | Abi::RustIntrinsic | Abi::PlatformIntrinsic) { return; } diff --git a/compiler/rustc_mir_transform/src/const_prop.rs b/compiler/rustc_mir_transform/src/const_prop.rs index 9699611e9b0a..feb054392bc2 100644 --- a/compiler/rustc_mir_transform/src/const_prop.rs +++ b/compiler/rustc_mir_transform/src/const_prop.rs @@ -527,7 +527,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { let r = self.use_ecx(|this| this.ecx.read_immediate(&this.ecx.eval_operand(right, None)?)); let l = self.use_ecx(|this| this.ecx.read_immediate(&this.ecx.eval_operand(left, None)?)); // Check for exceeding shifts *even if* we cannot evaluate the LHS. - if op == BinOp::Shr || op == BinOp::Shl { + if matches!(op, BinOp::Shr | BinOp::Shl) { let r = r.clone()?; // We need the type of the LHS. We cannot use `place_layout` as that is the type // of the result, which for checked binops is not the same! diff --git a/compiler/rustc_mir_transform/src/const_prop_lint.rs b/compiler/rustc_mir_transform/src/const_prop_lint.rs index 0ab67228f3f4..c4b10218c237 100644 --- a/compiler/rustc_mir_transform/src/const_prop_lint.rs +++ b/compiler/rustc_mir_transform/src/const_prop_lint.rs @@ -368,7 +368,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { this.ecx.read_immediate(&this.ecx.eval_operand(left, None)?) }); // Check for exceeding shifts *even if* we cannot evaluate the LHS. - if op == BinOp::Shr || op == BinOp::Shl { + if matches!(op, BinOp::Shr | BinOp::Shl) { let r = r.clone()?; // We need the type of the LHS. We cannot use `place_layout` as that is the type // of the result, which for checked binops is not the same! diff --git a/compiler/rustc_passes/src/stability.rs b/compiler/rustc_passes/src/stability.rs index 0bde7502e399..47911aef25d4 100644 --- a/compiler/rustc_passes/src/stability.rs +++ b/compiler/rustc_passes/src/stability.rs @@ -125,7 +125,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> { if let Some((depr, span)) = &depr { is_deprecated = true; - if kind == AnnotationKind::Prohibited || kind == AnnotationKind::DeprecationProhibited { + if matches!(kind, AnnotationKind::Prohibited | AnnotationKind::DeprecationProhibited) { let hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id); self.tcx.emit_spanned_lint( USELESS_DEPRECATED, From 385dbff9e5a77b441d453b109538ebceb2f33e7b Mon Sep 17 00:00:00 2001 From: KaDiWa Date: Fri, 27 Jan 2023 22:10:10 +0100 Subject: [PATCH 16/69] bootstrap script: slight cleanup --- src/bootstrap/bootstrap.py | 164 +++++++++++++++++-------------------- src/bootstrap/download.rs | 133 +++++++++++++++++------------- x.py | 2 +- 3 files changed, 152 insertions(+), 147 deletions(-) diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py index abdd12127d36..9cc7e0c68dd0 100644 --- a/src/bootstrap/bootstrap.py +++ b/src/bootstrap/bootstrap.py @@ -2,7 +2,6 @@ from __future__ import absolute_import, division, print_function import argparse import contextlib import datetime -import distutils.version import hashlib import json import os @@ -13,17 +12,17 @@ import sys import tarfile import tempfile -from time import time, sleep +from time import time -def support_xz(): - try: - with tempfile.NamedTemporaryFile(delete=False) as temp_file: - temp_path = temp_file.name - with tarfile.open(temp_path, "w:xz"): - pass - return True - except tarfile.CompressionError: - return False +try: + import lzma +except ImportError: + lzma = None + +if sys.platform == 'win32': + EXE_SUFFIX = ".exe" +else: + EXE_SUFFIX = "" def get(base, url, path, checksums, verbose=False): with tempfile.NamedTemporaryFile(delete=False) as temp_file: @@ -61,7 +60,7 @@ def get(base, url, path, checksums, verbose=False): def download(path, url, probably_big, verbose): - for _ in range(0, 4): + for _ in range(4): try: _download(path, url, probably_big, verbose, True) return @@ -395,15 +394,15 @@ class RustBuild(object): def __init__(self): self.checksums_sha256 = {} self.stage0_compiler = None - self._download_url = '' + self.download_url = '' self.build = '' self.build_dir = '' self.clean = False self.config_toml = '' self.rust_root = '' - self.use_locked_deps = '' - self.use_vendored_sources = '' - self.verbose = False + self.use_locked_deps = False + self.use_vendored_sources = False + self.verbose = 0 self.git_version = None self.nix_deps_dir = None @@ -426,7 +425,7 @@ class RustBuild(object): self.program_out_of_date(self.rustc_stamp(), key)): if os.path.exists(bin_root): shutil.rmtree(bin_root) - tarball_suffix = '.tar.xz' if support_xz() else '.tar.gz' + tarball_suffix = '.tar.gz' if lzma is None else '.tar.xz' filename = "rust-std-{}-{}{}".format( rustc_channel, self.build, tarball_suffix) pattern = "rust-std-{}".format(self.build) @@ -437,15 +436,17 @@ class RustBuild(object): filename = "cargo-{}-{}{}".format(rustc_channel, self.build, tarball_suffix) self._download_component_helper(filename, "cargo", tarball_suffix) - self.fix_bin_or_dylib("{}/bin/cargo".format(bin_root)) + if self.should_fix_bins_and_dylibs(): + self.fix_bin_or_dylib("{}/bin/cargo".format(bin_root)) + + self.fix_bin_or_dylib("{}/bin/rustc".format(bin_root)) + self.fix_bin_or_dylib("{}/bin/rustdoc".format(bin_root)) + self.fix_bin_or_dylib("{}/libexec/rust-analyzer-proc-macro-srv".format(bin_root)) + lib_dir = "{}/lib".format(bin_root) + for lib in os.listdir(lib_dir): + if lib.endswith(".so"): + self.fix_bin_or_dylib(os.path.join(lib_dir, lib)) - self.fix_bin_or_dylib("{}/bin/rustc".format(bin_root)) - self.fix_bin_or_dylib("{}/bin/rustdoc".format(bin_root)) - self.fix_bin_or_dylib("{}/libexec/rust-analyzer-proc-macro-srv".format(bin_root)) - lib_dir = "{}/lib".format(bin_root) - for lib in os.listdir(lib_dir): - if lib.endswith(".so"): - self.fix_bin_or_dylib(os.path.join(lib_dir, lib)) with output(self.rustc_stamp()) as rust_stamp: rust_stamp.write(key) @@ -458,18 +459,53 @@ class RustBuild(object): if not os.path.exists(rustc_cache): os.makedirs(rustc_cache) - base = self._download_url - url = "dist/{}".format(key) tarball = os.path.join(rustc_cache, filename) if not os.path.exists(tarball): get( - base, - "{}/{}".format(url, filename), + self.download_url, + "dist/{}/{}".format(key, filename), tarball, self.checksums_sha256, - verbose=self.verbose, + verbose=self.verbose != 0, ) - unpack(tarball, tarball_suffix, self.bin_root(), match=pattern, verbose=self.verbose) + unpack(tarball, tarball_suffix, self.bin_root(), match=pattern, verbose=self.verbose != 0) + + def should_fix_bins_and_dylibs(self): + """Whether or not `fix_bin_or_dylib` needs to be run; can only be True + on NixOS. + """ + default_encoding = sys.getdefaultencoding() + try: + ostype = subprocess.check_output( + ['uname', '-s']).strip().decode(default_encoding) + except subprocess.CalledProcessError: + return False + except OSError as reason: + if getattr(reason, 'winerror', None) is not None: + return False + raise reason + + if ostype != "Linux": + return False + + # If the user has asked binaries to be patched for Nix, then + # don't check for NixOS or `/lib`. + if self.get_toml("patch-binaries-for-nix", "build") == "true": + return True + + # Use `/etc/os-release` instead of `/etc/NIXOS`. + # The latter one does not exist on NixOS when using tmpfs as root. + try: + with open("/etc/os-release", "r") as f: + if not any(l.strip() in ("ID=nixos", "ID='nixos'", 'ID="nixos"') for l in f): + return False + except FileNotFoundError: + return False + if os.path.exists("/lib"): + return False + + print("info: You seem to be using Nix.") + return True def fix_bin_or_dylib(self, fname): """Modifies the interpreter section of 'fname' to fix the dynamic linker, @@ -480,38 +516,7 @@ class RustBuild(object): Please see https://nixos.org/patchelf.html for more information """ - default_encoding = sys.getdefaultencoding() - try: - ostype = subprocess.check_output( - ['uname', '-s']).strip().decode(default_encoding) - except subprocess.CalledProcessError: - return - except OSError as reason: - if getattr(reason, 'winerror', None) is not None: - return - raise reason - - if ostype != "Linux": - return - - # If the user has asked binaries to be patched for Nix, then - # don't check for NixOS or `/lib`, just continue to the patching. - if self.get_toml('patch-binaries-for-nix', 'build') != 'true': - # Use `/etc/os-release` instead of `/etc/NIXOS`. - # The latter one does not exist on NixOS when using tmpfs as root. - try: - with open("/etc/os-release", "r") as f: - if not any(l.strip() in ["ID=nixos", "ID='nixos'", 'ID="nixos"'] for l in f): - return - except FileNotFoundError: - return - if os.path.exists("/lib"): - return - - # At this point we're pretty sure the user is running NixOS or - # using Nix - nix_os_msg = "info: you seem to be using Nix. Attempting to patch" - print(nix_os_msg, fname) + print("attempting to patch", fname) # Only build `.nix-deps` once. nix_deps_dir = self.nix_deps_dir @@ -666,8 +671,7 @@ class RustBuild(object): config = self.get_toml(program) if config: return os.path.expanduser(config) - return os.path.join(self.bin_root(), "bin", "{}{}".format( - program, self.exe_suffix())) + return os.path.join(self.bin_root(), "bin", "{}{}".format(program, EXE_SUFFIX)) @staticmethod def get_string(line): @@ -692,13 +696,6 @@ class RustBuild(object): return line[start + 1:end] return None - @staticmethod - def exe_suffix(): - """Return a suffix for executables""" - if sys.platform == 'win32': - return '.exe' - return '' - def bootstrap_binary(self): """Return the path of the bootstrap binary @@ -757,7 +754,6 @@ class RustBuild(object): if target_linker is not None: env["RUSTFLAGS"] += " -C linker=" + target_linker env["RUSTFLAGS"] += " -Wrust_2018_idioms -Wunused_lifetimes" - env["RUSTFLAGS"] += " -Wsemicolon_in_expressions_from_macros" if self.get_toml("deny-warnings", "rust") != "false": env["RUSTFLAGS"] += " -Dwarnings" @@ -768,8 +764,7 @@ class RustBuild(object): self.cargo())) args = [self.cargo(), "build", "--manifest-path", os.path.join(self.rust_root, "src/bootstrap/Cargo.toml")] - for _ in range(0, self.verbose): - args.append("--verbose") + args.extend("--verbose" for _ in range(self.verbose)) if self.use_locked_deps: args.append("--locked") if self.use_vendored_sources: @@ -783,7 +778,7 @@ class RustBuild(object): args.append("--color=never") # Run this from the source directory so cargo finds .cargo/config - run(args, env=env, verbose=self.verbose, cwd=self.rust_root) + run(args, env=env, verbose=self.verbose != 0, cwd=self.rust_root) def build_triple(self): """Build triple as in LLVM @@ -792,16 +787,7 @@ class RustBuild(object): so use `self.build` where possible. """ config = self.get_toml('build') - if config: - return config - return default_build_triple(self.verbose) - - def set_dist_environment(self, url): - """Set download URL for normal environment""" - if 'RUSTUP_DIST_SERVER' in os.environ: - self._download_url = os.environ['RUSTUP_DIST_SERVER'] - else: - self._download_url = url + return config or default_build_triple(self.verbose != 0) def check_vendored_status(self): """Check that vendoring is configured properly""" @@ -891,7 +877,6 @@ def bootstrap(help_triggered): build.verbose = max(build.verbose, int(config_verbose)) build.use_vendored_sources = build.get_toml('vendor', 'build') == 'true' - build.use_locked_deps = build.get_toml('locked-deps', 'build') == 'true' build.check_vendored_status() @@ -903,8 +888,7 @@ def bootstrap(help_triggered): data = json.load(f) build.checksums_sha256 = data["checksums_sha256"] build.stage0_compiler = Stage0Toolchain(data["compiler"]) - - build.set_dist_environment(data["config"]["dist_server"]) + build.download_url = os.getenv("RUSTUP_DIST_SERVER") or data["config"]["dist_server"] build.build = args.build or build.build_triple() @@ -932,7 +916,7 @@ def main(): # x.py help ... if len(sys.argv) > 1 and sys.argv[1] == 'help': - sys.argv = [sys.argv[0], '-h'] + sys.argv[2:] + sys.argv[1] = '-h' help_triggered = ( '-h' in sys.argv) or ('--help' in sys.argv) or (len(sys.argv) == 1) diff --git a/src/bootstrap/download.rs b/src/bootstrap/download.rs index 6ae283f32a5f..626e20754bc0 100644 --- a/src/bootstrap/download.rs +++ b/src/bootstrap/download.rs @@ -70,6 +70,53 @@ impl Config { check_run(cmd, self.is_verbose()) } + /// Whether or not `fix_bin_or_dylib` needs to be run; can only be true + /// on NixOS + fn should_fix_bins_and_dylibs(&self) -> bool { + static CACHED: OnceCell = OnceCell::new(); + + let val = *CACHED.get_or_init(|| { + match Command::new("uname").arg("-s").stderr(Stdio::inherit()).output() { + Err(_) => return false, + Ok(output) if !output.status.success() => return false, + Ok(output) => { + let mut os_name = output.stdout; + if os_name.last() == Some(&b'\n') { + os_name.pop(); + } + if os_name != b"Linux" { + return false; + } + } + } + + // If the user has asked binaries to be patched for Nix, then + // don't check for NixOS or `/lib`. + // NOTE: this intentionally comes after the Linux check: + // - patchelf only works with ELF files, so no need to run it on Mac or Windows + // - On other Unix systems, there is no stable syscall interface, so Nix doesn't manage the global libc. + if self.patch_binaries_for_nix { + return true; + } + + // Use `/etc/os-release` instead of `/etc/NIXOS`. + // The latter one does not exist on NixOS when using tmpfs as root. + let is_nixos = match File::open("/etc/os-release") { + Err(e) if e.kind() == ErrorKind::NotFound => false, + Err(e) => panic!("failed to access /etc/os-release: {}", e), + Ok(os_release) => BufReader::new(os_release).lines().any(|l| { + let l = l.expect("reading /etc/os-release"); + matches!(l.trim(), "ID=nixos" | "ID='nixos'" | "ID=\"nixos\"") + }), + }; + is_nixos && !Path::new("/lib").exists() + }); + if val { + println!("info: You seem to be using Nix."); + } + val + } + /// Modifies the interpreter section of 'fname' to fix the dynamic linker, /// or the RPATH section, to fix the dynamic library search path /// @@ -78,45 +125,7 @@ impl Config { /// /// Please see https://nixos.org/patchelf.html for more information fn fix_bin_or_dylib(&self, fname: &Path) { - // FIXME: cache NixOS detection? - match Command::new("uname").arg("-s").stderr(Stdio::inherit()).output() { - Err(_) => return, - Ok(output) if !output.status.success() => return, - Ok(output) => { - let mut s = output.stdout; - if s.last() == Some(&b'\n') { - s.pop(); - } - if s != b"Linux" { - return; - } - } - } - - // If the user has asked binaries to be patched for Nix, then - // don't check for NixOS or `/lib`, just continue to the patching. - // NOTE: this intentionally comes after the Linux check: - // - patchelf only works with ELF files, so no need to run it on Mac or Windows - // - On other Unix systems, there is no stable syscall interface, so Nix doesn't manage the global libc. - if !self.patch_binaries_for_nix { - // Use `/etc/os-release` instead of `/etc/NIXOS`. - // The latter one does not exist on NixOS when using tmpfs as root. - const NIX_IDS: &[&str] = &["ID=nixos", "ID='nixos'", "ID=\"nixos\""]; - let os_release = match File::open("/etc/os-release") { - Err(e) if e.kind() == ErrorKind::NotFound => return, - Err(e) => panic!("failed to access /etc/os-release: {}", e), - Ok(f) => f, - }; - if !BufReader::new(os_release).lines().any(|l| NIX_IDS.contains(&t!(l).trim())) { - return; - } - if Path::new("/lib").exists() { - return; - } - } - - // At this point we're pretty sure the user is running NixOS or using Nix - println!("info: you seem to be using Nix. Attempting to patch {}", fname.display()); + println!("attempting to patch {}", fname.display()); // Only build `.nix-deps` once. static NIX_DEPS_DIR: OnceCell = OnceCell::new(); @@ -328,8 +337,10 @@ impl Config { let filename = format!("rustfmt-{version}-{build}.tar.xz", build = host.triple); self.download_component(DownloadSource::Dist, filename, "rustfmt-preview", &date, "stage0"); - self.fix_bin_or_dylib(&bin_root.join("bin").join("rustfmt")); - self.fix_bin_or_dylib(&bin_root.join("bin").join("cargo-fmt")); + if self.should_fix_bins_and_dylibs() { + self.fix_bin_or_dylib(&bin_root.join("bin").join("rustfmt")); + self.fix_bin_or_dylib(&bin_root.join("bin").join("cargo-fmt")); + } self.create(&rustfmt_stamp, &channel); Some(rustfmt_path) @@ -358,16 +369,21 @@ impl Config { let filename = format!("rust-src-{version}.tar.xz"); self.download_ci_component(filename, "rust-src", commit); - self.fix_bin_or_dylib(&bin_root.join("bin").join("rustc")); - self.fix_bin_or_dylib(&bin_root.join("bin").join("rustdoc")); - self.fix_bin_or_dylib(&bin_root.join("libexec").join("rust-analyzer-proc-macro-srv")); - let lib_dir = bin_root.join("lib"); - for lib in t!(fs::read_dir(&lib_dir), lib_dir.display().to_string()) { - let lib = t!(lib); - if lib.path().extension() == Some(OsStr::new("so")) { - self.fix_bin_or_dylib(&lib.path()); + if self.should_fix_bins_and_dylibs() { + self.fix_bin_or_dylib(&bin_root.join("bin").join("rustc")); + self.fix_bin_or_dylib(&bin_root.join("bin").join("rustdoc")); + self.fix_bin_or_dylib( + &bin_root.join("libexec").join("rust-analyzer-proc-macro-srv"), + ); + let lib_dir = bin_root.join("lib"); + for lib in t!(fs::read_dir(&lib_dir), lib_dir.display().to_string()) { + let lib = t!(lib); + if lib.path().extension() == Some(OsStr::new("so")) { + self.fix_bin_or_dylib(&lib.path()); + } } } + t!(fs::write(rustc_stamp, commit)); } } @@ -459,8 +475,10 @@ impl Config { let key = format!("{}{}", llvm_sha, self.llvm_assertions); if program_out_of_date(&llvm_stamp, &key) && !self.dry_run() { self.download_ci_llvm(&llvm_sha); - for entry in t!(fs::read_dir(llvm_root.join("bin"))) { - self.fix_bin_or_dylib(&t!(entry).path()); + if self.should_fix_bins_and_dylibs() { + for entry in t!(fs::read_dir(llvm_root.join("bin"))) { + self.fix_bin_or_dylib(&t!(entry).path()); + } } // Update the timestamp of llvm-config to force rustc_llvm to be @@ -475,13 +493,16 @@ impl Config { let llvm_config = llvm_root.join("bin").join(exe("llvm-config", self.build)); t!(filetime::set_file_times(&llvm_config, now, now)); - let llvm_lib = llvm_root.join("lib"); - for entry in t!(fs::read_dir(&llvm_lib)) { - let lib = t!(entry).path(); - if lib.extension().map_or(false, |ext| ext == "so") { - self.fix_bin_or_dylib(&lib); + if self.should_fix_bins_and_dylibs() { + let llvm_lib = llvm_root.join("lib"); + for entry in t!(fs::read_dir(&llvm_lib)) { + let lib = t!(entry).path(); + if lib.extension().map_or(false, |ext| ext == "so") { + self.fix_bin_or_dylib(&lib); + } } } + t!(fs::write(llvm_stamp, key)); } } diff --git a/x.py b/x.py index 6df4033d55d7..b7df39c7bc9e 100755 --- a/x.py +++ b/x.py @@ -22,7 +22,7 @@ if sys.version_info.major < 3: pass rust_dir = os.path.dirname(os.path.abspath(__file__)) -sys.path.append(os.path.join(rust_dir, "src", "bootstrap")) +sys.path[:0] = [os.path.join(rust_dir, "src", "bootstrap")] import bootstrap bootstrap.main() From b925031c5fb4cd5c8c23b655d15edca8ca0ac4ab Mon Sep 17 00:00:00 2001 From: KaDiWa Date: Sun, 29 Jan 2023 21:53:10 +0100 Subject: [PATCH 17/69] bootstrap: --help handling --- src/bootstrap/bootstrap.py | 47 +++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py index 9cc7e0c68dd0..0f793c9327f5 100644 --- a/src/bootstrap/bootstrap.py +++ b/src/bootstrap/bootstrap.py @@ -820,17 +820,10 @@ class RustBuild(object): if os.path.exists(cargo_dir): shutil.rmtree(cargo_dir) -def bootstrap(help_triggered): - """Configure, fetch, build and run the initial bootstrap""" - - # If the user is asking for help, let them know that the whole download-and-build - # process has to happen before anything is printed out. - if help_triggered: - print("info: Downloading and building bootstrap before processing --help") - print(" command. See src/bootstrap/README.md for help with common") - print(" commands.") - - parser = argparse.ArgumentParser(description='Build rust') +def parse_args(): + """Parse the command line arguments that the python script needs.""" + parser = argparse.ArgumentParser(add_help=False) + parser.add_argument('-h', '--help', action='store_true') parser.add_argument('--config') parser.add_argument('--build-dir') parser.add_argument('--build') @@ -838,9 +831,10 @@ def bootstrap(help_triggered): parser.add_argument('--clean', action='store_true') parser.add_argument('-v', '--verbose', action='count', default=0) - args = [a for a in sys.argv if a != '-h' and a != '--help'] - args, _ = parser.parse_known_args(args) + return parser.parse_known_args(sys.argv)[0] +def bootstrap(args): + """Configure, fetch, build and run the initial bootstrap""" # Configure initial bootstrap build = RustBuild() build.rust_root = os.path.abspath(os.path.join(__file__, '../../..')) @@ -918,23 +912,30 @@ def main(): if len(sys.argv) > 1 and sys.argv[1] == 'help': sys.argv[1] = '-h' - help_triggered = ( - '-h' in sys.argv) or ('--help' in sys.argv) or (len(sys.argv) == 1) + args = parse_args() + help_triggered = args.help or len(sys.argv) == 1 + + # If the user is asking for help, let them know that the whole download-and-build + # process has to happen before anything is printed out. + if help_triggered: + print( + "info: Downloading and building bootstrap before processing --help command.\n" + " See src/bootstrap/README.md for help with common commands." + ) + + exit_code = 0 try: - bootstrap(help_triggered) - if not help_triggered: - print("Build completed successfully in {}".format( - format_build_time(time() - start_time))) + bootstrap(args) except (SystemExit, KeyboardInterrupt) as error: if hasattr(error, 'code') and isinstance(error.code, int): exit_code = error.code else: exit_code = 1 print(error) - if not help_triggered: - print("Build completed unsuccessfully in {}".format( - format_build_time(time() - start_time))) - sys.exit(exit_code) + + if not help_triggered: + print("Build completed successfully in", format_build_time(time() - start_time)) + sys.exit(exit_code) if __name__ == '__main__': From 3e5e38731834246f09f596dec954f35d26bc5629 Mon Sep 17 00:00:00 2001 From: rustbot <47979223+rustbot@users.noreply.github.com> Date: Mon, 30 Jan 2023 12:01:05 -0500 Subject: [PATCH 18/69] Update books --- src/doc/book | 2 +- src/doc/embedded-book | 2 +- src/doc/nomicon | 2 +- src/doc/reference | 2 +- src/doc/rust-by-example | 2 +- src/doc/rustc-dev-guide | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/doc/book b/src/doc/book index 2cd1b5593d26..f2a78f64b668 160000 --- a/src/doc/book +++ b/src/doc/book @@ -1 +1 @@ -Subproject commit 2cd1b5593d26dc6a03c20f8619187ad4b2485552 +Subproject commit f2a78f64b668f63f581203c6bac509903f7c00ee diff --git a/src/doc/embedded-book b/src/doc/embedded-book index 19f798d44883..f1a4614aa41c 160000 --- a/src/doc/embedded-book +++ b/src/doc/embedded-book @@ -1 +1 @@ -Subproject commit 19f798d448835a4888e3b3eae7fe69f1d61d8681 +Subproject commit f1a4614aa41cc544b91b79760a709e113f3451d7 diff --git a/src/doc/nomicon b/src/doc/nomicon index 960d610e7f33..bd1829d23529 160000 --- a/src/doc/nomicon +++ b/src/doc/nomicon @@ -1 +1 @@ -Subproject commit 960d610e7f33889a2577f5f17c26f0d5c82b30df +Subproject commit bd1829d235296952bf72ca55635e360584b8805e diff --git a/src/doc/reference b/src/doc/reference index 2cb0ed9ba563..22882fb3f7b4 160000 --- a/src/doc/reference +++ b/src/doc/reference @@ -1 +1 @@ -Subproject commit 2cb0ed9ba56360949f492f9866afe8c293f9f9da +Subproject commit 22882fb3f7b4d69fdc0d1731e8b9cfcb6910537d diff --git a/src/doc/rust-by-example b/src/doc/rust-by-example index a9fb7d13eadf..134376872e8c 160000 --- a/src/doc/rust-by-example +++ b/src/doc/rust-by-example @@ -1 +1 @@ -Subproject commit a9fb7d13eadfcc5f457962731f105b97f9a7474a +Subproject commit 134376872e8c387ef369507e0ee9b5a0e3272718 diff --git a/src/doc/rustc-dev-guide b/src/doc/rustc-dev-guide index 7352353ae91c..e359ee27fc3d 160000 --- a/src/doc/rustc-dev-guide +++ b/src/doc/rustc-dev-guide @@ -1 +1 @@ -Subproject commit 7352353ae91c48b136d2ca7d03822e1448165e1e +Subproject commit e359ee27fc3da3356d71a732128c0a1abe02e53a From 59cc5e5d59796f5817d46b31450923597d9f8ae7 Mon Sep 17 00:00:00 2001 From: David Wood Date: Fri, 14 Oct 2022 14:00:06 +0100 Subject: [PATCH 19/69] errors: add `emit_note`/`create_note` on `Handler` Support for emission of notes was added in f8ebc72 but `emit_note` and `create_note` functions weren't added to `Handler`. Signed-off-by: David Wood --- compiler/rustc_errors/src/lib.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/compiler/rustc_errors/src/lib.rs b/compiler/rustc_errors/src/lib.rs index d076fc08b0e2..57732db5acab 100644 --- a/compiler/rustc_errors/src/lib.rs +++ b/compiler/rustc_errors/src/lib.rs @@ -1157,6 +1157,17 @@ impl Handler { self.create_bug(bug).emit() } + pub fn emit_note<'a>(&'a self, note: impl IntoDiagnostic<'a, Noted>) -> Noted { + self.create_note(note).emit() + } + + pub fn create_note<'a>( + &'a self, + note: impl IntoDiagnostic<'a, Noted>, + ) -> DiagnosticBuilder<'a, Noted> { + note.into_diagnostic(self) + } + fn emit_diag_at_span( &self, mut diag: Diagnostic, From f7b42102e68537c6b0bbb3a1e83c9db69820dfb3 Mon Sep 17 00:00:00 2001 From: David Wood Date: Tue, 30 Aug 2022 17:00:20 +0100 Subject: [PATCH 20/69] errors: implement `IntoDiagnosticArg` for `&T` Implement `IntoDiagnosticArg` for `&'a T` when `T` implements `IntoDiagnosticArg` and `Clone`. Makes it easier to write diagnostic structs that borrow something which implements `IntoDiagnosticArg`. Signed-off-by: David Wood --- .../rustc_borrowck/src/diagnostics/region_name.rs | 6 ++++++ compiler/rustc_borrowck/src/session_diagnostics.rs | 14 +------------- compiler/rustc_errors/src/diagnostic_impls.rs | 6 ++++++ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/compiler/rustc_borrowck/src/diagnostics/region_name.rs b/compiler/rustc_borrowck/src/diagnostics/region_name.rs index 9233287cf3a7..2440f20502ab 100644 --- a/compiler/rustc_borrowck/src/diagnostics/region_name.rs +++ b/compiler/rustc_borrowck/src/diagnostics/region_name.rs @@ -187,6 +187,12 @@ impl Display for RegionName { } } +impl rustc_errors::IntoDiagnosticArg for RegionName { + fn into_diagnostic_arg(self) -> rustc_errors::DiagnosticArgValue<'static> { + self.to_string().into_diagnostic_arg() + } +} + impl<'tcx> MirBorrowckCtxt<'_, 'tcx> { pub(crate) fn mir_def_id(&self) -> hir::def_id::LocalDefId { self.body.source.def_id().expect_local() diff --git a/compiler/rustc_borrowck/src/session_diagnostics.rs b/compiler/rustc_borrowck/src/session_diagnostics.rs index 23acf159240f..13199d038525 100644 --- a/compiler/rustc_borrowck/src/session_diagnostics.rs +++ b/compiler/rustc_borrowck/src/session_diagnostics.rs @@ -1,4 +1,4 @@ -use rustc_errors::{IntoDiagnosticArg, MultiSpan}; +use rustc_errors::MultiSpan; use rustc_macros::{Diagnostic, LintDiagnostic, Subdiagnostic}; use rustc_middle::ty::{GenericArg, Ty}; use rustc_span::Span; @@ -128,18 +128,6 @@ pub(crate) enum LifetimeReturnCategoryErr<'a> { }, } -impl IntoDiagnosticArg for &RegionName { - fn into_diagnostic_arg(self) -> rustc_errors::DiagnosticArgValue<'static> { - format!("{}", self).into_diagnostic_arg() - } -} - -impl IntoDiagnosticArg for RegionName { - fn into_diagnostic_arg(self) -> rustc_errors::DiagnosticArgValue<'static> { - format!("{}", self).into_diagnostic_arg() - } -} - #[derive(Subdiagnostic)] pub(crate) enum RequireStaticErr { #[note(borrowck_used_impl_require_static)] diff --git a/compiler/rustc_errors/src/diagnostic_impls.rs b/compiler/rustc_errors/src/diagnostic_impls.rs index dad5e98aac02..d5a5ef3b445f 100644 --- a/compiler/rustc_errors/src/diagnostic_impls.rs +++ b/compiler/rustc_errors/src/diagnostic_impls.rs @@ -36,6 +36,12 @@ impl<'a, T: fmt::Display> From<&'a T> for DiagnosticArgFromDisplay<'a> { } } +impl<'a, T: Clone + IntoDiagnosticArg> IntoDiagnosticArg for &'a T { + fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> { + self.clone().into_diagnostic_arg() + } +} + macro_rules! into_diagnostic_arg_using_display { ($( $ty:ty ),+ $(,)?) => { $( From d45004806d04225bab2f86076bcc6d6a8862b2a9 Mon Sep 17 00:00:00 2001 From: David Wood Date: Tue, 30 Aug 2022 17:01:54 +0100 Subject: [PATCH 21/69] session: impl `IntoDiagnosticArg` for `CrateType` Forward the `Display` implementation for `CrateType` to `IntoDiagnosticArg` so that it can be used in diagnostic structs. Signed-off-by: David Wood --- compiler/rustc_session/src/config.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_session/src/config.rs b/compiler/rustc_session/src/config.rs index c49c5fa99041..973d860118ef 100644 --- a/compiler/rustc_session/src/config.rs +++ b/compiler/rustc_session/src/config.rs @@ -24,7 +24,7 @@ use rustc_span::RealFileName; use rustc_span::SourceFileHashAlgorithm; use rustc_errors::emitter::HumanReadableErrorType; -use rustc_errors::{ColorConfig, HandlerFlags}; +use rustc_errors::{ColorConfig, DiagnosticArgValue, HandlerFlags, IntoDiagnosticArg}; use std::collections::btree_map::{ Iter as BTreeMapIter, Keys as BTreeMapKeysIter, Values as BTreeMapValuesIter, @@ -2694,6 +2694,12 @@ impl fmt::Display for CrateType { } } +impl IntoDiagnosticArg for CrateType { + fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> { + self.to_string().into_diagnostic_arg() + } +} + #[derive(Copy, Clone, PartialEq, Debug)] pub enum PpSourceMode { /// `-Zunpretty=normal` From 2575b1abc97e1352b307163ac7de2142aded22a5 Mon Sep 17 00:00:00 2001 From: David Wood Date: Fri, 19 Aug 2022 14:48:15 +0100 Subject: [PATCH 22/69] session: diagnostic migration lint on more fns Apply the diagnostic migration lint to more functions on `Session`. Signed-off-by: David Wood --- compiler/rustc_borrowck/src/nll.rs | 2 + compiler/rustc_codegen_gcc/src/lib.rs | 1 + compiler/rustc_codegen_llvm/src/back/lto.rs | 65 ++++----- compiler/rustc_codegen_llvm/src/back/write.rs | 64 ++++----- compiler/rustc_codegen_llvm/src/errors.rs | 123 ++++++++++++++++-- compiler/rustc_codegen_llvm/src/lib.rs | 13 +- compiler/rustc_codegen_ssa/src/back/write.rs | 8 +- .../rustc_codegen_ssa/src/traits/write.rs | 1 + compiler/rustc_driver/src/lib.rs | 26 ++-- .../rustc_driver/src/session_diagnostics.rs | 27 ++++ .../locales/en-US/codegen_llvm.ftl | 48 ++++++- .../locales/en-US/driver.ftl | 6 + .../locales/en-US/expand.ftl | 2 + .../locales/en-US/interface.ftl | 10 ++ .../locales/en-US/monomorphize.ftl | 6 + .../locales/en-US/passes.ftl | 2 + .../locales/en-US/session.ftl | 2 + compiler/rustc_errors/src/diagnostic.rs | 2 + .../rustc_errors/src/diagnostic_builder.rs | 53 ++++++++ compiler/rustc_errors/src/diagnostic_impls.rs | 18 ++- compiler/rustc_errors/src/lib.rs | 41 ++++-- compiler/rustc_expand/src/base.rs | 6 +- compiler/rustc_expand/src/errors.rs | 7 + compiler/rustc_interface/Cargo.toml | 3 - compiler/rustc_interface/src/errors.rs | 21 +++ compiler/rustc_interface/src/util.rs | 27 ++-- compiler/rustc_monomorphize/src/collector.rs | 12 +- compiler/rustc_monomorphize/src/errors.rs | 14 ++ .../src/partitioning/mod.rs | 18 ++- compiler/rustc_passes/src/check_const.rs | 4 +- compiler/rustc_passes/src/errors.rs | 7 + compiler/rustc_session/src/errors.rs | 6 + compiler/rustc_session/src/session.rs | 27 +++- 33 files changed, 510 insertions(+), 162 deletions(-) diff --git a/compiler/rustc_borrowck/src/nll.rs b/compiler/rustc_borrowck/src/nll.rs index b2d92d0dba7a..c71413e8e7c0 100644 --- a/compiler/rustc_borrowck/src/nll.rs +++ b/compiler/rustc_borrowck/src/nll.rs @@ -369,6 +369,8 @@ pub(super) fn dump_mir_results<'tcx>( }; } +#[allow(rustc::diagnostic_outside_of_impl)] +#[allow(rustc::untranslatable_diagnostic)] pub(super) fn dump_annotation<'tcx>( infcx: &InferCtxt<'tcx>, body: &Body<'tcx>, diff --git a/compiler/rustc_codegen_gcc/src/lib.rs b/compiler/rustc_codegen_gcc/src/lib.rs index bf1da38312f7..5ab87feb98b1 100644 --- a/compiler/rustc_codegen_gcc/src/lib.rs +++ b/compiler/rustc_codegen_gcc/src/lib.rs @@ -200,6 +200,7 @@ unsafe impl Sync for GccContext {} impl WriteBackendMethods for GccCodegenBackend { type Module = GccContext; type TargetMachine = (); + type TargetMachineError = (); type ModuleBuffer = ModuleBuffer; type ThinData = (); type ThinBuffer = ThinBuffer; diff --git a/compiler/rustc_codegen_llvm/src/back/lto.rs b/compiler/rustc_codegen_llvm/src/back/lto.rs index 6c0faf37a63c..d2e01708a37b 100644 --- a/compiler/rustc_codegen_llvm/src/back/lto.rs +++ b/compiler/rustc_codegen_llvm/src/back/lto.rs @@ -1,5 +1,7 @@ use crate::back::write::{self, save_temp_bitcode, DiagnosticHandlers}; -use crate::errors::DynamicLinkingWithLTO; +use crate::errors::{ + DynamicLinkingWithLTO, LlvmError, LtoBitcodeFromRlib, LtoDisallowed, LtoDylib, +}; use crate::llvm::{self, build_string}; use crate::{LlvmCodegenBackend, ModuleLlvm}; use object::read::archive::ArchiveFile; @@ -77,15 +79,12 @@ fn prepare_lto( // Make sure we actually can run LTO for crate_type in cgcx.crate_types.iter() { if !crate_type_allows_lto(*crate_type) { - let e = diag_handler.fatal( - "lto can only be run for executables, cdylibs and \ - static library outputs", - ); - return Err(e); + diag_handler.emit_err(LtoDisallowed); + return Err(FatalError); } else if *crate_type == CrateType::Dylib { if !cgcx.opts.unstable_opts.dylib_lto { - return Err(diag_handler - .fatal("lto cannot be used for `dylib` crate type without `-Zdylib-lto`")); + diag_handler.emit_err(LtoDylib); + return Err(FatalError); } } } @@ -127,7 +126,10 @@ fn prepare_lto( let module = SerializedModule::FromRlib(data.to_vec()); upstream_modules.push((module, CString::new(name).unwrap())); } - Err(msg) => return Err(diag_handler.fatal(&msg)), + Err(e) => { + diag_handler.emit_err(e); + return Err(FatalError); + } } } } @@ -140,7 +142,7 @@ fn prepare_lto( Ok((symbols_below_threshold, upstream_modules)) } -fn get_bitcode_slice_from_object_data(obj: &[u8]) -> Result<&[u8], String> { +fn get_bitcode_slice_from_object_data(obj: &[u8]) -> Result<&[u8], LtoBitcodeFromRlib> { let mut len = 0; let data = unsafe { llvm::LLVMRustGetBitcodeSliceFromObjectData(obj.as_ptr(), obj.len(), &mut len) }; @@ -155,8 +157,9 @@ fn get_bitcode_slice_from_object_data(obj: &[u8]) -> Result<&[u8], String> { Ok(bc) } else { assert!(len == 0); - let msg = llvm::last_error().unwrap_or_else(|| "unknown LLVM error".to_string()); - Err(format!("failed to get bitcode from object file for LTO ({})", msg)) + Err(LtoBitcodeFromRlib { + llvm_err: llvm::last_error().unwrap_or_else(|| "unknown LLVM error".to_string()), + }) } } @@ -328,10 +331,9 @@ fn fat_lto( }); info!("linking {:?}", name); let data = bc_decoded.data(); - linker.add(data).map_err(|()| { - let msg = format!("failed to load bitcode of module {:?}", name); - write::llvm_err(diag_handler, &msg) - })?; + linker + .add(data) + .map_err(|()| write::llvm_err(diag_handler, LlvmError::LoadBitcode { name }))?; serialized_bitcode.push(bc_decoded); } drop(linker); @@ -489,7 +491,7 @@ fn thin_lto( symbols_below_threshold.as_ptr(), symbols_below_threshold.len() as u32, ) - .ok_or_else(|| write::llvm_err(diag_handler, "failed to prepare thin LTO context"))?; + .ok_or_else(|| write::llvm_err(diag_handler, LlvmError::PrepareThinLtoContext))?; let data = ThinData(data); @@ -562,8 +564,7 @@ fn thin_lto( // session, overwriting the previous serialized data (if any). if let Some(path) = key_map_path { if let Err(err) = curr_key_map.save_to_file(&path) { - let msg = format!("Error while writing ThinLTO key data: {}", err); - return Err(write::llvm_err(diag_handler, &msg)); + return Err(write::llvm_err(diag_handler, LlvmError::WriteThinLtoKey { err })); } } @@ -689,8 +690,7 @@ pub unsafe fn optimize_thin_module( let module_name = &thin_module.shared.module_names[thin_module.idx]; let tm_factory_config = TargetMachineFactoryConfig::new(cgcx, module_name.to_str().unwrap()); - let tm = - (cgcx.tm_factory)(tm_factory_config).map_err(|e| write::llvm_err(&diag_handler, &e))?; + let tm = (cgcx.tm_factory)(tm_factory_config).map_err(|e| write::llvm_err(&diag_handler, e))?; // Right now the implementation we've got only works over serialized // modules, so we create a fresh new LLVM context and parse the module @@ -717,8 +717,7 @@ pub unsafe fn optimize_thin_module( let mut cu2 = ptr::null_mut(); llvm::LLVMRustThinLTOGetDICompileUnit(llmod, &mut cu1, &mut cu2); if !cu2.is_null() { - let msg = "multiple source DICompileUnits found"; - return Err(write::llvm_err(&diag_handler, msg)); + return Err(write::llvm_err(&diag_handler, LlvmError::MultipleSourceDiCompileUnit)); } // Up next comes the per-module local analyses that we do for Thin LTO. @@ -733,8 +732,7 @@ pub unsafe fn optimize_thin_module( let _timer = cgcx.prof.generic_activity_with_arg("LLVM_thin_lto_rename", thin_module.name()); if !llvm::LLVMRustPrepareThinLTORename(thin_module.shared.data.0, llmod, target) { - let msg = "failed to prepare thin LTO module"; - return Err(write::llvm_err(&diag_handler, msg)); + return Err(write::llvm_err(&diag_handler, LlvmError::PrepareThinLtoModule)); } save_temp_bitcode(cgcx, &module, "thin-lto-after-rename"); } @@ -744,8 +742,7 @@ pub unsafe fn optimize_thin_module( .prof .generic_activity_with_arg("LLVM_thin_lto_resolve_weak", thin_module.name()); if !llvm::LLVMRustPrepareThinLTOResolveWeak(thin_module.shared.data.0, llmod) { - let msg = "failed to prepare thin LTO module"; - return Err(write::llvm_err(&diag_handler, msg)); + return Err(write::llvm_err(&diag_handler, LlvmError::PrepareThinLtoModule)); } save_temp_bitcode(cgcx, &module, "thin-lto-after-resolve"); } @@ -755,8 +752,7 @@ pub unsafe fn optimize_thin_module( .prof .generic_activity_with_arg("LLVM_thin_lto_internalize", thin_module.name()); if !llvm::LLVMRustPrepareThinLTOInternalize(thin_module.shared.data.0, llmod) { - let msg = "failed to prepare thin LTO module"; - return Err(write::llvm_err(&diag_handler, msg)); + return Err(write::llvm_err(&diag_handler, LlvmError::PrepareThinLtoModule)); } save_temp_bitcode(cgcx, &module, "thin-lto-after-internalize"); } @@ -765,8 +761,7 @@ pub unsafe fn optimize_thin_module( let _timer = cgcx.prof.generic_activity_with_arg("LLVM_thin_lto_import", thin_module.name()); if !llvm::LLVMRustPrepareThinLTOImport(thin_module.shared.data.0, llmod, target) { - let msg = "failed to prepare thin LTO module"; - return Err(write::llvm_err(&diag_handler, msg)); + return Err(write::llvm_err(&diag_handler, LlvmError::PrepareThinLtoModule)); } save_temp_bitcode(cgcx, &module, "thin-lto-after-import"); } @@ -886,11 +881,7 @@ pub fn parse_module<'a>( diag_handler: &Handler, ) -> Result<&'a llvm::Module, FatalError> { unsafe { - llvm::LLVMRustParseBitcodeForLTO(cx, data.as_ptr(), data.len(), name.as_ptr()).ok_or_else( - || { - let msg = "failed to parse bitcode for LTO module"; - write::llvm_err(diag_handler, msg) - }, - ) + llvm::LLVMRustParseBitcodeForLTO(cx, data.as_ptr(), data.len(), name.as_ptr()) + .ok_or_else(|| write::llvm_err(diag_handler, LlvmError::ParseBitcode)) } } diff --git a/compiler/rustc_codegen_llvm/src/back/write.rs b/compiler/rustc_codegen_llvm/src/back/write.rs index b2af9f31e449..38f8733763df 100644 --- a/compiler/rustc_codegen_llvm/src/back/write.rs +++ b/compiler/rustc_codegen_llvm/src/back/write.rs @@ -5,6 +5,9 @@ use crate::back::profiling::{ use crate::base; use crate::common; use crate::consts; +use crate::errors::{ + CopyBitcode, FromLlvmDiag, FromLlvmOptimizationDiag, LlvmError, WithLlvmError, WriteBytecode, +}; use crate::llvm::{self, DiagnosticInfo, PassManager}; use crate::llvm_util; use crate::type_::Type; @@ -37,10 +40,10 @@ use std::slice; use std::str; use std::sync::Arc; -pub fn llvm_err(handler: &rustc_errors::Handler, msg: &str) -> FatalError { +pub fn llvm_err<'a>(handler: &rustc_errors::Handler, err: LlvmError<'a>) -> FatalError { match llvm::last_error() { - Some(err) => handler.fatal(&format!("{}: {}", msg, err)), - None => handler.fatal(msg), + Some(llvm_err) => handler.emit_almost_fatal(WithLlvmError(err, llvm_err)), + None => handler.emit_almost_fatal(err), } } @@ -85,10 +88,9 @@ pub fn write_output_file<'ll>( } } - result.into_result().map_err(|()| { - let msg = format!("could not write output to {}", output.display()); - llvm_err(handler, &msg) - }) + result + .into_result() + .map_err(|()| llvm_err(handler, LlvmError::WriteOutput { path: output })) } } @@ -98,7 +100,7 @@ pub fn create_informational_target_machine(sess: &Session) -> &'static mut llvm: // system/tcx is set up. let features = llvm_util::global_llvm_features(sess, false); target_machine_factory(sess, config::OptLevel::No, &features)(config) - .unwrap_or_else(|err| llvm_err(sess.diagnostic(), &err).raise()) + .unwrap_or_else(|err| llvm_err(sess.diagnostic(), err).raise()) } pub fn create_target_machine(tcx: TyCtxt<'_>, mod_name: &str) -> &'static mut llvm::TargetMachine { @@ -117,7 +119,7 @@ pub fn create_target_machine(tcx: TyCtxt<'_>, mod_name: &str) -> &'static mut ll tcx.backend_optimization_level(()), tcx.global_backend_features(()), )(config) - .unwrap_or_else(|err| llvm_err(tcx.sess.diagnostic(), &err).raise()) + .unwrap_or_else(|err| llvm_err(tcx.sess.diagnostic(), err).raise()) } pub fn to_llvm_opt_settings( @@ -240,9 +242,7 @@ pub fn target_machine_factory( ) }; - tm.ok_or_else(|| { - format!("Could not create LLVM TargetMachine for triple: {}", triple.to_str().unwrap()) - }) + tm.ok_or_else(|| LlvmError::CreateTargetMachine { triple: triple.clone() }) }) } @@ -355,25 +355,28 @@ unsafe extern "C" fn diagnostic_handler(info: &DiagnosticInfo, user: *mut c_void }; if enabled { - diag_handler.note_without_error(&format!( - "{}:{}:{}: {}: {}", - opt.filename, opt.line, opt.column, opt.pass_name, opt.message, - )); + diag_handler.emit_note(FromLlvmOptimizationDiag { + filename: &opt.filename, + line: opt.line, + column: opt.column, + pass_name: &opt.pass_name, + message: &opt.message, + }); } } llvm::diagnostic::PGO(diagnostic_ref) | llvm::diagnostic::Linker(diagnostic_ref) => { - let msg = llvm::build_string(|s| { + let message = llvm::build_string(|s| { llvm::LLVMRustWriteDiagnosticInfoToString(diagnostic_ref, s) }) .expect("non-UTF8 diagnostic"); - diag_handler.warn(&msg); + diag_handler.emit_warning(FromLlvmDiag { message }); } llvm::diagnostic::Unsupported(diagnostic_ref) => { - let msg = llvm::build_string(|s| { + let message = llvm::build_string(|s| { llvm::LLVMRustWriteDiagnosticInfoToString(diagnostic_ref, s) }) .expect("non-UTF8 diagnostic"); - diag_handler.err(&msg); + diag_handler.emit_err(FromLlvmDiag { message }); } llvm::diagnostic::UnknownDiagnostic(..) => {} } @@ -494,7 +497,7 @@ pub(crate) unsafe fn llvm_optimize( llvm_plugins.as_ptr().cast(), llvm_plugins.len(), ); - result.into_result().map_err(|()| llvm_err(diag_handler, "failed to run LLVM passes")) + result.into_result().map_err(|()| llvm_err(diag_handler, LlvmError::RunLlvmPasses)) } // Unsafe due to LLVM calls. @@ -547,8 +550,7 @@ pub(crate) fn link( let _timer = cgcx.prof.generic_activity_with_arg("LLVM_link_module", &*module.name); let buffer = ModuleBuffer::new(module.module_llvm.llmod()); linker.add(buffer.data()).map_err(|()| { - let msg = format!("failed to serialize module {:?}", module.name); - llvm_err(diag_handler, &msg) + llvm_err(diag_handler, LlvmError::SerializeModule { name: &module.name }) })?; } drop(linker); @@ -626,9 +628,8 @@ pub(crate) unsafe fn codegen( let _timer = cgcx .prof .generic_activity_with_arg("LLVM_module_codegen_emit_bitcode", &*module.name); - if let Err(e) = fs::write(&bc_out, data) { - let msg = format!("failed to write bytecode to {}: {}", bc_out.display(), e); - diag_handler.err(&msg); + if let Err(err) = fs::write(&bc_out, data) { + diag_handler.emit_err(WriteBytecode { path: &bc_out, err }); } } @@ -678,10 +679,9 @@ pub(crate) unsafe fn codegen( record_artifact_size(&cgcx.prof, "llvm_ir", &out); } - result.into_result().map_err(|()| { - let msg = format!("failed to write LLVM IR to {}", out.display()); - llvm_err(diag_handler, &msg) - })?; + result + .into_result() + .map_err(|()| llvm_err(diag_handler, LlvmError::WriteIr { path: &out }))?; } if config.emit_asm { @@ -749,8 +749,8 @@ pub(crate) unsafe fn codegen( EmitObj::Bitcode => { debug!("copying bitcode {:?} to obj {:?}", bc_out, obj_out); - if let Err(e) = link_or_copy(&bc_out, &obj_out) { - diag_handler.err(&format!("failed to copy bitcode to object file: {}", e)); + if let Err(err) = link_or_copy(&bc_out, &obj_out) { + diag_handler.emit_err(CopyBitcode { err }); } if !config.emit_bc { diff --git a/compiler/rustc_codegen_llvm/src/errors.rs b/compiler/rustc_codegen_llvm/src/errors.rs index 001d1ce93d8b..81072edc475c 100644 --- a/compiler/rustc_codegen_llvm/src/errors.rs +++ b/compiler/rustc_codegen_llvm/src/errors.rs @@ -1,10 +1,11 @@ use std::borrow::Cow; +use std::ffi::CString; +use std::path::Path; -use rustc_errors::fluent; -use rustc_errors::DiagnosticBuilder; -use rustc_errors::ErrorGuaranteed; -use rustc_errors::Handler; -use rustc_errors::IntoDiagnostic; +use rustc_data_structures::small_c_str::SmallCStr; +use rustc_errors::{ + fluent, DiagnosticBuilder, EmissionGuarantee, ErrorGuaranteed, Handler, IntoDiagnostic, +}; use rustc_macros::{Diagnostic, Subdiagnostic}; use rustc_span::Span; @@ -81,10 +82,18 @@ pub(crate) struct DlltoolFailImportLibrary<'a> { #[note] pub(crate) struct DynamicLinkingWithLTO; -#[derive(Diagnostic)] -#[diag(codegen_llvm_fail_parsing_target_machine_config_to_target_machine)] -pub(crate) struct FailParsingTargetMachineConfigToTargetMachine { - pub error: String, +pub(crate) struct ParseTargetMachineConfig<'a>(pub LlvmError<'a>); + +impl IntoDiagnostic<'_, EM> for ParseTargetMachineConfig<'_> { + fn into_diagnostic(self, sess: &'_ Handler) -> DiagnosticBuilder<'_, EM> { + let diag: DiagnosticBuilder<'_, EM> = self.0.into_diagnostic(sess); + let (message, _) = diag.styled_message().first().expect("`LlvmError` with no message"); + let message = sess.eagerly_translate_to_string(message.clone(), diag.args()); + + let mut diag = sess.struct_diagnostic(fluent::codegen_llvm_parse_target_machine_config); + diag.set_arg("error", message); + diag + } } pub(crate) struct TargetFeatureDisableOrEnable<'a> { @@ -110,3 +119,99 @@ impl IntoDiagnostic<'_, ErrorGuaranteed> for TargetFeatureDisableOrEnable<'_> { diag } } + +#[derive(Diagnostic)] +#[diag(codegen_llvm_lto_disallowed)] +pub(crate) struct LtoDisallowed; + +#[derive(Diagnostic)] +#[diag(codegen_llvm_lto_dylib)] +pub(crate) struct LtoDylib; + +#[derive(Diagnostic)] +#[diag(codegen_llvm_lto_bitcode_from_rlib)] +pub(crate) struct LtoBitcodeFromRlib { + pub llvm_err: String, +} + +#[derive(Diagnostic)] +pub enum LlvmError<'a> { + #[diag(codegen_llvm_write_output)] + WriteOutput { path: &'a Path }, + #[diag(codegen_llvm_target_machine)] + CreateTargetMachine { triple: SmallCStr }, + #[diag(codegen_llvm_run_passes)] + RunLlvmPasses, + #[diag(codegen_llvm_serialize_module)] + SerializeModule { name: &'a str }, + #[diag(codegen_llvm_write_ir)] + WriteIr { path: &'a Path }, + #[diag(codegen_llvm_prepare_thin_lto_context)] + PrepareThinLtoContext, + #[diag(codegen_llvm_load_bitcode)] + LoadBitcode { name: CString }, + #[diag(codegen_llvm_write_thinlto_key)] + WriteThinLtoKey { err: std::io::Error }, + #[diag(codegen_llvm_multiple_source_dicompileunit)] + MultipleSourceDiCompileUnit, + #[diag(codegen_llvm_prepare_thin_lto_module)] + PrepareThinLtoModule, + #[diag(codegen_llvm_parse_bitcode)] + ParseBitcode, +} + +pub(crate) struct WithLlvmError<'a>(pub LlvmError<'a>, pub String); + +impl IntoDiagnostic<'_, EM> for WithLlvmError<'_> { + fn into_diagnostic(self, sess: &'_ Handler) -> DiagnosticBuilder<'_, EM> { + use LlvmError::*; + let msg_with_llvm_err = match &self.0 { + WriteOutput { .. } => fluent::codegen_llvm_write_output_with_llvm_err, + CreateTargetMachine { .. } => fluent::codegen_llvm_target_machine_with_llvm_err, + RunLlvmPasses => fluent::codegen_llvm_run_passes_with_llvm_err, + SerializeModule { .. } => fluent::codegen_llvm_serialize_module_with_llvm_err, + WriteIr { .. } => fluent::codegen_llvm_write_ir_with_llvm_err, + PrepareThinLtoContext => fluent::codegen_llvm_prepare_thin_lto_context_with_llvm_err, + LoadBitcode { .. } => fluent::codegen_llvm_load_bitcode_with_llvm_err, + WriteThinLtoKey { .. } => fluent::codegen_llvm_write_thinlto_key_with_llvm_err, + MultipleSourceDiCompileUnit => { + fluent::codegen_llvm_multiple_source_dicompileunit_with_llvm_err + } + PrepareThinLtoModule => fluent::codegen_llvm_prepare_thin_lto_module_with_llvm_err, + ParseBitcode => fluent::codegen_llvm_parse_bitcode_with_llvm_err, + }; + let mut diag = self.0.into_diagnostic(sess); + diag.set_primary_message(msg_with_llvm_err); + diag.set_arg("llvm_err", self.1); + diag + } +} + +#[derive(Diagnostic)] +#[diag(codegen_llvm_from_llvm_optimization_diag)] +pub(crate) struct FromLlvmOptimizationDiag<'a> { + pub filename: &'a str, + pub line: std::ffi::c_uint, + pub column: std::ffi::c_uint, + pub pass_name: &'a str, + pub message: &'a str, +} + +#[derive(Diagnostic)] +#[diag(codegen_llvm_from_llvm_diag)] +pub(crate) struct FromLlvmDiag { + pub message: String, +} + +#[derive(Diagnostic)] +#[diag(codegen_llvm_write_bytecode)] +pub(crate) struct WriteBytecode<'a> { + pub path: &'a Path, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(codegen_llvm_copy_bitcode)] +pub(crate) struct CopyBitcode { + pub err: std::io::Error, +} diff --git a/compiler/rustc_codegen_llvm/src/lib.rs b/compiler/rustc_codegen_llvm/src/lib.rs index 246e82545c87..111d14b265cd 100644 --- a/compiler/rustc_codegen_llvm/src/lib.rs +++ b/compiler/rustc_codegen_llvm/src/lib.rs @@ -5,11 +5,12 @@ //! This API is completely unstable and subject to change. #![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")] -#![feature(hash_raw_entry)] -#![feature(let_chains)] #![feature(extern_types)] -#![feature(once_cell)] +#![feature(hash_raw_entry)] #![feature(iter_intersperse)] +#![feature(let_chains)] +#![feature(never_type)] +#![feature(once_cell)] #![recursion_limit = "256"] #![allow(rustc::potential_query_instability)] #![deny(rustc::untranslatable_diagnostic)] @@ -22,7 +23,7 @@ extern crate tracing; use back::write::{create_informational_target_machine, create_target_machine}; -use errors::FailParsingTargetMachineConfigToTargetMachine; +use errors::ParseTargetMachineConfig; pub use llvm_util::target_features; use rustc_ast::expand::allocator::AllocatorKind; use rustc_codegen_ssa::back::lto::{LtoModuleCodegen, SerializedModule, ThinModule}; @@ -169,6 +170,7 @@ impl WriteBackendMethods for LlvmCodegenBackend { type Module = ModuleLlvm; type ModuleBuffer = back::lto::ModuleBuffer; type TargetMachine = &'static mut llvm::TargetMachine; + type TargetMachineError = crate::errors::LlvmError<'static>; type ThinData = back::lto::ThinData; type ThinBuffer = back::lto::ThinBuffer; fn print_pass_timings(&self) { @@ -416,8 +418,7 @@ impl ModuleLlvm { let tm = match (cgcx.tm_factory)(tm_factory_config) { Ok(m) => m, Err(e) => { - handler.emit_err(FailParsingTargetMachineConfigToTargetMachine { error: e }); - return Err(FatalError); + return Err(handler.emit_almost_fatal(ParseTargetMachineConfig(e))); } }; diff --git a/compiler/rustc_codegen_ssa/src/back/write.rs b/compiler/rustc_codegen_ssa/src/back/write.rs index 9f1614af7b16..8508ab87532c 100644 --- a/compiler/rustc_codegen_ssa/src/back/write.rs +++ b/compiler/rustc_codegen_ssa/src/back/write.rs @@ -305,8 +305,12 @@ impl TargetMachineFactoryConfig { } pub type TargetMachineFactoryFn = Arc< - dyn Fn(TargetMachineFactoryConfig) -> Result<::TargetMachine, String> - + Send + dyn Fn( + TargetMachineFactoryConfig, + ) -> Result< + ::TargetMachine, + ::TargetMachineError, + > + Send + Sync, >; diff --git a/compiler/rustc_codegen_ssa/src/traits/write.rs b/compiler/rustc_codegen_ssa/src/traits/write.rs index e0e8ffa89ed1..9826256a4c5d 100644 --- a/compiler/rustc_codegen_ssa/src/traits/write.rs +++ b/compiler/rustc_codegen_ssa/src/traits/write.rs @@ -8,6 +8,7 @@ use rustc_middle::dep_graph::WorkProduct; pub trait WriteBackendMethods: 'static + Sized + Clone { type Module: Send + Sync; type TargetMachine; + type TargetMachineError; type ModuleBuffer: ModuleBufferMethods; type ThinData: Send + Sync; type ThinBuffer: ThinBufferMethods; diff --git a/compiler/rustc_driver/src/lib.rs b/compiler/rustc_driver/src/lib.rs index ccefd6adaf14..02e0b042ad26 100644 --- a/compiler/rustc_driver/src/lib.rs +++ b/compiler/rustc_driver/src/lib.rs @@ -43,7 +43,6 @@ use rustc_span::source_map::{FileLoader, FileName}; use rustc_span::symbol::sym; use rustc_target::json::ToJson; -use std::borrow::Cow; use std::cmp::max; use std::env; use std::ffi::OsString; @@ -1205,29 +1204,20 @@ pub fn report_ice(info: &panic::PanicInfo<'_>, bug_report_url: &str) { handler.emit_diagnostic(&mut d); } - let mut xs: Vec> = vec![ - "the compiler unexpectedly panicked. this is a bug.".into(), - format!("we would appreciate a bug report: {bug_report_url}").into(), - format!( - "rustc {} running on {}", - util::version_str!().unwrap_or("unknown_version"), - config::host_triple() - ) - .into(), - ]; + handler.emit_note(session_diagnostics::Ice); + handler.emit_note(session_diagnostics::IceBugReport { bug_report_url }); + handler.emit_note(session_diagnostics::IceVersion { + version: util::version_str!().unwrap_or("unknown_version"), + triple: config::host_triple(), + }); if let Some((flags, excluded_cargo_defaults)) = extra_compiler_flags() { - xs.push(format!("compiler flags: {}", flags.join(" ")).into()); - + handler.emit_note(session_diagnostics::IceFlags { flags: flags.join(" ") }); if excluded_cargo_defaults { - xs.push("some of the compiler flags provided by cargo are hidden".into()); + handler.emit_note(session_diagnostics::IceExcludeCargoDefaults); } } - for note in &xs { - handler.note_without_error(note.as_ref()); - } - // If backtraces are enabled, also print the query stack let backtrace = env::var_os("RUST_BACKTRACE").map_or(false, |x| &x != "0"); diff --git a/compiler/rustc_driver/src/session_diagnostics.rs b/compiler/rustc_driver/src/session_diagnostics.rs index c1bc10891144..a7aef9cbc2c8 100644 --- a/compiler/rustc_driver/src/session_diagnostics.rs +++ b/compiler/rustc_driver/src/session_diagnostics.rs @@ -38,3 +38,30 @@ pub(crate) struct UnprettyDumpFail { pub path: String, pub err: String, } + +#[derive(Diagnostic)] +#[diag(driver_ice)] +pub(crate) struct Ice; + +#[derive(Diagnostic)] +#[diag(driver_ice_bug_report)] +pub(crate) struct IceBugReport<'a> { + pub bug_report_url: &'a str, +} + +#[derive(Diagnostic)] +#[diag(driver_ice_version)] +pub(crate) struct IceVersion<'a> { + pub version: &'a str, + pub triple: &'a str, +} + +#[derive(Diagnostic)] +#[diag(driver_ice_flags)] +pub(crate) struct IceFlags { + pub flags: String, +} + +#[derive(Diagnostic)] +#[diag(driver_ice_exclude_cargo_defaults)] +pub(crate) struct IceExcludeCargoDefaults; diff --git a/compiler/rustc_error_messages/locales/en-US/codegen_llvm.ftl b/compiler/rustc_error_messages/locales/en-US/codegen_llvm.ftl index b82c903290b9..e5df417370bb 100644 --- a/compiler/rustc_error_messages/locales/en-US/codegen_llvm.ftl +++ b/compiler/rustc_error_messages/locales/en-US/codegen_llvm.ftl @@ -39,5 +39,51 @@ codegen_llvm_dynamic_linking_with_lto = cannot prefer dynamic linking when performing LTO .note = only 'staticlib', 'bin', and 'cdylib' outputs are supported with LTO -codegen_llvm_fail_parsing_target_machine_config_to_target_machine = +codegen_llvm_parse_target_machine_config = failed to parse target machine config to target machine: {$error} + +codegen_llvm_lto_disallowed = lto can only be run for executables, cdylibs and static library outputs + +codegen_llvm_lto_dylib = lto cannot be used for `dylib` crate type without `-Zdylib-lto` + +codegen_llvm_lto_bitcode_from_rlib = failed to get bitcode from object file for LTO ({$llvm_err}) + +codegen_llvm_write_output = could not write output to {$path} +codegen_llvm_write_output_with_llvm_err = could not write output to {$path}: {$llvm_err} + +codegen_llvm_target_machine = could not create LLVM TargetMachine for triple: {$triple} +codegen_llvm_target_machine_with_llvm_err = could not create LLVM TargetMachine for triple: {$triple}: {$llvm_err} + +codegen_llvm_run_passes = failed to run LLVM passes +codegen_llvm_run_passes_with_llvm_err = failed to run LLVM passes: {$llvm_err} + +codegen_llvm_serialize_module = failed to serialize module {$name} +codegen_llvm_serialize_module_with_llvm_err = failed to serialize module {$name}: {$llvm_err} + +codegen_llvm_write_ir = failed to write LLVM IR to {$path} +codegen_llvm_write_ir_with_llvm_err = failed to write LLVM IR to {$path}: {$llvm_err} + +codegen_llvm_prepare_thin_lto_context = failed to prepare thin LTO context +codegen_llvm_prepare_thin_lto_context_with_llvm_err = failed to prepare thin LTO context: {$llvm_err} + +codegen_llvm_load_bitcode = failed to load bitcode of module "{$name}" +codegen_llvm_load_bitcode_with_llvm_err = failed to load bitcode of module "{$name}": {$llvm_err} + +codegen_llvm_write_thinlto_key = error while writing ThinLTO key data: {$err} +codegen_llvm_write_thinlto_key_with_llvm_err = error while writing ThinLTO key data: {$err}: {$llvm_err} + +codegen_llvm_multiple_source_dicompileunit = multiple source DICompileUnits found +codegen_llvm_multiple_source_dicompileunit_with_llvm_err = multiple source DICompileUnits found: {$llvm_err} + +codegen_llvm_prepare_thin_lto_module = failed to prepare thin LTO module +codegen_llvm_prepare_thin_lto_module_with_llvm_err = failed to prepare thin LTO module: {$llvm_err} + +codegen_llvm_parse_bitcode = failed to parse bitcode for LTO module +codegen_llvm_parse_bitcode_with_llvm_err = failed to parse bitcode for LTO module: {$llvm_err} + +codegen_llvm_from_llvm_optimization_diag = {$filename}:{$line}:{$column} {$pass_name}: {$message} +codegen_llvm_from_llvm_diag = {$message} + +codegen_llvm_write_bytecode = failed to write bytecode to {$path}: {$err} + +codegen_llvm_copy_bitcode = failed to copy bitcode to object file: {$err} diff --git a/compiler/rustc_error_messages/locales/en-US/driver.ftl b/compiler/rustc_error_messages/locales/en-US/driver.ftl index 8ad198c86c93..79ffc82c6c67 100644 --- a/compiler/rustc_error_messages/locales/en-US/driver.ftl +++ b/compiler/rustc_error_messages/locales/en-US/driver.ftl @@ -11,3 +11,9 @@ driver_rlink_rustc_version_mismatch = .rlink file was produced by rustc version driver_rlink_no_a_file = rlink must be a file driver_unpretty_dump_fail = pretty-print failed to write `{$path}` due to error `{$err}` + +driver_ice = the compiler unexpectedly panicked. this is a bug. +driver_ice_bug_report = we would appreciate a bug report: {$bug_report_url} +driver_ice_version = rustc {$version} running on {$triple} +driver_ice_flags = compiler flags: {$flags} +driver_ice_exclude_cargo_defaults = some of the compiler flags provided by cargo are hidden diff --git a/compiler/rustc_error_messages/locales/en-US/expand.ftl b/compiler/rustc_error_messages/locales/en-US/expand.ftl index df0e8ae5dd8f..dbd80954382d 100644 --- a/compiler/rustc_error_messages/locales/en-US/expand.ftl +++ b/compiler/rustc_error_messages/locales/en-US/expand.ftl @@ -127,3 +127,5 @@ expand_module_file_not_found = expand_module_multiple_candidates = file for module `{$name}` found at both "{$default_path}" and "{$secondary_path}" .help = delete or rename one of them to remove the ambiguity + +expand_trace_macro = trace_macro diff --git a/compiler/rustc_error_messages/locales/en-US/interface.ftl b/compiler/rustc_error_messages/locales/en-US/interface.ftl index 688b04472226..a7bc0e7af1fe 100644 --- a/compiler/rustc_error_messages/locales/en-US/interface.ftl +++ b/compiler/rustc_error_messages/locales/en-US/interface.ftl @@ -44,3 +44,13 @@ interface_failed_writing_file = interface_proc_macro_crate_panic_abort = building proc macro crate with `panic=abort` may crash the compiler should the proc-macro panic + +interface_unsupported_crate_type_for_target = + dropping unsupported crate type `{$crate_type}` for target `{$target_triple}` + +interface_multiple_output_types_adaption = + due to multiple output types requested, the explicitly specified output file name will be adapted for each output type + +interface_ignoring_extra_filename = ignoring -C extra-filename flag due to -o flag + +interface_ignoring_out_dir = ignoring --out-dir flag due to -o flag diff --git a/compiler/rustc_error_messages/locales/en-US/monomorphize.ftl b/compiler/rustc_error_messages/locales/en-US/monomorphize.ftl index 243d10bfa062..6cea6a603f33 100644 --- a/compiler/rustc_error_messages/locales/en-US/monomorphize.ftl +++ b/compiler/rustc_error_messages/locales/en-US/monomorphize.ftl @@ -24,3 +24,9 @@ monomorphize_large_assignments = monomorphize_couldnt_dump_mono_stats = unexpected error occurred while dumping monomorphization stats: {$error} + +monomorphize_encountered_error_while_instantiating = + the above error was encountered while instantiating `{$formatted_item}` + +monomorphize_unknown_cgu_collection_mode = + unknown codegen-item collection mode '{$mode}', falling back to 'lazy' mode diff --git a/compiler/rustc_error_messages/locales/en-US/passes.ftl b/compiler/rustc_error_messages/locales/en-US/passes.ftl index 0c2ab3d08f9d..6ebb188288f0 100644 --- a/compiler/rustc_error_messages/locales/en-US/passes.ftl +++ b/compiler/rustc_error_messages/locales/en-US/passes.ftl @@ -731,3 +731,5 @@ passes_proc_macro_missing_args = mismatched {$kind} signature passes_proc_macro_invalid_abi = proc macro functions may not be `extern "{$abi}"` passes_proc_macro_unsafe = proc macro functions may not be `unsafe` + +passes_skipping_const_checks = skipping const checks diff --git a/compiler/rustc_error_messages/locales/en-US/session.ftl b/compiler/rustc_error_messages/locales/en-US/session.ftl index bc37d91a7c6a..5984c201af0d 100644 --- a/compiler/rustc_error_messages/locales/en-US/session.ftl +++ b/compiler/rustc_error_messages/locales/en-US/session.ftl @@ -89,3 +89,5 @@ session_int_literal_too_large = integer literal is too large session_invalid_int_literal_width = invalid width `{$width}` for integer literal .help = valid widths are 8, 16, 32, 64 and 128 + +session_optimization_fuel_exhausted = optimization-fuel-exhausted: {$msg} diff --git a/compiler/rustc_errors/src/diagnostic.rs b/compiler/rustc_errors/src/diagnostic.rs index 4ad24c1400d6..df949e46fbde 100644 --- a/compiler/rustc_errors/src/diagnostic.rs +++ b/compiler/rustc_errors/src/diagnostic.rs @@ -1051,6 +1051,7 @@ impl Diagnostic { ) -> ( &Level, &[(DiagnosticMessage, Style)], + Vec<(&Cow<'static, str>, &DiagnosticArgValue<'static>)>, &Option, &MultiSpan, &Result, SuggestionsDisabled>, @@ -1059,6 +1060,7 @@ impl Diagnostic { ( &self.level, &self.message, + self.args().collect(), &self.code, &self.span, &self.suggestions, diff --git a/compiler/rustc_errors/src/diagnostic_builder.rs b/compiler/rustc_errors/src/diagnostic_builder.rs index cbfee582d871..c9d662ad43fe 100644 --- a/compiler/rustc_errors/src/diagnostic_builder.rs +++ b/compiler/rustc_errors/src/diagnostic_builder.rs @@ -408,6 +408,59 @@ impl EmissionGuarantee for ! { } } +impl<'a> DiagnosticBuilder<'a, rustc_span::fatal_error::FatalError> { + /// Convenience function for internal use, clients should use one of the + /// `struct_*` methods on [`Handler`]. + #[track_caller] + pub(crate) fn new_almost_fatal( + handler: &'a Handler, + message: impl Into, + ) -> Self { + let diagnostic = Diagnostic::new_with_code(Level::Fatal, None, message); + Self::new_diagnostic_almost_fatal(handler, diagnostic) + } + + /// Creates a new `DiagnosticBuilder` with an already constructed + /// diagnostic. + pub(crate) fn new_diagnostic_almost_fatal( + handler: &'a Handler, + diagnostic: Diagnostic, + ) -> Self { + debug!("Created new diagnostic"); + Self { + inner: DiagnosticBuilderInner { + state: DiagnosticBuilderState::Emittable(handler), + diagnostic: Box::new(diagnostic), + }, + _marker: PhantomData, + } + } +} + +impl EmissionGuarantee for rustc_span::fatal_error::FatalError { + fn diagnostic_builder_emit_producing_guarantee(db: &mut DiagnosticBuilder<'_, Self>) -> Self { + match db.inner.state { + // First `.emit()` call, the `&Handler` is still available. + DiagnosticBuilderState::Emittable(handler) => { + db.inner.state = DiagnosticBuilderState::AlreadyEmittedOrDuringCancellation; + + handler.emit_diagnostic(&mut db.inner.diagnostic); + } + // `.emit()` was previously called, disallowed from repeating it. + DiagnosticBuilderState::AlreadyEmittedOrDuringCancellation => {} + } + // Then fatally error.. + rustc_span::fatal_error::FatalError + } + + fn make_diagnostic_builder( + handler: &Handler, + msg: impl Into, + ) -> DiagnosticBuilder<'_, Self> { + DiagnosticBuilder::new_almost_fatal(handler, msg) + } +} + /// In general, the `DiagnosticBuilder` uses deref to allow access to /// the fields and methods of the embedded `diagnostic` in a /// transparent way. *However,* many of the methods are intended to diff --git a/compiler/rustc_errors/src/diagnostic_impls.rs b/compiler/rustc_errors/src/diagnostic_impls.rs index d5a5ef3b445f..7a94ce3777a2 100644 --- a/compiler/rustc_errors/src/diagnostic_impls.rs +++ b/compiler/rustc_errors/src/diagnostic_impls.rs @@ -159,12 +159,6 @@ impl IntoDiagnosticArg for ast::Path { } } -impl IntoDiagnosticArg for &ast::Path { - fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> { - DiagnosticArgValue::Str(Cow::Owned(pprust::path_to_string(self))) - } -} - impl IntoDiagnosticArg for ast::token::Token { fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> { DiagnosticArgValue::Str(pprust::token_to_string(&self)) @@ -183,6 +177,18 @@ impl IntoDiagnosticArg for type_ir::FloatTy { } } +impl IntoDiagnosticArg for std::ffi::CString { + fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> { + DiagnosticArgValue::Str(Cow::Owned(self.to_string_lossy().into_owned())) + } +} + +impl IntoDiagnosticArg for rustc_data_structures::small_c_str::SmallCStr { + fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> { + DiagnosticArgValue::Str(Cow::Owned(self.to_string_lossy().into_owned())) + } +} + impl IntoDiagnosticArg for Level { fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> { DiagnosticArgValue::Str(Cow::Borrowed(self.to_cmd_flag())) diff --git a/compiler/rustc_errors/src/lib.rs b/compiler/rustc_errors/src/lib.rs index 57732db5acab..ec04e865d53b 100644 --- a/compiler/rustc_errors/src/lib.rs +++ b/compiler/rustc_errors/src/lib.rs @@ -617,22 +617,24 @@ impl Handler { } } - /// Translate `message` eagerly with `args`. + /// Translate `message` eagerly with `args` to `SubdiagnosticMessage::Eager`. pub fn eagerly_translate<'a>( &self, message: DiagnosticMessage, args: impl Iterator>, ) -> SubdiagnosticMessage { + SubdiagnosticMessage::Eager(self.eagerly_translate_to_string(message, args)) + } + + /// Translate `message` eagerly with `args` to `String`. + pub fn eagerly_translate_to_string<'a>( + &self, + message: DiagnosticMessage, + args: impl Iterator>, + ) -> String { let inner = self.inner.borrow(); let args = crate::translation::to_fluent_args(args); - SubdiagnosticMessage::Eager( - inner - .emitter - .translate_message(&message, &args) - .map_err(Report::new) - .unwrap() - .to_string(), - ) + inner.emitter.translate_message(&message, &args).map_err(Report::new).unwrap().to_string() } // This is here to not allow mutation of flags; @@ -1010,6 +1012,7 @@ impl Handler { } #[track_caller] + #[rustc_lint_diagnostics] pub fn span_note_without_error( &self, span: impl Into, @@ -1019,6 +1022,7 @@ impl Handler { } #[track_caller] + #[rustc_lint_diagnostics] pub fn span_note_diag( &self, span: Span, @@ -1030,19 +1034,23 @@ impl Handler { } // NOTE: intentionally doesn't raise an error so rustc_codegen_ssa only reports fatal errors in the main thread + #[rustc_lint_diagnostics] pub fn fatal(&self, msg: impl Into) -> FatalError { self.inner.borrow_mut().fatal(msg) } + #[rustc_lint_diagnostics] pub fn err(&self, msg: impl Into) -> ErrorGuaranteed { self.inner.borrow_mut().err(msg) } + #[rustc_lint_diagnostics] pub fn warn(&self, msg: impl Into) { let mut db = DiagnosticBuilder::new(self, Warning(None), msg); db.emit(); } + #[rustc_lint_diagnostics] pub fn note_without_error(&self, msg: impl Into) { DiagnosticBuilder::new(self, Note, msg).emit(); } @@ -1059,6 +1067,7 @@ impl Handler { pub fn has_errors(&self) -> Option { if self.inner.borrow().has_errors() { Some(ErrorGuaranteed(())) } else { None } } + pub fn has_errors_or_lint_errors(&self) -> Option { if self.inner.borrow().has_errors_or_lint_errors() { Some(ErrorGuaranteed::unchecked_claim_error_was_emitted()) @@ -1132,6 +1141,20 @@ impl Handler { self.create_warning(warning).emit() } + pub fn create_almost_fatal<'a>( + &'a self, + fatal: impl IntoDiagnostic<'a, FatalError>, + ) -> DiagnosticBuilder<'a, FatalError> { + fatal.into_diagnostic(self) + } + + pub fn emit_almost_fatal<'a>( + &'a self, + fatal: impl IntoDiagnostic<'a, FatalError>, + ) -> FatalError { + self.create_almost_fatal(fatal).emit() + } + pub fn create_fatal<'a>( &'a self, fatal: impl IntoDiagnostic<'a, !>, diff --git a/compiler/rustc_expand/src/base.rs b/compiler/rustc_expand/src/base.rs index 951d59246785..5a48473d5b07 100644 --- a/compiler/rustc_expand/src/base.rs +++ b/compiler/rustc_expand/src/base.rs @@ -4,7 +4,7 @@ use crate::errors::{ ArgumentNotAttributes, AttrNoArguments, AttributeMetaItem, AttributeSingleWord, AttributesWrongForm, CannotBeNameOfMacro, ExpectedCommaInList, HelperAttributeNameInvalid, MacroBodyStability, MacroConstStability, NotAMetaItem, OnlyOneArgument, OnlyOneWord, - ResolveRelativePath, TakesNoArguments, + ResolveRelativePath, TakesNoArguments, TraceMacro, }; use crate::expand::{self, AstFragment, Invocation}; use crate::module::DirOwnership; @@ -1142,8 +1142,8 @@ impl<'a> ExtCtxt<'a> { self.sess.parse_sess.span_diagnostic.span_bug(sp, msg); } pub fn trace_macros_diag(&mut self) { - for (sp, notes) in self.expansions.iter() { - let mut db = self.sess.parse_sess.span_diagnostic.span_note_diag(*sp, "trace_macro"); + for (span, notes) in self.expansions.iter() { + let mut db = self.sess.parse_sess.create_note(TraceMacro { span: *span }); for note in notes { db.note(note); } diff --git a/compiler/rustc_expand/src/errors.rs b/compiler/rustc_expand/src/errors.rs index afe5169d3f5c..9b9697ab13d2 100644 --- a/compiler/rustc_expand/src/errors.rs +++ b/compiler/rustc_expand/src/errors.rs @@ -368,3 +368,10 @@ pub(crate) struct ModuleMultipleCandidates { pub default_path: String, pub secondary_path: String, } + +#[derive(Diagnostic)] +#[diag(expand_trace_macro)] +pub struct TraceMacro { + #[primary_span] + pub span: Span, +} diff --git a/compiler/rustc_interface/Cargo.toml b/compiler/rustc_interface/Cargo.toml index f817c5bc1cd7..1199ff287c43 100644 --- a/compiler/rustc_interface/Cargo.toml +++ b/compiler/rustc_interface/Cargo.toml @@ -49,9 +49,6 @@ rustc_target = { path = "../rustc_target" } rustc_trait_selection = { path = "../rustc_trait_selection" } rustc_ty_utils = { path = "../rustc_ty_utils" } -[dev-dependencies] -rustc_target = { path = "../rustc_target" } - [features] llvm = ['rustc_codegen_llvm'] rustc_use_parallel_compiler = ['rayon', 'rustc-rayon-core', 'rustc_query_impl/rustc_use_parallel_compiler', 'rustc_errors/rustc_use_parallel_compiler'] diff --git a/compiler/rustc_interface/src/errors.rs b/compiler/rustc_interface/src/errors.rs index 15d7e977bbe8..29543fe2f932 100644 --- a/compiler/rustc_interface/src/errors.rs +++ b/compiler/rustc_interface/src/errors.rs @@ -1,5 +1,7 @@ use rustc_macros::Diagnostic; +use rustc_session::config::CrateType; use rustc_span::{Span, Symbol}; +use rustc_target::spec::TargetTriple; use std::io; use std::path::Path; @@ -91,3 +93,22 @@ pub struct FailedWritingFile<'a> { #[derive(Diagnostic)] #[diag(interface_proc_macro_crate_panic_abort)] pub struct ProcMacroCratePanicAbort; + +#[derive(Diagnostic)] +#[diag(interface_unsupported_crate_type_for_target)] +pub struct UnsupportedCrateTypeForTarget<'a> { + pub crate_type: CrateType, + pub target_triple: &'a TargetTriple, +} + +#[derive(Diagnostic)] +#[diag(interface_multiple_output_types_adaption)] +pub struct MultipleOutputTypesAdaption; + +#[derive(Diagnostic)] +#[diag(interface_ignoring_extra_filename)] +pub struct IgnoringExtraFilename; + +#[derive(Diagnostic)] +#[diag(interface_ignoring_out_dir)] +pub struct IgnoringOutDir; diff --git a/compiler/rustc_interface/src/util.rs b/compiler/rustc_interface/src/util.rs index 54363e07b971..e4b4d5375e64 100644 --- a/compiler/rustc_interface/src/util.rs +++ b/compiler/rustc_interface/src/util.rs @@ -1,3 +1,4 @@ +use crate::errors; use info; use libloading::Library; use rustc_ast as ast; @@ -472,16 +473,15 @@ pub fn collect_crate_types(session: &Session, attrs: &[ast::Attribute]) -> Vec Outpu let unnamed_output_types = sess.opts.output_types.values().filter(|a| a.is_none()).count(); let ofile = if unnamed_output_types > 1 { - sess.warn( - "due to multiple output types requested, the explicitly specified \ - output file name will be adapted for each output type", - ); + sess.emit_warning(errors::MultipleOutputTypesAdaption); None } else { if !sess.opts.cg.extra_filename.is_empty() { - sess.warn("ignoring -C extra-filename flag due to -o flag"); + sess.emit_warning(errors::IgnoringExtraFilename); } Some(out_file.clone()) }; if sess.io.output_dir != None { - sess.warn("ignoring --out-dir flag due to -o flag"); + sess.emit_warning(errors::IgnoringOutDir); } OutputFilenames::new( diff --git a/compiler/rustc_monomorphize/src/collector.rs b/compiler/rustc_monomorphize/src/collector.rs index 305f0427e501..31a3ffbb1d89 100644 --- a/compiler/rustc_monomorphize/src/collector.rs +++ b/compiler/rustc_monomorphize/src/collector.rs @@ -201,7 +201,9 @@ use rustc_target::abi::Size; use std::ops::Range; use std::path::PathBuf; -use crate::errors::{LargeAssignmentsLint, RecursionLimit, TypeLengthLimit}; +use crate::errors::{ + EncounteredErrorWhileInstantiating, LargeAssignmentsLint, RecursionLimit, TypeLengthLimit, +}; #[derive(PartialEq)] pub enum MonoItemCollectionMode { @@ -524,10 +526,10 @@ fn collect_items_rec<'tcx>( && starting_point.node.is_user_defined() { let formatted_item = with_no_trimmed_paths!(starting_point.node.to_string()); - tcx.sess.span_note_without_error( - starting_point.span, - &format!("the above error was encountered while instantiating `{formatted_item}`"), - ); + tcx.sess.emit_note(EncounteredErrorWhileInstantiating { + span: starting_point.span, + formatted_item, + }); } inlining_map.lock_mut().record_accesses(starting_point.node, &neighbors.items); diff --git a/compiler/rustc_monomorphize/src/errors.rs b/compiler/rustc_monomorphize/src/errors.rs index 5233cfb21203..a53bd7e1fef5 100644 --- a/compiler/rustc_monomorphize/src/errors.rs +++ b/compiler/rustc_monomorphize/src/errors.rs @@ -83,3 +83,17 @@ pub struct SymbolAlreadyDefined { pub struct CouldntDumpMonoStats { pub error: String, } + +#[derive(Diagnostic)] +#[diag(monomorphize_encountered_error_while_instantiating)] +pub struct EncounteredErrorWhileInstantiating { + #[primary_span] + pub span: Span, + pub formatted_item: String, +} + +#[derive(Diagnostic)] +#[diag(monomorphize_unknown_cgu_collection_mode)] +pub struct UnknownCguCollectionMode<'a> { + pub mode: &'a str, +} diff --git a/compiler/rustc_monomorphize/src/partitioning/mod.rs b/compiler/rustc_monomorphize/src/partitioning/mod.rs index fd6bcad18983..af3f60bb9326 100644 --- a/compiler/rustc_monomorphize/src/partitioning/mod.rs +++ b/compiler/rustc_monomorphize/src/partitioning/mod.rs @@ -114,7 +114,9 @@ use rustc_span::symbol::Symbol; use crate::collector::InliningMap; use crate::collector::{self, MonoItemCollectionMode}; -use crate::errors::{CouldntDumpMonoStats, SymbolAlreadyDefined, UnknownPartitionStrategy}; +use crate::errors::{ + CouldntDumpMonoStats, SymbolAlreadyDefined, UnknownCguCollectionMode, UnknownPartitionStrategy, +}; pub struct PartitioningCx<'a, 'tcx> { tcx: TyCtxt<'tcx>, @@ -348,17 +350,13 @@ where fn collect_and_partition_mono_items(tcx: TyCtxt<'_>, (): ()) -> (&DefIdSet, &[CodegenUnit<'_>]) { let collection_mode = match tcx.sess.opts.unstable_opts.print_mono_items { Some(ref s) => { - let mode_string = s.to_lowercase(); - let mode_string = mode_string.trim(); - if mode_string == "eager" { + let mode = s.to_lowercase(); + let mode = mode.trim(); + if mode == "eager" { MonoItemCollectionMode::Eager } else { - if mode_string != "lazy" { - let message = format!( - "Unknown codegen-item collection mode '{mode_string}'. \ - Falling back to 'lazy' mode." - ); - tcx.sess.warn(&message); + if mode != "lazy" { + tcx.sess.emit_warning(UnknownCguCollectionMode { mode }); } MonoItemCollectionMode::Lazy diff --git a/compiler/rustc_passes/src/check_const.rs b/compiler/rustc_passes/src/check_const.rs index dd8c646a43c8..526b829bf676 100644 --- a/compiler/rustc_passes/src/check_const.rs +++ b/compiler/rustc_passes/src/check_const.rs @@ -17,7 +17,7 @@ use rustc_middle::ty::TyCtxt; use rustc_session::parse::feature_err; use rustc_span::{sym, Span, Symbol}; -use crate::errors::ExprNotAllowedInContext; +use crate::errors::{ExprNotAllowedInContext, SkippingConstChecks}; /// An expression that is not *always* legal in a const context. #[derive(Clone, Copy)] @@ -124,7 +124,7 @@ impl<'tcx> CheckConstVisitor<'tcx> { // corresponding feature gate. This encourages nightly users to use feature gates when // possible. None if tcx.sess.opts.unstable_opts.unleash_the_miri_inside_of_you => { - tcx.sess.span_warn(span, "skipping const checks"); + tcx.sess.emit_warning(SkippingConstChecks { span }); return; } diff --git a/compiler/rustc_passes/src/errors.rs b/compiler/rustc_passes/src/errors.rs index 9e05ad22e624..97169a6367c3 100644 --- a/compiler/rustc_passes/src/errors.rs +++ b/compiler/rustc_passes/src/errors.rs @@ -1565,3 +1565,10 @@ pub(crate) struct ProcMacroUnsafe { #[primary_span] pub span: Span, } + +#[derive(Diagnostic)] +#[diag(passes_skipping_const_checks)] +pub struct SkippingConstChecks { + #[primary_span] + pub span: Span, +} diff --git a/compiler/rustc_session/src/errors.rs b/compiler/rustc_session/src/errors.rs index f5a72573d58c..8e8fba5e236f 100644 --- a/compiler/rustc_session/src/errors.rs +++ b/compiler/rustc_session/src/errors.rs @@ -375,3 +375,9 @@ pub fn report_lit_error(sess: &ParseSess, err: LitError, lit: token::Lit, span: } } } + +#[derive(Diagnostic)] +#[diag(session_optimization_fuel_exhausted)] +pub struct OptimisationFuelExhausted { + pub msg: String, +} diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs index 95f199de6ff6..91d23f1041fe 100644 --- a/compiler/rustc_session/src/session.rs +++ b/compiler/rustc_session/src/session.rs @@ -5,9 +5,10 @@ use crate::config::Input; use crate::config::{self, CrateType, InstrumentCoverage, OptLevel, OutputType, SwitchWithOptPath}; use crate::errors::{ BranchProtectionRequiresAArch64, CannotEnableCrtStaticLinux, CannotMixAndMatchSanitizers, - LinkerPluginToWindowsNotSupported, NotCircumventFeature, ProfileSampleUseFileDoesNotExist, - ProfileUseFileDoesNotExist, SanitizerCfiEnabled, SanitizerNotSupported, SanitizersNotSupported, - SkippingConstChecks, SplitDebugInfoUnstablePlatform, StackProtectorNotSupportedForTarget, + LinkerPluginToWindowsNotSupported, NotCircumventFeature, OptimisationFuelExhausted, + ProfileSampleUseFileDoesNotExist, ProfileUseFileDoesNotExist, SanitizerCfiEnabled, + SanitizerNotSupported, SanitizersNotSupported, SkippingConstChecks, + SplitDebugInfoUnstablePlatform, StackProtectorNotSupportedForTarget, TargetRequiresUnwindTables, UnleashedFeatureHelp, UnstableVirtualFunctionElimination, UnsupportedDwarfVersion, }; @@ -483,6 +484,8 @@ impl Session { self.diagnostic().span_err_with_code(sp, msg, code) } #[rustc_lint_diagnostics] + #[allow(rustc::untranslatable_diagnostic)] + #[allow(rustc::diagnostic_outside_of_impl)] pub fn err(&self, msg: impl Into) -> ErrorGuaranteed { self.diagnostic().err(msg) } @@ -583,12 +586,16 @@ impl Session { )) } } + + #[rustc_lint_diagnostics] #[allow(rustc::untranslatable_diagnostic)] #[allow(rustc::diagnostic_outside_of_impl)] #[track_caller] pub fn span_warn>(&self, sp: S, msg: impl Into) { self.diagnostic().span_warn(sp, msg) } + + #[rustc_lint_diagnostics] #[allow(rustc::untranslatable_diagnostic)] #[allow(rustc::diagnostic_outside_of_impl)] pub fn span_warn_with_code>( @@ -599,6 +606,10 @@ impl Session { ) { self.diagnostic().span_warn_with_code(sp, msg, code) } + + #[rustc_lint_diagnostics] + #[allow(rustc::untranslatable_diagnostic)] + #[allow(rustc::diagnostic_outside_of_impl)] pub fn warn(&self, msg: impl Into) { self.diagnostic().warn(msg) } @@ -641,11 +652,17 @@ impl Session { self.diagnostic().delay_good_path_bug(msg) } + #[rustc_lint_diagnostics] + #[allow(rustc::untranslatable_diagnostic)] + #[allow(rustc::diagnostic_outside_of_impl)] pub fn note_without_error(&self, msg: impl Into) { self.diagnostic().note_without_error(msg) } #[track_caller] + #[rustc_lint_diagnostics] + #[allow(rustc::untranslatable_diagnostic)] + #[allow(rustc::diagnostic_outside_of_impl)] pub fn span_note_without_error>( &self, sp: S, @@ -653,6 +670,8 @@ impl Session { ) { self.diagnostic().span_note_without_error(sp, msg) } + + #[rustc_lint_diagnostics] #[allow(rustc::untranslatable_diagnostic)] #[allow(rustc::diagnostic_outside_of_impl)] pub fn struct_note_without_error( @@ -882,7 +901,7 @@ impl Session { // We only call `msg` in case we can actually emit warnings. // Otherwise, this could cause a `delay_good_path_bug` to // trigger (issue #79546). - self.warn(&format!("optimization-fuel-exhausted: {}", msg())); + self.emit_warning(OptimisationFuelExhausted { msg: msg() }); } fuel.out_of_fuel = true; } else if fuel.remaining > 0 { From 2ff46641a92c27a32db3e0dc94ae86295e6c3277 Mon Sep 17 00:00:00 2001 From: David Wood Date: Mon, 26 Sep 2022 15:42:12 +0100 Subject: [PATCH 23/69] incremental: migrate diagnostics Migrate the `rustc_incremental` crate's diagnostics to translatable diagnostic structs. Signed-off-by: David Wood --- .../locales/en-US/incremental.ftl | 118 ++++++ compiler/rustc_error_messages/src/lib.rs | 1 + .../rustc_incremental/src/assert_dep_graph.rs | 40 +- .../src/assert_module_sources.rs | 50 +-- compiler/rustc_incremental/src/errors.rs | 364 ++++++++++++++++++ compiler/rustc_incremental/src/lib.rs | 4 + .../src/persist/dirty_clean.rs | 63 ++- .../src/persist/file_format.rs | 21 +- compiler/rustc_incremental/src/persist/fs.rs | 111 +----- .../rustc_incremental/src/persist/load.rs | 54 ++- .../rustc_incremental/src/persist/save.rs | 24 +- .../src/persist/work_product.rs | 18 +- .../incremental-session-fail/Makefile | 2 +- 13 files changed, 617 insertions(+), 253 deletions(-) create mode 100644 compiler/rustc_error_messages/locales/en-US/incremental.ftl create mode 100644 compiler/rustc_incremental/src/errors.rs diff --git a/compiler/rustc_error_messages/locales/en-US/incremental.ftl b/compiler/rustc_error_messages/locales/en-US/incremental.ftl new file mode 100644 index 000000000000..4852ee0d9595 --- /dev/null +++ b/compiler/rustc_error_messages/locales/en-US/incremental.ftl @@ -0,0 +1,118 @@ +incremental_unrecognized_depnode = unrecognized `DepNode` variant: {$name} + +incremental_missing_depnode = missing `DepNode` variant + +incremental_missing_if_this_changed = no `#[rustc_if_this_changed]` annotation detected + +incremental_no_path = no path from `{$source}` to `{$target}` + +incremental_ok = OK + +incremental_unknown_reuse_kind = unknown cgu-reuse-kind `{$kind}` specified + +incremental_missing_query_depgraph = + found CGU-reuse attribute but `-Zquery-dep-graph` was not specified + +incremental_malformed_cgu_name = + found malformed codegen unit name `{$user_path}`. codegen units names must always start with the name of the crate (`{$crate_name}` in this case). + +incremental_no_module_named = + no module named `{$user_path}` (mangled: {$cgu_name}). available modules: {$cgu_names} + +incremental_field_associated_value_expected = associated value expected for `{$name}` + +incremental_no_field = no field `{$name}` + +incremental_assertion_auto = + `except` specified DepNodes that can not be affected for \"{$name}\": \"{$e}\" + +incremental_undefined_clean_dirty_assertions_item = + clean/dirty auto-assertions not yet defined for Node::Item.node={$kind} + +incremental_undefined_clean_dirty_assertions = + clean/dirty auto-assertions not yet defined for {$kind} + +incremental_repeated_depnode_label = dep-node label `{$label}` is repeated + +incremental_unrecognized_depnode_label = dep-node label `{$label}` not recognized + +incremental_not_dirty = `{$dep_node_str}` should be dirty but is not + +incremental_not_clean = `{$dep_node_str}` should be clean but is not + +incremental_not_loaded = `{$dep_node_str}` should have been loaded from disk but it was not + +incremental_unknown_item = unknown item `{$name}` + +incremental_no_cfg = no cfg attribute + +incremental_associated_value_expected_for = associated value expected for `{$ident}` + +incremental_associated_value_expected = expected an associated value + +incremental_unchecked_clean = found unchecked `#[rustc_clean]` attribute + +incremental_delete_old = unable to delete old {$name} at `{$path}`: {$err} + +incremental_create_new = failed to create {$name} at `{$path}`: {$err} + +incremental_write_new = failed to write {$name} to `{$path}`: {$err} + +incremental_canonicalize_path = incremental compilation: error canonicalizing path `{$path}`: {$err} + +incremental_create_incr_comp_dir = + could not create incremental compilation {$tag} directory `{$path}`: {$err} + +incremental_create_lock = + incremental compilation: could not create session directory lock file: {$lock_err} +incremental_lock_unsupported = + the filesystem for the incremental path at {$session_dir} does not appear to support locking, consider changing the incremental path to a filesystem that supports locking or disable incremental compilation +incremental_cargo_help_1 = + incremental compilation can be disabled by setting the environment variable CARGO_INCREMENTAL=0 (see https://doc.rust-lang.org/cargo/reference/profiles.html#incremental) +incremental_cargo_help_2 = + the entire build directory can be changed to a different filesystem by setting the environment variable CARGO_TARGET_DIR to a different path (see https://doc.rust-lang.org/cargo/reference/config.html#buildtarget-dir) + +incremental_delete_lock = + error deleting lock file for incremental compilation session directory `{$path}`: {$err} + +incremental_hard_link_failed = + hard linking files in the incremental compilation cache failed. copying files instead. consider moving the cache directory to a file system which supports hard linking in session dir `{$path}` + +incremental_delete_partial = failed to delete partly initialized session dir `{$path}`: {$err} + +incremental_delete_full = error deleting incremental compilation session directory `{$path}`: {$err} + +incremental_finalize = error finalizing incremental compilation session directory `{$path}`: {$err} + +incremental_invalid_gc_failed = + failed to garbage collect invalid incremental compilation session directory `{$path}`: {$err} + +incremental_finalized_gc_failed = + failed to garbage collect finalized incremental compilation session directory `{$path}`: {$err} + +incremental_session_gc_failed = + failed to garbage collect incremental compilation session directory `{$path}`: {$err} + +incremental_assert_not_loaded = + we asserted that the incremental cache should not be loaded, but it was loaded + +incremental_assert_loaded = + we asserted that an existing incremental cache directory should be successfully loaded, but it was not + +incremental_delete_incompatible = + failed to delete invalidated or incompatible incremental compilation session directory contents `{$path}`: {$err} + +incremental_load_dep_graph = could not load dep-graph from `{$path}`: {$err} + +incremental_decode_incr_cache = could not decode incremental cache: {$err} + +incremental_write_dep_graph = failed to write dependency graph to `{$path}`: {$err} + +incremental_move_dep_graph = failed to move dependency graph from `{$from}` to `{$to}`: {$err} + +incremental_create_dep_graph = failed to create dependency graph at `{$path}`: {$err} + +incremental_copy_workproduct_to_cache = + error copying object file `{$from}` to incremental directory as `{$to}`: {$err} + +incremental_delete_workproduct = file-system error deleting outdated file `{$path}`: {$err} diff --git a/compiler/rustc_error_messages/src/lib.rs b/compiler/rustc_error_messages/src/lib.rs index f053bdc3809b..1882d4b698e6 100644 --- a/compiler/rustc_error_messages/src/lib.rs +++ b/compiler/rustc_error_messages/src/lib.rs @@ -52,6 +52,7 @@ fluent_messages! { expand => "../locales/en-US/expand.ftl", hir_analysis => "../locales/en-US/hir_analysis.ftl", hir_typeck => "../locales/en-US/hir_typeck.ftl", + incremental => "../locales/en-US/incremental.ftl", infer => "../locales/en-US/infer.ftl", interface => "../locales/en-US/interface.ftl", lint => "../locales/en-US/lint.ftl", diff --git a/compiler/rustc_incremental/src/assert_dep_graph.rs b/compiler/rustc_incremental/src/assert_dep_graph.rs index 6703d53f3805..22bd12f2e636 100644 --- a/compiler/rustc_incremental/src/assert_dep_graph.rs +++ b/compiler/rustc_incremental/src/assert_dep_graph.rs @@ -33,6 +33,7 @@ //! fn baz() { foo(); } //! ``` +use crate::errors; use rustc_ast as ast; use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::graph::implementation::{Direction, NodeIndex, INCOMING, OUTGOING}; @@ -133,12 +134,10 @@ impl<'tcx> IfThisChanged<'tcx> { Some(n) => { match DepNode::from_label_string(self.tcx, n.as_str(), def_path_hash) { Ok(n) => n, - Err(()) => { - self.tcx.sess.span_fatal( - attr.span, - &format!("unrecognized DepNode variant {:?}", n), - ); - } + Err(()) => self.tcx.sess.emit_fatal(errors::UnrecognizedDepNode { + span: attr.span, + name: n, + }), } } }; @@ -149,16 +148,14 @@ impl<'tcx> IfThisChanged<'tcx> { Some(n) => { match DepNode::from_label_string(self.tcx, n.as_str(), def_path_hash) { Ok(n) => n, - Err(()) => { - self.tcx.sess.span_fatal( - attr.span, - &format!("unrecognized DepNode variant {:?}", n), - ); - } + Err(()) => self.tcx.sess.emit_fatal(errors::UnrecognizedDepNode { + span: attr.span, + name: n, + }), } } None => { - self.tcx.sess.span_fatal(attr.span, "missing DepNode variant"); + self.tcx.sess.emit_fatal(errors::MissingDepNode { span: attr.span }); } }; self.then_this_would_need.push(( @@ -204,7 +201,7 @@ fn check_paths<'tcx>(tcx: TyCtxt<'tcx>, if_this_changed: &Sources, then_this_wou // Return early here so as not to construct the query, which is not cheap. if if_this_changed.is_empty() { for &(target_span, _, _, _) in then_this_would_need { - tcx.sess.span_err(target_span, "no `#[rustc_if_this_changed]` annotation detected"); + tcx.sess.emit_err(errors::MissingIfThisChanged { span: target_span }); } return; } @@ -213,16 +210,13 @@ fn check_paths<'tcx>(tcx: TyCtxt<'tcx>, if_this_changed: &Sources, then_this_wou let dependents = query.transitive_predecessors(source_dep_node); for &(target_span, ref target_pass, _, ref target_dep_node) in then_this_would_need { if !dependents.contains(&target_dep_node) { - tcx.sess.span_err( - target_span, - &format!( - "no path from `{}` to `{}`", - tcx.def_path_str(source_def_id), - target_pass - ), - ); + tcx.sess.emit_err(errors::NoPath { + span: target_span, + source: tcx.def_path_str(source_def_id), + target: *target_pass, + }); } else { - tcx.sess.span_err(target_span, "OK"); + tcx.sess.emit_err(errors::Ok { span: target_span }); } } } diff --git a/compiler/rustc_incremental/src/assert_module_sources.rs b/compiler/rustc_incremental/src/assert_module_sources.rs index 89d419bc8e90..2968a0e1203a 100644 --- a/compiler/rustc_incremental/src/assert_module_sources.rs +++ b/compiler/rustc_incremental/src/assert_module_sources.rs @@ -22,6 +22,7 @@ //! allows for doing a more fine-grained check to see if pre- or post-lto data //! was re-used. +use crate::errors; use rustc_ast as ast; use rustc_data_structures::fx::FxHashSet; use rustc_hir::def_id::LOCAL_CRATE; @@ -66,10 +67,9 @@ impl<'tcx> AssertModuleSource<'tcx> { sym::post_dash_lto => (CguReuse::PostLto, ComparisonKind::Exact), sym::any => (CguReuse::PreLto, ComparisonKind::AtLeast), other => { - self.tcx.sess.span_fatal( - attr.span, - &format!("unknown cgu-reuse-kind `{}` specified", other), - ); + self.tcx + .sess + .emit_fatal(errors::UnknownReuseKind { span: attr.span, kind: other }); } } } else { @@ -77,10 +77,7 @@ impl<'tcx> AssertModuleSource<'tcx> { }; if !self.tcx.sess.opts.unstable_opts.query_dep_graph { - self.tcx.sess.span_fatal( - attr.span, - "found CGU-reuse attribute but `-Zquery-dep-graph` was not specified", - ); + self.tcx.sess.emit_fatal(errors::MissingQueryDepGraph { span: attr.span }); } if !self.check_config(attr) { @@ -92,13 +89,11 @@ impl<'tcx> AssertModuleSource<'tcx> { let crate_name = self.tcx.crate_name(LOCAL_CRATE).to_string(); if !user_path.starts_with(&crate_name) { - let msg = format!( - "Found malformed codegen unit name `{}`. \ - Codegen units names must always start with the name of the \ - crate (`{}` in this case).", - user_path, crate_name - ); - self.tcx.sess.span_fatal(attr.span, &msg); + self.tcx.sess.emit_fatal(errors::MalformedCguName { + span: attr.span, + user_path, + crate_name, + }); } // Split of the "special suffix" if there is one. @@ -125,15 +120,12 @@ impl<'tcx> AssertModuleSource<'tcx> { let mut cgu_names: Vec<&str> = self.available_cgus.iter().map(|cgu| cgu.as_str()).collect(); cgu_names.sort(); - self.tcx.sess.span_err( - attr.span, - &format!( - "no module named `{}` (mangled: {}). Available modules: {}", - user_path, - cgu_name, - cgu_names.join(", ") - ), - ); + self.tcx.sess.emit_err(errors::NoModuleNamed { + span: attr.span, + user_path, + cgu_name, + cgu_names: cgu_names.join(", "), + }); } self.tcx.sess.cgu_reuse_tracker.set_expectation( @@ -151,15 +143,15 @@ impl<'tcx> AssertModuleSource<'tcx> { if let Some(value) = item.value_str() { return value; } else { - self.tcx.sess.span_fatal( - item.span(), - &format!("associated value expected for `{}`", name), - ); + self.tcx.sess.emit_fatal(errors::FieldAssociatedValueExpected { + span: item.span(), + name, + }); } } } - self.tcx.sess.span_fatal(attr.span, &format!("no field `{}`", name)); + self.tcx.sess.emit_fatal(errors::NoField { span: attr.span, name }); } /// Scan for a `cfg="foo"` attribute and check whether we have a diff --git a/compiler/rustc_incremental/src/errors.rs b/compiler/rustc_incremental/src/errors.rs new file mode 100644 index 000000000000..deb876783654 --- /dev/null +++ b/compiler/rustc_incremental/src/errors.rs @@ -0,0 +1,364 @@ +use rustc_macros::Diagnostic; +use rustc_span::{symbol::Ident, Span, Symbol}; +use std::path::{Path, PathBuf}; + +#[derive(Diagnostic)] +#[diag(incremental_unrecognized_depnode)] +pub struct UnrecognizedDepNode { + #[primary_span] + pub span: Span, + pub name: Symbol, +} + +#[derive(Diagnostic)] +#[diag(incremental_missing_depnode)] +pub struct MissingDepNode { + #[primary_span] + pub span: Span, +} + +#[derive(Diagnostic)] +#[diag(incremental_missing_if_this_changed)] +pub struct MissingIfThisChanged { + #[primary_span] + pub span: Span, +} + +#[derive(Diagnostic)] +#[diag(incremental_ok)] +pub struct Ok { + #[primary_span] + pub span: Span, +} + +#[derive(Diagnostic)] +#[diag(incremental_no_path)] +pub struct NoPath { + #[primary_span] + pub span: Span, + pub target: Symbol, + pub source: String, +} + +#[derive(Diagnostic)] +#[diag(incremental_unknown_reuse_kind)] +pub struct UnknownReuseKind { + #[primary_span] + pub span: Span, + pub kind: Symbol, +} + +#[derive(Diagnostic)] +#[diag(incremental_missing_query_depgraph)] +pub struct MissingQueryDepGraph { + #[primary_span] + pub span: Span, +} + +#[derive(Diagnostic)] +#[diag(incremental_malformed_cgu_name)] +pub struct MalformedCguName { + #[primary_span] + pub span: Span, + pub user_path: String, + pub crate_name: String, +} + +#[derive(Diagnostic)] +#[diag(incremental_no_module_named)] +pub struct NoModuleNamed<'a> { + #[primary_span] + pub span: Span, + pub user_path: &'a str, + pub cgu_name: Symbol, + pub cgu_names: String, +} + +#[derive(Diagnostic)] +#[diag(incremental_field_associated_value_expected)] +pub struct FieldAssociatedValueExpected { + #[primary_span] + pub span: Span, + pub name: Symbol, +} + +#[derive(Diagnostic)] +#[diag(incremental_no_field)] +pub struct NoField { + #[primary_span] + pub span: Span, + pub name: Symbol, +} + +#[derive(Diagnostic)] +#[diag(incremental_assertion_auto)] +pub struct AssertionAuto<'a> { + #[primary_span] + pub span: Span, + pub name: &'a str, + pub e: &'a str, +} + +#[derive(Diagnostic)] +#[diag(incremental_undefined_clean_dirty_assertions_item)] +pub struct UndefinedCleanDirtyItem { + #[primary_span] + pub span: Span, + pub kind: String, +} + +#[derive(Diagnostic)] +#[diag(incremental_undefined_clean_dirty_assertions)] +pub struct UndefinedCleanDirty { + #[primary_span] + pub span: Span, + pub kind: String, +} + +#[derive(Diagnostic)] +#[diag(incremental_repeated_depnode_label)] +pub struct RepeatedDepNodeLabel<'a> { + #[primary_span] + pub span: Span, + pub label: &'a str, +} + +#[derive(Diagnostic)] +#[diag(incremental_unrecognized_depnode_label)] +pub struct UnrecognizedDepNodeLabel<'a> { + #[primary_span] + pub span: Span, + pub label: &'a str, +} + +#[derive(Diagnostic)] +#[diag(incremental_not_dirty)] +pub struct NotDirty<'a> { + #[primary_span] + pub span: Span, + pub dep_node_str: &'a str, +} + +#[derive(Diagnostic)] +#[diag(incremental_not_clean)] +pub struct NotClean<'a> { + #[primary_span] + pub span: Span, + pub dep_node_str: &'a str, +} + +#[derive(Diagnostic)] +#[diag(incremental_not_loaded)] +pub struct NotLoaded<'a> { + #[primary_span] + pub span: Span, + pub dep_node_str: &'a str, +} + +#[derive(Diagnostic)] +#[diag(incremental_unknown_item)] +pub struct UnknownItem { + #[primary_span] + pub span: Span, + pub name: Symbol, +} + +#[derive(Diagnostic)] +#[diag(incremental_no_cfg)] +pub struct NoCfg { + #[primary_span] + pub span: Span, +} + +#[derive(Diagnostic)] +#[diag(incremental_associated_value_expected_for)] +pub struct AssociatedValueExpectedFor { + #[primary_span] + pub span: Span, + pub ident: Ident, +} + +#[derive(Diagnostic)] +#[diag(incremental_associated_value_expected)] +pub struct AssociatedValueExpected { + #[primary_span] + pub span: Span, +} + +#[derive(Diagnostic)] +#[diag(incremental_unchecked_clean)] +pub struct UncheckedClean { + #[primary_span] + pub span: Span, +} + +#[derive(Diagnostic)] +#[diag(incremental_delete_old)] +pub struct DeleteOld<'a> { + pub name: &'a str, + pub path: PathBuf, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_create_new)] +pub struct CreateNew<'a> { + pub name: &'a str, + pub path: PathBuf, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_write_new)] +pub struct WriteNew<'a> { + pub name: &'a str, + pub path: PathBuf, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_canonicalize_path)] +pub struct CanonicalizePath { + pub path: PathBuf, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_create_incr_comp_dir)] +pub struct CreateIncrCompDir<'a> { + pub tag: &'a str, + pub path: &'a Path, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_create_lock)] +pub struct CreateLock<'a> { + pub lock_err: std::io::Error, + pub session_dir: &'a Path, + #[note(incremental_lock_unsupported)] + pub is_unsupported_lock: Option<()>, + #[help(incremental_cargo_help_1)] + #[help(incremental_cargo_help_2)] + pub is_cargo: Option<()>, +} + +#[derive(Diagnostic)] +#[diag(incremental_delete_lock)] +pub struct DeleteLock<'a> { + pub path: &'a Path, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_hard_link_failed)] +pub struct HardLinkFailed<'a> { + pub path: &'a Path, +} + +#[derive(Diagnostic)] +#[diag(incremental_delete_partial)] +pub struct DeletePartial<'a> { + pub path: &'a Path, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_delete_full)] +pub struct DeleteFull<'a> { + pub path: &'a Path, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_finalize)] +pub struct Finalize<'a> { + pub path: &'a Path, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_invalid_gc_failed)] +pub struct InvalidGcFailed<'a> { + pub path: &'a Path, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_finalized_gc_failed)] +pub struct FinalizedGcFailed<'a> { + pub path: &'a Path, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_session_gc_failed)] +pub struct SessionGcFailed<'a> { + pub path: &'a Path, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_assert_not_loaded)] +pub struct AssertNotLoaded; + +#[derive(Diagnostic)] +#[diag(incremental_assert_loaded)] +pub struct AssertLoaded; + +#[derive(Diagnostic)] +#[diag(incremental_delete_incompatible)] +pub struct DeleteIncompatible { + pub path: PathBuf, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_load_dep_graph)] +pub struct LoadDepGraph { + pub path: PathBuf, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_decode_incr_cache)] +pub struct DecodeIncrCache { + pub err: String, +} + +#[derive(Diagnostic)] +#[diag(incremental_write_dep_graph)] +pub struct WriteDepGraph<'a> { + pub path: &'a Path, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_move_dep_graph)] +pub struct MoveDepGraph<'a> { + pub from: &'a Path, + pub to: &'a Path, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_create_dep_graph)] +pub struct CreateDepGraph<'a> { + pub path: &'a Path, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_copy_workproduct_to_cache)] +pub struct CopyWorkProductToCache<'a> { + pub from: &'a Path, + pub to: &'a Path, + pub err: std::io::Error, +} + +#[derive(Diagnostic)] +#[diag(incremental_delete_workproduct)] +pub struct DeleteWorkProduct<'a> { + pub path: &'a Path, + pub err: std::io::Error, +} diff --git a/compiler/rustc_incremental/src/lib.rs b/compiler/rustc_incremental/src/lib.rs index 83dd9a67e61b..3c58cfa38f28 100644 --- a/compiler/rustc_incremental/src/lib.rs +++ b/compiler/rustc_incremental/src/lib.rs @@ -2,8 +2,11 @@ #![deny(missing_docs)] #![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")] +#![feature(never_type)] #![recursion_limit = "256"] #![allow(rustc::potential_query_instability)] +#![deny(rustc::untranslatable_diagnostic)] +#![deny(rustc::diagnostic_outside_of_impl)] #[macro_use] extern crate rustc_middle; @@ -12,6 +15,7 @@ extern crate tracing; mod assert_dep_graph; pub mod assert_module_sources; +mod errors; mod persist; use assert_dep_graph::assert_dep_graph; diff --git a/compiler/rustc_incremental/src/persist/dirty_clean.rs b/compiler/rustc_incremental/src/persist/dirty_clean.rs index ed7b272b13d1..c6e63998c793 100644 --- a/compiler/rustc_incremental/src/persist/dirty_clean.rs +++ b/compiler/rustc_incremental/src/persist/dirty_clean.rs @@ -19,6 +19,7 @@ //! Errors are reported if we are in the suitable configuration but //! the required condition is not met. +use crate::errors; use rustc_ast::{self as ast, Attribute, NestedMetaItem}; use rustc_data_structures::fx::FxHashSet; use rustc_hir::def_id::LocalDefId; @@ -196,11 +197,7 @@ impl<'tcx> DirtyCleanVisitor<'tcx> { let loaded_from_disk = self.loaded_from_disk(attr); for e in except.iter() { if !auto.remove(e) { - let msg = format!( - "`except` specified DepNodes that can not be affected for \"{}\": \"{}\"", - name, e - ); - self.tcx.sess.span_fatal(attr.span, &msg); + self.tcx.sess.emit_fatal(errors::AssertionAuto { span: attr.span, name, e }); } } Assertion { clean: auto, dirty: except, loaded_from_disk } @@ -282,14 +279,10 @@ impl<'tcx> DirtyCleanVisitor<'tcx> { // An implementation, eg `impl Trait for Foo { .. }` HirItem::Impl { .. } => ("ItemKind::Impl", LABELS_IMPL), - _ => self.tcx.sess.span_fatal( - attr.span, - &format!( - "clean/dirty auto-assertions not yet defined \ - for Node::Item.node={:?}", - item.kind - ), - ), + _ => self.tcx.sess.emit_fatal(errors::UndefinedCleanDirtyItem { + span: attr.span, + kind: format!("{:?}", item.kind), + }), } } HirNode::TraitItem(item) => match item.kind { @@ -302,10 +295,10 @@ impl<'tcx> DirtyCleanVisitor<'tcx> { ImplItemKind::Const(..) => ("NodeImplConst", LABELS_CONST_IN_IMPL), ImplItemKind::Type(..) => ("NodeImplType", LABELS_CONST_IN_IMPL), }, - _ => self.tcx.sess.span_fatal( - attr.span, - &format!("clean/dirty auto-assertions not yet defined for {:?}", node), - ), + _ => self.tcx.sess.emit_fatal(errors::UndefinedCleanDirty { + span: attr.span, + kind: format!("{:?}", node), + }), }; let labels = Labels::from_iter(labels.iter().flat_map(|s| s.iter().map(|l| (*l).to_string()))); @@ -318,16 +311,15 @@ impl<'tcx> DirtyCleanVisitor<'tcx> { let label = label.trim(); if DepNode::has_label_string(label) { if out.contains(label) { - self.tcx.sess.span_fatal( - item.span(), - &format!("dep-node label `{}` is repeated", label), - ); + self.tcx + .sess + .emit_fatal(errors::RepeatedDepNodeLabel { span: item.span(), label }); } out.insert(label.to_string()); } else { self.tcx .sess - .span_fatal(item.span(), &format!("dep-node label `{}` not recognized", label)); + .emit_fatal(errors::UnrecognizedDepNodeLabel { span: item.span(), label }); } } out @@ -348,7 +340,7 @@ impl<'tcx> DirtyCleanVisitor<'tcx> { let dep_node_str = self.dep_node_str(&dep_node); self.tcx .sess - .span_err(item_span, &format!("`{}` should be dirty but is not", dep_node_str)); + .emit_err(errors::NotDirty { span: item_span, dep_node_str: &dep_node_str }); } } @@ -359,7 +351,7 @@ impl<'tcx> DirtyCleanVisitor<'tcx> { let dep_node_str = self.dep_node_str(&dep_node); self.tcx .sess - .span_err(item_span, &format!("`{}` should be clean but is not", dep_node_str)); + .emit_err(errors::NotClean { span: item_span, dep_node_str: &dep_node_str }); } } @@ -368,10 +360,9 @@ impl<'tcx> DirtyCleanVisitor<'tcx> { if !self.tcx.dep_graph.debug_was_loaded_from_disk(dep_node) { let dep_node_str = self.dep_node_str(&dep_node); - self.tcx.sess.span_err( - item_span, - &format!("`{}` should have been loaded from disk but it was not", dep_node_str), - ); + self.tcx + .sess + .emit_err(errors::NotLoaded { span: item_span, dep_node_str: &dep_node_str }); } } @@ -412,12 +403,12 @@ fn check_config(tcx: TyCtxt<'_>, attr: &Attribute) -> bool { debug!("check_config: searching for cfg {:?}", value); cfg = Some(config.contains(&(value, None))); } else if !(item.has_name(EXCEPT) || item.has_name(LOADED_FROM_DISK)) { - tcx.sess.span_err(attr.span, &format!("unknown item `{}`", item.name_or_empty())); + tcx.sess.emit_err(errors::UnknownItem { span: attr.span, name: item.name_or_empty() }); } } match cfg { - None => tcx.sess.span_fatal(attr.span, "no cfg attribute"), + None => tcx.sess.emit_fatal(errors::NoCfg { span: attr.span }), Some(c) => c, } } @@ -426,13 +417,11 @@ fn expect_associated_value(tcx: TyCtxt<'_>, item: &NestedMetaItem) -> Symbol { if let Some(value) = item.value_str() { value } else { - let msg = if let Some(ident) = item.ident() { - format!("associated value expected for `{}`", ident) + if let Some(ident) = item.ident() { + tcx.sess.emit_fatal(errors::AssociatedValueExpectedFor { span: item.span(), ident }); } else { - "expected an associated value".to_string() - }; - - tcx.sess.span_fatal(item.span(), &msg); + tcx.sess.emit_fatal(errors::AssociatedValueExpected { span: item.span() }); + } } } @@ -456,7 +445,7 @@ impl<'tcx> FindAllAttrs<'tcx> { fn report_unchecked_attrs(&self, mut checked_attrs: FxHashSet) { for attr in &self.found_attrs { if !checked_attrs.contains(&attr.id) { - self.tcx.sess.span_err(attr.span, "found unchecked `#[rustc_clean]` attribute"); + self.tcx.sess.emit_err(errors::UncheckedClean { span: attr.span }); checked_attrs.insert(attr.id); } } diff --git a/compiler/rustc_incremental/src/persist/file_format.rs b/compiler/rustc_incremental/src/persist/file_format.rs index 2dbd4b6bce85..dc981c6179ee 100644 --- a/compiler/rustc_incremental/src/persist/file_format.rs +++ b/compiler/rustc_incremental/src/persist/file_format.rs @@ -9,15 +9,15 @@ //! compiler versions don't change frequently for the typical user, being //! conservative here practically has no downside. -use std::env; -use std::fs; -use std::io::{self, Read}; -use std::path::{Path, PathBuf}; - +use crate::errors; use rustc_data_structures::memmap::Mmap; use rustc_serialize::opaque::{FileEncodeResult, FileEncoder}; use rustc_serialize::Encoder; use rustc_session::Session; +use std::env; +use std::fs; +use std::io::{self, Read}; +use std::path::{Path, PathBuf}; /// The first few bytes of files generated by incremental compilation. const FILE_MAGIC: &[u8] = b"RSIC"; @@ -60,12 +60,7 @@ where } Err(err) if err.kind() == io::ErrorKind::NotFound => (), Err(err) => { - sess.err(&format!( - "unable to delete old {} at `{}`: {}", - name, - path_buf.display(), - err - )); + sess.emit_err(errors::DeleteOld { name, path: path_buf, err }); return; } } @@ -73,7 +68,7 @@ where let mut encoder = match FileEncoder::new(&path_buf) { Ok(encoder) => encoder, Err(err) => { - sess.err(&format!("failed to create {} at `{}`: {}", name, path_buf.display(), err)); + sess.emit_err(errors::CreateNew { name, path: path_buf, err }); return; } }; @@ -90,7 +85,7 @@ where debug!("save: data written to disk successfully"); } Err(err) => { - sess.err(&format!("failed to write {} to `{}`: {}", name, path_buf.display(), err)); + sess.emit_err(errors::WriteNew { name, path: path_buf, err }); } } } diff --git a/compiler/rustc_incremental/src/persist/fs.rs b/compiler/rustc_incremental/src/persist/fs.rs index 1fd2b9b0d7b7..73d7e3becab4 100644 --- a/compiler/rustc_incremental/src/persist/fs.rs +++ b/compiler/rustc_incremental/src/persist/fs.rs @@ -103,6 +103,7 @@ //! unsupported file system and emit a warning in that case. This is not yet //! implemented. +use crate::errors; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::svh::Svh; use rustc_data_structures::{base_n, flock}; @@ -225,12 +226,7 @@ pub fn prepare_session_directory( let crate_dir = match crate_dir.canonicalize() { Ok(v) => v, Err(err) => { - let reported = sess.err(&format!( - "incremental compilation: error canonicalizing path `{}`: {}", - crate_dir.display(), - err - )); - return Err(reported); + return Err(sess.emit_err(errors::CanonicalizePath { path: crate_dir, err })); } }; @@ -273,14 +269,7 @@ pub fn prepare_session_directory( debug!("successfully copied data from: {}", source_directory.display()); if !allows_links { - sess.warn(&format!( - "Hard linking files in the incremental \ - compilation cache failed. Copying files \ - instead. Consider moving the cache \ - directory to a file system which supports \ - hard linking in session dir `{}`", - session_dir.display() - )); + sess.emit_warning(errors::HardLinkFailed { path: &session_dir }); } sess.init_incr_comp_session(session_dir, directory_lock, true); @@ -295,12 +284,7 @@ pub fn prepare_session_directory( // Try to remove the session directory we just allocated. We don't // know if there's any garbage in it from the failed copy action. if let Err(err) = safe_remove_dir_all(&session_dir) { - sess.warn(&format!( - "Failed to delete partly initialized \ - session dir `{}`: {}", - session_dir.display(), - err - )); + sess.emit_warning(errors::DeletePartial { path: &session_dir, err }); } delete_session_dir_lock_file(sess, &lock_file_path); @@ -332,12 +316,7 @@ pub fn finalize_session_directory(sess: &Session, svh: Svh) { ); if let Err(err) = safe_remove_dir_all(&*incr_comp_session_dir) { - sess.warn(&format!( - "Error deleting incremental compilation \ - session directory `{}`: {}", - incr_comp_session_dir.display(), - err - )); + sess.emit_warning(errors::DeleteFull { path: &incr_comp_session_dir, err }); } let lock_file_path = lock_file_path(&*incr_comp_session_dir); @@ -380,12 +359,7 @@ pub fn finalize_session_directory(sess: &Session, svh: Svh) { } Err(e) => { // Warn about the error. However, no need to abort compilation now. - sess.warn(&format!( - "Error finalizing incremental compilation \ - session directory `{}`: {}", - incr_comp_session_dir.display(), - e - )); + sess.emit_warning(errors::Finalize { path: &incr_comp_session_dir, err: e }); debug!("finalize_session_directory() - error, marking as invalid"); // Drop the file lock, so we can garage collect @@ -488,16 +462,7 @@ fn create_dir(sess: &Session, path: &Path, dir_tag: &str) -> Result<(), ErrorGua debug!("{} directory created successfully", dir_tag); Ok(()) } - Err(err) => { - let reported = sess.err(&format!( - "Could not create incremental compilation {} \ - directory `{}`: {}", - dir_tag, - path.display(), - err - )); - Err(reported) - } + Err(err) => Err(sess.emit_err(errors::CreateIncrCompDir { tag: dir_tag, path, err })), } } @@ -518,46 +483,20 @@ fn lock_directory( // the lock should be exclusive Ok(lock) => Ok((lock, lock_file_path)), Err(lock_err) => { - let mut err = sess.struct_err(&format!( - "incremental compilation: could not create \ - session directory lock file: {}", - lock_err - )); - if flock::Lock::error_unsupported(&lock_err) { - err.note(&format!( - "the filesystem for the incremental path at {} \ - does not appear to support locking, consider changing the \ - incremental path to a filesystem that supports locking \ - or disable incremental compilation", - session_dir.display() - )); - if std::env::var_os("CARGO").is_some() { - err.help( - "incremental compilation can be disabled by setting the \ - environment variable CARGO_INCREMENTAL=0 (see \ - https://doc.rust-lang.org/cargo/reference/profiles.html#incremental)", - ); - err.help( - "the entire build directory can be changed to a different \ - filesystem by setting the environment variable CARGO_TARGET_DIR \ - to a different path (see \ - https://doc.rust-lang.org/cargo/reference/config.html#buildtarget-dir)", - ); - } - } - Err(err.emit()) + let is_unsupported_lock = flock::Lock::error_unsupported(&lock_err).then_some(()); + Err(sess.emit_err(errors::CreateLock { + lock_err, + session_dir, + is_unsupported_lock, + is_cargo: std::env::var_os("CARGO").map(|_| ()), + })) } } } fn delete_session_dir_lock_file(sess: &Session, lock_file_path: &Path) { if let Err(err) = safe_remove_file(&lock_file_path) { - sess.warn(&format!( - "Error deleting lock file for incremental \ - compilation session directory `{}`: {}", - lock_file_path.display(), - err - )); + sess.emit_warning(errors::DeleteLock { path: lock_file_path, err }); } } @@ -774,12 +713,7 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> { if !lock_file_to_session_dir.values().any(|dir| *dir == directory_name) { let path = crate_directory.join(directory_name); if let Err(err) = safe_remove_dir_all(&path) { - sess.warn(&format!( - "Failed to garbage collect invalid incremental \ - compilation session directory `{}`: {}", - path.display(), - err - )); + sess.emit_warning(errors::InvalidGcFailed { path: &path, err }); } } } @@ -885,12 +819,7 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> { debug!("garbage_collect_session_directories() - deleting `{}`", path.display()); if let Err(err) = safe_remove_dir_all(&path) { - sess.warn(&format!( - "Failed to garbage collect finalized incremental \ - compilation session directory `{}`: {}", - path.display(), - err - )); + sess.emit_warning(errors::FinalizedGcFailed { path: &path, err }); } else { delete_session_dir_lock_file(sess, &lock_file_path(&path)); } @@ -907,11 +836,7 @@ fn delete_old(sess: &Session, path: &Path) { debug!("garbage_collect_session_directories() - deleting `{}`", path.display()); if let Err(err) = safe_remove_dir_all(&path) { - sess.warn(&format!( - "Failed to garbage collect incremental compilation session directory `{}`: {}", - path.display(), - err - )); + sess.emit_warning(errors::SessionGcFailed { path: &path, err }); } else { delete_session_dir_lock_file(sess, &lock_file_path(&path)); } diff --git a/compiler/rustc_incremental/src/persist/load.rs b/compiler/rustc_incremental/src/persist/load.rs index 1c5fd9169023..d5097065dda2 100644 --- a/compiler/rustc_incremental/src/persist/load.rs +++ b/compiler/rustc_incremental/src/persist/load.rs @@ -1,5 +1,6 @@ //! Code to save/load the dep-graph from files. +use crate::errors; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::memmap::Mmap; use rustc_middle::dep_graph::{SerializedDepGraph, WorkProduct, WorkProductId}; @@ -8,7 +9,7 @@ use rustc_serialize::opaque::MemDecoder; use rustc_serialize::Decodable; use rustc_session::config::IncrementalStateAssertion; use rustc_session::Session; -use std::path::Path; +use std::path::{Path, PathBuf}; use super::data::*; use super::file_format; @@ -27,11 +28,10 @@ pub enum LoadResult { }, /// The file either didn't exist or was produced by an incompatible compiler version. DataOutOfDate, - /// An error occurred. - Error { - #[allow(missing_docs)] - message: String, - }, + /// Loading the dep graph failed. + LoadDepGraph(PathBuf, std::io::Error), + /// Decoding loaded incremental cache failed. + DecodeIncrCache(Box), } impl LoadResult { @@ -40,36 +40,31 @@ impl LoadResult { // Check for errors when using `-Zassert-incremental-state` match (sess.opts.assert_incr_state, &self) { (Some(IncrementalStateAssertion::NotLoaded), LoadResult::Ok { .. }) => { - sess.fatal( - "We asserted that the incremental cache should not be loaded, \ - but it was loaded.", - ); + sess.emit_fatal(errors::AssertNotLoaded); } ( Some(IncrementalStateAssertion::Loaded), - LoadResult::Error { .. } | LoadResult::DataOutOfDate, + LoadResult::LoadDepGraph(..) + | LoadResult::DecodeIncrCache(..) + | LoadResult::DataOutOfDate, ) => { - sess.fatal( - "We asserted that an existing incremental cache directory should \ - be successfully loaded, but it was not.", - ); + sess.emit_fatal(errors::AssertLoaded); } _ => {} }; match self { - LoadResult::Error { message } => { - sess.warn(&message); + LoadResult::LoadDepGraph(path, err) => { + sess.emit_warning(errors::LoadDepGraph { path, err }); + Default::default() + } + LoadResult::DecodeIncrCache(err) => { + sess.emit_warning(errors::DecodeIncrCache { err: format!("{err:?}") }); Default::default() } LoadResult::DataOutOfDate => { if let Err(err) = delete_all_session_dir_contents(sess) { - sess.err(&format!( - "Failed to delete invalidated or incompatible \ - incremental compilation session directory contents `{}`: {}.", - dep_graph_path(sess).display(), - err - )); + sess.emit_err(errors::DeleteIncompatible { path: dep_graph_path(sess), err }); } Default::default() } @@ -90,9 +85,7 @@ fn load_data( // compiler version. Neither is an error. LoadResult::DataOutOfDate } - Err(err) => LoadResult::Error { - message: format!("could not load dep-graph from `{}`: {}", path.display(), err), - }, + Err(err) => LoadResult::LoadDepGraph(path.to_path_buf(), err), } } @@ -114,9 +107,9 @@ impl MaybeAsync> { pub fn open(self) -> LoadResult { match self { MaybeAsync::Sync(result) => result, - MaybeAsync::Async(handle) => handle.join().unwrap_or_else(|e| LoadResult::Error { - message: format!("could not decode incremental cache: {:?}", e), - }), + MaybeAsync::Async(handle) => { + handle.join().unwrap_or_else(|e| LoadResult::DecodeIncrCache(e)) + } } } } @@ -185,7 +178,8 @@ pub fn load_dep_graph(sess: &Session) -> DepGraphFuture { match load_data(report_incremental_info, &path, nightly_build) { LoadResult::DataOutOfDate => LoadResult::DataOutOfDate, - LoadResult::Error { message } => LoadResult::Error { message }, + LoadResult::LoadDepGraph(path, err) => LoadResult::LoadDepGraph(path, err), + LoadResult::DecodeIncrCache(err) => LoadResult::DecodeIncrCache(err), LoadResult::Ok { data: (bytes, start_pos) } => { let mut decoder = MemDecoder::new(&bytes, start_pos); let prev_commandline_args_hash = u64::decode(&mut decoder); diff --git a/compiler/rustc_incremental/src/persist/save.rs b/compiler/rustc_incremental/src/persist/save.rs index 6e9dcdd981ec..27be56eac6f9 100644 --- a/compiler/rustc_incremental/src/persist/save.rs +++ b/compiler/rustc_incremental/src/persist/save.rs @@ -1,3 +1,4 @@ +use crate::errors; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::sync::join; use rustc_middle::dep_graph::{DepGraph, SerializedDepGraph, WorkProduct, WorkProductId}; @@ -59,19 +60,14 @@ pub fn save_dep_graph(tcx: TyCtxt<'_>) { move || { sess.time("incr_comp_persist_dep_graph", || { if let Err(err) = tcx.dep_graph.encode(&tcx.sess.prof) { - sess.err(&format!( - "failed to write dependency graph to `{}`: {}", - staging_dep_graph_path.display(), - err - )); + sess.emit_err(errors::WriteDepGraph { path: &staging_dep_graph_path, err }); } if let Err(err) = fs::rename(&staging_dep_graph_path, &dep_graph_path) { - sess.err(&format!( - "failed to move dependency graph from `{}` to `{}`: {}", - staging_dep_graph_path.display(), - dep_graph_path.display(), - err - )); + sess.emit_err(errors::MoveDepGraph { + from: &staging_dep_graph_path, + to: &dep_graph_path, + err, + }); } }); }, @@ -163,11 +159,7 @@ pub fn build_dep_graph( let mut encoder = match FileEncoder::new(&path_buf) { Ok(encoder) => encoder, Err(err) => { - sess.err(&format!( - "failed to create dependency graph at `{}`: {}", - path_buf.display(), - err - )); + sess.emit_err(errors::CreateDepGraph { path: &path_buf, err }); return None; } }; diff --git a/compiler/rustc_incremental/src/persist/work_product.rs b/compiler/rustc_incremental/src/persist/work_product.rs index 2f1853c441ee..dc98fbeb0d16 100644 --- a/compiler/rustc_incremental/src/persist/work_product.rs +++ b/compiler/rustc_incremental/src/persist/work_product.rs @@ -2,6 +2,7 @@ //! //! [work products]: WorkProduct +use crate::errors; use crate::persist::fs::*; use rustc_data_structures::fx::FxHashMap; use rustc_fs_util::link_or_copy; @@ -28,12 +29,11 @@ pub fn copy_cgu_workproduct_to_incr_comp_cache_dir( let _ = saved_files.insert(ext.to_string(), file_name); } Err(err) => { - sess.warn(&format!( - "error copying object file `{}` to incremental directory as `{}`: {}", - path.display(), - path_in_incr_dir.display(), - err - )); + sess.emit_warning(errors::CopyWorkProductToCache { + from: &path, + to: &path_in_incr_dir, + err, + }); } } } @@ -49,11 +49,7 @@ pub fn delete_workproduct_files(sess: &Session, work_product: &WorkProduct) { for (_, path) in &work_product.saved_files { let path = in_incr_comp_dir_sess(sess, path); if let Err(err) = std_fs::remove_file(&path) { - sess.warn(&format!( - "file-system error deleting outdated file `{}`: {}", - path.display(), - err - )); + sess.emit_warning(errors::DeleteWorkProduct { path: &path, err }); } } } diff --git a/tests/run-make/incremental-session-fail/Makefile b/tests/run-make/incremental-session-fail/Makefile index 0461bb926e76..6ce1370927bc 100644 --- a/tests/run-make/incremental-session-fail/Makefile +++ b/tests/run-make/incremental-session-fail/Makefile @@ -9,6 +9,6 @@ all: touch $(SESSION_DIR) # Check exit code is 1 for an error, and not 101 for ICE. $(RUSTC) foo.rs --crate-type=rlib -C incremental=$(SESSION_DIR) > $(OUTPUT_FILE) 2>&1; [ $$? -eq 1 ] - $(CGREP) "Could not create incremental compilation crate directory" < $(OUTPUT_FILE) + $(CGREP) "could not create incremental compilation crate directory" < $(OUTPUT_FILE) # -v tests are fragile, hopefully this text won't change $(CGREP) -v "internal compiler error" < $(OUTPUT_FILE) From 7080f80e8b64eb5f2037de50991edb9e82aee3a5 Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Mon, 30 Jan 2023 11:05:12 -0700 Subject: [PATCH 24/69] rustdoc: remove unnecessary wrapper div.item-decl from HTML --- src/librustdoc/html/highlight.rs | 8 +- src/librustdoc/html/render/print_item.rs | 590 ++++++++---------- src/librustdoc/html/static/css/rustdoc.css | 2 +- tests/rustdoc-gui/code-tags.goml | 10 +- tests/rustdoc-gui/font-weight.goml | 9 +- tests/rustdoc-gui/list_code_block.goml | 2 +- .../rustdoc-gui/type-declation-overflow.goml | 18 +- tests/rustdoc/array-links.rs | 8 +- tests/rustdoc/assoc-consts.rs | 2 +- tests/rustdoc/assoc-item-cast.rs | 2 +- tests/rustdoc/assoc-types.rs | 12 +- tests/rustdoc/async-fn.rs | 30 +- tests/rustdoc/attribute-rendering.rs | 2 +- tests/rustdoc/attributes.rs | 6 +- tests/rustdoc/auxiliary/issue-85454.rs | 2 +- tests/rustdoc/const-fn.rs | 2 +- tests/rustdoc/const-generics/add-impl.rs | 2 +- .../const-generics/const-generic-defaults.rs | 2 +- .../const-generics/const-generics-docs.rs | 36 +- tests/rustdoc/const-generics/const-impl.rs | 2 +- .../const-generics/generic_const_exprs.rs | 2 +- tests/rustdoc/const-generics/type-alias.rs | 2 +- tests/rustdoc/const-intrinsic.rs | 6 +- tests/rustdoc/const-value-display.rs | 4 +- tests/rustdoc/decl-trailing-whitespace.rs | 2 +- tests/rustdoc/fn-pointer-arg-name.rs | 2 +- ...ide-complex-unevaluated-const-arguments.rs | 2 +- tests/rustdoc/inline-default-methods.rs | 4 +- tests/rustdoc/inline_cross/dyn_trait.rs | 12 +- tests/rustdoc/inline_cross/impl_trait.rs | 32 +- tests/rustdoc/inline_cross/issue-24183.rs | 4 +- tests/rustdoc/issue-20646.rs | 4 +- tests/rustdoc/issue-20727-2.rs | 12 +- tests/rustdoc/issue-20727-3.rs | 12 +- tests/rustdoc/issue-20727-4.rs | 20 +- tests/rustdoc/issue-20727.rs | 12 +- tests/rustdoc/issue-22038.rs | 8 +- tests/rustdoc/issue-33302.rs | 6 +- tests/rustdoc/issue-85454.rs | 4 +- tests/rustdoc/issue-98697.rs | 4 +- tests/rustdoc/legacy-const-generic.rs | 4 +- tests/rustdoc/lifetime-name.rs | 2 +- tests/rustdoc/macro-higher-kinded-function.rs | 4 +- tests/rustdoc/mut-params.rs | 4 +- tests/rustdoc/normalize-assoc-item.rs | 16 +- tests/rustdoc/pub-method.rs | 2 +- tests/rustdoc/range-arg-pattern.rs | 2 +- tests/rustdoc/reexport-dep-foreign-fn.rs | 2 +- tests/rustdoc/reexports-priv.rs | 48 +- tests/rustdoc/reexports.rs | 24 +- tests/rustdoc/rfc-2632-const-trait-impl.rs | 16 +- tests/rustdoc/safe-intrinsic.rs | 6 +- tests/rustdoc/slice-links.rs | 8 +- tests/rustdoc/struct-arg-pattern.rs | 2 +- tests/rustdoc/test-parens.rs | 2 +- tests/rustdoc/toggle-item-contents.rs | 6 +- tests/rustdoc/trait_alias.rs | 6 +- tests/rustdoc/tuple-struct-fields-doc.rs | 2 +- tests/rustdoc/tuples.rs | 12 +- tests/rustdoc/unit-return.rs | 8 +- tests/rustdoc/where-sized.rs | 4 +- .../rustdoc/where.SWhere_Simd_item-decl.html | 2 +- .../where.SWhere_TraitWhere_item-decl.html | 4 +- tests/rustdoc/where.rs | 6 +- .../whitespace-after-where-clause.enum.html | 4 +- .../whitespace-after-where-clause.enum2.html | 4 +- .../rustdoc/whitespace-after-where-clause.rs | 16 +- .../whitespace-after-where-clause.struct.html | 4 +- ...whitespace-after-where-clause.struct2.html | 4 +- .../whitespace-after-where-clause.trait.html | 4 +- .../whitespace-after-where-clause.trait2.html | 4 +- .../whitespace-after-where-clause.union.html | 4 +- .../whitespace-after-where-clause.union2.html | 4 +- tests/rustdoc/wrapping.rs | 4 +- 74 files changed, 552 insertions(+), 593 deletions(-) diff --git a/src/librustdoc/html/highlight.rs b/src/librustdoc/html/highlight.rs index 8a9e6caf611b..1644d1c5a29a 100644 --- a/src/librustdoc/html/highlight.rs +++ b/src/librustdoc/html/highlight.rs @@ -58,11 +58,11 @@ pub(crate) fn render_example_with_highlighting( write_footer(out, playground_button); } -/// Highlights `src` as a macro, returning the HTML output. -pub(crate) fn render_macro_with_highlighting(src: &str, out: &mut Buffer) { - write_header(out, "macro", None, Tooltip::None); +/// Highlights `src` as an item-decl, returning the HTML output. +pub(crate) fn render_item_decl_with_highlighting(src: &str, out: &mut Buffer) { + write!(out, "