From f03cf9916a1932f47b788a9de9256269cc172fe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20S=C3=A1nchez=20Mu=C3=B1oz?= Date: Tue, 26 May 2020 17:38:22 +0200 Subject: [PATCH 001/142] Add a fast path for `std::thread::panicking`. This is done by adding a global atomic variable (non-TLS) that counts how many threads are panicking. In order to check if the current thread is panicking, this variable is read and, if it is zero, no thread (including the one where `panicking` is being called) is panicking and `panicking` can return `false` immediately without needing to access TLS. If the global counter is not zero, the local counter is accessed from TLS to check if the current thread is panicking. --- src/libstd/panicking.rs | 63 ++++++++++++++++++++++++++++++++--------- src/libstd/rt.rs | 2 +- 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/src/libstd/panicking.rs b/src/libstd/panicking.rs index bf381896a22bb..46196960e718b 100644 --- a/src/libstd/panicking.rs +++ b/src/libstd/panicking.rs @@ -170,7 +170,7 @@ pub fn take_hook() -> Box) + 'static + Sync + Send> { fn default_hook(info: &PanicInfo<'_>) { // If this is a double panic, make sure that we print a backtrace // for this panic. Otherwise only print it if logging is enabled. - let backtrace_env = if update_panic_count(0) >= 2 { + let backtrace_env = if panic_count::get() >= 2 { RustBacktrace::Print(backtrace_rs::PrintFmt::Full) } else { backtrace::rust_backtrace_env() @@ -222,19 +222,56 @@ fn default_hook(info: &PanicInfo<'_>) { #[cfg(not(test))] #[doc(hidden)] #[unstable(feature = "update_panic_count", issue = "none")] -pub fn update_panic_count(amt: isize) -> usize { +pub mod panic_count { use crate::cell::Cell; - thread_local! { static PANIC_COUNT: Cell = Cell::new(0) } + use crate::sync::atomic::{AtomicUsize, Ordering}; + + // Panic count for the current thread. + thread_local! { static LOCAL_PANIC_COUNT: Cell = Cell::new(0) } + + // Sum of panic counts from all threads. The purpose of this is to have + // a fast path in `is_zero` (which is used by `panicking`). Access to + // this variable can be always be done with relaxed ordering because + // it is always guaranteed that, if `GLOBAL_PANIC_COUNT` is zero, + // `LOCAL_PANIC_COUNT` will be zero. + static GLOBAL_PANIC_COUNT: AtomicUsize = AtomicUsize::new(0); + + pub fn increase() -> usize { + GLOBAL_PANIC_COUNT.fetch_add(1, Ordering::Relaxed); + LOCAL_PANIC_COUNT.with(|c| { + let next = c.get() + 1; + c.set(next); + next + }) + } + + pub fn decrease() -> usize { + GLOBAL_PANIC_COUNT.fetch_sub(1, Ordering::Relaxed); + LOCAL_PANIC_COUNT.with(|c| { + let next = c.get() - 1; + c.set(next); + next + }) + } - PANIC_COUNT.with(|c| { - let next = (c.get() as isize + amt) as usize; - c.set(next); - next - }) + pub fn get() -> usize { + LOCAL_PANIC_COUNT.with(|c| c.get()) + } + + pub fn is_zero() -> bool { + if GLOBAL_PANIC_COUNT.load(Ordering::Relaxed) == 0 { + // Fast path: if `GLOBAL_PANIC_COUNT` is zero, all threads + // (including the current one) will have `LOCAL_PANIC_COUNT` + // equal to zero, so TLS access can be avoided. + true + } else { + LOCAL_PANIC_COUNT.with(|c| c.get() == 0) + } + } } #[cfg(test)] -pub use realstd::rt::update_panic_count; +pub use realstd::rt::panic_count; /// Invoke a closure, capturing the cause of an unwinding panic if one occurs. pub unsafe fn r#try R>(f: F) -> Result> { @@ -284,7 +321,7 @@ pub unsafe fn r#try R>(f: F) -> Result> #[cold] unsafe fn cleanup(payload: *mut u8) -> Box { let obj = Box::from_raw(__rust_panic_cleanup(payload)); - update_panic_count(-1); + panic_count::decrease(); obj } @@ -314,7 +351,7 @@ pub unsafe fn r#try R>(f: F) -> Result> /// Determines whether the current thread is unwinding because of panic. pub fn panicking() -> bool { - update_panic_count(0) != 0 + !panic_count::is_zero() } /// The entry point for panicking with a formatted message. @@ -452,7 +489,7 @@ fn rust_panic_with_hook( message: Option<&fmt::Arguments<'_>>, location: &Location<'_>, ) -> ! { - let panics = update_panic_count(1); + let panics = panic_count::increase(); // If this is the third nested call (e.g., panics == 2, this is 0-indexed), // the panic hook probably triggered the last panic, otherwise the @@ -514,7 +551,7 @@ fn rust_panic_with_hook( /// This is the entry point for `resume_unwind`. /// It just forwards the payload to the panic runtime. pub fn rust_panic_without_hook(payload: Box) -> ! { - update_panic_count(1); + panic_count::increase(); struct RewrapBox(Box); diff --git a/src/libstd/rt.rs b/src/libstd/rt.rs index 2426b2dead712..fb825ab16ebd7 100644 --- a/src/libstd/rt.rs +++ b/src/libstd/rt.rs @@ -15,7 +15,7 @@ #![doc(hidden)] // Re-export some of our utilities which are expected by other crates. -pub use crate::panicking::{begin_panic, begin_panic_fmt, update_panic_count}; +pub use crate::panicking::{begin_panic, begin_panic_fmt, panic_count}; // To reduce the generated code of the new `lang_start`, this function is doing // the real work. From e4b7d2c5071d1066159702d8176c6d87d843403e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Mi=C4=85sko?= Date: Tue, 26 May 2020 00:00:00 +0000 Subject: [PATCH 002/142] Omit DW_AT_linkage_name when it is the same as DW_AT_name The DWARF standard suggests that it might be useful to include `DW_AT_linkage_name` when it is *distinct* from the identifier name. --- .../debuginfo/metadata.rs | 12 ++---- src/librustc_codegen_llvm/debuginfo/mod.rs | 6 +-- src/test/codegen/debug-linkage-name.rs | 42 +++++++++++++++++++ 3 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 src/test/codegen/debug-linkage-name.rs diff --git a/src/librustc_codegen_llvm/debuginfo/metadata.rs b/src/librustc_codegen_llvm/debuginfo/metadata.rs index 0cce0b25e5893..484dc597bdbb1 100644 --- a/src/librustc_codegen_llvm/debuginfo/metadata.rs +++ b/src/librustc_codegen_llvm/debuginfo/metadata.rs @@ -29,7 +29,6 @@ use rustc_hir::def::CtorKind; use rustc_hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; use rustc_index::vec::{Idx, IndexVec}; use rustc_middle::ich::NodeIdHashingMode; -use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags; use rustc_middle::mir::interpret::truncate; use rustc_middle::mir::{self, Field, GeneratorLayout}; use rustc_middle::ty::layout::{self, IntegerExt, PrimitiveExt, TyAndLayout}; @@ -2299,9 +2298,7 @@ pub fn create_global_var_metadata(cx: &CodegenCx<'ll, '_>, def_id: DefId, global } let tcx = cx.tcx; - let attrs = tcx.codegen_fn_attrs(def_id); - let no_mangle = attrs.flags.contains(CodegenFnAttrFlags::NO_MANGLE); // We may want to remove the namespace scope if we're in an extern block (see // https://github.com/rust-lang/rust/pull/46457#issuecomment-351750952). let var_scope = get_namespace_for_item(cx, def_id); @@ -2318,14 +2315,11 @@ pub fn create_global_var_metadata(cx: &CodegenCx<'ll, '_>, def_id: DefId, global let variable_type = Instance::mono(cx.tcx, def_id).monomorphic_ty(cx.tcx); let type_metadata = type_metadata(cx, variable_type, span); let var_name = tcx.item_name(def_id).as_str(); - let linkage_name = if no_mangle { - None - } else { - Some(mangled_name_of_instance(cx, Instance::mono(tcx, def_id)).name.as_str()) - }; + let linkage_name: &str = + &mangled_name_of_instance(cx, Instance::mono(tcx, def_id)).name.as_str(); // When empty, linkage_name field is omitted, // which is what we want for no_mangle statics - let linkage_name = linkage_name.as_deref().unwrap_or(""); + let linkage_name = if var_name == linkage_name { "" } else { linkage_name }; let global_align = cx.align_of(variable_type); diff --git a/src/librustc_codegen_llvm/debuginfo/mod.rs b/src/librustc_codegen_llvm/debuginfo/mod.rs index 8c580847ef8fd..b5434298805f3 100644 --- a/src/librustc_codegen_llvm/debuginfo/mod.rs +++ b/src/librustc_codegen_llvm/debuginfo/mod.rs @@ -267,9 +267,9 @@ impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> { let substs = instance.substs.truncate_to(self.tcx(), generics); let template_parameters = get_template_parameters(self, &generics, substs, &mut name); - // Get the linkage_name, which is just the symbol name - let linkage_name = mangled_name_of_instance(self, instance); - let linkage_name = linkage_name.name.as_str(); + let linkage_name: &str = &mangled_name_of_instance(self, instance).name.as_str(); + // Omit the linkage_name if it is the same as subprogram name. + let linkage_name = if &name == linkage_name { "" } else { linkage_name }; // FIXME(eddyb) does this need to be separate from `loc.line` for some reason? let scope_line = loc.line; diff --git a/src/test/codegen/debug-linkage-name.rs b/src/test/codegen/debug-linkage-name.rs new file mode 100644 index 0000000000000..0d7dca3aba344 --- /dev/null +++ b/src/test/codegen/debug-linkage-name.rs @@ -0,0 +1,42 @@ +// Verifies that linkage name is omitted when it is +// the same as variable / function name. +// +// compile-flags: -C no-prepopulate-passes +// compile-flags: -C debuginfo=2 +#![crate_type = "lib"] + +pub mod xyz { + // CHECK: !DIGlobalVariable(name: "A", + // CHECK: linkageName: + // CHECK-SAME: line: 12, + pub static A: u32 = 1; + + // CHECK: !DIGlobalVariable(name: "B", + // CHECK-NOT: linkageName: + // CHECK-SAME: line: 18, + #[no_mangle] + pub static B: u32 = 2; + + // CHECK: !DIGlobalVariable(name: "C", + // CHECK-NOT: linkageName: + // CHECK-SAME: line: 24, + #[export_name = "C"] + pub static C: u32 = 2; + + // CHECK: !DISubprogram(name: "e", + // CHECK: linkageName: + // CHECK-SAME: line: 29, + pub extern fn e() {} + + // CHECK: !DISubprogram(name: "f", + // CHECK-NOT: linkageName: + // CHECK-SAME: line: 35, + #[no_mangle] + pub extern fn f() {} + + // CHECK: !DISubprogram(name: "g", + // CHECK-NOT: linkageName: + // CHECK-SAME: line: 41, + #[export_name = "g"] + pub extern fn g() {} +} From 2031e99d772091854d716df5bdf227f8be9b6397 Mon Sep 17 00:00:00 2001 From: Alexis Bourget Date: Fri, 29 May 2020 03:05:03 +0200 Subject: [PATCH 003/142] Added implementations for TryFrom<{int}> for NonZero{int} --- src/libcore/convert/num.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/libcore/convert/num.rs b/src/libcore/convert/num.rs index 6dd0522f7f610..22a2804678a4c 100644 --- a/src/libcore/convert/num.rs +++ b/src/libcore/convert/num.rs @@ -445,3 +445,40 @@ nzint_impl_from! { NonZeroU16, NonZeroI128, #[stable(feature = "nz_int_conv", si nzint_impl_from! { NonZeroU32, NonZeroI64, #[stable(feature = "nz_int_conv", since = "1.41.0")] } nzint_impl_from! { NonZeroU32, NonZeroI128, #[stable(feature = "nz_int_conv", since = "1.41.0")] } nzint_impl_from! { NonZeroU64, NonZeroI128, #[stable(feature = "nz_int_conv", since = "1.41.0")] } + +macro_rules! nzint_impl_try_from_int { + ($Int: ty, $NonZeroInt: ty, #[$attr:meta], $doc: expr) => { + #[$attr] + #[doc = $doc] + impl TryFrom<$Int> for $NonZeroInt { + type Error = TryFromIntError; + + #[inline] + fn try_from(value: $Int) -> Result { + Self::new(value).ok_or(TryFromIntError(())) + } + } + }; + ($Int: ty, $NonZeroInt: ty, #[$attr:meta]) => { + nzint_impl_try_from_int!($Int, + $NonZeroInt, + #[$attr], + concat!("Attempts to convert `", + stringify!($Int), + "` to `", + stringify!($NonZeroInt), + "`.")); + } +} + +// Int -> Non-zero Int +nzint_impl_try_from_int! { u8, NonZeroU8, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } +nzint_impl_try_from_int! { u16, NonZeroU16, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } +nzint_impl_try_from_int! { u32, NonZeroU32, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } +nzint_impl_try_from_int! { u64, NonZeroU64, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } +nzint_impl_try_from_int! { u128, NonZeroU128, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } +nzint_impl_try_from_int! { i8, NonZeroI8, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } +nzint_impl_try_from_int! { i16, NonZeroI16, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } +nzint_impl_try_from_int! { i32, NonZeroI32, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } +nzint_impl_try_from_int! { i64, NonZeroI64, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } +nzint_impl_try_from_int! { i128, NonZeroI128, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } From d8b51f180a9c6ced4397ce5568fa8ab553a7143e Mon Sep 17 00:00:00 2001 From: Alexis Bourget Date: Fri, 29 May 2020 03:05:25 +0200 Subject: [PATCH 004/142] Added tests for the implementations --- src/libcore/tests/nonzero.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/libcore/tests/nonzero.rs b/src/libcore/tests/nonzero.rs index 0227a66b8633a..2500099853237 100644 --- a/src/libcore/tests/nonzero.rs +++ b/src/libcore/tests/nonzero.rs @@ -1,4 +1,4 @@ -use core::num::{IntErrorKind, NonZeroI32, NonZeroI8, NonZeroU32, NonZeroU8}; +use core::num::{TryFromIntError, IntErrorKind, NonZeroI32, NonZeroI8, NonZeroU32, NonZeroU8}; use core::option::Option::{self, None, Some}; use std::mem::size_of; @@ -176,3 +176,21 @@ fn test_nonzero_bitor_assign() { target |= 0; assert_eq!(target.get(), 0b1011_1111); } + +#[test] +fn test_nonzero_from_int_on_success() { + assert_eq!(NonZeroU8::try_from(5), Ok(NonZeroU8::new(5))); + assert_eq!(NonZeroU32::try_from(5), Ok(NonZeroU32::new(5))); + + assert_eq!(NonZeroI8::try_from(-5), Ok(NonZeroI8::new(-5))); + assert_eq!(NonZeroI32::try_from(-5), Ok(NonZeroI32::new(-5))); +} + +#[test] +fn test_nonzero_from_int_on_err() { + assert_eq!(NonZeroU8::try_from(0), Err(TryFromIntError(()))); + assert_eq!(NonZeroU32::try_from(0), Err(TryFromIntError(()))); + + assert_eq!(NonZeroI8::try_from(0), Err(TryFromIntError(()))); + assert_eq!(NonZeroI32::try_from(0), Err(TryFromIntError(()))); +} From 69b2179afe695d1a93b792cfd7c4197ca63ce658 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Sun, 3 May 2020 20:47:51 +0300 Subject: [PATCH 005/142] Print accessed env vars as special comments into depinfo files --- src/librustc_builtin_macros/env.rs | 18 ++++++++----- src/librustc_builtin_macros/lib.rs | 1 + src/librustc_interface/passes.rs | 35 +++++++++++++++++++++++++ src/librustc_session/parse.rs | 3 +++ src/test/run-make/env-dep-info/Makefile | 8 ++++++ src/test/run-make/env-dep-info/main.rs | 6 +++++ 6 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 src/test/run-make/env-dep-info/Makefile create mode 100644 src/test/run-make/env-dep-info/main.rs diff --git a/src/librustc_builtin_macros/env.rs b/src/librustc_builtin_macros/env.rs index d769ebb1f5520..6c3a1ce0958ec 100644 --- a/src/librustc_builtin_macros/env.rs +++ b/src/librustc_builtin_macros/env.rs @@ -22,8 +22,10 @@ pub fn expand_option_env<'cx>( }; let sp = cx.with_def_site_ctxt(sp); - let e = match env::var(&var.as_str()) { - Err(..) => { + let value = env::var(&var.as_str()).ok().as_deref().map(Symbol::intern); + cx.parse_sess.env_depinfo.borrow_mut().insert((Symbol::intern(&var), value)); + let e = match value { + None => { let lt = cx.lifetime(sp, Ident::new(kw::StaticLifetime, sp)); cx.expr_path(cx.path_all( sp, @@ -37,10 +39,10 @@ pub fn expand_option_env<'cx>( ))], )) } - Ok(s) => cx.expr_call_global( + Some(value) => cx.expr_call_global( sp, cx.std_path(&[sym::option, sym::Option, sym::Some]), - vec![cx.expr_str(sp, Symbol::intern(&s))], + vec![cx.expr_str(sp, value)], ), }; MacEager::expr(e) @@ -78,12 +80,14 @@ pub fn expand_env<'cx>( } let sp = cx.with_def_site_ctxt(sp); - let e = match env::var(&*var.as_str()) { - Err(_) => { + let value = env::var(&*var.as_str()).ok().as_deref().map(Symbol::intern); + cx.parse_sess.env_depinfo.borrow_mut().insert((var, value)); + let e = match value { + None => { cx.span_err(sp, &msg.as_str()); return DummyResult::any(sp); } - Ok(s) => cx.expr_str(sp, Symbol::intern(&s)), + Some(value) => cx.expr_str(sp, value), }; MacEager::expr(e) } diff --git a/src/librustc_builtin_macros/lib.rs b/src/librustc_builtin_macros/lib.rs index a0f82d65618f4..f56d8a372a73e 100644 --- a/src/librustc_builtin_macros/lib.rs +++ b/src/librustc_builtin_macros/lib.rs @@ -5,6 +5,7 @@ #![feature(bool_to_option)] #![feature(crate_visibility_modifier)] #![feature(decl_macro)] +#![feature(inner_deref)] #![feature(nll)] #![feature(or_patterns)] #![feature(proc_macro_internals)] diff --git a/src/librustc_interface/passes.rs b/src/librustc_interface/passes.rs index c06fd91133b5c..5af0ba2afb977 100644 --- a/src/librustc_interface/passes.rs +++ b/src/librustc_interface/passes.rs @@ -540,6 +540,22 @@ fn escape_dep_filename(filename: &FileName) -> String { filename.to_string().replace(" ", "\\ ") } +// Makefile comments only need escaping newlines and `\`. +// The result can be unescaped by anything that can unescape `escape_default` and friends. +fn escape_dep_env(symbol: Symbol) -> String { + let s = symbol.as_str(); + let mut escaped = String::with_capacity(s.len()); + for c in s.chars() { + match c { + '\n' => escaped.push_str(r"\n"), + '\r' => escaped.push_str(r"\r"), + '\\' => escaped.push_str(r"\\"), + _ => escaped.push(c), + } + } + escaped +} + fn write_out_deps( sess: &Session, boxed_resolver: &Steal>>, @@ -592,6 +608,25 @@ fn write_out_deps( for path in files { writeln!(file, "{}:", path)?; } + + // Emit special comments with information about accessed environment variables. + let env_depinfo = sess.parse_sess.env_depinfo.borrow(); + if !env_depinfo.is_empty() { + let mut envs: Vec<_> = env_depinfo + .iter() + .map(|(k, v)| (escape_dep_env(*k), v.map(escape_dep_env))) + .collect(); + envs.sort_unstable(); + writeln!(file)?; + for (k, v) in envs { + write!(file, "# env-dep:{}", k)?; + if let Some(v) = v { + write!(file, "={}", v)?; + } + writeln!(file)?; + } + } + Ok(()) })(); diff --git a/src/librustc_session/parse.rs b/src/librustc_session/parse.rs index 233761dbed7de..aaae5889117ed 100644 --- a/src/librustc_session/parse.rs +++ b/src/librustc_session/parse.rs @@ -135,6 +135,8 @@ pub struct ParseSess { pub symbol_gallery: SymbolGallery, /// The parser has reached `Eof` due to an unclosed brace. Used to silence unnecessary errors. pub reached_eof: Lock, + /// Environment variables accessed during the build and their values when they exist. + pub env_depinfo: Lock)>>, } impl ParseSess { @@ -160,6 +162,7 @@ impl ParseSess { gated_spans: GatedSpans::default(), symbol_gallery: SymbolGallery::default(), reached_eof: Lock::new(false), + env_depinfo: Default::default(), } } diff --git a/src/test/run-make/env-dep-info/Makefile b/src/test/run-make/env-dep-info/Makefile new file mode 100644 index 0000000000000..2be0b4b324b08 --- /dev/null +++ b/src/test/run-make/env-dep-info/Makefile @@ -0,0 +1,8 @@ +-include ../../run-make-fulldeps/tools.mk + +all: + EXISTING_ENV=1 EXISTING_OPT_ENV=1 $(RUSTC) --emit dep-info main.rs + $(CGREP) "# env-dep:EXISTING_ENV=1" < $(TMPDIR)/main.d + $(CGREP) "# env-dep:EXISTING_OPT_ENV=1" < $(TMPDIR)/main.d + $(CGREP) "# env-dep:NONEXISTENT_OPT_ENV" < $(TMPDIR)/main.d + $(CGREP) "# env-dep:ESCAPE\nESCAPE\\" < $(TMPDIR)/main.d diff --git a/src/test/run-make/env-dep-info/main.rs b/src/test/run-make/env-dep-info/main.rs new file mode 100644 index 0000000000000..a25246bac792c --- /dev/null +++ b/src/test/run-make/env-dep-info/main.rs @@ -0,0 +1,6 @@ +fn main() { + env!("EXISTING_ENV"); + option_env!("EXISTING_OPT_ENV"); + option_env!("NONEXISTENT_OPT_ENV"); + option_env!("ESCAPE\nESCAPE\\"); +} From e85df08bdec792f512c1f92dbdb126c49ac57d0c Mon Sep 17 00:00:00 2001 From: "Carol (Nichols || Goulding)" Date: Mon, 1 Jun 2020 22:21:39 -0400 Subject: [PATCH 006/142] Don't move cursor in search box when using arrows to navigate search results --- src/librustdoc/html/static/main.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js index ac5a2f96b26c6..1611c91e559bc 100644 --- a/src/librustdoc/html/static/main.js +++ b/src/librustdoc/html/static/main.js @@ -1396,6 +1396,7 @@ function defocusSearchBar() { addClass(actives[currentTab][0].previousElementSibling, "highlighted"); removeClass(actives[currentTab][0], "highlighted"); + e.preventDefault(); } else if (e.which === 40) { // down if (!actives[currentTab].length) { var results = document.getElementById("results").childNodes; @@ -1409,6 +1410,7 @@ function defocusSearchBar() { addClass(actives[currentTab][0].nextElementSibling, "highlighted"); removeClass(actives[currentTab][0], "highlighted"); } + e.preventDefault(); } else if (e.which === 13) { // return if (actives[currentTab].length) { document.location.href = From 0dcb392e9889ab6976973a2f7140d18a80178202 Mon Sep 17 00:00:00 2001 From: Alexis Bourget Date: Mon, 8 Jun 2020 16:15:39 +0200 Subject: [PATCH 007/142] Added implementations for NonZero(U|I)size --- src/libcore/convert/num.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libcore/convert/num.rs b/src/libcore/convert/num.rs index 22a2804678a4c..dc1de55a9feea 100644 --- a/src/libcore/convert/num.rs +++ b/src/libcore/convert/num.rs @@ -477,8 +477,10 @@ nzint_impl_try_from_int! { u16, NonZeroU16, #[stable(feature = "nzint_try_from_i nzint_impl_try_from_int! { u32, NonZeroU32, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } nzint_impl_try_from_int! { u64, NonZeroU64, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } nzint_impl_try_from_int! { u128, NonZeroU128, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } +nzint_impl_try_from_int! { usize, NonZeroUsize, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } nzint_impl_try_from_int! { i8, NonZeroI8, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } nzint_impl_try_from_int! { i16, NonZeroI16, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } nzint_impl_try_from_int! { i32, NonZeroI32, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } nzint_impl_try_from_int! { i64, NonZeroI64, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } nzint_impl_try_from_int! { i128, NonZeroI128, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } +nzint_impl_try_from_int! { isize, NonZeroIsize, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] } From 2b8e2f836f59db23630a06554b8e1a33f6c502f5 Mon Sep 17 00:00:00 2001 From: Alexis Bourget Date: Mon, 8 Jun 2020 17:48:36 +0200 Subject: [PATCH 008/142] Correctly format the tests and import TryFrom --- src/libcore/tests/nonzero.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libcore/tests/nonzero.rs b/src/libcore/tests/nonzero.rs index 2500099853237..0a48d3d0ca9bc 100644 --- a/src/libcore/tests/nonzero.rs +++ b/src/libcore/tests/nonzero.rs @@ -1,4 +1,5 @@ -use core::num::{TryFromIntError, IntErrorKind, NonZeroI32, NonZeroI8, NonZeroU32, NonZeroU8}; +use core::convert::TryFrom; +use core::num::{IntErrorKind, NonZeroI32, NonZeroI8, NonZeroU32, NonZeroU8, TryFromIntError}; use core::option::Option::{self, None, Some}; use std::mem::size_of; From 6c8d8d6a6055d19dc33cc8b33b082d17583a0e47 Mon Sep 17 00:00:00 2001 From: Alexis Bourget Date: Mon, 8 Jun 2020 19:17:05 +0200 Subject: [PATCH 009/142] Fix test call for error case --- src/libcore/tests/nonzero.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/libcore/tests/nonzero.rs b/src/libcore/tests/nonzero.rs index 0a48d3d0ca9bc..48aec6d718d3d 100644 --- a/src/libcore/tests/nonzero.rs +++ b/src/libcore/tests/nonzero.rs @@ -1,5 +1,5 @@ use core::convert::TryFrom; -use core::num::{IntErrorKind, NonZeroI32, NonZeroI8, NonZeroU32, NonZeroU8, TryFromIntError}; +use core::num::{IntErrorKind, NonZeroI32, NonZeroI8, NonZeroU32, NonZeroU8}; use core::option::Option::{self, None, Some}; use std::mem::size_of; @@ -180,18 +180,18 @@ fn test_nonzero_bitor_assign() { #[test] fn test_nonzero_from_int_on_success() { - assert_eq!(NonZeroU8::try_from(5), Ok(NonZeroU8::new(5))); - assert_eq!(NonZeroU32::try_from(5), Ok(NonZeroU32::new(5))); + assert_eq!(NonZeroU8::try_from(5), Ok(NonZeroU8::new(5).unwrap())); + assert_eq!(NonZeroU32::try_from(5), Ok(NonZeroU32::new(5).unwrap())); - assert_eq!(NonZeroI8::try_from(-5), Ok(NonZeroI8::new(-5))); - assert_eq!(NonZeroI32::try_from(-5), Ok(NonZeroI32::new(-5))); + assert_eq!(NonZeroI8::try_from(-5), Ok(NonZeroI8::new(-5).unwrap())); + assert_eq!(NonZeroI32::try_from(-5), Ok(NonZeroI32::new(-5).unwrap())); } #[test] fn test_nonzero_from_int_on_err() { - assert_eq!(NonZeroU8::try_from(0), Err(TryFromIntError(()))); - assert_eq!(NonZeroU32::try_from(0), Err(TryFromIntError(()))); + assert!(NonZeroU8::try_from(0).is_err()); + assert!(NonZeroU32::try_from(0).is_err()); - assert_eq!(NonZeroI8::try_from(0), Err(TryFromIntError(()))); - assert_eq!(NonZeroI32::try_from(0), Err(TryFromIntError(()))); + assert!(NonZeroI8::try_from(0).is_err()); + assert!(NonZeroI32::try_from(0).is_err()); } From a4b8bb88f210de7fa2d82fe64b48331126eb7462 Mon Sep 17 00:00:00 2001 From: Devin R Date: Wed, 26 Feb 2020 07:40:31 -0500 Subject: [PATCH 010/142] warn on macro_use attr cargo dev update lints use if_chain clean up alot, span_lint_and_sugg find imported macros for sugg --- clippy_lints/src/macro_use.rs | 68 ++++++++++++++++++++++++++----- macro_use_import | Bin 0 -> 2816064 bytes tests/ui/macro_use_import.rs | 12 ++++++ tests/ui/macro_use_import.stderr | 10 +++++ tests/ui/macro_use_import.stdout | 0 5 files changed, 80 insertions(+), 10 deletions(-) create mode 100755 macro_use_import create mode 100644 tests/ui/macro_use_import.rs create mode 100644 tests/ui/macro_use_import.stderr create mode 100644 tests/ui/macro_use_import.stdout diff --git a/clippy_lints/src/macro_use.rs b/clippy_lints/src/macro_use.rs index b1345d0b751ae..cf526409374b8 100644 --- a/clippy_lints/src/macro_use.rs +++ b/clippy_lints/src/macro_use.rs @@ -1,10 +1,11 @@ -use crate::utils::{snippet, span_lint_and_sugg}; +use crate::utils::{snippet, span_lint_and_sugg, in_macro}; use if_chain::if_chain; use rustc_ast::ast; +use rustc_data_structures::fx::FxHashSet; use rustc_errors::Applicability; use rustc_lint::{EarlyContext, EarlyLintPass}; -use rustc_session::{declare_lint_pass, declare_tool_lint}; -use rustc_span::edition::Edition; +use rustc_session::{impl_lint_pass, declare_tool_lint}; +use rustc_span::{edition::Edition, Span}; declare_clippy_lint! { /// **What it does:** Checks for `#[macro_use] use...`. @@ -12,21 +13,27 @@ declare_clippy_lint! { /// **Why is this bad?** Since the Rust 2018 edition you can import /// macro's directly, this is considered idiomatic. /// - /// **Known problems:** This lint does not generate an auto-applicable suggestion. + /// **Known problems:** None. /// /// **Example:** /// ```rust /// #[macro_use] /// use lazy_static; /// ``` - pub MACRO_USE_IMPORTS, + pub MACRO_USE_IMPORT, pedantic, "#[macro_use] is no longer needed" } -declare_lint_pass!(MacroUseImports => [MACRO_USE_IMPORTS]); +#[derive(Default)] +pub struct MacroUseImport { + collected: FxHashSet, +} + +impl_lint_pass!(MacroUseImport => [MACRO_USE_IMPORT]); + +impl EarlyLintPass for MacroUseImport { -impl EarlyLintPass for MacroUseImports { fn check_item(&mut self, ecx: &EarlyContext<'_>, item: &ast::Item) { if_chain! { if ecx.sess.opts.edition == Edition::Edition2018; @@ -36,18 +43,59 @@ impl EarlyLintPass for MacroUseImports { .iter() .find(|attr| attr.ident().map(|s| s.to_string()) == Some("macro_use".to_string())); then { + let import_path = snippet(ecx, use_tree.span, "_"); + let mac_names = find_used_macros(ecx, &import_path); let msg = "`macro_use` attributes are no longer needed in the Rust 2018 edition"; - let help = format!("use {}::", snippet(ecx, use_tree.span, "_")); + let help = format!("use {}::", import_path); span_lint_and_sugg( ecx, - MACRO_USE_IMPORTS, + MACRO_USE_IMPORT, mac_attr.span, msg, - "remove the attribute and import the macro directly, try", + // "remove the attribute and import the macro directly, try", + "", help, Applicability::HasPlaceholders, ); } } } + + fn check_expr(&mut self, ecx: &EarlyContext<'_>, expr: &ast::Expr) { + if in_macro(expr.span) { + let name = snippet(ecx, ecx.sess.source_map().span_until_char(expr.span.source_callsite(), '!'), "_"); + if let Some(callee) = expr.span.source_callee() { + if self.collected.insert(callee.def_site) { + println!("EXPR {:#?}", name); + } + } + } + } + fn check_stmt(&mut self, ecx: &EarlyContext<'_>, stmt: &ast::Stmt) { + if in_macro(stmt.span) { + let name = snippet(ecx, ecx.sess.source_map().span_until_char(stmt.span.source_callsite(), '!'), "_"); + if let Some(callee) = stmt.span.source_callee() { + println!("EXPR {:#?}", name); + } + } + } + fn check_pat(&mut self, ecx: &EarlyContext<'_>, pat: &ast::Pat) { + if in_macro(pat.span) { + let name = snippet(ecx, ecx.sess.source_map().span_until_char(pat.span.source_callsite(), '!'), "_"); + if let Some(callee) = pat.span.source_callee() { + println!("EXPR {:#?}", name); + } + } + } +} + +fn find_used_macros(ecx: &EarlyContext<'_>, path: &str) { + for it in ecx.krate.module.items.iter() { + if in_macro(it.span) { + // println!("{:#?}", it) + } + } + for x in ecx.sess.imported_macro_spans.borrow().iter() { + // println!("{:?}", x); + } } diff --git a/macro_use_import b/macro_use_import new file mode 100755 index 0000000000000000000000000000000000000000..61d3a827f1f77ecf6d8dd69590a42eb2cfb26354 GIT binary patch literal 2816064 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

IRQ1mo=!3=*8==7#byEYE(;=I{>g;H*O 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

*3jox#OK#(BR=~UryTHkU8@f8JSo=G z^9qAtT-g#yGX4Hxp_MbNLtj?Nga8eOBeJP`l7*w#(500@PJjaqvW-|YklwKkN^rZ& ziq|wt7!meakbyg38L5jCaD&JWEjirOjS>~UsUdw3LHBcK&!cJQW2vis#X_w#mF2^L zj)EPv!LpP}m6lBL2fo#lY@LGrwYyMp2*EM}3&1}F^y(FsH)*D6v!@$tvms7+{wgS_ zp%m*2E4{SnYAaw3PMZ2OjBhL+zzNfy>;4d3aZdR(4w0vEG$I_sgPHT7T@b*}!L-O0 zbqg-Wl)R|2h5-@1JDUEr*l7p;cYD!D(D!}oyTYsKhd+mJ;Uh= zLV}y6Vu%BpbQ4h@j(-hSR(krcQ1d&v(j4p5!xj%9pix)An;Ub65gN-$Cp57AsnjBg zGDH?Al(1Vz8~uAXoK@MFG)>z}40oEXxL_EIR2MTEJQ>Yov!Ic$Nf(H_tr_Y^7|JOB@wT-Xg&hy(sKPAD11vL1@$fbROIL(Q^N zk=N)OtOETPyiggy|9lZ753Ge)Cw6q^iOw#~_)DxPU3MI~{^{!5@jy9(k6)K*PY+Yz&wpd6zzbb4v*sz(D-edaRb3-A62yynYyTZJ`7j6tjN7@9< zq^=0I{dm|d-OC}fzzv91)~~~z;8mxbjoWdwOJgG?J@}7;|~MYi0;U?lo-7w`U&Ud?#%Ng}e)TF^iRYkecuk0quDveB?tQ5%96anhj)LIhp1ljWoyfRE%%3 zcSfE`yMGG3W%CiNC9Han! zsm}{q5e2B#Zu(1q!$p8?2-Ni4|BR&lXC2%@e}o%%mX|~Jgd=p4;6q=5UAM;Wz*Tz4 zkvyXv+610T@!3rudiJ|g?+1Rm7{VsBH<8o6@GN5PGc1>l2Fa2-Uq%o_k`=PU00jAg zs@865`U4m-GaJX4Wb(^TZZ#6NIXJyP2rGj*icUR4yZkN+P&8u}mxM(oW;LL%;j9}@ zn;rv^0^?T&BC}Q&0HT-UChKIW2`VBCLkJxjLfhXdGH#Yi&}L zy-QQaIzw1r9!VHD=>k4DNEk^f=sD+jj<68=Gkh2$8oaj@XVr@UwY$Y#3x- zyV_s?GeGAtlr|`x{o$gcuztOC#tcn89Aq^U zq+zn^MtF;HP2w*A+v)ww@)N_TWSz23o$#VY<^;1psie}U|8GAO>~S#+`*OWi+71#K z#H)-avw94ubKp2kP8Vmi>b0tbfh6eYKMufho^dy1zjAk>rvRz*(qo&&Y-nnpG^YOa z`)qKIBU5O3Klqr8)ijQwnd6B;OWdszs zgg>xr(=$Dak8lnhSzO*XAiuIP%NQH&>T0w;3pz&53?RDKW{gn~z)lq(DkqNE9_N(H za8cuaIO1J`1Pvl*7Nc`NjWG_*h8HMFUQOCl-~pC3$K@}=m}&Nfo&fG<1RT-ogrlyV z{~#PFk?bvY?Vn;@`*(uv(D?67=e%(=`f>=@po_HQFo8!XcbxvkqaBg-Aj${`r*R%N z_yOIX%p7FaNZD^QBN8tCJxiCX24G3LqQP2f7s*nSL5s%c-#yY8K$`l`=yPMS@ene1 zbZvv$EEc8dv46z=h3O|_Vdy-u^!fvwpL#74Wa=EY|FL67&?>l7Ay#-bl&tUtpov{6 zLRz%{p398cW1hE>e4-$iBalLg&u&8B;vjoH_vZ_dw^)+-6hXa7TFs4ATTE2xpQ`|nzQ5oAnplyDs98AzUP z5GLd(ddq2EctNTRyaZdn(WzEAi zOkz(q?}jHlGigRkXn#;Rl>Sv?&3e~Lb`9;Nd?O?13_6g4-v*yPcJ>~9CL zY7m02F)#e>S60Uk@yO_EUcM-~EzPvHF#8*wZa_~$r|6k3`*AYO3i;ec6Swi<$ck8D zH}M?YLLHCYT6GQuMzhmv(cJ)abNzlXT)kYD(OXYyd3F%P@lGfk;Bf*Csw7%G<6!_7 zvUqVM0%uY+irxxeaB47IBr(3>z7T_OZDnq0Xn{5Jt>7Ak4XMGO;F?2C)on`)K5vpNeKu7F&86ynD!{4>@cR6a}w2PD~qQX0Es& zBCE?{8>**Am{wYY8@77V zPRb$#&o(tZ;k=!p=-MaCgci`Mez_J{r%;3n?lIc(F$fj1!Dz3?VP;dPACG_Zb8%cT zkfebQw*4TZhRHnQu%-xy9@o3-ED2Z#sMy;W_>2Y_kz=e#&Y7%<)7YB@5{$tQN%#bD zHUJvXpC1K4vfd~=yy_VTrCH-BEyJAfo&_DQH=#Vk`vmxb>2VA#lnIi(){$f}H%d2RgzmK4LAF@P*P?&=$ zbmsO4Rt-b(j5(3RS%2{5E{i{Omj0VgW4(UD+ANpKyj0hGRB)AP!BPL z2nn=y4mKCqS2i$Ed;6Z&C!c8p8qkUHdfW#N#3r{GZ1}IM|L_ht)okOogMRZmVQq1S z;9ib&i7{(7@{J>P5eF@7T>K+liBruXw5xN~zWl0^bNsLc2UtzjwG2E|uGB|`2A=su?H>tkS}$w;HbT%n{=`rmOzo_2Y)fuSZmAE@$U7&f5rN zdL6QGnUK){u^UDQ0e04~sH-3aFJt2$9Du2QE-YxvndiJ8@y`ovnAxlqH2e=>M`PF2 zfvXScX3ibI!945bs3ugMW*bwbCM?KNFdp|5nQU9EN+&&QZSC-6cPBp$aWI1=eH>7A}u?jn&F_2S?-bfZw*>@u$@Q0gfeBVf> zSSNrLzA{c0OZC%55C&_0%^?Q-IYSJc(cp~g(GR23a!#ifQ&_7-C$f;gB9-rpQ?ba zg+EzWzK%2%WMAJR}NaGgL9Zh%7_!hsEECN+~gO>nvAL(^zv zzNW5c*{BS><+tYO*_zwa#6ywbro1inku0;J>96_Od+20j@~)Kg-CTNwwuEIMasjk* zQPRta6IdYmb>w|dFHPAH7|+BXWLw4I%EdV5W%39D-Qc z^Taft5;NLhm`^y6z5{-qc_i-Xt4*dak9Oy$$*$7Y_ku;V+ISaMNAHFp5@lYY8~ng&4vZ8whJ@%bZwAh3{!n=m9v2g*2R)uOK zq;>1CH;BG9RgNl1>codBpud05sR?_Le7jJkxqnMc>dm6(qU(@$JjWUnnz9E}C&o*8 zDf2-vy;O{uXbv1D#0zTRNBH+}`iqV*4acg0zgzYn- zO&qa6n{Eqf3CRwPm$31asL~#=voVKl(!h!*aOY^aRB&!st9oH=7i@$!3HM!h(W`y@p+j@V})Gnjbe0cLgz zXgC(zq*$?-UU(I^yf;j8GV@@w(g@gQbMlheRx7#hLtuiG3xPOfz0LcBRcOh#k!%}D z!d>RaFM+=@@HYs>RLiP&+1r*Se&2XA>m!y{=_Q2Y!u_BMWe^fmuo9v*k0gr)5v+-! zsoABLXir|j`w`H;fiplY=+L5=y`rGCflfVLz3+3vKg>A9sc*7BT5^<4i|kzk*V?dA z>fkgF9!?*z5I$xz3z_L@CnH`MN-xfJ{m?%xFPVC{wru5n#e#O~+#B({WxjdT`#t5f zIWf{sI`jG&^t>znMoffC)se~mBhU~3bb~Vf@pN<;Iwrl=6*Zk*T3iij+E3C)($pU< zW+?{cs2j7#>sd(;sdP|JN4aC`DMuRmgjC;jiN5rr4;L;55iE3J^?1Ya*~oNALjEP= zj>MM(`VA^r3~_neRM>7ZiNO<-M_}b;*T}|$vo|7VB~dNi6xnDHSUFXTfo5c$*ccJ! zq<{qncg_*t!2&ZJ=T8v*AC{ISXr~Wzny+`?08mA2Fk44YgQl95<(YHy9v=orpoQ3lwUNn9r{Nw*sLiqo^+gQd^^WvPqpbCX!o~3_CZ$i zCv7n!x)um>KEhHfC=TbGnc3-zYwj$VtO4Df5~J@}0%J*}I0vTfd^84;?8yXl(`s1d zSV_vEu;#|-xR~RSzEbwr=uX7@^nugygwfA^A7LCgBdj=NqY@4OB!Uf%Al+S9ii0x= zu8-bHx59&$wr@l8^&r4FME*%@9`lgBhR|a0IzH1EyJ9wetey6k>*l?>wGNrf-ZF=u-lYW^@ueLd!Oa8); zTMy|6(6||Ih#@Ra-2d&McY~PK+3S7;YR5@}KKd|H0pKJuLqp&A;xJQ`1Z!p76>{+8 z8em25*For-g|ut%DHdl8qtt2QkP#Utw|#;OmpX^<2z?440^$_VE}1Qo#4Vgw?@)A$nU`UJ{i={CvT`^2b$5HbgMIO@HkfA(2-7n z1Nw9n9MZbTh3P*PnKk8R&bcP?0`Q#x5I0+2jl4mezTSLqZ(mxfvukX=wi*t@TY5na z=`T&)y6iz>_l`yeD~SOyH+t!+Y+9;-=3NI!UejyBdY}F__zysJ9w7@$OZ5IRA}E`v zjP)S(_i@onNGK+*AfVmmYXH)F8J%+X#hG`w+Vj$t0hOV7;QsVutiLeIJ*ULL(fWb7 zXganV5RW&Nbtbmm@qP5ndZc|m1^krn^~`d)@>RVLY2NGqUW zv-Ggc0wxgyys(Ul$MYL&HFNOx)}@s0GG5EM@+qqIE;N)u)U z9D+vUP1zHNP-z*=2`2p!y?tX4HKdtEBAY6mewHvLk#(9^$Sg{#=W^^P7tmWWR8y%N zZA^**ZIR)YrkJa-Sr{x5(ds3{c1@aysMu&JmH}|eq)<(aFp|Z;bM9yQ= z%`#!G^0YB4AhRNl#${NV#x7y-u{jg)!ESuU^eY-6uZvm6r6{1^Rhs!7M_VyOwAX>Q zWe~Ju^7#ndSc(9kwsoF@J7ARr9l^8~zrxcp&QDFwXDYyE-wy)!@gIN( z?nBUBHywba>rqMwx^a^XpmULcP;=*3vGm_x4RB@^uoJt+^}c<})r10Q zO5}Ki*^38j4GN0?8r?KJh+L55uP(&en)33ohK;&<>}r{%@_Ba&=V`KrlH1(Zn0=tn z^v6}MO-ee8LW~EpjNOT}3jrMnoXWupS!3gD>KVP5M`V2FK1l?dGDp51=S%dT z0yloS3ne!=KWEq}`g%WO-h_X%=53f-Hq}V5VQLBAux~$UqkS7Ihu`tEmv5`_OnZ`O zK%4(af-TJ3(%cnYF57vC%r>T=v>w?!2r3RFKkH_!2}{RC#DA>}X{Q(5v|?>ca_01b z^DzXl-Y`BR0w3w-^OZI9+{sF`ddiQ{ll%M_+w z_ftQ)$ z*+5uNK;_^#R>g+D2thtJ9W`}^+8WDfVi`=|mKB;I*-sI2eK8DkgN{U54<6z)w$2yX zWU~f7OjX1qUh^Xto@g}8R+2$>PWsDcob;s7i!kz@8cmt5v2!ZWy5pvVB}jb{rGP%t z#!z$FMEYOY$~Xcqw+wQG7|cF`n8hNTxJ~h_OHa0ktP$&qbn*OeB`hd*rvBlPvXgB+3CTeo{X`ci7-fZDFqXd zL-E*dWSiuS2K3NmBiVGV>ZZ-1$bzU=f%9%og4DeUq(`vOXF9Rs2n=C11!2c_pS7r+ zDMDMGL+}06GdP(+ zngW}HUYz)s8aKsAs#QI6oOomncXcS~;S9~R0~{@&aoTBjDG6EuRW>rokfmfAow8Xf zY3~(7lY%xS_UgmflG*uQ8v5lF&GhZVblK$ zxT#P+&OCtd4j{=CEIq`C@~|{ZjN$T<`rmYEDWDsG4_V8_X&sO=D%}mxEQ5D;Epf`~ z^7gNfpgGez7Uky6KajqaVW3hd*SsNhzq7TO`$62tNa!LYiwAL_T@GS?8AQw#q$@;5vJAuFmgq;ETtG5neIKHGH_Eu6iSMk z@+R0-41?c_QC$18L8k=~TM(W2$4K~%!mB;$Rv{;MV%>)@td|bd6cgbod|`CeVbVsq zBr@NN0pH{daq`=ClLzk|-_mP88nrx#b@xOXotZLC0z zO%Sm1@gWq4M_wzpWSJqgQ8IHnU>yz*P7P;qe-*SFwsU&#vyED*SS?|c;>r5n z=sk!DDc8W|m^iS%js_DTb%|1OctD>|NH09)A=xOJf^gJ^3b)=?<8(+0u-#T$YYCD% zhqMPWRIv5Pl-`7XE@ysytieoa7Q#dAkycC`1qvKG)uaFpJs%%QBN98G(uKFOdayCF zH+wsxS0@y5r#*~hxsViRLGn@th9 zLVn^3r;M~Jw^XjCsf8k~FX66HI{7OwLi8uSU-ojP17iPCQp`;}4>Yd=4_i@}$CDDc zT|Qq;W~RSBtBAcpH)k3(=ByYA_7l%hHA)p>iK^p_-@Ivmo&)N%b(!*BLRRtM zq}!fP`sqY&JcEitX|;;buCRrUG2&&C)Ea8#UQ}Bu7F}sQv(HJXGS+e3H%$W2X##xO zjfm39L*F2zbl9e&L^u#~(~=lb4tkoS3VqZGmT$(i8T-zne`O#h$G0fOApI102dPLck=fxKK1^8T|W$3N^0R5dQ+ynE0(ZmJn9 zzE6VSIgO9qhuEC}teMS#1kR{gX5fIXdK+|ZCa{V{nLLV+Bir>kPkW4*83a>&qwGYy zkW0(F8%K78HMT+lT&DWUD5MOUlIyL6D*{^iv0m9Ok*St+=-mh zeR(9k`pCDf7Bq4ovL+aFYCWOA$cC1HDe}u+Q<7>GU)$Rk!zI`$B)H@$%%}~W1@ypY zuz{@hH9QF&CJXe8{Gw0cEjg!Ix4(r7zpzV>+-3@kJ<3q zs$+!Ty$SZJ*~%e`>@N<1#%BH3L9ToooBFx*56mYOTFNO*u+oJ-m{vJ@lul}DQMUWF z;Z!h4A`VzZRU!!9M#bl8Gc@!$O;}o$?|_ay&f5IU7O;;4^b~8j+R-9>59nvG(jlTd zuCLXTz?h~Ce57HAG_cSx8O3huy$#0re64F4>O!ELAuLG3O^r7maa(U=t4856)CbFH zcT^Uc1M8wxd$u^U zAf7zwX$9?qdX&r_Qri2aNCl^#jzmI{MkQ@y2kV9cx)56Gu4Q4@a^ysSqdnCTB%fBL z(HM^Dz<-XUsLo0wi-|-1X}ha-Y1Dc-_Jg50PT-A&djARp5yAF^ohpU&Wzo+yGDn`V zLZmczljzE3An@1)1F{R9S&cN#%=!CN;gFkMTcO4No_4xFSCd$!y&YOMlM_0i?{7MS zm~7_qJ&`F#t1Er3$M+nV^E(z|R9gO23EEjgHGSrITmgkh#4#OsZhl^=Qv^=W!?9k| z+gUDh?Xo{1rJ{r>W3!-xF4A_+L5y~=`-acZ#yEHEj^6R}zM2CF zm-sWTVgK|=nSjklaeuw={wCJ8u1-F zlsN>X@X%qXl4aG=L$hDB`z8HY-{|}@E#;$(1-|Z*VT26Yiw;5@-n2!tXg&~pQYy5Q z!|roVKBQqe#SzGSjqVa$Z0<=%KMPFDs>gZV^m;~te!c@VYSIr`&_GRjh^qL{rp}!K;BDc_;0M-qPMO@^ zzIwMQIsW7*J1%8)$7k&6a?2Pg71+&%9*IOGyGhJSdEz194+eJRD4e!%pC!53^JXu~ zO>>F%WV4M?2=dl9KxHe}I+5zrWkQPwnAdE8-WPtkt{R8({ zp+Bck3I`ov1qa4xUEH#HiXD$hK)fMpPL-E)Z8$5CxZ4w!Vz^~5wDWZA)SU;W^FUl( zB^yVH4r!6NaZb1))fj6nZ*EY2nK5~Y ze0riF2pIPhEc%#8qr;?6MWo`6vQSIeD$SclSbnIh$=ve$7^eHL0bPokMK(1W1Cl^M zCb_)U)VWGxioJnIQ@mgr*WQEPjI(xV!oQmCd6&lLu2YLNy;K|+u+9F>5=9~=HJ}^+ z>({96D|fjGb+>0P?t&`~>GV%<3O@BYmk7xBU#1gE-7qp%)|Wie+(-qaIUk7an}FhPhc)=3Hew&W z#ZFTm(5-_q+w9WJY*Q89GIODh8G+NEOj>F)mL6?GV=CR@O1cAHI;Olr4%~%hYxpE$ zCQT)wNF{$6Z2kyU=wxM34jmS{LfUbyLp#-QMQ)O*rOAwIFEixf9?q->CQ zU?^2a?dwh_XOBZiFyjh_cwIF-XU!_8ih)g;vCDpfxOb zaz#>3u~6ijq~_I&j^F=4No)O~`L#{{?|j$suHY)F8B{}HKlysr}RjzF?zYOEgF4tixQ6BM7-LRXa*q_7nJ z+PHEm=?4-yV<7S&x6b}_=|xs6FqNsf-B_oGT)-u^IIL}YvNECDL!MdNbx4^ZLz(9zR48sxO(S#l=%aW{Q^B)>BC^`kj4M}5fWZSbp2j{pS`a$(c4 z+W*}RIeSMoSXAY|zz;5!oU>p8Ij{?u!Y5{qbDVTFY%skDf1^v5u{Fl1p3r0k1e|0! z(*>ukIeCP?m2m<;TKz@YBu;Xhu}OO-oktnPBE?=6tO*LcL0EUV$sDX1xLA!SCfv2& zbKqc1Yz@Z{xD=e-`LTYjdEJ~;w2%SmY+HqU6oQ9rIyX-JZsC*`f6PSrFQ<)xNJIzY zkw_R6_lA=#Aj?Uue|`eol+9?G>kVsp6v56naIpdHiAvd!r2DGCa?1-)f#BQ-QDW4X zZUCp%s@|TNQ0h`qv1#677#8U?B=PX_xkrisV~)NVd`Gq3>riHz&yigPpRqKfVS*?j z81Pz-+yIch{ktwR36Lb+B}yF-IB%rx|hBq&(5MIeij zcUuN~k~**$8no2O(&_m_0NShsNJ96L1fy<;rH>7i#mJLVg5m~WcxLuC{|vEk)@FZB z73UHs>M%f@k^cs-&F=aSIr)M^7ilx_X*jd+esEB)U3FqMAlAZ8U!U08+aHD_SAG>N zqBcPd-4Z*as5t6@I3-<Butt z4|lMp;ED9pg9b=3St0{qZ~G|lBWwY=NN2!#C65*3TYtSEWGV`0-cj;!7W);uBw z1KFru+~_V;^EK&<3>R(IatIYqv^7Lw6Ybw*w+&(ewYKq4O}5j9TBRZ#tn^4H&Ff0M zro&dszCIMuGn&1x!GFD&hs$l11;Yr~>CDS<2%Q5LIBEJ40HbHZlr9kn zWAz*=9&j$kqV3U$3b{+(>e1HBn#mZh9KGt z%210>93554IDy${?=lUYv~pL&g6E5L86^EU(O(K%%9%|^(DZWm8oCnIU9NR7{g-q!(G@|fa-I(I^0 z73bk|xX#L%EZ=jaOgbq=7TW&i$mCbegMqXeKsG0B&)?5+Ke@12ZQ4mJ*wJdpVJQxe z@zNIyx3=kDL5zOOUMtz<_S6wR%SL`(F^BgIyW27 zLC9d=1~$PAYz_b`t*6d5k-K><;zoNy#%Uc+nP&t&dhD8n+c_}DH{sP%7?5w>hNE`T z8Km8R4M0=6P@3#Hvt=O9Dg}2ssEM-* zIZo<8dF%7abxm?NwajS6igEhmcSg}6VWmu8JJmOfaYA7@$g(SQN1<h*;Q&i#NA=^5#vbadH$v(Fr99oeG2Ez))c} zy%O4!%@s5-9`r6YS1ilZBqSSHk}uXndbvBn_}dNi#5g7<$f*swvH;&4CzN?TBad1@ zw>|1P{8ag06S=vwm_95Q?|o~DEqwq{j)ZV zLA}Y$vo9e+!21$ zYX5|cpjZeOC+xBu3_vGBmK)fuC7`Dl$}F0##Z|y6F(?@;&=p9j$wZ!$(GHg&3@`S} zW0G7Xj*Y@-W1$G)W)r3)c%|2@w-u{Wk?G^$Ux{kS$aw;w3D=oMav;Hw^j2d^H#g*Z z@WDJGy$xQ*D)C=q7qOTsxWnBeeCw>o;Jcsi-tW*o=-#uIp*Tk66M&HApAXVQ4M6fNZl}lCH5v-yq$pWd) zA_C^&&<%fdn7qINZOJJU5vXYkbig}_NrS7Qz$xY+J>DN7U_Ph2p!~$Fc}sF82I1Do zua?ac!5PNEacX*sTg0SSYi+(eB@}q6MQ9VT@_i2GIU`c8X6Tjk1NaX#9@$XnOklTy zv1OlzrhKhilh&y-Xw5*h+GfZ4%Gg+M8bvh%w5c3Y{vlX1|a0Kv9ky&(;S$mNm~uQfoeC zC~uSR$%QEPEo8NIFIGEcwr`*~DWC(8Ob6zOauFeaJr$H)M7Ajgf@PI*2?xzfN`>GP z)KX&*R%SzJ1(0_EYCmxmd=tC&pK+{{zdcfIRxVX~OB$i-QxUUjQYM&SGg=IdxFHVK z6WP?zGkr0j`*sWjAAy^O4}XrUq0=$Y<-k4?_V(4_Pt6fP4=vU-(88SUIC60|o$JU% z$8a~iGoS*Dq893NVQ0R(#~5SQoo|mxj+p`zFB;H!BZmP=PMbbw)=c_0ik7>4W1B*i zZkH)%5EtXqTdgspvx0(1T?hlALy+~2jR2DLZR(Divo+}8$;S*@29Oxu*mFTW?XRY^ zNHxqE_=j_RAK-}@OuQcU?q;R{vmh}KjWLZ5=4)iPjD-L0G*I{8OJdsjVu9u z@)juUQ2i2M$hHX>-(!L)zH8LgJO`F&OR|w$e>k}yRr(*Iz5{v&F}JU0L@%!9go?OaUqmuVX*4*#;Rohj%^c&m zG*NJaJx=Crs(2Z+y|Ip>hdn$!K)i+l`uyuRu%I4P=AVPUeLk{zIFWu)_qk z05|*wysDR1L1{~64oc(c;xZHAl~v>DE`d@GuV*P9_B{nG8&XK1XaKmAV!7OxTREBT zhaaSN=MH(iOi?vEc#qA`&|& zCGC(6kp2nA8w_)ZB#;;UDAoZmbxml7HcO&gv!UJzO8SJ&MBK|#h{IX9`q4MD`5qZcSgv_Q_v(zcC(jwu3@#!;|;t=Kp)(11P8w-^sr_S z37d9^$lEB}qIEe0Ka|MO+x<@?61Wh$#`EB$g2oF0eQGbwDP^yKowZCDQ@sUB)qUVg z0KlX(;cLW7Wiwg1(*-MEF;2h4+~r9()44?U{K|oaZfxRF<5^AVx@sJB`}Gv4)~b)1k1j0;Y>pe}*-4&$wg>;vCt;kvq<3MW}PK+9vm zudy%_zb)wzipmuzc*KarE^+FB2H`k-fpGCnPjKWP0`*)#hf9QIxEhM_2Gr33HnC(` z>&1_HP?0+1fSxc;Lx>wk+J|TYifLrb5ph!!kckqUUuSVSTWM&c14c0FtxuUu2Olhk zR!{eLDl$IrJFO!(WB!7Jb9>L8Gb^`n+Pr;c(M?Jc8=GZ^Vci2uJWyK0raEb2rgy<6 zFhb|pSX)5E;{@8mZ%(8`oz6rlwxt4mmrLqHT`8OHV|hziC(~>mixjIt^Aw?Y6G_(r_&&^NOmg`%#2Kmak)JM5oqcdw*4R*o9Y&hZ9!C+;K zdU^RufQkesxgeirr#3$GjYiMa9~ToB&R}}cI-EDivI|jIjjk6(UMd#1KMp3Oxiw!!A z9MtKEkHE(h&lo?8Kf>b7V=`lbBL<{CQ6?&RLsW5u2x%T~+1ax(SAxbX= zLNWu|CMilaD7G_XDQoud&VTxSnMnK}Ul1(`JJH0%t%aJTfxj~Z5Y~my4yOgv_L-II zn0?4Bx&dMW&NwGLV7yK{JOF;xcQZGsk0x-EjsBGs8t6_1v>Ea$MQ7A!!6g3P)q?q1 zQs&D(K=$PE{DFm{u&RKLyAj%_dZhw0TP|E3(io%|vu-XcUl0G5*zEmv#KXZ9S}(Cu ztedv@`v_3!{bwCan{%KGb5w&@%6trUmi$;lxbGRk)~6n~zhKdqhlDb{wX&Ca$&{#1 zI49rp`$!qYZh-wqOxt(aWE~QvnCq?5VuV06N$vx+B8n1S6#EpymwI=gDSzI~y2ZF^ zI#i-|tHqW<%1BiH%5-u{aDS z9&Dc)h)+y34j{eDvT!5QSwkv7=a)d(C}by1T7#sZM;~42?JKTbOYefMFS}&vNRKs56bg@}ZZNo2zWo3p2eAX3*~V1aElXOHs@XAM z)0Pl^(!2>wzgp5gdsnS5Xap|jhe{78g@`n5ncWjDUU(`p*`aDz0R?3wXOrhy` zjU$cCz^g&p$wl+ulQH1L=DO6m#x@P=)H=PwKtUMzqhu>}0qkgdFB_8?w1Z9(af0bDVRYUU5-Qr%ybfi`fw!&?f^|?o1&;8pV>%>Neh77A` zKT03QnwRyo&C((JvNT$u6C=O<&O$9;TuN>5lQ%Xj_SxKN<5bIwaobI$CH6;aeKA%K zd!|4He!Rb4m(&g%A{=V{=#VWOW^zolWGhRh0v+aKFyAr}xx0XX!)2`Kl2_aGP$<2G zz*SDty=>Rv$a%zhEFY@a=wBw)BFWKVKIguHRtNZk@n2ajPWIa|UC4>wq@41#ns zN2nT*h z9-I2sHZmZN7e}`@AaK195fUq_2!{!c&}RBzH}+*oG9m+=UBPZRdP<}tz8wZL!=^Tk z2-wi5A1T3Jha)$12#IDy_^5Lg-2twrwhZwC)`crRHW&07UJgguuy9T~(p&I*R3xu* zAu`INUQOgtX3=r)Ac~68W3ZQ*2sAuxD!Aa49{;1_6dapm;Ug^-yUoE4nL_H9b%RLP zXhO6GUEOr>gLoyPVNeef*x(mX+Al6GFO@N=J%0|2Q%8Ou`+_ENC4*)MN8j2&hw*L9 z#I4uRagcV{g$pp75J);BsR)OmGmD?xZgcioEA-k@^t9s3ejz=$X*FVlfKFm6&S|@w zm|qu_XP3H)SaH-ob!3``9XLROZ*jlWxRlJ{tXxFdV;CBtr81S^Z^E7=Gc=m;l?Q%? z^kXnM?({^1j;;}lc%q-^S=>#cq1z1I8S2R?vz(~1=VK9;x5z!i9<=qJ8irsd*SNgw ztKeR&-v1NmSVDj;mnIA8o~Qcr=8Udx{~xGtfy?Q)8zX6=p;xnC03dKc8bldd-JnzS zh>p46%f4%9&)&Vz_&x*`FJ$o8lxf!_b&|+g^O)zB-nb!_M92g@0n1$ws*UOqZ-Z(( zx&NLq|Hce+vq)MC!b)!eYDENALYPDWB-l~{Oqi!I((5 z+YG_lIV>1(%*stuy6xzhC@Brhbil5KVNed*~^^kW)>G1 zX3K@0M3QQoKKr9}iI_FI3hFsic_VdEvVj{%_e)5?;{v#fh}SZR^lOk!4S9BekS$S8 zU;prsS5TS6MJSkoT5Zd0MApI!BcS*GNbsAv>Vf`r;nxhzXDKrit|!kwhipTIA{amq zK_rYh0?0_}{%QCF__~bjWsKh4e+KSXh;8PX(#CsfTT3hJ+CcYMPHpxsraMdqbnZ8; zmq@OQHu;6~nze8DwXxaj0`Qs$Y9O4qbvI&4y~VSzs+U(Im^3a55gF1Ov5!X%(B+j- zF81Y@hLF~e3h9#@#AUE?3=xwIzxnELxb$_F>rk=n8leg}(OrAIQ6)gQpz&kGW!&U- z72S-7IsHjd9Y`|@_iTK5oN@sk22WXYq;*3x=-gAlv#(&nxp4f+5IU_Hm&Tlz+(c%5 zAkDEn#4;g@NzE@65rqGpftbJSp*10|o^RnPK$NVXwh6E8X@f2^(u^3=yr`>BY6@oI z%{{^W+3-gyARn$6q~Wgv&ZFOUQ#k@|Wrc~@4-5mVe7SO#nMMY~kVCXcOqpher2_2G zTOXvQA$t%&3>HGHM@j?G!b6Ni9ECg3VMChaa-f(1ho>ucRkTmPK5 z(kaNGJEjNWn;Zukr?MHTQ!z{9pVLfNY1Van(p{2;Ss!oovvQ0hnyRm0=Gd zK)l#*;nNmp8#3FL#u_kjuWn`iAdzWh!P%H) zz0;^9xhfo8@ipLFU`?CUQJA9%h*0<5=6yA+80# z5AX1C_6q*jXKQ7P2dZ7PoT#v1HdE_h9hzc<0!J}$Db;0lB*lR` zWlnH{SW!;A5#`%<_XwXd?j@W;zhX(uM`c);QZars=^;}|(zkx%Bn0O5==RHo6EbwH zqVIrVG7PiH*SQ0DIQUB-v)x3PD$OcF3lD946qB9}5JMnf-g$v!=gT4K_b#+Uqk;+| zN##MyRwF=Qe9{|kRdV%JaLiI5;@H_HZFA%NoAkAdxPSybeV9KYlZHGiZ=ipom%^X` zApw~eE3nYB4|@}pPC7?nPeR(+1aElPV>Ua9aO)dd|4wtD&S755tC%8`Dj`WXuBu35 z)H_H{F4nh-((Haydiy z-kBMVVs%Q!anIX?Z~Sx=%?4qEzO6!QPaT1>c*P2 zwuN=}z8%>Ikn0x0r=1BYT?^^ms5ny*4l7XrgI__7ZxGlr%qC43as3i@ zselx)Nt|XL?&DHY%K>ri?Ug!W8co}%4#0yNPeN7(t*Yevz{en%1lc4jC>aQ&MkUwH zNZ@&Rr@}SWb;d!5BObj z93-|0MNyH(zYBNL0nni{_ix|hiEGnEg>L1}jN1 z#*W6`ri)aS^Q9lJu(SYZPn1qWf^T%qnN}V-B0S!S6kwyT1#g1~Ty=ANZXn z#AkIqV*4Mrb`q`Nntsu`ACNur5MA1gFN&RanSsF_sjTL)n(N;1xO;K0Uo&p!vijQ(X+^*=g)37`!Q*4))IdxCF zZ#+l$Yr%D_v`M4|VM305>_}uPsIy~tU%5~%mrRn!`BpdGT}DcBU=LfW{_1Nu?h%E@ zUj3!v7jp)s(gYle{^Z!(aDcAq)SkNyraV?lT=n`*pwGsGSQQEOm1rAeV`4=IEcPZY z^suX#MX|o_Uh1kJ|3Bot34C2u)&9R)=1BwvK~yR#f);2Clv>L5?U2$!X-d;l5aE(0 zH*IVta+3}y3M$Hrf}nzef}p;yDB^(P01AThfS|}EDuaTEiZ6no@T&jsT6^zv_Br>Q zo1_im`}_O(NZZ_-Gwi+g8lLs6wMgP*^ZMbTbLd_|^?0<1=3JQSC_8i$QOoe=`kA&} zr*)GP&PX{F*Jzeq?GIEoz*|_W%!wIEuY0d-u~%kK+kE?lA7>Lu;n?%8ZVXQL*8EnD zhCGw<+NT&2J{C0Ex^#PcV4c;y-HtRJ5q_B>?9tc|<3 zZHN+sl7tBOkXAzucG7lVn|aGEJB`?UBZx~T#4djV{NR012IfDwUo9t79dGa(c@1d{v~7m79#V2tLoV7Y4?7BZ&)exT`(`Lx@n4U8 zrIIVA?oz?;!?M^bzh3qPNjXzYwUd{Wq~`4n--%*PynDaIMy;eSQF$`FC*S)T{q_6l>aEoD(;E{@d5!`4IYAe5HpgX@Uf>Eu0v-SDWbiC}&W7vom6Se;YPo6WVVyNR|WLp%dcFFeBwD-rpMO=e2D3uXn8q=;b z<9cbyI(jRVLFXd?_b*p#GoUqrR$9nDOXPg6_7E%-^v1gcK$BzkGkUXV5!8D5#IO7! z7$qp8(YVqd4Wu;i!W|1GU(cScM|oFE{R%hJKibkVwuyJCcz&yF z2|YONM}n@(_B(w0jXsUsB;NRZOp=dSOY+>$lKMzzlmahHclnNbe0OPW0R8g|UYvmd z_TqU}dnB$=vFoUxROF|O2npk5y1R5dUf(MCI2V07PF3%t<OBr97{ySild;)QeRlEuUvxrdGr zZD@44^8ZS*y?iekRg*@+V@Rn#11b2iK5a%2|9qNdDXMFyR`D!*m4DYMC*Nr>RTYg% zigMqd<62QValp7*nnJKlD2bNZh2q5y{ooS9*unDw+LP|YRbf?$f@)j>Hi4qhmS+K8th)R zdTfyFxO1*XABAOin*bj442{9iRm~7sLnZaQ-3AqkL9t0l*Da3{V4FS+JJu7eHLhyl*J)9_JosBmtu(vU55?zt02j@z z4Ql#M?z)w1VK=iYX`i_3!I?yh)q;KMClG?H7zhBa)~6XMxfW8@IP!a^Rsz5Gp>akE zUC&9);g{N?*WIp=!kU`pIlke-HrY=N6wy%)wA6CPPVWC5h}Lg~im9-v9CH3Rbjic> z^j-4a@Jp)UbceNmXtMPeXW;3z78x3F$9!lU3fR}wUw6t|FPmTxb}yYbWy`Cn@}?E3 zFXEebj>AM#W#{uB3Sd~D;T5UUS< zg|FR=g3*wX#S6Ra?=(NBQO9eElqp5^gf!nLYx#^i=4T^#N#Qez3Q`?+eLH1?gd z@eM&Cbg<`o8wIUp%8%2cKHpXTY+x3f24PYV7Yd_DnB2EPptoTsF(>Jau_miz`^ zr?(%eVJ@C>A+1WuEnul1Ut(rXI8jfP&F%@9R&FU~cPO#UV|v>vxzgHBYW}*Jcafg0 z21i2nS`%`GdI(~PC}DThHe(Jgqz2kDDI3Bc<3kqE?#xH02On1m^E9(bjqw2RGbofL zp)|`dY9FT}uY=!=5>n;lHNqxG3grtJwsPcK0LFTX^EZwxDLHAHaq{mHIW7T1OjTU5 zA6fpJ@+Af|RjZ51+N@vQj?JfHTz(BdEk2b0X^CAHG;vE})__jk8)zj=f7 z%2H6VB5Mc|a;{mr%GnfnSYv;s5GU*q=OcOt469s0xf79Y-!MpQO#PU*aA`&UbNBqS z*&UI~ERes5j$p$B3mB$Xk(bj=hdd}x@1`;y!MIqT{HW?!FV$M|CqTGRspd|sv_Orv zw~$?44o;;CM28&8VM+bqK$m=Kd`q9EvaHVuW2fu2ldA{1;~d3=fh(ZB1xX>qlH&^m zrY1jwCizQd(lqbn?0oM+1Y)u!u_Ic-*Uty5TzXt}?xNO~V_W9R{m&`fkHldOiI8q4 zxi0;INH9inwNh$V_R87n-fv1n*b>P)F|jN75^fDgVOJvkhFs|{v^gp-!x_J&GBDtK z$dnwYmo*%n2Jwt6ifZebGmZTMBFuuU?CqW^pLBnrdp*&8*<7r`xXgPGq%dd}s)>x4 z<6Ds>czlsEwkIom4-ftneg^ku#Vd?wk}j&Rr_emDoO8%#^vtF+!o?SAw*}CS8jbam zF#|DS&~(VBTpJ4Sf374gWRK`c3&Do!PIxfdTh6Tl3oRP>s&xR7tUg9DhYzpQ4nmEJ zG%eIE5vA8=gA`l0M8I2zhX%q}oW`fT8>gro8H)F-soiK0qH?AJW6??ZGUeNJ>8rLW zJf4L+OT*z3I4PGhYh1!$#bh4tPwN_a-?WLc4%SxEC+o8V**tDwf^@;s){4$~bh5pDL>q+$$@C{kzb9GorgTcGze;VN^P(o zvPEp>fSHnUS<1d{%6iiSgcHXaMbF)T*316XKY~by@D_cnEIw< z{-Vp8B&j(H{??|>3zTi~^&5<-Q^1ARq^S=P#M!@Shz9<;-$buU?iII-f`Vav!<2P9@8s_VZx-9v`?OZ`Udq8|itlxM8`m{(*QB8@B&%f20%uzn6;OW)dxT*9eVt^t!C6vdMXw0j9N>*Vw+ z;>@}NO?GA?;$F_EyU#0BiMuaWjZ7HYsdILsWpPPyjizS`1iIW~Ih!`jn!YKyu5 z4isgEsug?fu_X)OCC~(f0#y$U%_f?9aOFoj6~m~R8+rHhE%Wr$c@r6w7 zQqa%@wnAB{z5X$B%!XoTGx6E|U(oQ3j^s2YBb}SMpviAXUoUV$ldqNDBy~)a@1~cm z$o6MVaA+@(g&ylGerBpp0bq6dzVrosxxQicZ$nizg={(2FtKs#oepEyXa7OAE+#9^_iY&@lk+`-WPlCuyhL9N4XCueYKn3*6Z4A9mI< z`c8dA@5=rjk_@0q_SeM>M+$pw*y=F~QO=0S?#$23AtElMDK-dl#xZ&C!JU#Kf8H+9 z#G7S$N#Z3jwDfOLX}5Pd9j7swUN4t7u2A981$QR*4(|MnQa*V<728qe-e2Gl;{J77 z`JfQ^6_;YB(vH!E*eI2kG`qAK3)>W!tp5vOtmP9HJIF+cnpt#x%sR_o_zhbj*;PyE zyR=PxHR-BqB3tQUo@^2JiOel^7FW|QO%%;oAE+YNkur$=T#!9WW4f9U?Z#4(d+()K z2+Q=EQMJq*w-Dv^2j!*TTRKe-+xeo!j2^Lsm7OpW{TF>8QjwEL?=(1g2C2FoiJUgS zMXSGFyxGq_g&??WJF*+5(%q&zj#zM76NNJBVnNcgsVj?ZbFB1Bfn<3-39*tQ zY*qZgrXVQ1->d*23WO;Unud*t% zJyh@psaf%lnS0v#+tF7DhPZT7e-m|YGt)%4G17E0;Vb^1tKc>q#_TI?-~aHG>Bya|CXvL*5ot5 z0Lcsk(313w%N8?AG`20dx&n5mLTkm9Z~U>%|I;;9>Z!bL&}|@(MNk1G&6w3BSdr@q z8xx!lGxpwVW*XWgx%s zUG4kGhB^qzUKBbrecW_M^-uD-U5Uc9)rj@0A5&J5^8x=t`GNO%_Qgj^8^mN_=-5-j zJB(0A=XFG%SLD^dbCJ^C{90`v`lyfd1*&_as8Xqw`l~IhTcPh zgf_xSn_u{Y{R7pt(`6{5kke~qO%V+m=0Lh4hAHx<+|P2@gnzvv@=wtk1N(I_bFnCaR>Y`()cPIo_%CF zI%_-O&@LE&14cHc9B%TYY~!&E!uFHH{{4FCDpv%?$9ut()(*|;o_wdv|Ih-Hkg zE1$YB;>eYrat9VqZt#yr_yrd8-E;Slos`&)H-a`Ks?kd%Otb&?{ zV;>=#t9?x`j7!D5ILDrb-7-?T@CBke>CA34)xY%V+^=x0=#DsZ<}vMq9v!)qG?cXz zNs}&m_Y^YTlw8!!v(p;Sj@8{gos@Y(WJ{|(>rMoU6++=zPq(B&OH}035Q`L*pXKy+ zqZ&MZc*Y5w+J|YDu)3YGm%dE`k3<3ZNAH@TaFskpGd;uh2_)om)5qNEXxz)1g8wnH zm!++aX67sHM)c9- z{N@u-&@wo3xq$!wwaN2`M|ZCL5s!f#)Z8ne)te%76p>lYu*r$LfHfiU)%Grxdv|*C zS?#5@wN6xXAZR`GqZ|D%ROBUjX_59*qj7*~#+AAX&6Gg2?IWEZ|NQSs&fGoL$g#H^ zeGtun`-XLrb=mCoB`zV?q6UeYJ;_|)Yph@K_=#=3o=;C$Pv}ZTV9b%=>TVeofqrk z?r*0Y;XoPxrA-U79H1DK8s#NzK&v;=&O)2Ya&yag_R?o^q6yr zahbeNp@ZN+hem&p)<$FdeqhQKRw5W&{!Bjr-57z(v+H*J#-<9K)%Q#@&Qw*(BT_z0;8w)Pp%^8w*hW8=bd1eYXdC z7F1+AXu_88Qy2J-(5OHe_p;;R)?A}wP1X8X%YNUXu?YUNBPPmu!&#PYlIt^ncEmB0 zZinobw;TB$_BD+K2OOkhyAt+8mX<9h;xxYy=)e@2Na`>#~<|Kt? zseLJyy+Tz|qNucLY2zhw2|TeFR4unt_6gvx@08cawy>Uk^2Rr6+mBOErI!XQhtL_t!z9NU zSs!k%dbm!l6-I@)wfp36(g;Jug#dD_i|}X_VRVw)cfvu{V0Ey6)nI$C%tEV1REF{p zDNINiQIVBP)5gpB;_nEm$IWT~AY|vH_3_l{6?y$tZY+I2b9Ciw*jWaV$pVPCQHNUh zSiZQ=iI5^ues}ynJbH&Zg=E#4KBEfpD}VK?U8gZqvmjuhRw7j7R7`THda@fj|54|U z(-H-wPQSD}BgN>S+1aCA=W$rOXp~U3re95#uKc5le1xWQR5YTfnVK`GJ*4FBL&txj zM)@O*eq$FV4LEk6vKi&&?JIkrX183sg=kK!-a{xaD@ilcK}WMDlPz;nd)hgBenr_s z*M{C<&%OwxZ3BH+dY8d$bDQfvjD8v!l@TtG9`XD|Dl+j%t%ad7T0^S=rl-8)cO=E5 zMtj{e!fN<~8H(dNKgnzHv+P*UDFCn)`6I}p?|$!GR2Km+iRaR!KO)p2WNQt3eLn4G zQ@s&^yGLm~|Npwi`pO9k>zCNnGFFbf=9bVy44|r3)xcPO3qeiKlO2q|Pr)ppt_Idl zuVN1d*u*O!MS;D#*5thd+9Szsm=ET?`sUTB@}q@0bnCt$O8pYDx?B$u#~jo49=p{o z-_r9=-v+;)SG8}O$up`B<@CAJPlUv`-x ztSkdJ%?q<{>K5`B{iBrqo)Fva_S3DC-}D-7E}dlhdn+;lyg|W+x!Gz%*Gc6CX;J7# zGeAqkeP8aEzEaW4`x=m2?=e_!qwi1K14rJJyXe5HZFFRJ@+5XX@vf@O)|ETHXDVeA zWb!;JGaQ&`3teKJFZqwWb#~Ggv8Kw!&z;6}o;za&IOdoWtC9^E&iSy^R`d_|bk0#O zxZIm+4tuavO8^4LM@@A}MQ-DY3;Xb7yBU_gipE=1^6EH?>WFUpl@TCC z4Kgt&dr~&-B(S!@wJv#fBg%@r6rzf+{jF+AdUqEEeoOwUx!bOG(%UvxPj+utT7^FFqL?zc^91Q54RR77D5KEIK*w zWUDAA(V{(aJ3r$qx2>R5o}#OWmcB<-CgZ(T@{ba-(I^0KdzN^y%KTGSSdyb>zg1$7 zr=K2Ga@coVTkf?7X^UAx$EcrYm~gqbJM#4O)Sp-^;Ei}M8AiI2GV?)O%}j@qHA4Fz zYXvlO=0JPBzK*6BKOZ6qR#$+PYe*YKz19_!Z$(oX{9dmWMu0`HP&wQQ<9?UapniU)3_-GprE&iTXb^|lih_0@d@oVpn7!|{7qLBoi?`C=IN z3+%<48Qo$O-gdaqN-J&j(=ETl-O$j%M40KW^FJgxjy?9j{OFDJ%i z8nwMxWYXtkA{RQl;t{gNXzD(Bs}_K&LI2sYRz9E{d;L|Jj0t=8i~K9{YpSD$>K*d5 zvQpfD0;bW`MvfH&oJEZ6yyQapD&Ej0^4R2BFiaq483Q~^X3em!LIW6Wfwi_IPu@a? zQ3qOwiAYTeUd()pLhIY7lB;xcIc4pi9ju~Yzki0tPCNPjk^7N0wJyPhaZGxrikuv5 z4^9sXQ+jUz!*dYcqxj-gu%02=_2LQAx};@s(vR}Jy%zE?pVuMs=8$rQnKPG@*7h*n zbt}}-D&uR~_T+;p8UB)Qf85zV)Gilu%y`(Kc)dy^cig?6A}E+M1t?yxr6QdhtLm&G z50==vT;Yg4(5O_24DXoN!uHFJuIFVT5?He~4F;fGnhI#9Vhi`JiA2-RbmY};P*iv% zsOEF`%D+wd-5V~Ux{fNHvgB}r0%}K-dEFTEgO6i4wjxz;0btcG&=^`jkz;%gcSUaf zpvy`Qwb$2xq5)>EACfCTdI0Z0*wU6bMfx>>Jy&!#0@FxG042>$@gwCx5z3T&&)cRw>L!k6MIR zUBWnh|nL@B$tl1s467yfw{;Pms@|5w)8ha2qqAmu&{;y;We)%Jb$k-f10UxYpf^F zlHp5B%4@(PBLqqs)acxkihTdEbo;c3z{s8sM>qPc({@G1B6f53{d5V+MRyg1;G2`# zcFSHIBrm3TRy7?cX4TDow#ADSGCF?dOw-EC8RIbz_dzqK75T6Gh`*GJN(Z&}j_#qj zvvj`L^tpe8XRC8R|3K7O-cZ;b;E+lWy|=}_w^fLKHJ}-H)wFA@mevSHQ#zX87C1txg&VT*^Q%@sM^~ou=P&j|lwe$48o@^DT51IH>WdgboXXo!es;5#>WoX^~uSJ$#}reuI3YZ@INm@0S+ z>i&*f!CWDdo9$Xy?P&3b{VEVivs=7uwR+$cIrLOmLN<8^F{J@WS9^DlRQ^Gy_z+jh zaq~i%tkYmkmboHd(g0XR#4hK)T7vGpmPE0VD(ceD2nEZ&;S1|Ztsd;}(_tVnoA<9p zgCxz$6|TDb;ii>Ps=>Kkv$NWp&Ap0x@`;~zSTx9>ww~ZiYZC7NFg0JXT9FfelcW;S zQW}_(8Z}jstZ_8l*W|1uDR&{=H0CX9UD_s>9gxo?G})D=!vA*M$tW{c^hm+;-RJF~ z2%0iB-DSJH8X>9-xx0A<#gLUF&kzUt(ft9M^dV3K~Er z#cna5p?uESk*ohza1osykdH-hA9`y;tNT0a@_Hp0Qefng0^?e}6a=C?dma#xJnM1F z$4CPV12>R?Vz3TW7TNVjn(OQ7LA#bf6xwh)*wMuGvtwLbz!x4bfv)VAi_blMJ>KC& zrSRZpc2|?0bou$Ivr&cL-{^xbQ!m~^3|Pk+YcR-MmAc#j(VtX`R8V@hmjvjlOYMcm zCk_pZHS%6AOz1YBgMQwu*~j=UjneUA8j+e^u8L& z#Ig!K-&VaaumLt(pHk6!U+2r$t>OzcZB_BiSD3u4*yAr&Q*uA0 zGFkV|ySdLoCVbkftrL<}$>MyIca@8a{Gp|_u5y>iWMfn~W-3``$^R;~rEE2;u&9-U^U6#(U{F}1IEUJ;2>c3}b3yJ$a8xe6{lRWV@FX1xn zPLHbC?)u3ziXv?Y!=fWAVlQp#qj+3&6@Fe(FB$VAvf*zq3VzW8>-6Eb#jcX$v!)$? zH@wSz>e{}p{2$&uUzi*x%+q7d>^R0)bocd3ubXI1J#{BR8^7M;s*q*pee&w>_(p+< z!hATB=RL%)WJd+3E2J?4w0Q$LX7l%w7k=>wj!raEtK3V8zEqJH!DLLkYuf`A1vxJ6 z3MU3Q-%8BM<7rekAC7lLmQyL1{Himx7Uj;InWF9*73Hb}UIK-GzSfT3$&;keq&-QY zM+rgr0k`;N_FQ$A-;JEW{9^a~w%L86fJ_rEO9|U7>GC}2rG_ZTdtu(kwJ0IU>HP61 z?xg{t!?`EfANw}UsQcj`ePYs-w?ikBkw8UH!;`cyscb{ppaq}ZEV`1<9*ywpDL47$ z;K!*tD6#z0?xXam&M4xp@u~KlMTLXfq7A)j1mzRIck8pU)qa!r@q6y@@gQwU+mY;# zqy8Wj`NtiZT$k##UoFiGjK6wOcmf?$+k?=tXULYknS8pIhs6R;msqOPI>_)1%9oDG zKY%-gW!rsJZHO%UP8F5dIx0Ov86iu@f`gaK&HUMpyb3`eBN zS+2-Vj9PZJ+@Yt0F*Iinu7U>ucfKM&{maBuG04$nS(sUQ`JibuL#!Gb$uwra^EVi{9MXpsmbv1D)ldEJVuI|5{C9BIJzb=4X=?+tD zH%}vX+_ay7TVv-oTZ|Pu85OyJ`s?vcGB#W4cQC@gC2Oq@@Ra(-6<32!_9K8oPMZ43)jqOE@~sPb z+%N^TWJTSpy3@UoP@y6>P=3dL4-#+0{ivFmg_3J?s^A&@m$s^ve*ANF1Nv!GVqcHN z+cR1p{^90gv{UH-Sg!S1r(@01%Rh)Ea?bTg4X@AV65Nn<=fLV3E5e~CCyNGr$ZDdg zlN`e1ALl)IAkB7^t5=s%C^?D;o#f`i$OS72Z_-?nKe&c5gN#P)x(iiIrA&k$`h~7! zk}qtc{(nGc8O`Om7YW%>mpV&y51o(ecd=KlYo2{Q)iU<5E%s4M4|{;b8xQC6$Bn`1 z(MgfHXfblG{3pqTG(uIjcYJkGp@C^4@?mF-d`RUT&72w16)l~saMAABHNPAi>l`z& zhc@p=FK=1iB5(byx>f6Z58atpyB@4nrz7ifmyezs&f;{9Pa*2Au=7ev(v?(ja6a%= z)qahq*M7svTYRYfh2}J9YcI-!xxpyfHnh+@Rpg(vopT*yG+8SxigOUvR+X9IPzt#d zgO@`aV9A87@YfB%!b6z|v*-*oJ)@W4*Ois#WJQ(Ju_`evw$wfs9+eI`f*R>Gw}df9 zIp)EmTm^XQ?Nok81kqghYvtZa41B7`Sp35!Og^3Tcmz%6mym_3w`g{}B4^%Vq2b2) za{XWQ{Iq8o2mjK$C=Z70XcPeJb=6Di%Ss4uddASiu)0Y)(cfNqL!oF==NlNhc+}|B zqxvaM6RJn!u^6{g75Q=wp>&`{1Dp}-@$-lb^pK5YxGJ)aDuu=ULw-ydnqk`Gn@eVX zN~8x2?n<0i?Yss>K#Qq#ScV~*a?h{X5)Hh}jA*r>Tpa+%QMl8`OpjmViOCGib7V91 zePUwMn0PVYxiy-^%fbyd9#4DAG$&k<7a#acbhO*GRR+GFJ|@XSf8OHZ(QT6#uVt1Th0w-MjBT+$=1^{LY+~h zF61Dxl}18`Js`$AxA%KpD%qQ{_mrugdn!mZPU zn|sD4R-z)`QuMlCZhF2FQsgFxW9#d5Y{jz6jDzy7L@GRa%k-s-CLlVp{e>~ej-1b& z31V2^;EEO&>0e>8w>oDcI>#$0nYAf(^0V{9A}7T^&DYrKGJL<;&u*Osc9ZA@~^iBsOOBKz@VN zm-{KQn)r~5E29_HGfO*$hB6R^AZ$k4HA%&VJX`{*HCx!|+=T3_JP(qb&rjIX`h2=s z5IUDUyqPR$Z9USB+}eBpiPB%6)*+M5c1kY1UwF_=I_QrLLhGI_hsB%U)hJv#MHZ=j ziqIm)^U8yewhrU7uBnFN&mWzl&?L6tEngXtbZ#)o%$bZMz{$~Gc*9@Moxv1xEz}YW zKyMF>+YBo~TW_R(V#ckM?Z}|4SUA7s*oDhl=E-X{pVHI4s!v|kkS_J>laKKlmo3tV zrQzRJn7Deqc2ISy>=6DsP0sxQNtD$!_~f0M@rGK77f(y;-+|-y_O6%NeJ38AUzkxVX-hKmKOTF5@vfkfA z^eYcBF=tH8+s3_7X8;Gv_pR(rPuxOt+3V8c#U>k2kvmC&;kpDd$z~{>tQA_`G;#Yn zyb5y;o1P!apD%GKEX<#r@8DpluT&MjlA=0GzW25dbudp(%b>SYH?j@}+SM;FxeWbC zDU@0_d3r|_lj&1Jw852n1v&m}ZhouG9evlvLe1Vp#-pXkNHMMKaE_biC+w;Xd^}f$ zSsAr9rTH~=XVVXwIdlDt=~ewRzyy|tqkR1rG-rb1yt3wbA~!tbw$>@k{4N%!?k$#_ z+4185n=IHc;T_HLO?M@K6L=ej^cIDSl~CMYBInmnnctFgLP<5r_5Z?&L2%@Eeg^YSq@l(7eCxS z*r`)L>-~P3rwck(5`uT@K+QSsFKt8Afl|CaI`~f!p!96ZqVXNx=-03`&5v)XQHpxa zw|$ON(!Z`xn`ImI$RCodtz-cFN4yVWrL_sfSg3c!I!%Du9fwb<_x38O}F^P1Il-&1ETNG^l8ALow19y+) zm;h1Ntnw#~F_b3JV{ivtlL5Kscbkze8tm+;+FMx45g7ODT2|jZh_-^p z*Hx{N$PNB|(WxKPN*0Pq`O0(XUrYW4_Hx4Xj_~Mw`sMQ&6CJze)}W~o5txLE9+3lX z@2XAGUON?FKORBUZ5K6j16H0%BT$c?j7_7OY87`m~}#%pp?F2t<33`I&LKBKv zYuGFOq)$`~+_O7Yv)kV)9Y z5!UI6U9?F(Ow~uf|IvsJY!(JSZKkS)M7%9T;fIQClz)26bh88HU%)&#*1>$8kS8}% zRwo6JBA?Y9F;ivBLc5OI4Wx`O^C*>ir@UUR$DnBVzF=OPqe1!#QH7#3!Ph zST;WVo3{!ppUGVFs`}kF%lSJ*;mOJQK*-j^1vG)dQ<1;U@zGZT&5xudpIKvHk=2x- zsy}PO=lYVkhRA#WelwZBaB17J>XO-u7tWPOu*39bve$ATk6{UJ>7pNyIQqR3K3#yr z00o=f_e#nMjiJ|5TU+xDJ{rR-J%V5=c_ad4pO!4)6b(R~(T)jd}0gm`Omh8wNtP5y8xUfSSbdounbQvEic%eV*?8N%l^ z%qE!*H7sv!=?CZDPURK+V9beZd6?s&%ha2( zt&~97F5F+ zcSd7j(v7e<%LTo9$?}kx8<8z|j2K6wU-j(u86tgg;^xGabfZyADR2BP=5a_m$Q1-; zb)#xTWkSAvhz8s`i%BjbEXU1-wK@z44V2T3=BBl`97V2G8Q)$RHuS!3yfR+h<~tjK z(2eP6B35IyQxpXS*z5m@mf3mPW>hLt54=W>MAEwYd%OZ}T({Vj#J!4(r9;jv+40Pf zddvm3h0eXkev=&o+VATIx5coPd5``pcf1^Dv)^$B|L#(}fGVVTcfu;8U#eZ&LfSSm zaso*V)z)hnvI1z3B+!qw^{{1bCV6DNyD>gpE6Q(PxckW~B1SuXWP+h3((#1}tReu= z8u=yY0>}v2Qc{p)O#3@G$fO2>qLyjx@2$N(fQJ07gJf)TWQ+j|nZE;UiQXp86PFXML4VfJ&V?CM{) zwARInRAe4tkJD`>9+WCO|B?U0BMacMW0seV?q{;^n;n&>q047BR%xSsdV84w6b zhT%Sl^iC~As7M=ujvv%;K4&XXEc{NFpQ;69YKRp^{GRfj5VeuN7>G6w8;$C_8qy4& zI5B$sC6V9q*9mu5coeq7h_4mCZ{=GdcU^2HCKZ>amK)kire(p$@yxRMx1iY*G4rb3 zG`f`%p(j1!=uO5A-!x}r2%u0^Dr4?aLGTctDT6oBsWd7LYW{bnDH`W7akvKfeQ6y5dWB)_l3F2uf9Vq*R6GSNsYuB8h{Dss{T2_+}Ieerig zu;DKlKkQ?cdsOnoFZ3{<6ApbzQM@7GrVm`@JhT;!5?!_ z5&;}ok;jkm;dh}|WrExAFpkQ0Xan%!E|H^z`4y_0FsB_-?8?ELa4S-gt#8{x9NSIi zL!8xuDJ3{Z`*FPM#SAIOsg3bE_0t<*arf#85sQ$HYy-^+85lx()jlo0dHF{bd72=c z-;$k5PKZ~Mr(fY+GERwfK}S)pZM8cD#lAuzZFPkEX3;Zx7~b*Vu$HpToVmC^X-@y* zVn$ly3s@BTj58iQr>)@jbYP*iQ%CzSqu`u4@jjW6CATHryJ>!KpxX$O^UP7OlaK+& z5-G}bsF)638x^+O-bD^q7i@GTsLiX@JKTwG#BIM4O>ouLCQwwF#Vgy;=K*Cy6R+Ve z*#ksUIl7vk-&ol>>2XW`GmW%rR@n7tX``Fu@H#p5B;(Kf!&dHH{6Fk0wGJjA(iq&P zBacbyZ^~Eg|Dfv_tp;r`Kxw*^&E`2zW{%|PQ(~FPDQG(hS^X>*<=Vs8cjB|>itk5z z_HNOHKPl3hjyQ&d|HlkVGbsIO__Vl{&JDMlS(h}F!V>MjJ_x{dJpfmd#81*{IV>a^ z-MI(3S?9CMw*fuIIz_;lzn=!UWDJH=tvJp3Zq_uE8<7yZL=E}YXS&N2J>nr2Sef?fLyGf-3bj!n#e z@KDPYO$g?)+?XGKso0-{{Pq$3x1vO*)qA^4`tp zo@iWMc_S^FI&8vqwX3InRbBS0>0!zRRc!V~S>V93P;ZGGB`riiythKbb#;+)jQoVW!w+}_FGZ($4jRnr-43N$ zkgV4D5(;m=7iw`eg}HA4@1k^K8I`}lV`hK-fgI-%BYiD$N{2y{XA@X559@4)|iN6|DyOZGGp?} z%ZZT5YO0=;Tb|xL1ZE}=3Of^BFn_z&yNtgxkm({`yw=MI3)%L_kPefV?Q2<128Y;s ztm^4s+1?|6frStYyh^v`b~&eNKK*lRX7 z4J{hizS_a2N$m~yA!NOERyE;Z^mA#y*B6j&yZ4X!n>wgwQ# z(An!d<>eRmFrV4?^#=aA8BBnvqhs2>Zk7YEu6q#=su~? z?}KL{n_9LeN2^8Xr5!9MxRdE!>+CEmFTyXn|0CeXSH3MWana3Fmq2rIftg5=Bwd`# z(&pvrjB@FpdsY_&4a-e31*MyIgDrK4Q~*$2?Kp9+!#5lfPa!G)CS(dsZrOvBtDQn+ z%Z8l+%pViKab#tmeuXKSAtgJI8p5A6!lkydKGKK<3HzfVvQ14SETtkkfH$y-&7G@5 zG!s=fUhV~-6)?lhnT)bwU)Fcj zEZBl8za;~imoJ@LT`+s`yhSZbtMglzFP&i`>o&I@qv-M<9*j z2pU$I_tu7oXtdHzAFCpBHuDv&u3M^=h$=EI-QfY}&tAA_`O+5oFh5|9ySyg(pmk}> z!owF=TaKOEvSiu9R_0jGUViw3WirS&)(*8RqPieFJ*^IOBZL#<*8!0`icfXM&~^N& z?acdz2jpXX0k^(3NCyEXOVRMbH5K?W7ftJd6LV-IR<>jv8b5O*#-2mbul2@eNf~@d z`71hXXoF1V#XHxv4|WNaSWXn?&t3)}e93~@Z7tKPElZcSE|m-8HE+6)N#vCD*+@3TS8w|U+6i=6 zUj`>AAJC;j9|_&$+?y?KtuAeu-PXET&f@;D%RGx0)BsmCzzp8N@^o?io9EIZuH+5a%J2Q zf1j!BO>MPI;bRX4=;KXSQC0GO6)~Z*+slzs?6wUzv5FuD?kK<59rbDutpDZ~uJB4; z&5Py<$j}!Wq+qI-f;TkmOXE57RD2%U5<1p(>L30gtHV9Dl~bq9kO#vL>i!2jseA(o zohWDaZ7JWMDDpTz2{c@7(Y|t62c9xoE&h4X>e9pSCPMda{$cxm0@ukZC(k1AkG-gU zgP||4;+m`5>#JA7=;@PV`7PbZZTQoAeGK%k!)@;Gst&E|my7tRKhzg+A5wmDp1)tU zeXwJ-oXo#SgUbP26dtu)%fH>`-oxMehI{2&KA}k^KeTMi&-tf)L0RSUGOi!G@n}N& zJ$#BBfq^*4LzZ$Cw-|UIOdw}%!aB+S@)t(I;;y z7raE|d%MLGKvfF#c-Q4)d`s`)$b0wh$iMJ*)YdR z;dwo9GjxJ*2lrAX{lKp7-ik|&g}>}t1M z+212e_!f8PuQr<#8IprobN3?+8dp**l>8=>Nb0h?DV#d)oxGnbqvMyg$nGq@Lxbh# zTrxSA@1<@S@M^uR<_n1m|C|>FTkDFf(tBVbk*d0UpEU|v`NRBDqj8%;iY0j@+D+Kw z^Q?-e>6?HhOlMIw1XjupshSV)6oBc&>#fFCx?d1_kmzBZi)i?C44RhCN;*robkXx4 zEF0VqHpJs0ckO|;m?HPE45|~Ba6t$Y@Qaf+uePm`d23}qaNA@GznQ(hY=$t0&Mn$sfp-O|iJC8|b-9XD zj3X`IBeo0)K+dOKm{MF1D3} z@;7vprp~mw(2M7d?2s>Rl3V*UQWo*Xq>^tzT(zSM z+WWbg#R`E*X02whRNJsXZL4*{#z|a)eSimkbSx5dHYQ5w?vNe%rcQ8@ccRtQs>m%Y zmCwap&C_)DAgVh1xTi-YQugI+w62l6SO$HdvrX<+cF1)8;w?xI@-UYz#m{^(UkhPK zBG7uq;9dFSpbV^zHEzVQ$#O;ZWp%8$TDR^1Ziw8;={#u{)5&YHGauV4%bkfLl)DR7 zl;1ufd23b1nr@P-k-?tYs`icz^2+CPBfaF6LAI)0ebUdS>Ngnyb|s5pM)!^UEK%or zrViOTtc`T@k~xEHo4GwEAoj+(yiU-!dNE6jVWjyI8c|*9<$Y`V)K0JFHCb^bjzGd5 zlAWRzbk-{)jxS1<~txzjq~L zYFU?Rb#41#H+1o-^1b+<(_|`#fvb_+D%CO-xe0+wox;DdzScBJzRul)9b=)0W1WH| zDy1W6^d!+=4H4USvd1i&eu>jTYR=igtR{-=PDXtJ%6&fC1f8=!56wq&UC`JOrjpP1 ziiD$5k#~3{V8U^x3X~ad9e$5?HZ{M?}%)eTMny$!z zvM!VIFS2$@NX9qVR{h8qq!oVVa`>_3y%_1tXjHio!PfL#v+UfAOl5-?LWN%OyZZZ~ zJ!7@BamgfYxGL{P5u0mt0ZZyZX*pcif?nXO<;nMZ>8N&Y=&PbDC@K9bB5N+CJb@N) zlDo}o(F|+42ZDOTcU>h9aLDax5qNnMtJw+~+SSv)PI}o^EA!Whv0iK6%*8ZFPpS$D z&Q6NHM>vu_)(TVwONXeO&hMk~G#>zepLnKyaD)7n^H@81nAzrf_FuvAaGX4O*B2vC z;!X@G{+T+=vy5TUWLrx=Z??DLv*>Z#cr{Hk>T_+OA{pBJ{ci=O)?IJ!UD*vx2YpSp zM>Fwe`cPGkD+C^K;>Wb^WN{?pRAyOO)K}FR!Wm|F|VuQ zevXsDrF~n${x12_^K`-NsmOu_ec*n(6LW}XwkLn&OsM;OiSrZ-T%6Gz3m%wVQO9O$ zL`-{!s`-3^#mVl6Jo3gMmFhst|MFHL#^DIdQm>j(lkKP9nf867qx%m9=x0$hv06@ z?o0fkvA4LAWyMv;6gWS|VgNfElPB$Me;Omvy$DGxx>O9}GvU}W%|d^-ef>uL?rs=I zi%YEsrA%TOk|4p|-u*YoF30jO9K?ZIZB1BJaO`x2 zyh8K~ZGWH^ALV}OqQolc$XB~vtSeTp`@6xUtg~j-z8WYdt5>QjysFPjS!^NlhVb{J za4fw4Talev(Zr2AlvP$Y?r4^cGbPt>CFjJQi+ypp5#j?QMJQSY+LTIB)^97K9kjb9aDqk`K$DxE1S{s5Qpd(S9N@w`>#9-aA?EFU8)ET%FKg)_y}ickm=8}+ zi%&Gr;mOUF*6a*>-VW_UKAyaeLuOPRc`K-6?r9m_+SfxXNeazV>~9@U2>$Tj$kAY^ zb(hl+AFV~dgFl^RFk+s}!b6PD7rI&Z+-{dQkv?XKB|@`DO)W?w*1KX5f{&)U^ESL( zRaL7v=+mdkTRH#B^}t$quq)4Qu|{21B~gJnuyb)S32+hVh5&c8KISX@qRMUDGqzC* zIv>e;c&u@T{~oY73mvP&bPJSBIF|=&IXUQqL~5pDSKc>X2PPI4H2IG>2wK5yGZRW`6g$-%{DIRV=QLLYYDbg# z+C8o$R1{&lnUV}2iPOoo3Yr58A_BR2JgNk zhS#c>o^E;uYD1V(XT>?Tk(L>aT!J7Gk0t^4{)hsRvwV;vBweuT`Icb?}8lMJH*AU)YN5fjsNRnioA8bzmt=jn*=X;(ktoBEW`sZMQvhzOgQ8mK!PN2##Br;H8?8MLTU&lP2Sr1z5l^8;Xua*+dWR?$v(|e z`%J_VRC7lChMu8giXiVt=>_*j{fIvyX_`#1J(pG*hNQw0DtL7@urpNqs=Pkf9v^3C$@zN?$0Cosf?>xHm-gUIp5hTJ?h%{SaJy3ll zWSg4v!7wwi0B9m6Ic=M=L1Eo8O(pc`rnf^LULS04nV4r%V%HRk6)${Imuj9m)D;6v zd&cV}Vksk+_hWA3T-2WKuA24cGnB^y9qD^d_*A_&f&-X?=f&HhyZ?yL(Nl#Z)P3PC z0bhqs2slEE)#&Jg!s~!yA=?3MQ6CBdY*%@3NltCb$LI6TB+oekRaZue>Q{Ys*79awa9b1flH+Q;ibAcU0rfA>H4G*wN1KL7x3=G^+jp@ z=pR4dF%uI!$$#YkNcuf}ZBPAG>r~0Jl~A{3g||;qIWp`7OB8OGU#$zcW`1gS*`;rT zVUymUDa72${DIitiRHuG?o=E3dO|hz8vgm3L38x%2Nl^3DL`uJ0AY*&+~f^3&sDPD zlV9R?$bRF{qY?akYVdoAWJ)#hmkG?YpRk!xk%m0bW-qD4q-pG_1-}YHls+}_Zu~Yd zL-tY&q7dGxr^g=ECG?0DF}%<=gGcSWFPLEBnemOrn^Dy@>9MHVL<^% z_TTfK{>BfTK&zbEDmA2yA7mI;roCR*nS$rC zy%9w2B7xKgSz22gG+W{brnUgT{~jL9K}PCUdRvvtJ18%P)HG*;8{4yQ&B@n1rk+6S zw0_z`w|koAe2w30*=2c}Q~feK2xF0cSaFYCc@?LcO?(h7kkuP|>y>`R%V{E5BOGo3DjfFgYq{fa8+y899i)wtb7}V0&q<7OBJ#{#o>8DPCnU>Pn-kI*Dh_819$bOc{7xs{C0mY zP0+*eba_4(vcuBneDPw8ugG~!=a&vNY)3?>tGaq{3{@Ly}Dr~6CkY{a2n}q6(UNmnodUC&)sx+6nH9PC% zOcl#<>M`gNT#o;b=9B~Z?V{A>A~w;0@0`n7B3NhOF4rL8lAxe|FDN=`SFxh8D;r~3 zNtLOm+4+XIV-ZVq_5J8k=TcA>)!!RM&u2AiY3PPp<(hP<%0@KYn~lexSM$-0VuEW9 zAFBr*jFMh=MU~s>b;s+QIg3`PK<;Ci^kp^)b+RB8jg?)P@+G;f;HJ@=I;S@87Pw=W zLn^(a@KOZ08v$-q#CB}wA~5xev?E(461jbt#N)Vp@F|>4O@XEYu&WAZM+X@Ekw}Pj z;ghcaFjr!DfMP9kCFb#^!4Y-!OWAH+sk&^35Ni^4Eq{h2?7GpMzxZw5oGNnjP0r?jOIkwS12A zk)48y=Js+LTbra6kKos>ACfN2Ly3FgRnZt6nq9dNjrf=$3GY-dwl8n)>fw$KGAOs8 z7(yec5^eWJuVuYsbceTe{@dovCJw^`+vq(>Zn#KBE@qqfhFr@vLhu2DgnwlmUhgNA zh9xm^dx(t+iNRh35%XgucfaIKtc_O5Yy8PcjE5j>L0$qxsY@-VuruTb-@H_9Ik=uf zc7l#>9;SUCr^NyG^!4Cyr2#e?SYKOxN;`C0u<9A5!}*TCJ#chLS-6Db?OfU9kWfs` z*#bT{M_sc3av%p+(|y~p%^5XhuQnf%nyWG_FAL(Rq60!ZRJSiYysO_4c@v&)QU`K1 zmePZo&XwPvo2nuLpK)2bIwGmjp>x@;WjDq;Ps^$7NxWK}_89w3@tut-GKmG+*sVA~nv#hX3d z15wn!l>gFoJeE(+eU^LqBciyMHO?&m#dooTojzPFJ0c0+;}M(?O|@NsNc&XV$#d+C zE1mOt6c;B?KEPtAU|P!Qr~D(9OJ^rt)SYgU{7Hp5ZrF4?uk0E;{gzl&Q3689feo@3 zH;HpHhnXTul!Ei{ObE|LN?oD0qg1?EA4_pSSFq<--E@}LVXSwRhRi?bigh~Taw!kL z(25!1$>e(e%L}TVo%`{Hg2|B|@8oyiYiLw(m9v)1!mF6Z$8)B8IIIOocwJWT44M4K zc4d(07+O%a@!Q1Uj4aI1H1mph@Ce&_-faZ@WCfyJ}Eg2hC6{%;tm0 z_aYTsCPnjOMZ29-m`)9x%AQ6tB6socrXf=1QctsV>hj17*>FX~pWa_x0WIW|4M>sG z;FqYJYd~qTaT?nff%!974YMrc;e4LXtC@x{L{8p?-uI}W_gucu0Ub++j!qsu!~yp7 zz2Z!Z)v*0RKUHOHAMFWh<~4;w|37lFqW>!|-AaDMeAnqSbQLYtNFnGM7%zmlw&L%dXTn z_tX(eTan%0X)943)*|%l-xs=;E15yA{~@le3ycCcOpcp8!5emWF=GKxO{vV+p`GCh=Be$~tGlC(~n~isLmkN=#^0*UtIb8!Qe2GBjlE*5& zv;5{o6BF-KSAv4?pX$qZ_d4=lL~#be{?zj(#5#z>l!^~HKcAXO*GG3HIqyAnBER6F z|CPUKc6#Q!X~BNEHTre)lA<3htglcJHwkAdLgtgj{X>>%WHI}9o1o6T9redJ;O#xD z`n9C1SAP8?)BpuiRPuZcu^P&78|U)+3!RHqkw5ZzF3=vmU`46xKpV>KK*_0k2$E-% zaQHL!OrsbMz5Mf4I>ja`X!;Pg$20+84aqc`MXE-a)dhhBNZz++uoHzIn}$9ENwP`} zR(78KrIYF!obgFkbTFx#hVhEs2Q***4TPTDR-JO^aqjTZcppt;c|_9knc>VYB;f-a z2u0MQfKnTFaA9zGzFaOyBmw^O(;R36Uxo&&gYBK&%;MFw|LH#}zwuE8gw(x{SCKve zkvQwl_&4buxn}0fb&%yaR_*In@Rz}3mMMmY>x#spOr$mw^Pw~i)wMEXhlw(0;j*@t zWpdkg%(RjNZP8vce4l#D?vSAUT%O8q=S+ZWhbXC~$CD}vQf z7fLJjKl#-WbiH5Dj51a<^siS1^X@ic^hecwzrY4Oirlgj@*NCoPk;X!I>h{JC-j@C zHhjY$-c=@1CQeMUdO>iooVzX0WdoDo(VLYKCfnhJV&10PL9c6VJ(y>({TqAI3l8~i zBU_)0Z-bNLpMTT~9jvXc-^`h*Rm)s=v_6yB?~MLe-5q+QVcX|&vS>_Es}zw+MyHCu z#ED<&*dm6hS6%z56)3JE;DpT5`3Ma3{trDL1wvKSg6GgGvEPLTa*?QM?5wR%)-9L! zjq(}2rKiCEvN>Xdq|Db&Wtxajo`waE&xWaMGy}ROpY=n6`%o`QmBi0DL8%XAI$hVa zUg#vbE_9LkjhEj(1Rfmy1%nG*c){QS%O1aV2Tp6@UtD%1V4`k>@hdnI6Q`?kvckr9 zf2F|{$V+jFZ^r3O{i89vW*482;>K^G6&E`pufjCw3dxNa{xlNcAuSSE1o)OK()-0P zVilEtW-i)Itislj1$RrI|4Qa?Zq%XoK3dZYkN>GhY3@N_6tY(@zsVq%Q5?NveyLlH z?`xx$XTZXHG56q;q;vFjyMEn5tmveAmMBUgsl(CpM!2#nq_8&w%%H2wW&Z_p8V;ycKv`FEq-Yei&zp@tij* zZ5y;K6qN!W#Ov8pIk4bSwuEx`!L*dLuAO8fb)XkOnLIoPo1mjHpHw3;{UEvg=U(8T zFv<3>o?tk(N>1Y5=|3{1h)3f_q;%+P1h(qMQ8Z`KZ7|TS)}_)*jb1b04=xt2$lLZJ zKzCj8ZLPNYh-w)!jjYs=yc~BoVa;lIV;46=WL&9?ovp}@oIaP_y8DC)W(A?_oQ?12 zFc|mS<6va28_Oj}XJ+b)8HK>xxfXQiUYh~kMm%--^Ey{Cr$P(?+Ym%4|4Zp1&VSPU za#TY$IZTU`O0}T2-Yc3jmTAjVLR?vTZ)_%_aml)Xw*7 z69~FQb@#}gH~M&Eu=WPVv^hFLs_*1-S`ZpDLSD{}5@JuC1*M3NX75DZLb=oYp|)z1 z{qOV#(yHC$ufPXs&p(vT=XPV+Xc9t{?T*QADlP*X@>JRAfFz!p25-u9qbqL`PFCkG zSibnkw(3!{m&iZ3HnrOr15Z;XCJbHPEs{NS(t#&rbitPI!i8(^ly}|Ww$R7B@|qLf zslyFDlt_#y4yHs8>_PfCt(V(&4$i19K^3H4RX1>3-mqc|4SZ1NB@e<1Vjd7Y5O%^WnCP8!dw!fb6OT?V1e(N2ufN`+IX zNZj(idV5#RzOk&oP03)-$()lStnlWa$1jzC>eT7WfAWmIkM~8*>@>VkMSh0ILgiw; zeN~NSVu*S}{_-JQkc9!kdIf$%4j_!pYKgH4@l;~_vRM2^1BcgxRydK?bd$XC5^rkd zxaX|W44puj<2f2!upu;}o^Gs{pt%t!v#~ODi7Ik*7CbW$k`>8F9IJ13ry@Q7 zBotG^)YYhvw2E_G;{GWsR~6L#SHu!$uSgOgvR>bB#1%D~{01T9uGpO-Ldpm#6UDEwGvRP*Uy@HIXp~}@E{_|`Df+@NUd#z^C`%7IGzr=3h)|py)yk zN<7Jhf6}{uxVqc@nT2U$E=+u#t$5@Lku?|#IW*^fxi!*7ZxXwl-DFwuO19yRRGe@k zeBI36PAVUNqUi%F-d2&VNJm9kShqQP=DhIcz$N#!V+u4=Ltyv@4E>E|FEh1hVAym-WR$Q^m}_eT{9 zwKb+s;>%&yG7*DcJZB0DTJ>!P_l+EW*MJ<0#~-i1d$3sZI&d(FQF0qnn0Rpm6{3CF zjyNh)jkOqt&OjHr04rwuVa6bvE;oz2tTsqdnld_E7nWF|Euy(+otEAhKHADEgj2(m z@O3h__=R%#cb(pFFO)Zmskuxn2lLh3caxuFYzY|1XO6W?7J?3~9YgIsJ{0%@D$kW_ zwc`s~+&0I0-fkYeWA%)`kBQN&TFHu2Z;te2wnoF)l5gAYTMRj>{V9A=+vtGwrZ^kJ zH$ETxisP`91#gkSl5;L~`!;MY(j?HwR}nnbhv+d$Qs$jF`iojuv@D%FyRD_VZ1$W* zE%F4LpCs;lB7bAS{4x*pzd84$bl{67t$`nWUr4tYTct|(F}Vc&nsZ_@#}th>rgQoZ zS`xbrl~*+pzU4~AwNO+egSoVBwbX5!wn6Lk&v-V!$(OUbiSe(iou%b~uurw72WL#t%^s9r|RKtudntC)ncBPSiYKNIgk z7-_kLx-~ zuR5YJYDPiu`hqXJ$FNxu%Nraa4S+v+KshyKp!}S&`P;{Kb_U`XVe- z?ksJB>d7d#fQS^DIrE+q+vT5jG+LFKKWJ*^GhjlZ=H5 z8xq%B`99`*@9E*BZU`eyinaD_T%^Q&h1jU^E!_?zUo1%Usg~M=g_w@LPix3t^a$G; zJXP{5hMg3G8mB$r1i(A{c};Tx>X16Ir!)MdO%e*1T=ScpT_~S-TQR92*~gqHN{eTp z)!xV1A&=qJPyR_Z7I*ZIGhUZtgwT6j_+pJlWhEK-gkUMR-tCs$$wYPul+`6?{#?%? zIUFGMB3$CCk3~Z7$t6y6Kg@B^@Wwpodpz+klD&lFvTR-diuMhG=R#B1E{KvN3=26P z?}%uQM$)c&M+WbYU&Pc4vZka%B@hCuMS<(p9JqNcbF1?f9u5hmx@h?_c@uV#hgBws z1sRwu$W4JAEU$l&q8Yt3Y8;dc8xLK6ug2hC`XOY+I>}{*HyXyc00pf%n^~#I-k{VG zW!qmlJD0psrMndgl}tuQW3>J&ReXH6&(Gtw>Y6ug_T&P%kRHp(a~h5KSk4JVPQfN| z9&Y#C0DH?qJey_x{YTMoW-iWfU5+AfC<>q(j2LF=t5?PHVahKNKy#NC*J_k_!w=cV zOnZM-H?`b7f9OW9s|Z3WvTK%BSsuZ+SSS?Nt;v&Is8~I^@ckHP+ zpwP2t&J6WbGiP#>#pD4r{ZNtD84}KNR?+Bkbdoic-zkWluChH|f}*J>NdgxxO&kRo zSmDH@x#Xk~O!_x!r9RrAt-77II&%rH(_N!le;<;b%sSISFGeM+%LmDQCOJZRpM~|D zDz7O1$iGpXN!mXzect{HU{czcvXf24bZAP#y+>Y!Y>f5bw2o^Q%wI1YcRNg~pMCa=NiwgDshXhJ}bX z@JlsEbPIH>ztp~df>~USb>hknUbQMOfU*SJ;#$)<(xM>pIG}`@#gdVE^NpgBjN-bZ zUs1e-66hrBbW@|+h!Z7%Jq zezI<~w>6235uYwBxU1T_^S8zia@7J=oq#TX;FL#lTBMC0zna}ksPRoj^8eDt-1b^d zC>)PJVM1VBBo&2f{V#IRM?4kjfUL30FT>o@B)#bq*$tG|vO&6GM5D^3ee@?_wSC5i z;Um}$hhrL?KL!xWYXixL1S>x56<4`M>p*Ut& zb;n48Cb)%10J-39YOh^NTo-UNQu_L&2DrGBH=0aAFXA2>zUayHuPNUo^$|B20Cbm1 zf?q1OAYI}ETMsiE7rHrkix%TO4VcdM$UJZmov9?JpJ#vRk+;7(h!mf$Rz+%~K+`vByHX4M6c}3}K|&=|YGv8B8J2i-ep8xk(-?ODZ^lO|7A=p- z`ja%7iw^mJJRRQguMbn z=xPD?B}Pf07Z-(^eO}VoJsd4m+9B+D< ziJkM+0!EZdZxG4ieJ;!kRpg)}(BxL!e%2q@_2Q_<@%vrub5IMJZpQccmSNh~&w@2M z(Pu(u$m@v@m#t_uW|Ryz(I0^rs!Dl%Hf8SKHWMB-MJiu6irc7KNs2=|4ah3g6lFtCF^stwx3x*N>Wu%4J&1iwjpJG5 zvjG+PzC%a#)zcYymt(%u8F`mJ=pWl$lN$kn;8q%GebpeR?7c5=G4?d{3-ckK_ieXT z9xYi|$|JWrWpubdI~gZL0}NP!G>Vu#cR|a%sxu1r5ZEOixVjnNYKwH778(6uH?_lL zNcC&RV}G0t$jrC<5LfM>@*79h6rxa9LHQ2+e>SLjdN6&S%4~*dg#%K+gCo2IR&cWGX>0Y20$v^fuuFiECPb_ z&IE&T(+TAR`<0uU>I zZK52z3!EA4iM|m-{JwIL727)YFwxrYk#~eUk4=5b)0zpV1X^<-m+L?0G`fvJua9U4 zy{I%S$tEThKY!lDFs$#b*XjGY8Gc)n%K?(?MsJ_)#kw>%p<1KZCvxg}?8%AK(DEZi zMTJh-#@_JH?30q~ozna;8By|DvTp&#g`V3ALuU2)Ue?@ALoSC7z2j5#DS=`Xs4wPwH^Ws|b7h)eQm42|9^f4PqKw z;t@g{g(@R^s46rBHhdJgPqYE1{J|=%v+WvARy$&)63sdHQSs?1M1;@44rnFhq|_s! z9N^LB=ESo>)s_rLCw;oidWV_aD*n7&nhRfJXF6J^G@mjiqp&S8FdjCcZ|+TJDtPl}=CxGx_o@xapUmahUoXaxa-0)}MAojsD`t6XH~P`smE z)#A#N!{4nQm-f7on_lV;U($dzN)ewiVr<+zb+`bLQXZa))Xl(x7~KvQgt@hs5v+wY zzkISlXBn_}`(TRY$btBQ@TlZ%)X&kGmGDe4pP_zv^f_T0Yubd|?cSk@W0RD8#!DQ< z6Pv(pnU{h&kWKLhG*Q?^OAer&8asn}qKW@2-sx9C%_;QZU|p#pI%LeKk3VP)XxMy+ zaS1v63Y0LeNjS9;e60r{J+<82tBDgWdIE*&RR8wK6?thWSY}B?+Pb2T67>U$P`aFui(P zIEEl1t82a5y@bS0r)+x@dL8pomxTu_GsKOO{0+XYa|$iw`8H8Ch@Pw`!(b?SZHUnw z8{QX)qwrT`D(kG^q)g*39Ub!RQ~53~TQ3o*PE&Wx;iF=mun`sc#k|(B*PgiRROG!Z zp=C8?3+S1=Ti&&Ng#17ZY&J-4BDL@QvD1+{8kM9R=ci-!aNnA`Ty>Hzu}ckTjCS$m zu`FdA-s^ZP(nm&}fDp!6jepD;`)-G1` zEwv2DxA1&iPM90`<7$vgXj-X*L_23Y$_)vsW9@2%yz?|CqNe=_mMoaF(8cvB^^bdP z++2Js^RUw2RwnmQpUi_Z1rVXidIXBI+%C+F$ zXe_FNc57bkl|-Lu4rZ<%wle2!6H)0`c$CO0Qd$6(Et4=jLr&&Zfdy=|sB>N9;|PjT zi{<((z!Uiej`gya_Zxiitb3KbQa0D*_Rqx2XgkB*9CgilCRv9mg(ewe9#od>Vx_Wf zp5!M|`-1#_9W@lEaft*jCL+|Zp}Vh-x~6j}JThokJp}nSpE1_(5|!|%*|!t#(PSj< z3x{2HUqH$2aCZ;IQ+0VOxL`+(SozXRMXIRSddFb5)y>Oh`>1*#Bz0JHz{4;5WV{f; zUm6ieyebz3jG!BwD8;%!f8re65UzMhi$ywoB;UtI@aWdrNj}C}d&o;q;1-w0Z$No) zhKDT|{)vwR>f>!rV|}k)=&r;{*nOF&V2nnLDM+XsNLO>C>+2UByx+1 z^DyQQoVNa;&}q%YF_7xRXDB8AqRx+UsB!*ne+>+zd!ZFPvOe4SOkuc}`YLkQbl>vJ z%X4mri`JC^jn#Aipms3IW>)0>Q7JfXSH)6es&b~Bdf}`2ASEBnkac*GnZ~P!5fqFj z@Jo!^Ucp}X_c1Fj@!T=E;T?z|y#$)(pKqQEYeh!3=lu>Cg?vXKs-{$xXs(Ah z{72k)Db<+4=Tb8C`@et`{4rXWx`v(|K9tD;E@mk8oDe~F_$}zNsNm+?W zPmbpQ*k$n(S^O7$dEbOB8TV6#7 zb|_Y(eQ>aSgZ!MB)sWW{M~e5FL!!fE0+uhEKZD1gy|lVw;k;!FWC2b6OmAtE2swTH z^mFhl3iNaMNFKO3#|oB1c*EG-B>5!UtL15JbT1l~lW7$ieb>gjnlnb6Hpb$@OQP(n zyNh{zuwHQIV-8wuJM7HF5!ivx;o_lERhdCDyVRXfm|@f^pH`bC3=vfj$H5(l`@y@* zhIfOsTQinCHGlUenW0WUTHrebP`Ln$X@x`b&1S7=wR^lNq9R4`w#(xcw!KhG3}^2| z5(9+QHTe+uffaqp(re-`N15a%8Ri5{r=Setq;$@JiZG!n6q0ebru`mANnN zeKH4<2uK(x0``*jr<%Rc> z5D9|t*hK^*!Cf#QqL_eD#JCd>5UM~B+_$(d)f%n4t;X6#Tx#r3t#xbETCG}1Tlb}= zZmnx$TeY@T|KIPKnfvD62NaYp+W-B0UNYx<=gys(d*+;(GiPQVbqocD2mhs=tJSTJ zjJPYvlw?7-X?~rkrodwt%3VC+zXhp_y{1or3Yl{_v`(PnigvK9?}Q=0tU5zpplEN$9&h3%T;nM^J9U}h&mDt6tjJ@ z)PJ_LR2f~X-HicPW^uO<8pN9CMT1V;GwAl2lQES4TS|t&pSz&Tb}Y=avN0cutix1& z=yElx+}I=4E$CW9s#vA}HMpj+(Wt|!v;+&XA`)-f@=1|xWYpH^1mgs*?}63a(L9YH zB@kmULo8o37snn6o2tpLxPnodyk!=0`b0Gl`GFNowk6j4t`7_*LOYcW8)@posE zi@MWJz!+(=ZY}hV;qd!Jm73;Jq#h@#KSGHHyQ0Am6J31TYc)=O{0LXV#xUpbmW6Y$ zmEEF4)SJbIWo*8T6+qKaQ8H7=h1{^@Eu3>C&b&HmzWNZh+F3KF?Y|2;UwhT>vX{!h zz7>qqif8Bb1V-sUGh(b}x@nCj3}^o7^9#WnFs|o>xk~P#6t{v`(^gYuVr0(;EyEEq zAyqL^oqz_hy2Hi#W5$8!bkU@rdfTa~$cWaNbUGZZBcwi|Tv{-pCyOGmM(_|EdIKR{ z2O-TJGh~#6y_O-t(dp+(92LJ;v$-hVLt!1=XU^d`2W;Lg2Id!j2yI`SV@1%502VRu zMhBGt8r}9IrbFq1tka5y)pkPhAt$P5(U~i}u+XzHPXs{N=%C&T*$uZGalV^;gD!G;+S3|JX9$WihEYyO$$G3lPEhGQJGh~ckL6e1MGob3%LwFS= z-b8iz{hHzIX6R}TT9V!OSKM!`bj0d|U+B1wv)r5LcToB)!Rk2mmv2IcVQ+NwSGZxq zqt*-0u>adJPMNo;Tc*meQQZ!AE!!LKzCkCgTW_>e7MeX>8-Eu`;dNqstfNED=gB^t z*eyy`ysR?=?Xp9D{6Sy}^dZ-DwxucDGAOwXyLKAPvEf(0p})Sm1_kBxIi_J&)1an= z2j4Q~puedI31@722zwsEX+>-acVhUWyQr=%3Sj*~&b8DlxdtQ=Zv z%NaXQg<|~NPTOcZ*)fnP=)oPic!@d(wY6Z;5zF;CuAg0}8PxEe|2wzw*x|1kf~|h@ zfr+Zm+UJ&y`QZyXIZboBmqtRZZLszd6sDd^V&xhUyq2!qCe}9&W+?SLcnTMm_AFS7 z1h(57L6i=~!VNAgSUw(gNDGEu$m3&zXiY7iS;J|+bcJ!2$*xsqeVJCzeGFL$C#Kh6 z(y^x#a#j)tq z$r!27(fZS;DCL4h>P)PeU4czdXD_m|6~;DV53kvNd(Nw2WX|nPvAq+=oJ*0J8A}_r zKPc8WJmEG{$KYdpws-rUzAx*1`kMK8PF`Y1+vVy2wAMBFX9fe|w~a@cS@%`2(@#{7 z2l`Dm!&Wasp-DTlUDIZ8^BSBjV2pP})Q8g120xJBO#==0?DRtS%ZFjquV=?rX^o@p zRL)T}pHJzme(rywI&3XwhH2J|SaKS%-=E2byrGw_)9c;HyQpCJJWeJ$xq_l-gn0=2 zkZ{-7L$Ta+r%so*A__n&rEuer8D^M#o8ZOhPGl}OW_GQA_70hh-4p_zI{;=2?XZNb zs1+FCm~NCb0X1!N*d4f&;!^H5cEn;@Hqg`kp3yyP^lbf{i+%11^(inW+Y5Xi^2A)1 z`QIgVG$`4#)G$}5ZilrLPja`EfAAGxeOdl0gSX!9OyKPKhvU3w-R&uSt|!o|Kwn2r zVABV%eL9wXU+q0e*?1;|Pw241*6FZVAA=3CVZ4$Z0DrDRhij?DU|VMyV3f-~r!Q>8 z6VtdCuW_>SVs!VohpD;>UtVlpEr-M8btmNIBJA`8L5PEzBhG}dgut{rW-Ug+wNAIq z?L;q8A0NlflV$fMvvc(;h2Dm3@I{@CsjiFJ=5Q^Pi4=X33k6!?qs2b+FwK7ywm!tB zWLv6~OO8{=z@!3qMSWb@Zjs(8jXjYb>eK6_iNLZI@IZoi)gDL%L){+V)DvLF;W4+i z{z<`{983}x7Ck*vYy+3B`OeUu)||7NroPsp{^vLGtb}0_juc$7BZ5Pn3U36cP-Bl- zu1<LMDO{=EGIPUsDXtU)Dv0n>$t&c=M#>k!t*nnsD z>?2?*lhX-hTlZ>U^h8)Bwxoj_7y~`ZrOOwMR~IDpJ@KYF(BrKmAooXfSXtUr;L!%Cq6x$_K7rh{Sl>&v~=;MoD@r-(#{GkZ(bA4jX|Y_32y-{2?3X3Ay~{OI*a zYMfeJ8RQCe#(dqn9?y?gQxA)*{2C8dGUot_aylzic`FvF3e*GJmwJ0WUbL;c!L7b| z3)J7hakGv0=<)@u;CI4BL7Zvhgxe0m@dseT$kf4A{5Vx} zNgTO&>AdBOYUM=uS(azjdjaEXqad66@y(1c4P0~9LKu#BNkCh2c!!;7j!@qQ*CO@W zak}|T1gGJH>KA+)3?=NOt>UB5PSJpL#J%>D=MaBi-$I<#Vk2&9I9-GctHbLEvd+ADGLqjE~y-cgtH-{oyx)I{uN9$7S ztf#CrUENyeEkL_E^>B_c)UZRC8tZ!=lB=p9C6fp9$e$;oNlQg)zpI`51h+BA$Ov0C z5iw8C47~&Fw@;Ax3M5_%DaMAsYvCm;n8w%wJ#P^>X*;kv&ju0Kbk2z`S3iSL57u=< z)T;x-Il)s$x`?DZQd(|-H7FU?U2wtCk^ni{d|#7$X73CPT(FitpUD%gqAr|f^1#>rC7f?0^!JIT(&<&K?%JP`%{zyV!$^Qz zm`nl_Oj&dkDqejuC7e}O@tZpbn6wIrtfguxq{VDVu7!s)`^Owg(SRewI#E<3L_}>o z4x!5KFOCi$j;4ZF%+~s3LQs6>`-8nrzDPU~C^7Qd(UBa<+uzvQ`GlxW)rCCrj%h@% z&bGN@f~O*P++FlV8%gv2O52pxAHgKn!I~Rgy@yhul6I86UAye3T)uG80*;%o0`n?p zc9eb|RC%r19m&t0eaPX*EnhTFy@p4Z<5{&S1QGskJzlrcWp&8lTpYAWZ)Cn>c@>{R z8xnQbZ@kpg+SMyGdjGFE1z$4%P?el%vMPchhjyq}E%b$MA#dMacn$R*7?vVQi<&DW z&JpTcK&PV;&pF7{+7bMw+d=Me;3ex!)QKo0CsiIOm5SDdIuUZH5lZ@T=c`LTmWm(+ zcc8qGD}_9u9Y3sDLOp?$qz);mw+jRuhcu6%vcmh$U28Hfy|QNuuhU<0%XMlksJ=U( z)}`x1&T0z;BiNGtwafHN)WhrYF_^+sN2qh;Q5XTt4Z4w1AIE5cty)mStQFk`#-q@v z_oZsqI97%2M66Bgp$~Dvxfj;E0V^y8g4`C($9^wGGL9LN1A440SL;*Ap z3@Hst^@S>6Q#ihm1F-s*fw++`@TryoaKBv|NFL;fy~WG598g)&ynGRv_9}d`+4P5k zRvD*GnosITG-y1;zT4)L!AV?1cW>dXU~bIF*)9MXxi^}t>$t#dj%0SR#n`919dOp@ zV>C4mfzg$gP6ixr^rX8Qjb05r(w`r#+pTQLJq=ah_EI2*)Tx@mbYEi(M=da&Xp70S zR_2@H*5Gl7bt41r1%qe-y_TL9i?SWQD6-E3_Ru|4r>)C#?B-8(wJo#SJ;7)sc3W9y zHO%BlH|EcRif7-j0o)**qTn!&V$Wa3&ru3FN6qy|k@E$u42ic?U5x&ZTR-evsXdX- zBnrg8;lmxt^6R$^({j@G!Q-fJ9Mf|`&`yPU4g-mYk5I2`F2W>}DnX{fh%=!es~|UA z{Vp&3-a5%7)+`hp7C0?mu1-c?pr?)jla2vL2rKNu46RVFYi8m2LVXK-N={VsCMmUW z(V+{~Ve9lRevRAE#I1hjyZZ&Lgw&g;n^~q%jmXum;)`&Ex(%N!WKntyJmt(Hs~zL| z+whD10`0Ydl{Fk-;-rrIFYX0LnXaq5b7k33#&scRJrBh5JLH|zfNw(8uZ=sWc@ zv}D^wVBP->6^Z{^kniHO4XiqO4b=!v2OFs8@Ny_z`|5g~7fw=|%-pcG5o7EZFyTL; zy|^NSO=ffSPhbRuFv2)~>4MoSu>BCPA@h?8HIFNW#-Y>z1&)wwruol*U4Qpg>~sY1 z6;&@kzhWp+83V8NfTd3Ao2ToB`Wb)IYJkJOisX!>Qu>(D@xSYei>IO zRkG@mq-r`Sp;D>T-})={(*-F+yR8sy{Ip~w+5{jvTDl}i?bM=Zx1HqK)R3fk>5qz{ z4If}$n%FmuA|aDW0`Fcv=>UN`oEki8yUrZh@30c`w9oo0f;0HV4+xz$Wl_|ft3wA_tZp4-v2q_sxmm0_9XucTYmuN7 z>pAl>w^$*}Db}kdu2U=*vc(Evg<{p+=N4;k6zLJCSnbGCP^>PURemk?p%j3{s?k9f zt62wGtTuz9Se+7-Vy!eUbBh(ioMQc-iR%>0g>11xSfNpq+u0fS7UHsA zmyGdJxrILqgQGr7WmNjoyU=!E?p`w5t4J>a(FkIXc0XQzAc$5HOJi&==^b8Fs)I47 zc)5y;egozOG3@XC(k++9RPL{yI&f?(mA>L#@Gpo1cJ?aM^L9(B77!ylQmKl*AlgCf z|I0DyG{Rj7@AnKId2(0e5u1bTcdnPJ82%jChs4$W(nr4v{y})ee6O8-Gi2A^JbodrgHvF?L1m+Y1hpsQ6Uo z1?N@JNov?#a5?QIr z&5rWbe)!d&obW2IxY}2b;76iY+a0LpItfbU z?e$}wZ8k!iR0s^cf)XI80;Iwdqv) zxqI+2Nqo07l|2S`jxsMKACKCvv^@L5un4$&Y2Vzc2srfuiXL1dC|Z$V{fxvQ5fmLD ztf1&dI1m)M7ac)S2OHs#oRZAF#D#UQ+JuPr{AD0#qKY(r#5_opgnbwuLA-wn*_g5r%c*Ymrj!HNxdAjry2={gpu2xSXsOTE3~KV(ZBHZ4g8&pUwuQOBD?T< z>B`HEgYmcNYH0Y`m?O6r!Q5Csm7#LA7ZrK-(7G&jti6a)*XF2e?Iob-+=}P1jaV~s zo?TE;b`Zk$qW<6a{F2OIM=4-10Bm4x)%Zd@V#CV4!Ah0=d`{sFWq^?+{))h8!y5vD z(P;<~7^)k0tiY%N5eSTC5>{X!A-O^VBLrH3;eug-(Z*LTOmn@Lw-xR@(2Eba;n7YhVN2($vj z1&aiRy(yiDe^bw5cf2&(vv385&66uIEanP~5EclG9wU~n6oJtn!eVzvV6@{C1OlU* zgcTV1R|A2;U5HHwq+Nm{Flv6HU&t(&QJf1|tr@}!3Rov83i!1^VAM%a1jYv@byr}7 zFh^iio$M)Y2g=I|j0|Oi3ohPDiw29a#aq$fVu5G~fd$dff;?K$aIkr)D;io2=86Uv zb40_1CTbuWL^8DF1%YJfGK5Hm-0QewB|{yEKr*zDu#%x1yDIPsNrn(;C4&owB||%3 zWhFxw2rC)X8;)eC0TD=sW)Oj7Xaiv-Lnp$4WauGbB}4xA1a05JC0=Nz$XyN@Zymer;~shE`~jp+ z4OOFq93nPLFw~{x=Z+>NSV2SS9v>bJ{+_7@K21Fp&n@L!?Zn7Dc>mks} zbr%fF^)|lB%JohVR<8FTT(ss1|!d7YNHNs>flL8W4p}0EmED+CW%l z=|nhSmL3w8S@Q1}n57ZnfLU5WSY~<4_9!& zUz3Q7-K`sh5vsXANsvOdP6uf^Ytcc<#dd>2E_O*!XIsN`KxQaL>-H{>s3TIh4eGYRz+n}S#M7}Z== z7YUU-2VDdc^%@;D@o68WHj0C9zV$mOLErOw1(t~8;SEuFz$9N?grA@C@WNXFN$eLG z`*p@%*ftbzz@*^-#Lg}7)inJ4w-|dbKoWc7SEzJjPTIob^IC+ePyUXt7^&B1T z!6WD7W2*9-`124xfd5v^tNhcoen2RhMy&qJ5MRw2ij1{-{hr4E_isunzuBw)!+0M@ zbuq(UzvjRz zGTjhc*IpE=O=ZVzP!o=1X&iYqDC8j^yr$tzg%mB+y z$b||?tf-Iz7Izh;klSteLT(o-O!nRgD7KC<>2OT3buxh2RM!ujL1QHHX8vYL+M$C3^Ar;sQjTY=wyhm&s>QQXfM{$ zA zUEs`J%q{{Ju?zd^MeHJAlwAajvJ1f?b`g-KF_&EkI$tM8cCi;jWE-I~L!Ix#RylcS zCU>s$eTeP&WAMGo{v_I{@AWceCq`TKt~ARj6_F*cLYBOeg#emuWXT?o6wPauC5*BD zvII{BvV`G4mVgLkN#h2SB}ge?j%E@O=J?Xc66XD@E=%TY09k^13S$d`5irs(A!eDQ1}O#1(M%%39P1%VI3g%gGy+Byjet=_ zL$FBE2pCl~1RX`A`z6f#f2%BE&m-C|5iHU#Ay(*@FeI#iLD=$82g8AYAraxBua1CWuQb|OA@+qj zE8Q^)n42M7_V&?PS!4vvEQpV}+ z$wo32*@ze*QsS-J3L=<_>>v@Hie&16w<^MN2^gJHw@8k86IjU9=c8;n8;b20u8$>WimD}H$ zqpAa8=crl`4(6!ZN!U56E)vE$ULD}fQPqI3b5y$YFohsseO_J6oujh&5CozVn#6)R zDmP-0b39`f%~9DWHb($u4m-ySXy>SGOn2tUVl0I9c@1HqIVyW+Hw5e)mBrjSDvN!t zH>vb0jPaXM)Aa{>@zSzaVF?0JeQWtMnA+(kzBR|7@DZSeAb%hl%3+8|%RnOtOlQ#| z&?><+Edd<}21>OXgjK4!gB+z=2ZC}`EC4Mej8bh!*vic=hOJUn2N%oDuZ~jfg&K}3 zRbpRAsh$Z@=QZ`dBdHF<&p+JD(wbqbqE%(xa;Nw+@rLAXx$t^y>1QxQRF>*Rod69-12h^io6lw zK#{kC2o!k-h``yT8-!KlxkDU9UPr)U%q0CbYz;=Qm5YbBv_fKQuWtpNL2`#8+Lg5x^a*KXcxI}Cz94M~ZvY<1IPy>}-CbaI0^}OWiijZFou_C`30kvO^ zyMCKYu;k_NN@QYMMrY3ghue!R(Evf5b=RFS*@g*T<@#hm<(AGZsM0c~P~nY&BxsrK ztLO0Zukrf5)$Hr3vV95@^4G@LM!V2PWfJY^)wI!L&_=ICrt45yK8Wlk&T4nb?8ca< zZW>;AKfzHeV!2#>1k_BKUh)`R0a^8UFn#so3Dpjwu`8XbIByl)0YS9X_>Y>mD`+oRwdKDbXw zpY+vT7yy#^b;%~_#COmH568>mexE@{+>9m&V%sa3pj>GRrWRlgc_WxQNm#+878hDi z9mA&ev?9Er1XCx{T9?+dfd!LVf^u5HR0E<&F!e?a6$vJ`*CN40a4mvq00h$$la*@b zD>s2)qHkO~2>;sA6?Bp7Vz?<)A+B*tQMF&(B~E014bsZ4gDc!R2&NXD6bdSWsU4($ z?ZEXBOiNye*27~BgT2h4TiDiGu!qB&l@*j&H4ML1m2m|Qn|oB?5EFqD5^Yq|QPD=M zNVEwkqD_@?t-ZZ`Ch&Gvg`^kPDMP;#{bxOnw=l@LA%G^ zDUU_`Myl>iYH#G~SbE7F;FKf55dB~c*gEQiRvH_Sz6egQY$sjX5H7O!Ou@57_8tKv_8ww(bkd2Gg3(D2iOA?= zJ?uUI(Mgy5(a3w$-a~ec+Ixr<*?R3a=oy7Ov+ItLG#anP%h+Lxx|J<~c#uU2{f&4)mH7kKDjpbPt>WQW zM?5fW#RI~DctCgqi3g+U4a#F2iWkrk*vf6&@wMK@!t zO;+SjD9DOthK;OfN7%}WZiI_u#jX%#MO_I2BV7q%_Uq>%5`(YbNFws}zbvw%m3fcK z3XWx>T?t}ET?qlBT?v9kT?qlBT?v94zAKULyBCaeC>J>@U4j+yJtVfo4n}{&&Y||o zBM|JKkVgmgzi0P^-yTuu_KY;yRO!26PiaIxS(5Y*L9~Hrm>y51KRO6DAQCs>&M$E% zhmpVdY-|ooW*rFJ8JRo#nL_CqYM6@E|69EmS1pVI0vJp_L(vm!2jY)2dk%Dgz_bDP z98j$c%ANx?2nKr&G?TD<4z!T~SIC|Nogl~!vgbe#32=ezIgmdEX%+U2z?<0zYy|4( z@n-h@S{dcmQug^eBv`?|UN?fakC!{OAjIns4up6Mh(L(9lQ2TO3t`)g)oD&Mt|1X= z#_J)(xoo0nzCyt0e1(9~`3izX^A!TJ)wl}^2s-t)j`I~9c17I@h-r6%f7-|U6j8mV z&3=+p_um5B=wL0kn^9%{khRI}HpW<+-0nmKI|S@u*vRet=>@snh;WhIo`M_|$!!56 za+{d_;H^k0klP(3A|L$ABDcGl_o&=1VUR&Si z9QuX(c)2qi@qlnaJb);O2NG61AZ)n>=VlhTrG`X=Th>E7(8H@pJO~&S4+2KT1HmHk zAYfEH5OhAyzg9eS--x&2dP^on&VqR0X5Id@@8`WU*Zl58XfUAab!loLDdiKATAg%NC>nH;(`u?$U1>e=G}^u zNhU{Z=2o1zSRhV9pcN-B7>JV)XvK*OIvK)SwK%Ca`Jf5iy77iEOffcm==T! zey$`?Rk8_m7YXafqP5{wC*t$biGe4#zI&>*AN!+bFH`;(Qvtbt`>9sTrK9l$ztxCLYR4z z?8VZIdJgttX$N85$aIiyWa?Z&xfe@~4stJ+W`n{LtWARA36}q%&Nl^?^#luH&R#5| zO^!9#p$Mx)SF{h_I!}-utj5V~&V5cBuujw_YLfN`yvsi9V z=qP)aop*n<8J9Mq9!bc!^mpd@VTcioOIr~m7?*x*VsM-m?CKW+?XG?ykb;@Jzqz2) zA9sNZfvi972Iqoq{c&7+{;g7DYNW}gO22>sXNM_?3{rbQG`#C)WRP0(4G?ya+Ct(c zGf3?K5e!nh^&LG(9d?U;2fGNtAT@V^Gf2(OhNHna6Kx2i{n_6rGxnlb2s~s=JTo|g z%^4n-`C0og`Cv|EY1yMVW}v|&DA*?C==9l`O|IjcKk~T2?r64HVRFEF3)rHLF|6$( z%Prt9HqrR~8dC9mmRrHQptxi3JA^>H*d_$p>0b+yGXftC7YuwfM6a|kQ=j=`dh@iG zylF8zO2zf&IU*5=pDhCM^I2%PevqFr43*LoxgGB^-(x59CiioOFz0jbV&XcV(}nEk z3}NIXgU1SpK&*f#&7(Z!0kK#C&l$+6 zfG{K#&{e2_znTZ!3J76N1$=7aR>}LMIk=FmfDmRYKxJtpJJeJm#gxA}#;V+)(*;os z8qLCxY|!dLG@{7{ts&5g@(^f6xeErOJOo-%?t+decV_R7LuGkQlkPIJcVo1^LXqSm z!}~n+gmzT*P3S8SAv@}5#0d0N4PpfPN~fTAoDcL>2(*O^fwqt?7!)!D+CsXZQ^?%v z?Wli%zG^ll5y8|BqM;(L^;I_sE12>ZgRp|B8AKqM+Vq{Z7*#tNBM?kKTE$U^z7D~^ zhK=I=v&Yk4&s+re85>V!zaNR&*q%ydu84s9OipE=hZ~^1r(97Ok~E{2WTw3#5U%n`L|5tZ&ie$-`1aAY(KxZ5x`K2G`~-FUiTTzr`HMQX0n^^j&? zq?Ls2i`WDynu5NF3l{n!d`$O6M1tE$9DCudwIab?&`9tIBts>G!3EJua2so!hN!~q zr6G~v>RW*dvv;Yytq2Zbjs&-O4uQzB9zxN_1+x-7OU-OAYzPTAt$0RMlMAA(Zo&8^ zjB2v6vI6DZf@z2mM7q?Va1GnVb+@OPgq1FBB&>Al1QAG=9(`vm(k1_GJZq(kUQ0}5 zVqBkm(+Wa*sqE%-kg(kwH{(SvsLXoMy>Vj(-J1}P(95u4Qalyn5rPpOF_2r8x{^f8 z+xL+9t8WcerG_Me^sBmA#_i(UhhE4%8zL_>ko!Udv0GuU;rc=M+i6IcGIw zn}}emVM-2iBTPvs%9MfyO!*3gk-bhupke2DY4#3B&J(0O%e+o`W-fwo|IR)Yd7APq z`$z-~|L(u8lI3A_%;f~kDNpG<<*i2*)kf~z!-0JW#ie|uvB1X`2Ye9_v z_MRJOz}rnpWE9y2A`qv!b`VyaHi8JmX{)}o7IE6a7)G4t<~km{lv8{|m|>*HkLhvg z@!JX~7-1Lzl21#9++8UJB>(*z)`jzYlsc4)93@Ahw2{E(ELk3jVlP%Z zMO&6fqu5Kp|H>m$*zI6;^${tZrbHETM9TM3yi;o{cr;24!%I>XJZz~M;SF#UiY(@7 zLt6iyBT#6}{2WK1bh6;~2$UWW#vLjD0|vz%sS&}z9jTQBl11H6m}IFz*b1IzhV3Lv8;OYE;ixE>WU*{5V3FXdVATJ>h7|u&e}e&!Tw!*; ze-!Fyiz|I~C4SrzKlg2OV_88RT^FM|dKKzO{L=5#>ZlX->i=YI>L_<3VysOaH6wym zM;#0sb);@8sG~-NH;g)JM@j)#bdiW~#g|1Lshg4aub4VI4Evtfpj_lAt&T`M_T^Sb zc3_~=$DnwfrbLp?{?3}kaZMD?8AC;b4zbqI@b z?oSxZwt(Oo=6_(k+K#Xo=l%$yi?O(dnZ`MF3yAeK&ixpJ)pw6>D4gVqiZ z!JxGpgkzkm;I{U;4rKY<(G}d?zK-D|QWZR(patQ@Uwk)v(ZKCUE4vQo5zyN3PuBT& z>!c7-meb~LW$xE&IV}$ztK(yj8wcQ45Juy6N>DVe`jMk?>quCQ+e*S}+)faI##R64 zYFrS-8n+dwf0xm?os6P2uDXpu(YSR8TDOK)gssNyKseC2-5>&uo4dWBaqAGa8n=aE zt8v>&L}cq%N8{3f5On}1=D0P0l8ans+!_WP1;r{$HGT<=+ZX4IAA_HNK|#wti^yKn z)O*Z|j=N)74*Kl1KLY+eYtXh?4*u*llQGwzbu%0U+G`pD*7Yxh8P`9HO+~=E{<&C@ zR^AzRiw21TMh1z*Ea!B&oTKh2=A8A=%Kxdpnz;VeFz->VT*4~((s~l7Upfs_d?*(= zPitioPeimb3&~Me&K)EQh(Tib49j4EmVFCJ+lxa>rdqbh;dlWr9HFulqxPc9g1;(a zFd`T+7-=YEFd|fBFcL6oFcL6oFd`@e_Vqo(6E;!~fb7LFzJD)Dz=4px2%-cW5ZOyZ z>$sla8b}RUPjH{QwB_m}?Lhp-#o_h#2iu z2o~v7&`uofR1n)R;-u4Mke<~r$a-`t{-fd~f7e$|oTN`e*Ps#QBIn6^0(^G4s1Jkn z1O`(C3+o9w@LaH-pc{l;PmsIYSx-<0B3Mt*0wUOMvmJz8Ptb*Mu%1BO=L})!h2(;@7 zEa-aqTa1OU>j^?wXgz_wvl{~cs_iz#KcN%#9IPi$_sZCn?v6D&$SLb)9i$&Zn-0?d zpwpo6=j@SSXlGgRF?cyuHWIh(CD>~G4n$ms_qdfxiaaiu^*g|pu;}UK?*nf?Xa?Rb zAk4tKQ-U(^&i%A7@NP!fs=_ve169}wB2a}rB+Pn(d}l!wHZp8gVJnHxuL}QDl5QPU z;pZE8(`QC5tfRyDn$upngPeZ0Oz&gbONKWcsKBB*uqr%QGzTW&f8`w5NRwTaeG_H1 z*MSJIWEq(YGw5anPpu6dswr6HP)%YRV2&*F{DqiFFc%xnzh|zDpKAT)%0fd+;{pGm&BVZ${4D7@E116`Yd~(xhRxpx!pTwa&gG zWUUkMD`BmRIC1TFuW{mfGN!7ZABGd{hr@3FgM!`uYMC8>3P&1$+6Q$X^U@Fe4x)2= zRDHs$&fNS7zKFR7;Qz#dRiUGViA|_Ug^m&y3`Ys8va46o45}}RqltqmDxN^{tw?_2 z;PT9nT_NGjHJbOg=$9F}EBmziVoJS^?UzZsO%Y3R|N6>Iqtm}<{56hjGQV=Z4qX&?zP@kSB_|c?l-Pu--YWBw6LAzH z-kd4B)`>`LLLQ$i-T6n%`XM8zo>ZE-Y5}psSg^u6XA5#J>-hL_?rh=?HQ9%pb8T56 zJKXK}%{}WJY)f#*SxInkrq*GCYI%NShzZy!8h=Y_J@S;f(c#5jl4K@(VFVNBw-cP> zpc#=gz{^!#Zx=KEZVh7o(#@PrAmHWQKCM3H=$C6y@C%%WUon%7hm16 z;-Le8_Cegwe*jPeo{k;>Bv|wSplOI0HMbEfGPmsvu*iBZV8nV)%-UnSQ7OS7G&iAm z5V{`bw*TlHULEuP)w13XST)U8OVG^xF zQ(|5kt1kOE8dKZ#vzwuU>_z60IfqYCQT7t>q>|Ap$5Siq#d43pu3_0p&It|n`Rw=z zIEn{LkBoxX;1o9Zz%}9B=z(hlg9F!aP$oWZ2R>B&!leGVY8U6@Hj=O(w~d7TxZNQB zw?8hwUD3xCaNRyGJK}sk^l=FmeOv*fA6LNW$0blY`($2iEMhYfR# z10)eo7Ot5JURvwP!p(>goGjc1B3KRFNg}!$m_xN90W4tjq%4930USD6n60+xWMP7O z9`uZ*5M9hTPZs{sYfy~P@9U#SOidTkY7YLipOgRe$g3HVns8g0@@wd z_#`ia{}nT&Gmw#g)eI?kmnRFipr#8a3xhBx3wIHBPZn0YqsP-|jxMYLf%!}5T^Sb6=x!$4!#ri#B(3TGB6ge#~YVE5k!7D`nhM| z=(X*-;3-1l3V%R)_;XlrK*EoW5mRFah(PXigRpYvGE)F%!g^-7nDNZO-Q2s_$oyv} zItM(+!|?Q(aDU9LkPK^Dy0)~*=BSi-VCCwc0RCMIY+-M@@`qsMOm zfopU8rfi#0>FMvICF^%-YhgQxz*;!RM0cw*gz4(cjDofBbrUy(q^-5kV(gs;)r&EP}NbTFlK;2$MWzMu5|L-H7LK^}=uB4w-Bwg2|BeIv57sh+-|g zGy+O9KD1XjrdSIn!CL4(UTDTrEB#Cs*pZxQtc4Z})rt$6TA{UYuzB9K7P^?R7P^qJ z7WVpMTy^owqSdNo1FFkd3sui*tcBd>ceMvV$+o_%L|$SoT*EHlvaPR<2CF#&Q8zrn zB5ruo5bs}S7t9^$=z=;D5nb?Qu?w~^?@>bxksjuE4V7{MZj7-9uO%z)OV#x9tSd4)5G`iu5SV6Ep~5YhfAv2-2OLw7s)`1DwK zHcJFWWHyVK)jkNyC75WRW6=KX#ZpoGG$8r>wOadZ5A9_WiD~x7gbAlsUusuvXX~7Qv)h z%!7Gb|GKG**p!oD5F4?6x`B)+7=US0Rq6ZYF(Vubwzh07b)~K`DN;81Z^v?ahj2!JJJwG&+-(DaK`1?XJ9UsAy*)Z8JGMR~ z5$Ms|sDs?0wN--R(fg!%2fJ`~E3gpec=SGR;?lj<>?Gzw_VExFc=Rfjc=$SBRsITp z9;!frJm0H4@Vf<~pgMmA<>fWKjvC|>{%5iDB-CIBGL47g72`qlfZ#y+4^TjLKS!7Y z<=;*ARSOBUmzld$OX~~XBzl%=9IM-00&cPsn3T)ek7pJ@ z_Oz?7^m4hk9APcsidb9~qx$5cY^9T~aE|9UggmndMqDm66mq#FROE6gVASPOK=#VG zr?;V zoghqe?9o9s$NVn@WpixQK{m%$gQ6fE68zi__D*xOStJxKzhJifxL^7G@A>LU{QPp? zOMHMp<)`?w`}cutjJDbJ149e}G3N$f-He~yX}Qr5xT6L(|DS&AC^R^)sn2~$watzR z<=6P>5%;6Ri?aD!`tkI1wA$RGAo}^`(rjBm1kJXcglV?lF$sp6Z3r~Yc3Y(1#Ru7J z*-~pBL;C&w5oxy6W)Q*talgAwXOiD8*!edETCNU(maAPb;OY=)x!MICuFlQ`Pxm&N z5c|krKh=8$#^ElAR{6w7Q7C&fyp?P$GVKoc#Y=N7@K$oc9gl*yQtm{cRpu>}e>?mZ z8^xiE^dK1f4^9>M1N_0cGhbKgeFKg|EPoTfzetavw}Zk(Vd)R@Ga@})&`6IkB+|o$ z0_hO~Z9RuTThA^S)N=^5_3VO9Ju4}|0j2;H?m+=u&=epHNda6aC_o6b1qgw*04^95 zAOzY1xS(4Al{*K!{T*XUK%s?3vZqR~Sb_C9z*;Anw@6gYT1q-4`Nxr$S$2N4LkE)ao$GfAqDfD3_^Z$qHvTNe!Y zHUwI}bwP)3v$LJ0`ND-1a2?LrQ>F%P?R^^roV_$8Txg*X7rJ193oRNIa26N+Yz3SJ zw?ZHga25;+I2SbXAq<7OM|?Dp4{kgeox9ttO3Y|I6D+D{0i*Ry(5YuF;Oq-S0?q{^ z1z^0$KCy&~3Ls#VQ3Q+@fM8Jp1dJAdpj!a+w@-mAQ>#oIx8{-s>x z$}%PL0Qr@xAP-amn>?uG)D^zkR6D9({wPloD0u)PVdZW~<>gal7>VqbhwPX>AFl2A zHC&E<(-jCjPvSImm6B&7dR`}x$I+)=b;%Zc#MO7<4}!E#v}yGV((2WEwa&_I(zlv( zV^aM9zlLP2oJXfN4#Xr*Ce}xeOl>uUoXXNk0!N*TJXV7Od0eN1l*g?S?0p3!@2|~U zHp0t{2z4PVLPHouXeotxr%sZ>yhjH)!p!ISP7&sn?Ya!?h}fh;SRjp+xDqttQIu-i zT)!6*s_Yv5Fk1n<2R4$8#oG`ga3$yh5x5fM20N|R`^*syYMuu_A5J_n->ofIO<##^l* z?ee`#oK*ak8oP>a(c6M;IW2{Vgt+R#nx?zG(9BpLvg1fHlX67-y~Es z2<1Q@OAm z*~P^nx1FhUF?S95>FtaOw*vh3Gi%6QEbx#Bf!0I91&cf+u5V|;N^OQ;a3);{v}?#M z=vv(^=Gurun6|oO)?!!G{;%8lCZ(p~XFVh=wjHt0hRQ+(i@9&InER#>X5N%ufVtv2 z)N{kYSVkPzre4c;Quv`kmM1bQ`)9aN%rGd2;)puDcj<4#Ae7JVBk@Muo$lNFAMhP= zAFjSN_b9|+qe+iVcf`u{i0li)5^81y%&m%m(sXm9vBqT|6P3DW#Et0zlJ&U;6j^d} znt6q|{$!-DCT$7{y-Uoid|;lD-LV+N^-fjF%6m$8FE8SH!OSGZ^)pzo@g0c%RIX$X zNNx#Mi{!p}-;}EURh_Q}OhU4Uc-7nNn~znue$F@ zPE?o20raa7@RuHg$lr+Ns^O*AZ0<7G4Hv{VmCeA9G9Y`94Q==|jCqk8^P*UF`kB|z zJ>|!{JeJWOe;}6Z4L?n~bM}A;+&ODTfUq8a%_OYHUmJ+P2n^=7|OrF0?LtE*QA%g+S}F7Xq!zo(o!+z3dFQbhet83Cmhx7-@Kaee z=3;>w3xSRr+q9s@MwzsjKdZ*RZ7^4jxtOcQbW(U&t1*yPjs3u+;^U@OV=kuEm>gcy zXrc~AR5Y0Z;!Ar3&OI@`DH!=B3S0!Lt=fGIWIygjho>?E^|Jb zJByMCmN|ncEOQ3oEOQnS!s_59oOHDjHX4G|LZIOqBWx@vF|S1_UwaMOcQlIp0|=Wu zwn=RUv1ETNHaHXIZv!FaKLX|N1i@wAm59}Yu#`UuBELCe*=631B-Xe5N1^=fe30co z9p&#LVau<^IOVSa;gr9eySX+4TXLXRDbli?#6fTkrL^n@5lGAYSVvm6kg(FS6GR{_ zZ5@TAr3FLM(t;srX~B@RbiqJchQR-@^E-1J2wOK}BLZP-QSwfa^E;bzk$*J7K-k*H z1+>C81X^M1f+1mRZ-j)c3mRc7OC54sfDaCU*5p!$IuOCvZUON>_qCNMpmr3!;X0#$ zY|W8Vpp{DIuP6d;vz_f7KBAIoD9j(4uX{ZP{fx84|i!pi4twL6_DcKO1N-<`$h4UKH8@f@6dA+W;bT zAly(q4$Uw?Ro=I|uSVBHi*Dh0l~?Y8+3`jYJA$}smajZ^f_s5jxUa9C#jl|sh=ygp zx(&aE8_@%Q#}W;3FTrhoD<3|>SJRi{_D$%MSB^Qx*WKf{VO=>7`dV~$4w1Q~e&v=Y zo5&l-`7IKwE=j87I1F=gsgmp8ORJ|};?QNlt~D`r3Vy?Ko;P6AEo17U!%Nh#_dTz= zVcVEG9=~B9dHq&wA5;6Md#Pccda!5vsvAGx!A3~O;tgIC$6^&POiik~Z7~A=Y^W@t zZ$a4lc_Nlv?qDl~>A}{35!?G}9)82ddWCoNMNF@W1OMEr@u&`Sarnh9Qtl4iu@{>k zz?5PiM=p#t@HFED5Sh?xdIa?la5YB}Uem$1B-MrZ4O{9(?py)%ao)MDU<}_{o_P}J zQGMcS*wbE?mLz+zsKcK3HV@5dO8M8g>sOG$A(ApJ4+EY(Gp-h~My7ihj(v#qbEzS( zAnQZVz#tK|tx7NoQ+<9bzd1QT?FEq;t)TRg6kjBTJ9 zh{kvD5d+=F!5!+k58rhUjDen4^&Fm1Rj=T$SM_K7ja4P^fL~RGzwxS(_?xI2kH5*P ziTGPmwFmyDs`kgy)RgLm!^~&)&v&$ zuKp_I4zKA06tv$_s8fkL%^R3Ew;w~rcul1pdXtV}fA_L;$`fkr_w>Vg{2LaFRrjvI zl%)%zVN3?p4t_^)`RkC|5=?IfWvRA~F1u+0QOdsJ%?|70iww8=5VH3!V!O`gX~LTporh7aV^PCw0`o9`key+L6~Z z*A}%jmfIM~O!z+H;9`p#RvsHFw%`j4NOm8Vjpd|Lx(rCMH!K&+NTs--sgxQN-&9Jo z1f^2i+)8=MBo(TZR}IJp6I6-|29+Xt{PYKihfDHU5gSr)q@j-Tn(jeCztsk2*f=Hz zy-s9c*nrp;s(qHfi+il4yNu`cL^Gt1;`f!o2 ze!2kWlW7xu)r#N5O}y&OVM>{Y-$V>plGBE-?(z5a#7>t9^STJS_3{U)#rj_H|$V9Y4PPvh#hl3O_zB4K4BM$e2p*i2ge~6Ddxvo<)OD z2zsa(dPhUm)9+L2I{YSX;Z;BK3vlJ5Iy~(;IDFv;9JQC61h?H>YQ!1Gm8gd)h}4MF z0e6W^O1<@pE~iR9#$klF`e-`41FqiNQy*@Ng>d5?wW75^*{gU-bUCUlc^ZghT+hKRO=hrpx5c*0q|!>L(>t;t=#cD)$;2 zQ>Wrr{|UMi?smdNwk+wkE=WJ6XHj033V2JBvj??F<-rb zUp-V=;^+k4eK!6)gCABOdX)#@O#v|+iCaP?&O6Ln4bO$ClIPehnTaQUJx-r5v}8Ze z8`*q4D^1HTujvJ}&^>;HcxR1l4c#~p;Pbq3-r#m~Vzg6#^|$!4$@-Eys9cpiyat{@sS-A&%5Q3gcH(w^!9KHz>m-L|4cWHXg zU4>3PGh*N5#%V4X?_}M8C}%V50U=}L^q+nOOU!uOnw_i~wBt`;6#=pLlcg&6v%Lz< z6)v1=L~}A10wwu{0I%#W#AL%Bu_%emXE{M;FB%G#&GJTthC>94hC>3%a421kd4)D) zXW2gZ@_VDV*2Ro2!C^crVMEPrh3UVW(&07o&@O7!A*JP^HSz*R%>)FknLvqA7Jyt7 zmwaVz;m-;MASiYMu@*Jr-OHMcZM_XdU@ht*VQuSbYY>(n>p*--_%UQ~*Oh{9D*|6^ zs{~;fTDyyw^uN$rL|rSUEtd-jTGKqewd5KAS>`o;1aY+`My1PUdtzN|#phl&AHIs) z(5IEe0&h#1qVEBLo}%o`yp04oMc*PpnWDD|_eUV&>q^MZtGm&plPFX49Xd%)(Rb@0 zr|5IiPY;dI*ruaN31&Ot5J7z+XVIbzeL}_ncI5%qWan@&Wv)_!D0IY zm_W0$L|)Sr)Eu?lvXcwrQGMre+~H_{*=f-`2mjDKb3ydZbGReVe3L5Y)k!c$c%pK| zeM43L5y;5N(8gE7a8S7gIue1lZf37yA^u!}U;X|iUV>XaRc?kq(p@;Xgqmwry|4a; zU;Tbb^fb^{u+JwiJUGyATN?d#&yBwBoeekjqd05jH601ZG7ijEv_@`xWN+LTxpCr8 z%@ZH0;0_y=*Yr3ZdH?G%wc?uK2J(p;d*G2{@LTax^$9;nsPEyo0#^9S`;njfy%06*U|hxQ@h`UQPNzPF#Wz4SWZPP7u_<o=lo=3y;nm$7# zlCcOH(eXX-CgMBUh(5Xtt6NB%>-A2n>pj&2qUi$cJ-Y)e$~8}UDmTPWiFZ&72yBie zo`)I8&~vlbFgJL>>l)Xu1E@wjeh-G~vS zmBSD{XlHdKkk$riXJ5EA9dl}2-HsnsQsqYo$WVJBh%yYbcjr)>ch0lpZr*wJf`qE# zxSMwlu!C^iQHd*12Z`_EPjWOW9b?X$5MGX*D`17H0MhvZ+G#5FFc7gqjm66DEe`e7 zlv81O!csp~r=2%X(2v0Ity=iVwk7AaW3d`h=jm4#n5Vb&s<&DK7a;tmOhZcj&|=NY z@1926j{EY{aA>%^{P!38>Y{I$mp_P>YdlAzFRzxD^D(?UczPE+DNp0&(~;6u`0?dp z!m2L)J8X9NO}W^s-gt(muE3AsnYow_&-1FADq}hh!aE&}5j%cU&iAU{!+OV-Yb1=? zWE~_gqI~m8%0BL;%CT4l+IZ*JlsW;w$%DP>sr$s#Wr#7kzgK<3zA<%mzL%Q3sW%*T zFBfIA*EDvM5_JG3TPAO$lEaZG((8|Zx_gFKfPY~CPfUaWYG9qE_>UE(l5gW4>XY|Q zSm^T}|LJ?b!YIw$`g% zFWqY!KCnbxg5TtGP$4feN4sJL6mrWgZMAoA^}RnrbS!MDJ>09Fe?m;%gkNooSH0O^ zVrn^lwbS4Y{6S1z881<_Gra0u5q_ypO4ZKvs?SAui)je&>s3FF@Nofisssq2;W4(T7eH>H2#IJURSG{mXT-}6U?V*J^rF)PSsG|=t2jT7*btB-~ zBU4$rJJ^d@Fp$mtK2{jW){(FS*;Ww$bDgEoo_}D~Vz&nYiw3f+-T$oH1E)BO2C@Y0 zKvpG}z$m9Y;o!R6;oz>STON(6wynWc*MfsTimB`ItHpWly}@+{kn_InRUc-#@cTy6 zB*^F0Tfw)TYkq5&d8*&7*T>YDm5Be8*KgdyxQusdM|l0!?~nmpU+0UP9`3L0y0!Vt zn@c>^*W8?go3(>e6@LTP`C3eUy*yRn!(P?HaIf-;54+%A^?FPlwoNKsgK!JO88{&= z`cqtWfY_%mwnIAqCOiRR$Rpl>bm>x0<==>@Z8z~U73bUy|0xh(@3m>gi3qnMyv+xx zvP%#?`c<7lj*Yf?c#II)@mD8Q8s>OjUHCEm?0uNcbHVAmVQDX|;TGgf%Jf96OswJq z%;W6G1y*qjl7&WzRa_FNGjTb{p57Z?X*8?vvbqE;SV$oE7_v3p#AW9m31lSIW;fMJ zY?8@T=dUhR3r131Y~s>_HoY>ID}NTR>OkF1?-Q$#SDfs=qF*d8uQ+{mudra`73Vo| zr}u;73187=K=x~=ZyXzjf4R&45m&DooITaU%Dh34bQ|MCeZz1On26kx&HprvP5)(j zBXKo$BZ{9NU5#DPt`ex=SM4UlRFq4Ro-#}#xwlgsAy7VM*`F{4{6`aaM`ouIii&I@ zm!4@``7!2)GtSHk2gtP}Q;KE~xmaMR&H<*ajLUozLfu}hl-k;jGh9buFToZM7AI?q zu{K5=T>@>F;T!GM4}sd+)M_(Our;uTy{1c$1Ns5fZd-i=e0n}YZ>Tm0m7n-NZYS#y z!n&Dm{F{v_NlfoOaW7`UF$p$dQ?I%Y{&O~P0w%avJ-mK@ zm0#eSMqWU8AHPp_7-Vkq z3y6h_GHS;8@v6)YzYc@@)TDAUuV5lFvwQc)?!LPr;vxg`yX-x{>sxm2%@J@n8s24= zqK>aUC0PnKprg<7a}6MJrOrWRWghp^@$xe*a;^F2ywiOg+@a{cvrgm6*h z&p0ZclTC?zlPH~QX0*n)l}(9VF!0L^f#R2$e&T*8C1!h3d`S8IAUZ&ds)W;ylA7${ zy+%`$b#Q{=C9k(N>4LT8u{QZSg%Y;eEM@zFh%~G(H|g1u?q&G*aZVo?1DxV=k|e$ z?q$B$mP~e#KPG)Oa@@)n;~nV>L3Dta{-U&M+oMb>c$0!w%}XEQcmskb32IgQ zD>tTAwYXh&4D4l38Rp@~Og3+ArDfJsNN^)r#^biv zbd8V2&Ick|Ujws^C3hXGMzxynkcTYxnjWxHZ-z*{ZdkHF|zGrNzl~uCR>*YVvMh?L>#Hf;fkN-oflH^7O zB}91#w<63Rgw8!7oUEqmPBh{9zQ2VZ{ckWzPF{tSdrZnl;ZF7Mc1`Gd`7XNK-&hpvB%T;p>6RmIW3+!AD^e<8I3{hsN{@z+1vm`YV<32tj*?y12M+2)KNfb2$%ekV03 z*L80q0Qt(%J9&wmhpEb)%;N?`L(LxcVO(8o;2ApARPJQBF}-L&=}}@_jeD6D$n1Lt zXG=RHta!;nbq#GezBJqBj z$&oo-Oqf(vC#NP9g?sXRFL}Uja834xoRfy*n|4#)tYjBpcL9L%8s?Ym1?rcEikH-b zdQwv=$%tlRS`;Tf24j2PXhwq#yL!P4d@SgIfnQzsKA|0bLSy&OZD#8Kp7p6F%Je~=cCzjaFrO~jmkfXg5$zOE86xY z&@V^V$5mn{If-wgxhZ;Wl0J#g#q8dtA&h&MR%~C2br;Xz6_ZQFRlbekfqB^z`YI5mc4Jq!Ef#qmtK8M>g31dWw5L9~FN zu`)XqM7K$Y{L00vSq>2_NM4?V#j7$#a6uU($gw4FnCER&86or-kS#1&=jwvN2q6TT zb*^`|C)7Vo3S`Gg=ObH(MZkr-puajDdHu}9WdCa6-}~k2BG~39>fy{ahb2_0=`l!V zk!txE)Id9{!=8*X%*0@|1}CGqVBqd^tcfXQv?rsupjmRCOTzrHn~5v}?XvhrxzCy~ zL1RF6kVae{&!`IS6WxXEBzBLN@-(>|Vrs&dxO4OI$ipl>D zi6fK$-*CQ#bz=!(X7WF=@k~7aGql&fPvFmdbjC{lA9>#aA4hS%y?b}komO|+)ybCb zY&O0;jaJ(QN;{FOSH)(_`j3p~g zU*Cd_OALi%ZPMV^Nhf_ZzEy4zJjtx(+@(DvNNo1vqG3k%R6O_7^-0V~R+eRtfxj32 zJy$0(2Wrm%RU`DCPg&XeU&IXKQ~dsPMfO*iI2z!e(v`~Y{T3F|@J~B1W$RiUva7Lg znZp8V9fI!Uk^SAiI5p>f=X8PtDpv!~usvc(wr1{r7(Q+?0JEPQ1q~@k z8@AF+lwCBLEYWqE0H+}6Mkta{mQl`wD9b44L6l{b^B@Xv%DIrpGCD+AM(z*txbNov7RfzmNlK~huU*gFg2sRCIw1@Tk|wIXMJqP?y}87Em)mcCW%w}K5x zI1g$4me}mW(Ql31Jri*;8h=R~b1FJ#HbxFj7!=tfVSGQ2f8-SZFU^tg8lzPnSgmI3 zR&_~HxTRh(iVnx`RcGO!8wWuJ_yLAn&YOf@1X$AYw)^Qv==o-A(TJq6EB;c3S)Kt? zXeh?^oQacj_YF3UHWEoQop~A}O1t+Rdwc5CRQ3`C=wg6V%VltG{Eizh3zRymOa`Zp zxr6gIeAUaZR+eXPMyy5>{_86;Trmy$ryIjm{CAd>FeE?&1KeCC0e%(=khvQ%obRP8 z`C64upN$ItjfYXbPW`^jJ~4#NzPqT}xg4#a2b}#GTS4Ny!~4FB-~Yjp#GmyN--y_4 zOwI0i4u`t*YKfaQ_9m!B9UOC6(s4Ejf$j+z>r6z@#scC)>!=;UV?m5DtbF-9_hE7b zk)s7t!#)MSed?t|-jymc(`D1Z?{yHSKYB`o(3l0*)@2b=%iqz zL){rF@~R=w`E{_+`R(7KT`RrdT#TlQ&1{-oM1gsN9d1`qnBG-%OuCAZc^Iub#fwu~ zvIAychk-L6;nf6(Zz_f9nHQXNP|ZmJ%$<{ppTZ!(Ui5v(x$_Y;#{a}nJDeJmRAE$6 z8ZcW^7*$k;rw*&`cpV5F-tNT@?8O;&-!na!qAo%ekS z(n6(zAFvnh?4eTC=!F@w%H2H>6~)TPvVv+87|fs533F_rzoR@$$)$t-v&zaTv2?@l zSHNa(vRHz-1m*iZ~VP)3HJY1VFz6ZuGtnR=^!PiVBeR zL>~+F@eo;0tney>s}!}K2w<|Fxa!3s<7Zw-;jJInq&d-C;bEQ3^d~9lR|=DU<;^h) z)BBZ<`PF*87o%RSw|baftuN}BSFNU3SiM>+Jgii!Rvjx;YXJ1Cb);T_(yutDPSVj+ zQLU>`K@QgVsm~MEz3{idFKeq`fH!xN;M!^>h+Yt~wmKffqh36LwUq+Zf=Sj^I_R&h z9{0XiL1k_Ayaxu>RytT%TLnOGZFL`(QEz%Nkee3PRytT%TfO6jWUo_eD;-m7t81{f z`dH5_*H)aj49FCPwN=Gihz5>btgyDy!NS_A)e9L|Tj`)$TlJzb)I0AS@ME~PT8>$H zh8IJIAlFuq*to{8dJdDxtw-T@)sG>8edtMG?~a9>xAiKWKFeqt)g#C|u8iE;80N6Er$eYnP* z_0F&}kK=dcIN6@z*ha21J0p*yZm5|u{GBn6 z$=){&$*!J`t=oj0bD2B`8H5RgQ3>OQN8(2FaX3GC>F9)U;AV!=d?twAu`mxlE@3pE z1ma8_A$$aX&1Zvn0-nE;I1j{cCMAq_@Yj4Hh>ziUm&C;&W=&2Qd*W1E^JO49K}VCo0pkY)<-BrH?GHm$hpVvL3qdR9ax)% zmlsHyTrbTuw!2=QobU2bNGHAG4V;|kU{ivMN>?yfPzjvjceU+-&k2P;7tC9G8_uSv zX64B9n)fysq=LfgYj$gf#wif&k-YPKFAy}OGY&0plvfbD+1lHbG%f|>Yd$0UTV%Aq9)0S3*J5hJl)`9gcfDf4 zTD*Y)z+M@;c_O05S6*W2ccWz2ti>ri^j%(JX%TOrYqFxkV@WVImLLbNdc|){spFLs zjXHcMj)2+v5X`a`%6_sim@PNMwQ~G5|2nhT#eRDYjMZAV6C(TMBzPG_zTubyGbZ(rF|sSd#=+U8SSawa|NN^RaCiSUs2Xd zbxgNbs&J0fC7!iX9pmZTz+F`aj2!MHSUB7XzkSU4KDWUj@U4}?FHS&ZtyF=GW-ZOy z@Y6!?y91pSBTx0dJF~}M2Ne!#rnzUZb>Iy#qYM5SOJRVGk5u-OSb`&(hhy*7nXXl4 z3y5%KidePd_cLGeLbtWw-!UuTyBRy-78B1n_b|q%Qz@J8nJZTh4=?N5H1?&OfDmzQ zzHhD^K@oNJcfwggn<;I$3Q5pw(m+d50FAU1LDf?B{d~jJb93=Oss?))5S;p1kY#3B zmJi0)HpU|l#d8LchvG3v4%S2n>S|HhnGOx34AtB-HnZoge(9L!=DX{&Q?`s5Er`GQ zzI1vP{K_@Jb68En{^4r>8!A%{JHjl@jQPC}a(+E_%m&y`qY)$JSjxjjR0M1q5tBPh znX~Tn6Cw{gY)n=5IAC4K2>jL?ccOE^KjT-466;wIFzX;jpv#}W1Ij`Y$H}#`nrpC! z*arHrF{$(qU_3*)#S&{OU8P}=1UbNMD}-^N+pD#=-WZSrKFv<5TrI(i^EUgca>U30 z(tOZaIfCK7E2^we-z7E>BVaX!83C~fBM?wo5=8)U1XcG!*SH9JE9Gk8+3DeOcZXGh zv*0;wLWwZYPFCc&lrYd<_!R>+Hq;ns1Be0xZ39tYpq(HT1MPvoz(D&+gzJ+$BV3=v zBK1jdUFs9EM5I26Me0+)aD5W=>+>5kRt}xDW~^cc8Xt<=3jZoI&>m#4@st^8g?*Eh z%Ji*{TEukNq`*!GA&4>D>8RaEBpUADw1`)19(BOGW;+^KcSd(K2o{vOfy_`631x;* zXxqhu^i3rf3T(R&TC+^bR1@B5B3Q_zQ8RHjEYVPGGR}=?6U=iWk=&oC9n|gfIR1(( z|6UV~x#&fe9tX*=PwFus8A^qOgiO7XiZ0#<7m$99e?%^R)~whMDhly;z#7ePm6e_MpKTgVB!)r6-*1&)hz$`zbL*7Mrw}cbWA!yJ zNoTo|Xy->u23$Y{rh&Cx(;&(RwUy!sNpfSH$)p6|#YDF@T@k()1nQ3#6^uFbmQjRP zZVo(vxKLDXqzh3hSI&h*I&Y9T0&TE13rEhTp>=`?1)(MsObPeanNzXXg>;)+&=eMy zk)0&+U(yuMeo0gG@T2d#Df*e{c3xA|`nri0@vd7_&@5P}F4uQc_yY#k4KQFfg?@%+ z8k%o3tvRsuQ48Y{&8yH#BhX4MB#!@*R{H0cv{DB@`mS54n~C1)wNgI_Z@@In6|a~e zalITUU9Oh{q}M~ioQ!$@>#ecVe6KZ5k6FWE&aUlyDArlAYO4k8tCK|Em$XI+PZN7i zXJ0-1=(}!>ekR)Kz1h;Rd7(AhU9V^$TrXRr&-Jo3oGm0Ql?YAZ{Z82wbf|lkWs`Kd zUN%Xu>y;S<1~w6vP0}FVZ`>rVoD%q)P*^P_n3_2FE+Qw zo1dPZrGB*yd2W8%Rj+osMPXTcyi&p2?|NC*+F6CNwum>7*|lNK-=M4+U70EC*k^{M z6EKUa+yWNs*;Gvu7H&F_y&ccbiiFZF{<0csUHj-i(|uk?eMc!EY*d4oYg8jc^R&t( z;o0$L)fv8zqZ~5;%m}DuxmG}40=-Q{m}i^Qx~`OxT=R25RVlHMs?>#mSL^|ur)*ga zg_<+>LUqE(bC+QYGxzMUgi+4Hw;eWSFmxI@NH#Wer(#%mc=5t1q2XK63S=JsnqR^Q zdLEv~NxTN4rXgYc0DsMP%&a&Fp7)+XSE>1Bfs9OAf@~sR_LL38D_fZt(n;#265N zfah8gQ$Qp)NEnOp*E}7>e(>x_Vj~bY!t*JKIUo+2mN0I|Uo)R*89N<2GWcs=2;xL| z9wD(kh!@})+6dw>5OwhELgI%pe|P0snY}MlyDRsb&V`y9MAWAbc)KeNnAe&g@OD?) zWReqMveWg-aB#gG`u(m~hQoY+IEeSV91a8Qt~?ytU6HX*P%pad4Lod4liigLWV`uc zbGnqb+bs^u+vk-GUZ+_K$?`V2Ub4D&@qU-(jqYVUVh*vm0_j3tnjgiyzi!(qj=rrT z;}>xTs!r3xUK#XUz^*MCW-=2=C=}j|G#42)zx6NVp-?Yu5 z$pqgqvzc8rkh=n5p2k)V^E6^EPjhrbKjdkQ)0cej17fxgg{&oW=8t26j0x*KHa5g| zG~PRpk#xjTH5FjKy=V}{d<}>?JD%?{-v;{E5A$_i!uF4HvhGG^jEXTpg$6>SR5BO`|O*CP>lhC^kC>KqbGuhXKHNjulN@xdB z(1dk?C}_fZK`2d_fqkcfCai&k+Dd36;cX>!!e7`*=m8Pdc&*J=f`zh$HHgF_8ZQCE z8ZUxhs_`0w9}5qk!7on0Z)GbXpz)fI$io`1Mq=K>XKv!Ik(RaAt>q?TPE|AKzo0x( z{@GWt$Y$O!9d8lx=a`CYM{bUCg)&e@ksMcj1^~qYr=Z8@Y!8 zW)W^_jakJ1bD0UQf@dk#H0}xA4L>Qym8+NCq%VZL@>C* zo(8`PNEXvH9M_nBxjF>SiI+J?T!)J+UX)}pO*;KZ?xhRuvu z+~m2N#8{1V|4RwuK`$^zC(_Tn9KuGdE-}*Ihy4Ah7VFZ%W6I`)Fz9ezN8a^d-ZQ5< z)N~*$R5!ptQUFxXoCZLQJ$c4n2Mf=f20-=9sSfJToMv}I#yVNSm4mH?@b|*s^g~!5 z;p61S=O9jtm&u#5WnLwb=@uR*4}dDK0Z`>t2Mc)(fGV##sO8l;8!h#+mxtLaV1E8v59n@;rklxUP`dFIJ+UyMry&PenNOjxn6#-E7j_tgVf!+}S zRo(-j%DWC0@*V(H-gQvRyY!BWy-dhBX79*+iZQ#yLyOoT`E1SOpJ8XxEoAoJP`=cD z!2&zk8(ZQ=3;ng&%l!~12H-dMPbBR7a0vAWS|qb>k5@TQ;WVla&fXqR+rvp8*xw6{ zA!IDAcAuu#F|Q8P=pL|`MtegWQ31z6)vx1-UtsuGQxGJFv0_% zs^I{rYFGygH5>p{4eOv*!x%ohW14D1g=A8&hs>F=)2%4Zj6Hsx_4{@9`9O81gMOV^ zud}vXH|x0sH_yBgVtc=^Svf+C+-R^Fij+%7nnnCScgeV7*#KNR3cM%x1`dAan{W*H z2w0a`=KJ?Pv*0iK1ZM?`-`Oug>6B&(#S~*M`Rr>6*PBnifgiv4h_9FD&ORU^whLEm z3wwnK@dW->?BuIl=ZO5dB@XeDjjfoMK6Y~;o|}OGSIkdkm)(Y1dJPY7?L5rtygX*~ z!@teFxWjwNWig}nbx6h2AwT^O&Umztm=sTy{{ch?i1DXZy7iHbG@F6Z@>-+2mTKZ${q#F-*pvY+!UpX!|Rx~%-tOn(Xu{vy4hjIdGxVaNWb~X^*KJ&k07{E;0S`O;?;v$DoqNlh0AXWc#)>Th!;j6f;`{FKYd{ZI!>auJF{0;O^vue)YwAg5) zf6KD;W$-IU!DZ1_L!G&eK`ehd%xYyz9|jlZR|_l4PY1W?fq#b!6ONH~w4p-gv1sdR zG2Wr#B{roy?i%k1fXaA>4l3gv3S$|S@s9MhU|`Boj9IjG)~@EkHO~>7vL8m}d&r@3 z1jk=cnF>6cA_usds%8ajcoU2~n34X^^RpZ1U@DTL6oOj&i!S zx+Rvsp{UGA->rq@S(imML+oE@MPR)7(nN*5G6as_0*mUaMul=PtkiOT83GFjd#$S{ z7aO$AQgsr}5?>6W<82Uga6)+0TtCAc8C7?bObg_gpyb%P6XkH;!FTtS)Yh<2O(3fO zlrh+vR&VX{3x?d3vYlRo zBKKZsI?kb5QtacNz-MozMT;XyM%6<|Yts-YX(bl&T%cw4IUZ-MOqOh7K)HNZK`RkCM*J0^UIf{Ge!8!Yx5GbrqAA$@yo~%zFf&@L*7wCc%BO-&CQ+i|& z6O0aGa%mYD*1^bmJ9FLxVS025#}-Hw6;CYBgXjezl@#F86ec7gol6sR6Iy+rUw+9b zxrOr&ZCH(91iwq9ZGEm59&`hg#``g1V$%Sl$-M z-+`cmL!jFPI=doM$p1c(4pgkfdUs-^SZg)<(dX_?cyG#qfK5@c(uyy|u^AS7R$4ts zB*n#Tu9a3D^Q^R5&w!bAGU9uneB!j;OX8+@u6*>3&`tac#4Yi(VYAaKCzIntm@(P; zl_Thu>Rycr%RKl%!jS@WGPc!;ygZ862ZBaXB?r#C_~r4$Ad5L@B7qzPq$6QCVd;oq zL^={MEFBT_ScD-Z>tZ4-8O+9#OTP!+S!|`Pel&DDi2Q4bnkX~5HdYzvb;3-pi&d6W zI_lwP-LN&)pskC9Z{HNlIWK7AouF$1#My+2drpSY8xRllX?PTV%)gNs6qtqyMy6o_ z!_%jE8T z|NIw4i2#QdreRRZ)A^=wopWRP0N)hwEBNN_nwU7AX`PF_>a0Xq0rRS}5`u1CbzUYb z3FcL2Wx|S>*Fd#O4O|c#WN)SQLkW5w(%)F)T7~rML!g^}uQuol=}*vDseI4$t!L53 zZEWMNSlW6NL??-##L9&g^pQ9oc58(H;I$5pQsE0-B*J__Cb=+QAQ<5b0*3hlLB$tb zo7l#Gkjinf@^$5`!FrZO)hRJ_80&jz>2@aac4A6keIi|a7j$ubc_R(fhAyrzZv-5; zi?^+}F0LrcVAy!9JM?Z{kaRZT$KV-{|wyO`2bb^ zVWP&a(!_Vk-Tip0+zNwIyZSP*k%RJn@PB=gGvG2&dU|-7NH8j4dcr6e$W$!@62Sw= z)u=EC24dLyf^ZCT^+0G=TGs_3xu(cMGOe|-;vU4b)}gTo+8D?`9IFY;b&_u^ngeqk zL7D69dq(-vf&^t9tqOr|9qHV}m%?diy_30lDmE-j^Yr~7An;^qbF%hB_}fO5(;R&Z z{JMbC0XqM5EGGg^4+$mU)WTkxD+WYo;*STKi9h}hXW~!3!yg> z-0czr%*4yVru1c|45Wi&Re@zD!N@XG!0h&d%%(@51(t(+bVn+TDfd9I| z?@+=#4+TS^K&zZ+HjYHdu)d1z?{I=qPV(=HgNwkQ`&jVL2jb5Q2P*iY^;7Ug0~LHR zl|sSEg_*BS(=>+UOQdyqIqdl3iID4ubK~aGRG;Y?&gy7VUNI8n#x%yTxs-wEp&eIYrK zAivioDp64IdpgU6#M;DahFad9H^}dAtUSJnWb0cV1QBvlVAF#jwlnli4-fj^-}G>I z08zdb3x~Nofbjb}fUvvj?*M`*>;S?a+1i?ha)!6Ih()%x2(HW47F#HMCX-m?Os0V0 zGnoYSGnvty!G*&D+g%&sgB1&B2DZB<0Sj$+QHL7Z?(!hL?JgGzYpoA>ViUoCFS3)YOLM8Mdy@Vd5m(YXs4LuhMl#mch7+_oihOZA3 z)C*(e?)x*0A>NPOI-E2eivJIwe-ktJDE|N3A;rcDShU))s@S*^e=BzIPJNC>G~y_l znXOObS;CSBQpSpG;fGu0hw3Kx(%cFxc8azdll0%7S}DJm>|+|)gMNxV_$Ok<$z!wW z%ivdzah+0`POs4HJg_lNS?oBMg|Ka0%WE~XO<4OR;u@EVJV|@<_=>=G7TJAdJ4-;> z&dTWTuXBz(c|t1lV=aG_9JeXOXwElh} zj!?nh+EkP(Uj?EYgmVlv`89Q~#*ID+S7UIQEbdnDWwUidtFAA(2vDR2o%3&=iN6ANm^&o=|79L~>fa*bp02toWW#ZvIT~>|S(}g!$ zfRV$}^;+XmeR$f)v^+=wuQiLI)?R2Pp#Je@Xd~r*v9V7LEpR z+UP{tQXG6zju;s1v-t?r8--rSc{1hP59M5$g7{eMNuuTLIG5T0;%gF1=d>D;4uBfbi%$$S zq8HzT^y0hFH!Z%@ly^kTz0!${gE_c&*x*O$a;P5EbFubSz!aRF1y_vvJU%PFYC^EiTRdRYl4?uMOv*LM6}f+b<~Ams*ZXk zDybvmWw$nP*{#9#vX0t36l;%8@qU+eggN_&7ZOHp6#n@k{!TA8i}-(TLmcZp7k{Ux z%p(4u+Xq)lX!qmv5^~_8JFbo!buIny!p+B@+1iHpPbYVIP^&OsaootO8jb4ViX=#3tNI9_&iwYoTN%IqcS0av?UPw+& z1nn(fPZ;w(kgFyE585Vfe9r^Nz%QGM*{e1X1+!P3AjV%}rNr!24++=o72?bsgvaZ4_OiuO-za{T zP2G=RE2|UPZP}gin$618NUFvu# zCXE~M*ZEL-+3k$Wb-%-ZosSGE=Zl0LNO!}Vagj31r?z`Qbv~LB^K&M!)N~dM8|z@fu(1wC%;fQNWhQUJvwpdlmYB)= z92KRUfRU%QIsX24pVp>y8?os}u&_LLAMaD;px)1HeH|=w2|LoU>8%g)MP;^AXGbcn z*M?wEH#h@UhT-4Wod+=*R+AAaE!A{hXj-+$;1(`=Q|A?CqrA7N@<9I9IU72_XEbFt z!NPl+dPsM>Ngkv$Y{a%nY_Pn1tirGj3eQ>wKzWc-K5XNMbD@glL(|HA&4=ZDU9*!P zHY2Mfl;h?&z)@=xTdf`erSDE70C73nX#|oHXuGw`v{R2tSB?X;bMx2)>zup53Rn_U zx^)tWeh_5j7VQ_-Iv_4DP1#4_7v-c2Eh#Mzw2^>YmR1EUq!KJ_2^!X`h_MARc3x>t zka?nm(IYLx;oPp=RCqeC0-s>slq2)#yvE$ZW*(Iz$nS0DRXG8}c@{97XAa!);XD)c z^IXIpE8!LEv$D^~1gJ6dsq?!NTM63Zw?P@VLAJS$AJC zDgzyzjJWVx?HWcP567yo?1F{I}G7=gzY*N`0$&s-6nqce-Yai4%^O5D-PQQqQGH$Nrbu8I&oNI z5YoEM+`u(J3qm+-l$rj)-1IwUrg&#~HhQor5^d9#c#PSo=mPR0{yJyHK>Z88hB=@f zi<$MRbKeP%+4?E^@vPAhAKr@vW(z7MJKx9Z%2yjV%Lk8Oy36ie>IQt%n2|dA9yy8p!?hsmIvqW2C*D(SCk;`qBA-$HQb1wi++uNiZ{e? z8<&#j8&*C{;|clGK7~OfXbWZ@W#%s`kI8ctGmkZMKi@lUyoA4*OU>NB@IPOb0CeMSnrV#oGGnkZ%+}-gao@jK zUhi4PKWt=NESoK_HS;gcz`FK##m4ecW`1W_zNGoH<&K%Z75*0?TPz=B=4)V+k(SVw zPdD?&!Y|=BGV^c1|7T37%V+yfS??uDeumPfXW{uJ-4rMfu}FCY{F3tQ_3f8uFTFf&fBP59v%glJU0I&d z!SYD^9Jr3{v;5mH&vKTh9gl_5x$QHU{f+JOV-J@0X>`k@Fui?rtk6CI&~Kmfy*MW$ zIooR=g>faNY%1O0h2!Ew8Gq6-&!8R0&%Ity$&$2BpNF{ZQ^)eKeO~rpX`h*Hc@(C% zkB$|}69E14#H-w@lk#}&qcFWZHC{NqJUXV8r@;#<Qk9GF>U6pe|%!#1oe`{p47Szt4w z0dI8%3}{I7J&b=QBGo@S=ISBDzDo7Qw?#fXVp#oVKp8ww|GZhYeJdJT_w%)U2(zxViG}pZBNiQ2l z-#%#3=9Fdq8)p*sjT;Njjis#5-ZP9Q68oA7s~>MuwUao_EVI~VJs|8-GnJ(f>+A<& zgX~(2;6S~}#I$y@b3o7~Ll;5U3EQJx&}mjXVS}^;Ww)UT*xLPd>!4q8+aCz}n{y|{|n31Z9-lPPNzh+Yum zufaatRUn)LKwKry&$yp~M(?S1bS*xY!uY&S;_5(%LR{Va9C2BUtIvze9t%P_vXt@5 zpbCCMyXY$5Hl;(HyF#FMEE(U7dvtq05-H}-&9cl(Dq3(tcyre~EVyzKY=)SI0#q1G z3qhEz#*(Bl|7;vm+alVlcMD4B?CAvwP(?1FD*?vN_oq#=a(m}=U{ysK&2CM9t%+04 ze_>IDm@BGadj7FrHcrn-C(M{But&@D-?@ScF=ooGjoCxQKW8~6it`7rtN0hTM$9Om)C5=_sI||Z<9F#R0hq0n&?Os9%*MbX z`C80j5>-2+8dzvwi>M-U9iyz*N+bjS);ZB|D1{zQ2J_AH{F1v3a5zVV{?;``z-$63%|_ ztCnzGY>j_s*RfdXC(vJ&JBAtgIG1MUQEppe?*!j3B}4s^J{7EbSq~1}V{l$YUx!I! zzLU<(&;)!J8=BVN59Pwt?oS04V#FxnXXb@J{x}ziu$CWxJU*>2sU(YE4A0zkn?Fr( zW*u?qhIp4=TW1MhGR#4Ng%-itTxf{}@;)|6(K=fow>~=nG6j^>jLRC2-9?xgG=@DH z8=PfpwS(B`^@OaFyBO-5wvII8H*TE~tju?Ut;1dQaO)70^%rz84_{Pdl>P!k1I2JH z7IQdES%H73B(eWh!m1Z{3b0%yh7pgl*>9P~&};wcz6)y)G0mYbb-Hgn+m>k-Q6kB0 zg@4YWXtEG-b6&}9jDL>j1aq{u6x$cEo2``bZC%ezy%uHs=v1_J!g@f2k-2m|DZ1<2 zYQi)1QXoF4J6b_I3e>dR-I260(-$qj9(K-e$zlQgB>1b7N{%0c0ds+g&nsT;P8fGA ziWzk?@Z7^F1l$*YbsK~D^$iK*=&M0&0^*Gu6ULF(f|!eq`Qj~W!_ia?_M$0A;N4ax zjH~fiR|Dc~L?O|P1aTIkkZ8st8tDW>e|;qG8{q&z-PZWM^Q?riNjvso5@_aQkTv;b zvS|)e#p9sEx^DlZQL$CZsM`V?S}zUq(%zYQyT>nL4w5Zw6;4w*m|*4_R0d|5g&N~f zFk7G6FKM)4qpPlbyh`g6`N2V2+v2ZoaC)J3*H_g2M1;snpaVA2@0iw*UYn14NJAxJD?>Q63_u0HVoB2A`)Z3dy z>>s(yu5s0#byLta*hz9-*Lg^j*1xGIGFx{;gEY6I11v1a#B4URl{KGbO}D*=qpv$; zvaI1w`a?BKNh4gd6pP)O4aLd`C8nOWj>)}d zk^k5CITVtQ01>;MDWmv_DF#h_-huxX!!SL5{l)OOan;i?BZXhzN61tvNnQ8jON#NU zQ9J`_JBcLK(QX_`YQ@A`lKe=;jB~^YCunK%Kf_8~Z#r3`&`fd=ysrK&S*VXhMMtr# zW^?w!doFK-U_8zNATGfH2&U>R1Mv(9Cg$u5q6*clC z>_sCL*r$Tv7tU=ccK*CoE&;d;t!3SDXh$s>J?2VqXH}Jp4JIA@-ul z7JlCVGrjyCkDC>*ftUc)DUIWIwt2;{Qt$U+_?_pFCGb%G{>LkdjEcXPdC(4k3Nr&a znb~?R#O!0P#J%EO{2d?ODll93{3WJ+{kjn+PiLi>58O8*7`bmGVEDcf!N`3h0mJu= z1PtFdA{f4J#3E?-jqI1S%TZKoAh#)J(PiY+t|K_{qY}iG>pZ{6_@D~~zs-LD>3Nd{ z-)X0$ynOH6X*$Q=>Q4E5ZL13MVWrr%ZoA%2NIQ2^6l^zF3NO)@K4DjwSp_$rK(d9OJ}zJ7=uX8YgXJ1 zQGWCYUAlaEF5K@ilQpVIzuU8(DC87(XWwD z=cxD~=d8Eb+^(atXY3)VO6NN8Yvr~kcxWnBz8_9a_2V-V)^G4x?NJ~O2QeDj?iLb* zaL+|oeKVFZ2gFLP-LNgtfe>Ss0~K%VfIm!7-v*=C#L{9@#` zz|jFYB|My|j%)xOaYiJtA{9^P?PB2+no!RKQ+1K{T&! zFWiH4^8zj;@27W4CQF&$9zVbRUVguRRB>Y|GO7p`+8?<*o($G=R7*JB@zK7*0Fyts z^j|!Mf%9mAm_OH5=s1TZe2vbI04wURgjEClIY%Tg zi<~tdo#_JnGY^LsoPGVUzXO(g5JsTSfrm$Ail>fJO|*62C>ZXRw$D}JPCp)0i3BI29>*qD)E4?nZC#1*LvQy^gwzhmqCrbyRCpq}ze`oxfw>ou`6(N!%05mfyt#ELbziDPW8H zC=Fae{V_IDb|2b6sQr`+yjVE{sEi)yxEZC0sWPf#UPif}a-@L1@}q;Z4=);KSaS4<`FbqoNWOZQFK>h8-U0Hp)d2a@F*jebWAU>0ITv(l zqeWqQQQ!5#=|$Bst*9S+LAm}xlx|TU^Rg5ust!s~v8KeX%-LR8%6@D!hh6JJ4;<-& zLu{((@AN=fjy@kth>l(dp#_#sUgibl9aZ*4iE^|Dj&Q*pplq1)Df(+F`Pr^XqxNyp zUEBbJJ!P@Smtwoa7_$_RCks)T?vQkC>_Ck@&y* z3C6U+v7Z&w#wQ-!Gb?r+f|2_vhVffapS%iUHsdV?yI3_0vL=oLIa`8w55&`WV9$BY z^q2n6AiHMkqgYk-1jD@LVfkc&;TFo@+70 zbOA<|VZB%aI4_&i0xK?QZ?)nw4nhdE;%Wdnw<3J^T*kw~hnR z4`Skpsg!-sBjg6IYr%gLf0C+c<7dNx9%YEsss3ll~c3$n~C%R1-8j9w7S@`=oYIB|2K7n+QD_cZ4`!#Q{v zRJ$I|wHj;NX~C}K@T}V~Y(szz{sQ?4X)1FUs7&$a+!D7qJZg_YQ{5W3W%=6%g2TaG z{(>khfBQhFuRjyp1 z%5_jxIj}(Y<_zU_?_ITRTv-F&7Ee3-X`oc?ZSe}H6&9wHV>>u^#7nIoLEBM#Eb6Z( zUTYP-iIp#iS@mWv@P?DD?;k3YPOPHv*ZfgU)}3)&(3|cvE)F=EXQyp69RrBz-5Z}i z2qUW-ek@Rak14Uw^&W?Q>vRweoS>C8+ViP^F+;)JBe3K2rG`w^_r?P&4Pv2{h6m{@ z4G+>+pdO^JKwZe;N=Z3FTrqicL8Wsu0BF0>TlZm)z0cKlx1fB^pW}&jJdY50eVcIx zwB54k`g44eKZLlnF~P_Mmi|8Iid>;LVpmnG>E zZ=nCP#Ni|0f_eR4FNtV{LsiEi7^*r?x55OKbD==OTu6lz7R)<)Ui9##*kX7B|H!Vx zYF(j;yN2j&SD>RYkn`8LJr2t%@I>eHd_xXOH{d(xeY_n= zv7`q?;h=QOiHMP6h^`*xR1`6QLXhgwsP5+M*ieyT5I~%WQs>8VfoVwQfUB@9{SHmN zAUAUSxetYO-hkeXD&yLdK)elt+Tj)u5$!OSa1re=L9zd$&n8?Iu9=ot#F4N*Q{)kM zc-s11Qc;w=8vpvEogCjvEdZ}LV(wbGoR{G`SX{&v=x&?^0WKM*wqK8Od@x~@hq zpw@MvfLfQ(nyGcat{Mzsyxq+62QK67gWqGk&dK5>A8ZnDfd8>fVg4tW$Nvgby*snc z$0$4yOK0b!0cO@u)Xa)xoKL@9ejzg};tcQ$nM6O0&xy{gpRd)-8m*SElgIS=NOG}O z3HGgZg6_)bA8hEW|)=){-+sqp3S%;u!eGi%#$4EqFwphZI z+4@)m@x-?(SxV1BoY9^YPi!3RSw)GpklCD{u$2PsvDQ6ntrBcn>jb4|wc|6VC?RW> zE{Q_cEWNH*M5t3EC0Xm96)MU4?^!tP3F+Yy^eie4on*o}QIj61HgHmj3TNIbUqsx5 z;NZk4St2x{&`#yI+ucO)L7aiCa4aC9slMQY%ht&HBgpor%zAY&ykvdIKv^H>WxbtQ zAHN>5jyR)PAD`I3&-w(B*CwLW3n)I2G-7d!5QOnm~&NssY~>G*E3I3K}T&MLj$P4O9SB8YmqsXrL6x_9$qe zbWqnoDg0~IA)?M9DGHQ zaV!3u?#E z9Jm!`wyie+wjhKM&w}VAaRU}L?_G&wUL;oG3?X-Nl#{)f%kX55F679f`wHyj=n4y_ z7g}{|3Jc@R$dvIllb=z(Y%grj<2z;wk=qq0pmO!_I-4dctjuprqm6-Tu?M9y??niT zcSOet^X@_jr$6@fXD+$D5nc`ubC&}~IqksrddV4%ZvS0mf8@wM@lijUa*(MB_F@mZ zJ_xp!0PGFfLT?>9kb(50XdvCNW??7QISa+uEK!j?2ZzR*K#ckXFWa9VGuq+br5-z{ zKgSWFE)YAd$&>hmZ{D|&I1N{sxp?j* z;VFrG;4iS;eh^_L@z<=K)3kM}TrE6dB{8wc87Tq7XQT*fN@Bx41_f7c0z4>l%6?RP zMqI$bxV%AauX5ym)2~adh0+%vq&G+HE7t(es83SqXSAdQ`(orer!;Px#eP<0jk$TE zY+eY%Fw^foF<9>Uz||)gVuqcwH7SR>bnuD|ty{o2YCF-HPD)egtNZ2B?>H|?=Rt;wlz^r5lehbX19g(k{r0z1SE-zCUt>jg`Ae|i()xx8UbH0v8 zH6g?r@hGx`Fpnap^Qd+&Iis9Bs+&(ZgAiNCtQl!3b{>FwC3ebC);SFaO?e z)_II}S8%tj!I_mK*m__rWxtHwGUX)X4)Ih?KhK;Xiv^|VPc@||{p&|5ihJ;p(bl$Z zqpkd6jJ9@USq7Fq^h7;*QesPs26?&};*`Yjfi3Ykzrk#*oU8^`;yu}Z)Lb9GTbXb& zhr;57avX@^8v5!k61l(VT$IQSe1Fl=?I5v{ohuWS&MO^0lWHP(VpjT2#azgPD3&rO`f%se~9G`IAP<+Hf@wreSJ{JndC+9&z@evEf=R$$_ zTnIsp@%)GG81!mbuflmlo&a=qNpBxAUgR8779BH-asDc^S{pMX5S4S(@W5?vmt9qV z?KUK@O@x^%F_*cfPkM#J&2=&yIw~^Xzs(;F#CSzGy@!@_9s+Pq44PshCda9wA&(p2 zE-}xTWqy9EpU@8(=V>DY<*p-k`fxdZ*8d*H*y&$i-mm5qH9O&0RPDbJ)j5^oZ=wGJ zNC`!sphk-x!Xd)qqZ;Kl6z_w%SGOuU4^0?-_^W>sC#NPHhKrr}tA7kc2RzH}NgDOf zfY@?nk@0i<)jx0I&?m0}7QNMs+e07XpGP}mMrAc_C!tK@dN;?<3^VlX58MmC_20)$ z&;=Wta>b~Ak!iC0;@Dtj>*~K~$5UPC1we@5<*VE~O7#!nUed%BxN*0~!R~#+`c=rv z(1(#r-b<)|6TiQU+~hXO7aM=VU;Tc_=|;nGNURC}a2v4xdNWsExT&=ok*@my?Gbq z?q8lT7Jrz)G1!Vciox>KccXgmJUn3(9|7W05Pv%=VT|Q3x1)eY(Mf2t;=AyVX(ril zC*cGRajD?CRc`e(o`~W%eZfoA_=kmUd_}ue#jazvp0%f&-^L&KE7kiDmDxIKFZXsw z`cf`UzbA+>8A@5WG!O&Z|59B)nTRfthYP<2n+C z(e=WRuQaYOs{@6h_#G(>!L=?-Gy^NJkbfPuQTsd&86RT~vRE}OAilgxtg}(z4mU{3 zIuS$<2`vG4!nB=?5f?TT{u!u&VeAXcKWgbv~AQ zJEAwFoMi8QxM2>pV`^M-FH8grHpgMkrsSoU#*77c$R*X59EB60si!eqev+K1yq(F9 z@R{69?M|BeCya3~BC_`6=U6fQ;{$}fAbA}mIPrERw}VDSyuZoMMpjP6U*q#;?uOHg zur7=ljn|mDPvB?ljn|pE`DYXvOO}C~9Af4kfS*Y6;7#2pNp}h95IZcfEI5tu<1h}@>7+d9KnbdZz92q^ES^D zDn~4$#UmJ2HOS6qNV`jHy`M)*FQD$kb4;=El&tfiR#sw5enmYERb%2F!@p+h&^?mI z{`hM=FMA<|X*8|5L|?ImH8jPl0=Mw!;te8M{~Oa-)jtOtm8`mrRc46yqs zTaHLGv~VuPuV1yNT&S@3WfUBW${PL`RM;=2!g^V{OHvkV#rd_A?n`Pz>a@uX;?`+9 z2&n)g`yLA01+wwdlx4gK4Iaato4{#?*AefPAo#{k4nzwG(dd_gP>u>zKBr^zb#CQY z6Pw{V9f!|!D@RbwCw%?OI~4aLFYgeHyu2fz`|^(cSKOpjj#JNOXChnshroTBq4Qd( zWs9QrKA+^BrVuvim{QrWzHNU$Rw)-^Er0hlOd6~X9!}BEworJ9oNXZ(dE7_J7(T{A z&>OOWj?IL}{0ythB}@F=P{tT@K>`*_Pe&VeBRh@1PFWYg-_K@a8=ixFHvGnG!;?U? zgOD~n0)%q^MQ!+esJXtKHvH2-ZMYOQ(8cOlk8K#?By7XIv^M0zQQFYwj@tt=TkpbP z=fvE2Rr>lxep8LYkBz@gmFc{QYyvvYHQ#XPMXA@475UlwNV1p2oV`8%8XwJW4W?mS zh0fQTvUY~Q0eR6ARZyz>{=VWeU=R5eTJKr>fhnX0(EXBLV$Fdy=-;azou1=Mmp?yn^6w+h3P(Y92 zLd-*9E^|}33Mo)(YVK8(+%)buV1nW1=tTvVVfV;p(`tV$;%0BFjo~9phOstIEhehX8F7 zV0z6_lZuVnYY@0PpWO}5&bQECJJhQG7;_H%ReUgc=lWu!o5a=0D$8yxHu^lGCI$i~ z0gUQD@dQO?kN@#I0hMwqhE`{5F2_qu2txlc*m3QFf6r@D)~>l;35h$}ff) z)GiQX42$c}z+36u*jh1cc>1^@e&pOxS}|-w;Ius_P;?UgUatq~Cj&i5KW#tQ{ZKz` z??QotfrQrVV4&>8h0jM4)b9IcFF^P1Ly1=mPnVXAg79-4*<|TwBOyJy-X=(k?c%jB z*H(GkBBC*yTj|p0D^X`|P+q(4bG#2HL@c^mg!sRc5RWsUo|~Sf_X;V?E3ZZZ|~F=!P>0Ra7*C z1pN$RBd8m7*pE2JEU>mNJrilw-oRw7{#PMv!Yh^VGKdZm;WQ{cM=C)?YVSxUe$PHt zfpLPbIe>nH!PEzT)xx4`>q8Ec8$p~|oXVcpTx>LfsBTMTSHRy+{|-a4Zy`_@{ksp& zUd};Ae>Pt}1peBa;zs_^c%_jU2TD0^WmFFuXJmgi10xqfs+VQ5-SBtP|6Ex)hi4Bz zy`iWKZxDd$=PxfhGH`iLfde=5AwE%#4T}Iq`Z5iagqDr4chM3jlh0QsYMi-YaA*u- zZswRaf4H*qSMM=K(#Ucgw;|~jqiO^FhP4?QzaFIb8xPXQuLtSl*M$P(mk`@HVDLh~ z@K7bFb)D>nP;GQF!y|@gkN(Usdf=b3Z6bR&)aQjV&k z6(h!{S!v2`2oEYR&B{}bShy0oQi@cf2o}^W2DBdaZqT6CgJ7gmdDA|u^&l3}dJz1t z(RvtxsgI**#fWKvp~LYR8af`N4;>HEhfan2p+0n6C@^#geS54pdoE;-4)pmIqa5oL z_>Eh@8TZC{Cwr>ThuB@KPKb}Np9G6kZZcF80L!uu0qntNi>k}Ae_()H;h$z@Z-?Ej zCi=I|+RHT?T+|CqdC|1&wlEmJs4XGG7qtn7FKWwz*fWY^U5jWtkS@|lS=HFq>?W}v z4|GA1-3Ma)1u#f8_%^@Ovr@;;txDVHYsRR!LL1*yH7oEm6v2pfZ~?_SIDQS3l^a^f zM^&J#0*1>fV7ROV!(}ZnFZ^a?OCN@aaT_XmVP*O0C|(o%J6xE+oN?;Lep_(>FWPFT zGi7=Z%byPQT+Pu4+0Hn&guWuXbQY#QQbR|TpO0U9;g>lpeIvLhSc%Zz_h~#x6H-cbZxvYxhm8}uUE5T@9sq2%x;;h8Yei3*&r0PMm z*60wp>2G2Q`!CxCLvA_=CD3b-+%9*a={SdK)xsVN6Bx`#Agv|EpuK9f!^C5_HncQN+c`HUzZqW z9})&R>K2AU8Fdy%T|Y934;}mUyZsKt$p}3-XFn4Hh2`l(kRgTT=|hm9$MOPQknIo| z7+j1;1_r_Cz>wj}L2OONgj{~#Cj{*_^dEUZl$-egp6{lMU3^cfM#*8`02W|zLg|c+latU z5;56Hf)3$s@U14qmA@z9lyf@oAaPSXS3deihhVfuSk|V+MiPufrfVO#&54d51@B2kqEAhRR%!euGhsXMZ|04 zXWiH{yIj-r3X8remUE_P8Zj7*IJhNnjI zz{u42Wz+D+OzR(sU|IwtX$iPSY1J|V?lc?`7xQl=vgO+uP?E9g-brk0{RXV2$0arl zj0CC2l`$tU3rU6jG?sVtSx7+4LWaG$HvNud(S8bDi9Y2?&@YO{1~?=^w$#!43M&Zbm0&cll2$mc!s40NK($H@ zTo4;%Z=m%l5kXyP%8f%NuE+Hgs`)c_Uz?i%(#;X$y552^#J;1f$)C5_>+}ZTv2- zFJz>JcSjf37czw|t}nVIeOENlyZ98QwR)RKg^8 z7OBIoLf2PLB6t9~vce!3NO18gZT>(gS0Z(+L$0JDDfh~>25U=3{y|J@8&fOgIbjhG z$7%v|o#Y$o2Ie|~GS}IMj|y=U*3teU(5<5gHxVhELQoTP^HgkDmV!?g2nak`3Ov2^ zw~Z*5BQt-B2Lzl3(D|ohIT3K$NhkrQmjnfz0cPTl2bzgL4$Y3EP`t?ODBv2+j$b(w ze-cV-ea^(6c{6dtpHU%SBoqnzYl`hhhQ z{JE0_|9l|+yl|j`FIqnZUo=p`7mIbY$Ru9%R7sUJ4cg`&WWDNdCAmPEWn>OAoxo0! ztU8C8>3}gfg0fTOYU~)3bM16xhQcv}Su4WawYF)r%lT_72M8C}HC(DQk0_hi-Tv zE(OaLe`}Q|9t~BFl0st^@2Kb}5DB`c*Q}}NPF*N>;|R0TngvyOFNmt& z7gg8PQ!oBMuEO2kTvL*tg0B%`W=2AI39+kIKZb~{{SjjWzLOX)nS#v;5LK@gRc9As zBJXC5m!>iunl#VsRB!KOe}v!r`8&4om%v~9F#MMd&Yp$DTj*~ZR{k+qO$Yq4g`XXS zU%L6rya`qk{(k=Qh*@q?sbBjD2q^PwsLXF6K_z~99e(N{^%u0%Mw<0J5kLM4<^R|a zNWSE}ztpc(;oA5dd-Hcr^M|90vP3_>MI7NFV^%p=MnpLCVjSs zQFzDM14plC5$NR%0voFv<=`0vhUlZ8XAp*ISz-s`83ZG9rB>lQyI0-H>{{d;wU45; z>dk~aG|&dZJMq%xddVUBTrW98ZLb{mpuw{?c;&DM9~$T)5kBm}P3;H=An2b8u;yQa zF^-QLM`6eBng3ua{tI^ea=5v_!P6MZAg1k>vQ9t}?eLFDY^E%Gb;C z-H^(P9f7~1c!#FMc5nmyJS!l^`PxXpX0ZE;ISC%eWWjqt$Z<^FW}f62=eeT=#(8eL zTiY1roE$l%O)zpuTR``a_IFujfhW4zfyXRJr2__c*}4TA$MB0ISU5jnZHr3pM@2P` z@hZLHF~8E=;a8R34S%81`$?!uZ&(NV604n|%#$n%tj?xS zS4;#9T`?i{RaZWV z*BZPm(nf-Lepy5o6X6R#1S73M@hp7dhnQ-O zFTE_%%jyWv@L$;q0lT##!h~md5n*7r7A|lvgorCy^QZCrhwd?qKeP3xIA#6<{u=Nas~h}urJSE8%9d*Ozu5u7Gj-EH zE;R6UgmiAUAD^Uw_}1{_Ec4R9I{Fs#K=GdOtzjOFiv25#jklU{#lF%sb030OfVWf{ zUpI4~55*#982rCC3*BY}s?2Qt*-oXc;ePHnbW*6l`d*g)rIIcUP?W@R9SA6gJFd~TLtK>&dNf6a#0_DDQzLu*rF-+~RT%w%n_ z&OxO0Lx*KH)-cNd^+TI#j=>Yx9cYjG;f>il%ke^k_=h;Z#_e$Bq~{DbOQT?oY1LDToc)&2;j?xTK!S&7nJncvyHrlL9eFLw1BuD2S?LAZ=hU}V*4L(Qz01%0C}J}Q2LwO%z!_5$ zl>xzz;8zHKX}*}HoMfrqkq5JM%r$!w$$Ue0;LID&pQidbWu*1Ho5Ss!G;x&GRKJJm z3}oG9fY0|C=<|Ko`12nP^m+T2d~SaXDO)+tg!PBxMWt)CJR8izb)jYGmx!y2Z3+?R!XO|y#0ef;_pp{o6zc7mT^ z`O{`1eMtzM(~!y>_+x*_G2oo>9Ai$WCMB>H>QBP?)Y> zt>rQM;T}WG>oI%-LOC`uqBM*eTAOP}0`F4v#gLX0}O;blN=zhMAltJE*4 zP5)C1*FtP3JOT1kpEZf#vI-jcaR}Ip$dz?O;}zdJVgvo(+&Uu5rC#K8b8HyQ0bk@a z((E`ey9^g#jkMl8bK2!?Fjx)AUT<#^?| zT~ptgC&aSzQ)&Hi8A@#SUSH2wn8Pq% zA?6usHPSj)C!?!BD7ZQ%7Amz1Ay53a8*PVgO1Yx$hd+1y^q2TP?rZd-V)S`U_|EWo z+07ssv?Bn&qlTbg0te=juc&PKr0sRazgC}guGJ?-x>1u~W_UHD>qn@7Mi%r6baTC? zxiZSuV{}|#hH}RxN~q3UC@^Ka5P}-n@u-0w)EfK5(Hr^v^k;5FwbOm*U>7<|v-7lA zAp1BCVh0#gRWi!a?Li3$dr*cwNsDkRH)uLwf`ub1WP-)3a@`t~%YMZg6yA%%2WvOO zm(AC*K{YJu?50=zqPmd1zos}AWi4NDr?HzRq#05BQ+keUtP)ge|FRY>)lrga=`MiU zr39sSBLiLHwLV80y-b4%iu(E=10=WxXF1Zkp^<^c{#Oh_Usw7N7@yfX3??IKld}G* zjJ{MRQ>^cL?;v3_34_OAXGFU>q@9-6TdqnbkhILX9TX$zf7nINZ&llP=9?o zvshbLj1X+2XgO}IPVcCdV;hFMDP6M{%F&~hqhBjW?VI0CIoJV_mq0lnKLMK=Eyt?r z^bfRhEMT}>(lrO694*Z6`L0~iA%3?#y1&bE+!8DYkL%XoGBaRGSF|m64yp8e2ej)rew8qhbVWY-`u(+SVF-+g;;Y z*1E>Eu8PLKmev3J&S`Vb4Jv}HyZ_%j&rRlgXU>#w+BY-b%=p$Bh>a@8$)%*adJzIT z?7LFm;svqb;sr5l@uEOoypR!nw`tDgdD!>Kp4pM0>`=$-3Mjx(cxVR^7}YqU1Y{Nq z5<-4bxhm(AAL!~vGM0MziAX$$=$m0@^o6f05`rx!S@-E8ei%nil4)+YKavUPTB8KW zPs|T<()!lpgySRNAIOv9Cc@Sd_@{vv@c||M*9b@oDBE9Q!Q^u$*=1Sf(!#4meS!z8Sa1p`u^wiS z)>57Cb3(z-C1%ec&25#JF(hxMYZYdf@~{ONGO8X&t%DC^jM@?4>B_CE>?cP3MjK>~ zMd#ue3C_^Ud|afMF=~c3B0(bZT2IDh~Y&7YG(;TBmE{Rg zmAKG)PF_@`=HZXL&>9zDd*alKXnR`rJ#0JE)2Qzge5|a2+o0%i5`3hr4TSqRStp6# zXyx*iS@T78mk&g6mrqKefn7c+gj!qU@^P{jeCIw+*1-^8jK__SaXGhRhQacyd7MmY z4Rtfk&>BimYpC)i5c_C_#ncw62k`@&MTwTV=+EItayJd_UCM@3btwz-sY?;! z^u?#oE5V><6hUW-B#JI%X(81t6F5Yh`^dp*|KY*GX(bSAa9RW}Z8oLH3NR`CgGD*R zQItOH0Z86vj~nah%|9lkPKB?#r(hJC$II(QWEgtB=$s*fJ;UwAG4WX^hB1-eX@(|F z`a*~)muczpS-QLlf6BI6`k{SvF)NWLrlhsBu^$qL-;{A$`a)FLv+$cTQLC!Sx7Lsk zlfz!Gt#LWzQ1}`qm#|*59fu?GDVxS6wrA4%Kw={;>@^juwfz++{>H?;OCt9Gu4U^H z(~R8_({Fr>Wir%kykOA?PcWpgIAwNm@flx-MccL^F=g+hxl(awjpYdkk=*e{ul90K z##iQ60c_)^^u8jw1YtRb#SNdvG9^rkQ3Ed0d;5YUIAxDMz95OoAn{+Mix%R_bNr?l z)*}cJW-)ye5O%s#_R!LY9%$S5CVL{MY={z#R|&DLRiYa|%@U3M9q_iWYIU)1VV#5B z<@lKNpDQD>JeL(}=|z(w;^XV0V%auY`UBWE*(xHI9ipX=#{b^`6k^%_TDmkF5qnPq z-b+jW1@^+3urENok;S*8mT1*TffhM$BKE*9!=E#-!C3TyhPNl$&K$_>i0gog$j4hj zmp{C<5N8J8rZ^9v^>#wp-fi%Nrz48))XE=0FLvor1a=P}s`!I0?#HjFL(|HZ-DSJn ztd+g-fbDRrR`%_Ky7l#6y~iKe<7?T2N1`I6J0Z<|hhNcFTDlQ8=U$9o(PAxCc)2c^ z{-WnF_H7A*SKk-?9itsBsY|ca#k2SoeF%h>)LvKVvM7qaWQ$6Da*Hnd-wF>x*HZU` zDfj*ngbCtQSnej#2gJD#>Ebc`iiYc2gqGB}hjsDZ#E2-G1m`9YEZ?F{bqu->J+6z- z@hch%&$Of(p0wRJr29U9(!~n=itvm_>dlk!2*)W9Wg8IA!MjDoW%v~h1krW|1Q+~@ z_SLnjhGNzhA$G<;E&KJJF;UY1Ue76@0QHFNNa>~Mu-?UdpR)c!T=jWaZ}~iBGwkm3 zld>;ti zpd{bdbHEI~cCLj}G51m*W{dfQ z;Vum==)q7SF2NvFbV-E&(AQgLzI6RPT;F4rximQ}$uY|^vejJ{HyUw7!7+8PWbTRd zGIsvTfrKDfy{q0QsXi}DaKxphzIQ2z<=oJyHbuBgL(FZ8HYNx~( zDXN&;6n&u66jjh`iozVe%Hv8tJb^1HR*X27p}?SJ{{^lNSQQmTS3uCV4QKgUb}XJ8 zIXwZM&(>3^c8sGK;EE1GpF0JoZco6ks9D$ORhmO&)1HfOPNUNSx=}UOi+(=*6wT8I z8V_J_bj(bGO?v6i)KuF9p9eM7s3sTGRAT|;XsQwXfj0BYXsW66crvbNk=_fp=e!#h zU2I_BPh!+{7+)^2k8C~+9lSaaW8MwR=ad^^uYEdfjaO|XoadA~LAc|UxYQl55Q$N% zl*46=bv}ll@qhCA1W44P=vcjvd9`vA5vyYTajYBq-rtmeoe^@NW zuj#K^`Xv0nhxS*s)Yb#SVhMgtx}B&%B`ue!1T#myQ-Q*iCRUX}(( ztUReIbW4A~iTidniD5rFXY+>~$O&)qrryvn1YHSUL_=Bqo#nN& zR2*zW@nL7JKwYfnETO5RrlJ(?;#?GO2W~W{UTqDCnXT5=TLbOC%vPwc!;ls5!G1k< z7|A*%SJRp5$BHWYBh@W3p|&29lIZSVF43~bsayeWJrVcyIP0cL<@PvF#C<&k^-i0f zNc*Z3H4d8o6!!HvmKK7)$Kf_DSmz6GfW&t2s?^zXgy@Hf<-Yhey;U&pHm|?ioW9>1 zTTES`dNN^^`J=jptY*PcgP5&b__5N(QnqaRGF|YnQs?_iY%AZBx3cCUYSkaNEStVa z6koFoq;@9lUty`~*$%s{>DgsjxhG(*v{wINt+TA$6KJ$iNc(Nl>XY^vYf##kSPwfW zTuEBvJpr}>X*y&X90C5{#xh7~2_D<&M3R~cwF-G|N1W%K+o^%wJ-5>U0`I`55}dlX zfN;<4bbxTq?R3NLp4+KBUpco^Pr^R8(+s;iA#Dc{6#Rc=WjQI&tlOF5Zjmzww;@3+ zNAQ$+aJ44`zJjacvwqb!-MuMeSafrO{RbU1)^2WIDf(*G7{$ydnS15MJ zD9hu}1Dy=+J7#NGg6DQd5euB#`8hEev&VVE;~ogK36~sLA{v;#_4s&C^2{0xzd7;; zgB+$bK(1nJJqatBZdF_;tKtKwhSMrB!VJ|CbCE{#0#wBfwf-_~^&qz1?#I){qWOW2 zK-KRY&2(&!dyd7;Xw8glm{yWJ3zKHYP?&5uDQPYZVDeya#kah>F6U;4;^CnM0SQ8(PcCg;}^X+Ab^T@+AJu;WrBz+MxplP4NVz z<#Mcze%S_>leF{;urmdP$7>N{>C}tXQflF8nn-_eA+}9^8xw^`Yw0HzL_`Ejn1#D) z5r$pWov<1eE0vbLd#jkp!||m%m%< z>JZ`ypDtIy+-Vo6po4eE-B`0 zZOGt+{{mUgiH8i8k3mH@d0Q8i@z^yYCa&tDK1NIj^3rTRl$_oa)&ub?>M@`YhVd2=Z(2-e%XSDTjj7hfiII0klGzZ8Yrh2=WI1Inm6Xg-r?(IUN zb(wWUwQ_rJsH=zF9qO7vxI-)j#$o6C&A!QM{u=69hyMyP$$9QP{(D^wHxZTMF_#6ZZl$mq3&nJls@y|h`6yp zh}M@ickz5GLf5j#pdLKLx^PSJ${jE_nU1<}>yYF>l}ke?U$wqF%6KJ!ae>Hu@osON zphs(CqxfyWbqwq6fkpJv2s{15hnoPd6KUC}5P9kLNWkA@0^0b|3!4-(0bR7eJ1W75 z&3a`;s*Z%*L6H$Pf<#0KM$~5eGZ)|MC5$5xpO?lz?AtDih?lm+7r)igtw(tFRanDu z@Y|Mp_UlgY?9)zh?IL@L5t=8dh{ zka>u5OzG8%~F;mUHkEdA+Nb_`(W z4v!02OkH49>r|_l%xPXR)xqu-QzHnsnA$+N#ncJHDJFsO-z}yZ63(FAK*BDj7TDcl z>Hx7e#Y8bWSWLunib;aOVj{TOVq*QyDJBW7n_{vwFWfE5td0KcL9EmEXQ+c1$4(An#><1emP@&^YHEIO^Qi#n zJZ&I+lb;RYz4gcI3|tc1!CLY%d)Q zxk3`hhqTmW$Rm>YFpLSnoPJPc>2;(HEr;h}C)z|bq6sz?X&y(SwCtx&0rt@n&ox5Z zl-%x%3)!xijul=KOK{7kI$TKkq~t7ewM8D2jH(+ggdDxCuqkMPm7Ciem97 zjn%f#6;j7)JN%fCIwrTa4$iHu79?w{*m=E+>Gvy{JrId&9j6WOaez})fFq0|G*!pc zS>QY08UQYH5_W=hR^X9{it$6j6o;%(ic=Ua5vVCC4i3dwyWhUw$5?0~n> zcJ)mdIJC9aX-VIiWP*VSg9QP1YxzrZaG$-iUCZwYn>l5CUwDA2E?%b@*?r*=30cN_ zAm8_eN6I~*8W46L&|q0vmMxZ*-EfCxW%t`{qu30n+;e?bWUI{T5pV1L;U1L|)~d`9 zrjKJ3M-Wj~i1ObZZD|O%HtOCo!92KY*>9%Dq((|>gKi9M@P^#I`1M{;v}wmmgJbq2 zc(5K%9vuLiUh-cdz%{F;XMX$&0nR#t%jm@H?L+lyl7tl`{)+Oqke`1T;NxLRe)fTj zmTjnySx)=v#+OQdc7to{9OS1QSv{D-5wJNbQa|XaUWs*5h>}jgu3OkriYq^8S^=5LrQ%1DqeMAh7^LWDPlZ zEo;cabzegkN`|;S??uS4mc0@@kh90qP(sv0`r8F-f?776ls_X`hfKmA8YihkH(3y)go)0X<#>s#8(t;6#n(yAPgb$EWbhdMkz zyk6>X^Ll5BB?7l2-qwY`fC!8*eH@n4mWAOxjK0dmP}cIsaI!F1^|5NBs`~!WOhyQ* z>Pf@3H!ZsY-S-vPN^kupiEDRS_7eE# zLAuuJup5%KmNo#*OOD!8!il>N#R3kxpw{ieeG-pz0f)qg;hsnBIm)Q5uBDl~;iL6E zYS%H+9m3YA-3Y>2z>(IqT)>fGtk=;z@i>Y?%tD@~qbQz3QPhx#MtUxarK>5527a`@ zi=u^*?r0Z92M9-ilGe2=ipsU?TsYrf(`8K&;Tek5N!T-&>(%|R9v!*nR7KV*l;hM! zyV&E@u94hcdRAnBd62R-UdeVkD`G7?)a(U@&5BqH4-Ft}hP7B$N}L^*l@e#SWu?Sf zxwrJo3n}WQ^=H@7pCL{OL%rUQbMw~SBjrD;+xx?lb5ot1bC$<2eVmgW?YO+@&daf!+DwLnb>#mD>YmIL@G5Li*v=#Kw*Mg4y|Wv-qOV+8O$YECH)7q<6Eexrp90EOlbVM{io&sHTeG&+GVW=X^Fcr$!p>2StG6>y}J>`2BPVyIF9cfg@UtP zJe|Q3xnji~47qbr$q7?%=R!&}ft?G^zMP$ldil{WzFaN`7VccQ>S9*nx#lm|`kR@K z;99?vcy+B`O?>-$PP|)XYGhdtz%tcD=%}`KXaSdnaJhgkAA0p;7x~Q};li_8t-I>R z!OEnbwV`!4OzPEZ#<|eYGzJ?WJzO*XbC>1FKZc2a(NCe^+J%up()oPZ}JRhiNTw~}|}bWzSaA-uJ`GsoOr_CV~S z>MSd}s7A}mE~?E&(M5Gi>w4{?+_t)v%yc<2EZg=4VY6JBHBf7_^}_JBUfUiTB9pFw ze|G+@<&nhe7=xR+%GxiI>Tzqa^dJlawyDH_r-8QfqhEduW{qw|11+NdQJ0-ivr5V3 z0QwjfNyt((8<47Dk$hQ-bs#Y2uoN3DD@(D>va%FAZ4{*_`8|}%>`^F{ zts=SW$XiGL!|TXymD>;O*0P5}Dkx`SkBQ_iiZ)07>lZ~uA_E-F~p)Eg1 z_0JZpWsipcPw`t`5i)N(4}+_1xXQo0GNgoW`43HwiADG=AJBvUfw}%qfZtE(e{c`} zhvfSI8h+<)3;!GT;J*s~U6xt%y+h#l*mOuNpX$x`EKa-xm)QAW=8}*(H^_%|$UC@?OO^_ES*5W`WioCAx)r~3c5xl7818c%b`LlVn`(ctuj^n1b)n-h z-*vEpGN7_2<2WSXu*7jV0xA3kdgC&Mt`d?pRs926%%E>@&B>7k3zXN0SYj)Ft6T+S z`5u^!i41)oQ?NMbyIJwQmsA`%8@_klCni>$R(w2sH$!M%u`KR;^@vq;*dpuIqjtCt zTWo2kb;0hudSvdSXs6YIaJADKLAcs!Z6F-&v`*Mv?KH8kqMcSl!q!e}fZf$jYXPw~ z+G$)#4{E0o%h67gU{E`a;A*wgDDCHHr%7;~Xs7v3PjRQ{mr^PBy}Q90Htg6+-vcVd zavo42=p5*PRT_!O2UK!zRzI%R_qGKExM538-%BUN0uN&lvL43Zt=5h?50+sk`){{C z4H%Z0)Z4A+TabFYH5ZQ3H~DV2X0SQ8TT3wKcI&B@*R{Oex&u`@F#k><;GkNO#2mGv zwY}ZCo6RWrY%ph`KmB&={_qX?h__o;&XJ-LZ?~?OR(ZR1Gpz3I*6k#M5i(0T5&H6J z-Co{>kAvlVs*K)OzH=-{E#D~;`nlyx0U1?cEz8&3Z~d2V9pcPk_nMXO5Xn00_Hvm6 z>-KVKwQetG9PaJq`}Ytbmj`mnm!NwWpeW{zqc!*#Pf+#Jqwuno2xiCHbj_rM2L;{y$kQ1Ek!*$vP4oWKZpX0`kU@Bimq8NJxA=XC;+ zFlIp`G50r%oT=V&uT0ePlKA7(y~V(=sWOR@ovEbqr7P^ z9asF5vTP&|{E|mMBO@o_lBp^9Q-q5MQ<=Qb3ug|54fa%9(Yr@!F z6D3z_=}YaCh9$q#(udEE$U7=a8gbj@?h&yMekJGOUO@c6mG)*W-GTq1JzzgmOV6u{ zid*n28Lm}z*cZ69Bg0yDqq#A0D1Ie77l$TmqVdC!D4AVS{QNjgw8OsVpm6a6I1|`S zdn%r2177n{NEAeH8vlZ=L!yDiji&J_PCz_khfI;S;9RZPJo1gOAM7KQvJ)#NYNCZ7 zMm3|j?wPRY0I_Fj$`}FrXLcwou)2OwBfs$3060EWXfD1nBK~FjWJ%TSg6*wq;qzM? z3=z!YMPOkjeisqvm0I(tp?0Vu*^R_SxcUdf+Jg8C-V9&^p3M`*yCG5COkl6l#P+b) zbcaOUfuVRJj_4XloDwQD#{VTOCfmWW%GI3~F^!raxGQw!-@GN__lW}@#@_@Q`JAA@xVa@Yqt z9QJ_@hgHz!un%-Ntbz)Mt=dreF=|6uvBBDKqMagHUBPaHwZaEFwWG!M>8l++&`G-w zbkeSZZrXjIlXewU(k^Sq{c1a4?I`#bb$*4yR%EQ=xqpX6y_Lyi3A%-L+nodJo@Hji zgSha@hYiBbvn<(rlsxX)Cn-x-#q5&xL$YL5sLm-_ALww$2RhtQL6D%@e^ z6b1X^1oy*s9yt7=%VmJFa`e|<04qs(3q}-b zwd|r(bdh}UcyFLV7cWXmlLb#G$6vTHRB{ztM)ZgbE=Z2YPQ|tihX>qpd@K;&W?aIH zg(H1t=pqu?0yha%K<>R1x1N-KjuE8u%z^kC(_Vn7>v5MVZ!<2Pgu^Irf~cMq5v9XH z+z!jvB>E|vN1LPD)Up@Ni-~P_#z)6#<`&BF*lL7Yx>Vc5cT{FL!4tH2F1QRMv3jUR z`aHWQ@G5p;k>j>SR?fno0$j4ws}HimY|u=bia*f?+~W&=Bu3(vgsGArM}Pyj;a9qg zmJaWvi}CoCUgVvs-Ua=Hmc0Yx8@X1xNilCkX-35^9cKRYn@|dJcu=#6?*x&|*zkCA z;u&7q?vE6gj;J!WKwccf9lp}rwZ#7~cOr^pyP^|}g)(rY%=m2poBodwHgAI9EFD#% zV7kIlwv5tIg}Iy`V;0=1h;MASrQ<7e{neSd*w*plRS=KcStoW1=l9zXyAH5p47>@` z74wrdoURl;&byj%KEkiG+`iYFO{&U?ye~Q=E&CB#+DImNhvMyva6ci~S6XitKZB015%yRjRs0V6 zzc$!Q3gZPcmA-{sC^3(rZ#i#5mKZX4)Uj12o7hc(^0U0X@8!Df<>p$}A zP}sMdLomo`iAhcu9-8&aiPxjV3JcjiJBAR7PVKA-1v_hYP*!IRi_1t>R4qFiOyoFF z`UJYR0mxpoaccw`k6nnR@h7IU|C0BE$cxR**v5!_)o#3CBtB%%s5p>*uZNKP9)7(x z(nNHh$v^V-ch=YAov;5=78UupJzswP+LRyp+Q3kNxDR)}ehAYA4aLo`)0g3f*k|zT zH3kzGZjzK;Q>}|=jV@*$uazyh!?Pb<6moEvA6$#pvLgMgdcL2emjP1W8=7lumw{}jD?Q<;QWxd z06*fJ86N%uSg#cW2Ul+Cjf;XFs|bnj@moMuAMT_?7u1A=8INsxHDbUN88vVlAn#)~ zsiA(Ji332nt_7G!!d0XnKNNSg+v(Zp1lJzfZiu}{lYalwO0yi~96XJ9OUs1S83sn8h@S8akflh{n=uAw%^#gESv7P2e=6m)%&iCwt zFZ1l@;A$wx|LkibE}!4V6MGJRdqvd6PpXWHKj4S57+T+(Y{Ks$6ta zF3xK`dlS*&a9v#>R-28aaH&?b-)G=gJl2J@j{SgDz;f)@c|JmiVdd7ccO8d3w#1>j zrx|y_o8!ucIV+4uQp#TTgF}bMH!`0@K%~^Sx z@rPBoXv=nG_GTpzHY0REMmY4y*ak8}ALvBrfJ%hefV}|U!B{c=bEzGpsTq$U@R02) zV=S^`bU+#7l31CH(FZy)I-nXOq6&}3$_`jOYa&L=DVy2EcV2grMS?I!wnEkDDEw)7 z6Zzdp8=m0ZeJv!g>m()A4iIa4fl>MBckCFe6nXv>8Rgd};MpUlEUOtS!Ewjb!7^*6 zmNIx_qGJeh?@zvVpn})~l&>AA821AISFczX2^Lj13uY#sB4UwMzNHjdJqf4CnnA2- zk$HLoi@{SZd+v#LF`b~vsM{IAiFVXoYSiZ2O4M~A);MZ+%brtuEj#rjyS@M3Qz5fl z+8vi0JQr3LEn9T5{mpGbmnO&MUeCn}?N!I+5zoa6ZQE1q(Ej4NSl`^?xI7

3^#I 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 z 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 (UOi+EP#LB+>D>qS+b9*V>({78Nf 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%0AhSlC;CgebPN>=q(i7ypxj=jKxsZ23rEl< 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

  • 3|5c_6MKs3PDKr@qr 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

    KfInJm}zsYG6tNZ)ab%ebWs1v3idR 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%0DjU>;Cz)q(Ac? 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 Qf93t0{|_n|Dt{XP2cJC)3;+NC literal 0 HcmV?d00001 diff --git a/tests/ui/macro_use_import.rs b/tests/ui/macro_use_import.rs new file mode 100644 index 0000000000000..6490a2107d5ac --- /dev/null +++ b/tests/ui/macro_use_import.rs @@ -0,0 +1,12 @@ +// compile-flags: --edition 2018 +#![warn(clippy::macro_use_import)] + +use std::collections::HashMap; +#[macro_use] +use std::prelude; + +fn main() { + let _ = HashMap::::new(); + serde_if_integer128!(""); + println!(); +} diff --git a/tests/ui/macro_use_import.stderr b/tests/ui/macro_use_import.stderr new file mode 100644 index 0000000000000..1d86ba584411f --- /dev/null +++ b/tests/ui/macro_use_import.stderr @@ -0,0 +1,10 @@ +error: `macro_use` attributes are no longer needed in the Rust 2018 edition + --> $DIR/macro_use_import.rs:5:1 + | +LL | #[macro_use] + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use std::prelude::` + | + = note: `-D clippy::macro-use-import` implied by `-D warnings` + +error: aborting due to previous error + diff --git a/tests/ui/macro_use_import.stdout b/tests/ui/macro_use_import.stdout new file mode 100644 index 0000000000000..e69de29bb2d1d From ede366be637657280ca506c5bad0f41f96c47340 Mon Sep 17 00:00:00 2001 From: Devin R Date: Wed, 4 Mar 2020 07:59:10 -0500 Subject: [PATCH 011/142] collected all the imports and names how to compare macro to import path add more imports to test --- clippy_lints/src/lib.rs | 6 +- clippy_lints/src/macro_use.rs | 234 ++++++++++++++++++++----- macro_use_import | Bin 2816064 -> 0 bytes tests/ui/auxiliary/macro_use_helper.rs | 55 ++++++ tests/ui/macro_use_import.rs | 12 -- tests/ui/macro_use_import.stderr | 10 -- tests/ui/macro_use_imports.rs | 37 +++- 7 files changed, 281 insertions(+), 73 deletions(-) delete mode 100755 macro_use_import create mode 100644 tests/ui/auxiliary/macro_use_helper.rs delete mode 100644 tests/ui/macro_use_import.rs delete mode 100644 tests/ui/macro_use_import.stderr diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index cd258c7b506c3..89f55986f634f 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -60,6 +60,7 @@ extern crate rustc_trait_selection; #[allow(unused_extern_crates)] extern crate rustc_typeck; +use rustc::session::Session; use rustc_data_structures::fx::FxHashSet; use rustc_lint::LintId; use rustc_session::Session; @@ -1060,9 +1061,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: let max_struct_bools = conf.max_struct_bools; store.register_early_pass(move || box excessive_bools::ExcessiveBools::new(max_struct_bools, max_fn_params_bools)); store.register_early_pass(|| box option_env_unwrap::OptionEnvUnwrap); - let warn_on_all_wildcard_imports = conf.warn_on_all_wildcard_imports; - store.register_late_pass(move || box wildcard_imports::WildcardImports::new(warn_on_all_wildcard_imports)); - store.register_early_pass(|| box macro_use::MacroUseImports); + store.register_late_pass(|| box wildcard_imports::WildcardImports); store.register_late_pass(|| box verbose_file_reads::VerboseFileReads); store.register_late_pass(|| box redundant_pub_crate::RedundantPubCrate::default()); store.register_late_pass(|| box unnamed_address::UnnamedAddress); @@ -1080,6 +1079,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: single_char_binding_names_threshold, }); store.register_early_pass(|| box unnested_or_patterns::UnnestedOrPatterns); + store.register_late_pass(|| box macro_use::MacroUseImports::default()); store.register_group(true, "clippy::restriction", Some("clippy_restriction"), vec![ LintId::of(&arithmetic::FLOAT_ARITHMETIC), diff --git a/clippy_lints/src/macro_use.rs b/clippy_lints/src/macro_use.rs index cf526409374b8..4c89647a57413 100644 --- a/clippy_lints/src/macro_use.rs +++ b/clippy_lints/src/macro_use.rs @@ -1,10 +1,12 @@ -use crate::utils::{snippet, span_lint_and_sugg, in_macro}; +use crate::utils::{in_macro, snippet, span_lint_and_sugg}; +use hir::def::{DefKind, Res}; use if_chain::if_chain; use rustc_ast::ast; -use rustc_data_structures::fx::FxHashSet; +use rustc_data_structures::fx::FxHashMap; use rustc_errors::Applicability; -use rustc_lint::{EarlyContext, EarlyLintPass}; -use rustc_session::{impl_lint_pass, declare_tool_lint}; +use rustc_hir as hir; +use rustc_lint::{LateContext, LateLintPass, LintContext}; +use rustc_session::{declare_tool_lint, impl_lint_pass}; use rustc_span::{edition::Edition, Span}; declare_clippy_lint! { @@ -20,82 +22,226 @@ declare_clippy_lint! { /// #[macro_use] /// use lazy_static; /// ``` - pub MACRO_USE_IMPORT, + pub MACRO_USE_IMPORTS, pedantic, "#[macro_use] is no longer needed" } -#[derive(Default)] -pub struct MacroUseImport { - collected: FxHashSet, +const BRACKETS: &[char] = &['<', '>']; + +/// MacroRefData includes the name of the macro +/// and the path from `SourceMap::span_to_filename`. +#[derive(Debug, Clone)] +pub struct MacroRefData { + name: String, + path: String, } -impl_lint_pass!(MacroUseImport => [MACRO_USE_IMPORT]); +impl MacroRefData { + pub fn new(name: String, span: Span, ecx: &LateContext<'_, '_>) -> Self { + let mut path = ecx.sess().source_map().span_to_filename(span).to_string(); -impl EarlyLintPass for MacroUseImport { + // std lib paths are <::std::module::file type> + // so remove brackets and space + if path.contains('<') { + path = path.replace(BRACKETS, ""); + } + if path.contains(' ') { + path = path.split(' ').next().unwrap().to_string(); + } + Self { + name: name.to_string(), + path, + } + } +} - fn check_item(&mut self, ecx: &EarlyContext<'_>, item: &ast::Item) { +#[derive(Default)] +pub struct MacroUseImports { + /// the actual import path used and the span of the attribute above it. + imports: Vec<(String, Span)>, + /// the span of the macro reference and the `MacroRefData` + /// for the use of the macro. + /// TODO make this FxHashSet to guard against inserting already found macros + collected: FxHashMap, + mac_refs: Vec<(Span, MacroRefData)>, +} + +impl_lint_pass!(MacroUseImports => [MACRO_USE_IMPORTS]); + +impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { + fn check_item(&mut self, lcx: &LateContext<'_, '_>, item: &hir::Item<'_>) { if_chain! { - if ecx.sess.opts.edition == Edition::Edition2018; - if let ast::ItemKind::Use(use_tree) = &item.kind; + if lcx.sess().opts.edition == Edition::Edition2018; + if let hir::ItemKind::Use(path, _kind) = &item.kind; if let Some(mac_attr) = item .attrs .iter() .find(|attr| attr.ident().map(|s| s.to_string()) == Some("macro_use".to_string())); + if let Res::Def(DefKind::Mod, id) = path.res; then { - let import_path = snippet(ecx, use_tree.span, "_"); - let mac_names = find_used_macros(ecx, &import_path); - let msg = "`macro_use` attributes are no longer needed in the Rust 2018 edition"; - let help = format!("use {}::", import_path); - span_lint_and_sugg( - ecx, - MACRO_USE_IMPORT, - mac_attr.span, - msg, - // "remove the attribute and import the macro directly, try", - "", - help, - Applicability::HasPlaceholders, - ); + // println!("{:#?}", lcx.tcx.def_path_str(id)); + for kid in lcx.tcx.item_children(id).iter() { + // println!("{:#?}", kid); + if let Res::Def(DefKind::Macro(_mac_type), mac_id) = kid.res { + let span = mac_attr.span.clone(); + + // println!("{:#?}", lcx.tcx.def_path_str(mac_id)); + + self.imports.push((lcx.tcx.def_path_str(mac_id), span)); + } + } + } else { + if in_macro(item.span) { + let call_site = item.span.source_callsite(); + let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); + if let Some(callee) = item.span.source_callee() { + if !self.collected.contains_key(&call_site) { + let mac = MacroRefData::new(name.to_string(), callee.def_site, lcx); + self.mac_refs.push((call_site, mac.clone())); + self.collected.insert(call_site, mac); + } + } + } } } } + fn check_attribute(&mut self, lcx: &LateContext<'_, '_>, attr: &ast::Attribute) { + if in_macro(attr.span) { + let call_site = attr.span.source_callsite(); + let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); + if let Some(callee) = attr.span.source_callee() { + if !self.collected.contains_key(&call_site) { + println!("{:?}\n{:#?}", call_site, attr); + + let name = if name.contains("::") { + name.split("::").last().unwrap().to_string() + } else { + name.to_string() + }; - fn check_expr(&mut self, ecx: &EarlyContext<'_>, expr: &ast::Expr) { + let mac = MacroRefData::new(name, callee.def_site, lcx); + self.mac_refs.push((call_site, mac.clone())); + self.collected.insert(call_site, mac); + } + } + } + } + fn check_expr(&mut self, lcx: &LateContext<'_, '_>, expr: &hir::Expr<'_>) { if in_macro(expr.span) { - let name = snippet(ecx, ecx.sess.source_map().span_until_char(expr.span.source_callsite(), '!'), "_"); + let call_site = expr.span.source_callsite(); + let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = expr.span.source_callee() { - if self.collected.insert(callee.def_site) { - println!("EXPR {:#?}", name); + if !self.collected.contains_key(&call_site) { + let name = if name.contains("::") { + name.split("::").last().unwrap().to_string() + } else { + name.to_string() + }; + + let mac = MacroRefData::new(name, callee.def_site, lcx); + self.mac_refs.push((call_site, mac.clone())); + self.collected.insert(call_site, mac); } } } } - fn check_stmt(&mut self, ecx: &EarlyContext<'_>, stmt: &ast::Stmt) { + fn check_stmt(&mut self, lcx: &LateContext<'_, '_>, stmt: &hir::Stmt<'_>) { if in_macro(stmt.span) { - let name = snippet(ecx, ecx.sess.source_map().span_until_char(stmt.span.source_callsite(), '!'), "_"); + let call_site = stmt.span.source_callsite(); + let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = stmt.span.source_callee() { - println!("EXPR {:#?}", name); + if !self.collected.contains_key(&call_site) { + let name = if name.contains("::") { + name.split("::").last().unwrap().to_string() + } else { + name.to_string() + }; + + let mac = MacroRefData::new(name, callee.def_site, lcx); + self.mac_refs.push((call_site, mac.clone())); + self.collected.insert(call_site, mac); + } } } } - fn check_pat(&mut self, ecx: &EarlyContext<'_>, pat: &ast::Pat) { + fn check_pat(&mut self, lcx: &LateContext<'_, '_>, pat: &hir::Pat<'_>) { if in_macro(pat.span) { - let name = snippet(ecx, ecx.sess.source_map().span_until_char(pat.span.source_callsite(), '!'), "_"); + let call_site = pat.span.source_callsite(); + let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = pat.span.source_callee() { - println!("EXPR {:#?}", name); + if !self.collected.contains_key(&call_site) { + let mac = MacroRefData::new(name.to_string(), callee.def_site, lcx); + self.mac_refs.push((call_site, mac.clone())); + self.collected.insert(call_site, mac); + } } } } -} + fn check_ty(&mut self, lcx: &LateContext<'_, '_>, ty: &hir::Ty<'_>) { + if in_macro(ty.span) { + let call_site = ty.span.source_callsite(); + let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); + if let Some(callee) = ty.span.source_callee() { + if !self.collected.contains_key(&call_site) { + let mac = MacroRefData::new(name.to_string(), callee.def_site, lcx); + self.mac_refs.push((call_site, mac.clone())); + self.collected.insert(call_site, mac); + } + } + } + } + + fn check_crate_post(&mut self, lcx: &LateContext<'_, '_>, _krate: &hir::Crate<'_>) { + for (import, span) in self.imports.iter() { + let matched = self + .mac_refs + .iter() + .find(|(_span, mac)| import.ends_with(&mac.name)) + .is_some(); -fn find_used_macros(ecx: &EarlyContext<'_>, path: &str) { - for it in ecx.krate.module.items.iter() { - if in_macro(it.span) { - // println!("{:#?}", it) + if matched { + self.mac_refs.retain(|(_span, mac)| !import.ends_with(&mac.name)); + let msg = "`macro_use` attributes are no longer needed in the Rust 2018 edition"; + let help = format!("use {}", import); + span_lint_and_sugg( + lcx, + MACRO_USE_IMPORTS, + *span, + msg, + "remove the attribute and import the macro directly, try", + help, + Applicability::HasPlaceholders, + ) + } + } + if !self.mac_refs.is_empty() { + // TODO if not empty we found one we could not make a suggestion for + // such as std::prelude::v1 or something else I haven't thought of. + // println!("{:#?}", self.mac_refs); } } - for x in ecx.sess.imported_macro_spans.borrow().iter() { - // println!("{:?}", x); +} + +const PRELUDE: &[&str] = &[ + "marker", "ops", "convert", "iter", "option", "result", "borrow", "boxed", "string", "vec", "macros", +]; + +/// This is somewhat of a fallback for imports from `std::prelude` because they +/// are not recognized by `LateLintPass::check_item` `lcx.tcx.item_children(id)` +fn make_path(mac: &MacroRefData, use_path: &str) -> String { + let segs = mac.path.split("::").filter(|s| *s != "").collect::>(); + + if segs.starts_with(&["std"]) && PRELUDE.iter().any(|m| segs.contains(m)) { + return format!( + "std::prelude::{} is imported by default, remove `use` statement", + mac.name + ); + } + + if use_path.split("::").count() == 1 { + return format!("{}::{}", use_path, mac.name); } + + mac.path.clone() } diff --git a/macro_use_import b/macro_use_import deleted file mode 100755 index 61d3a827f1f77ecf6d8dd69590a42eb2cfb26354..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2816064 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

    IRQ1mo=!3=*8==7#byEYE(;=I{>g;H*O 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

    *3jox#OK#(BR=~UryTHkU8@f8JSo=G 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

    3^#I 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 z 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 (UOi+EP#LB+>D>qS+b9*V>({78Nf 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%0AhSlC;CgebPN>=q(i7ypxj=jKxsZ23rEl< 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

  • 3|5c_6MKs3PDKr@qr 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

    KfInJm}zsYG6tNZ)ab%ebWs1v3idR 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%0DjU>;Cz)q(Ac? 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 Qf93t0{|_n|Dt{XP2cJC)3;+NC diff --git a/tests/ui/auxiliary/macro_use_helper.rs b/tests/ui/auxiliary/macro_use_helper.rs new file mode 100644 index 0000000000000..c63149a6819c8 --- /dev/null +++ b/tests/ui/auxiliary/macro_use_helper.rs @@ -0,0 +1,55 @@ +extern crate macro_rules; + +// STMT +#[macro_export] +macro_rules! pub_macro { + () => { + let _ = "hello Mr. Vonnegut"; + }; +} + +pub mod inner { + pub use super::*; + + // RE-EXPORT + // this will stick in `inner` module + pub use macro_rules::try_err; + + // ITEM + #[macro_export] + macro_rules! inner_mod { + () => { + #[allow(dead_code)] + pub struct Tardis; + }; + } +} + +// EXPR +#[macro_export] +macro_rules! function { + () => { + if true { + } else { + } + }; +} + +// TYPE +#[macro_export] +macro_rules! ty_mac { + () => { + Vec + }; +} + +mod extern_exports { + pub(super) mod private_inner { + #[macro_export] + macro_rules! pub_in_private { + ($name:ident) => { + let $name = String::from("secrets and lies"); + }; + } + } +} diff --git a/tests/ui/macro_use_import.rs b/tests/ui/macro_use_import.rs deleted file mode 100644 index 6490a2107d5ac..0000000000000 --- a/tests/ui/macro_use_import.rs +++ /dev/null @@ -1,12 +0,0 @@ -// compile-flags: --edition 2018 -#![warn(clippy::macro_use_import)] - -use std::collections::HashMap; -#[macro_use] -use std::prelude; - -fn main() { - let _ = HashMap::::new(); - serde_if_integer128!(""); - println!(); -} diff --git a/tests/ui/macro_use_import.stderr b/tests/ui/macro_use_import.stderr deleted file mode 100644 index 1d86ba584411f..0000000000000 --- a/tests/ui/macro_use_import.stderr +++ /dev/null @@ -1,10 +0,0 @@ -error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_import.rs:5:1 - | -LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use std::prelude::` - | - = note: `-D clippy::macro-use-import` implied by `-D warnings` - -error: aborting due to previous error - diff --git a/tests/ui/macro_use_imports.rs b/tests/ui/macro_use_imports.rs index 60c64ee8146e5..76911b0c565f0 100644 --- a/tests/ui/macro_use_imports.rs +++ b/tests/ui/macro_use_imports.rs @@ -1,11 +1,40 @@ -// edition:2018 +// compile-flags: --edition 2018 +// aux-build:macro_rules.rs +// aux-build:macro_use_helper.rs + +#![allow(clippy::single_component_path_imports)] #![warn(clippy::macro_use_imports)] -use std::collections::HashMap; #[macro_use] -use std::prelude; +extern crate macro_use_helper as mac; + +#[macro_use] +extern crate clippy_mini_macro_test as mini_mac; + +mod a { + #[macro_use] + use std::prelude; + #[macro_use] + use mac; + #[macro_use] + use mini_mac; + #[macro_use] + use mac::inner; + + #[derive(ClippyMiniMacroTest)] + struct Test; + + fn main() { + pub_macro!(); + inner_mod!(); + pub_in_private!(_var); + function!(); + let v: ty_mac!() = Vec::default(); + + inner::try_err!(); + } +} fn main() { - let _ = HashMap::::new(); println!(); } From 8ffbf6f94d9cc77ade0596ee104f3549b8db452d Mon Sep 17 00:00:00 2001 From: Devin R Date: Fri, 13 Mar 2020 18:54:32 -0400 Subject: [PATCH 012/142] use hashset not map for keeping track of seen macro refs remove stdout, fix clippy warnings, fmtcar --- clippy_lints/src/macro_use.rs | 131 +++++++++---------------- tests/ui/auxiliary/macro_use_helper.rs | 8 +- tests/ui/macro_use_import.stdout | 0 tests/ui/macro_use_imports.rs | 14 +-- tests/ui/macro_use_imports.stderr | 44 ++++++++- 5 files changed, 97 insertions(+), 100 deletions(-) delete mode 100644 tests/ui/macro_use_import.stdout diff --git a/clippy_lints/src/macro_use.rs b/clippy_lints/src/macro_use.rs index 4c89647a57413..9519fa6093bdc 100644 --- a/clippy_lints/src/macro_use.rs +++ b/clippy_lints/src/macro_use.rs @@ -2,7 +2,7 @@ use crate::utils::{in_macro, snippet, span_lint_and_sugg}; use hir::def::{DefKind, Res}; use if_chain::if_chain; use rustc_ast::ast; -use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::fx::FxHashSet; use rustc_errors::Applicability; use rustc_hir as hir; use rustc_lint::{LateContext, LateLintPass, LintContext}; @@ -29,7 +29,7 @@ declare_clippy_lint! { const BRACKETS: &[char] = &['<', '>']; -/// MacroRefData includes the name of the macro +/// `MacroRefData` includes the name of the macro /// and the path from `SourceMap::span_to_filename`. #[derive(Debug, Clone)] pub struct MacroRefData { @@ -38,11 +38,11 @@ pub struct MacroRefData { } impl MacroRefData { - pub fn new(name: String, span: Span, ecx: &LateContext<'_, '_>) -> Self { + pub fn new(name: &str, span: Span, ecx: &LateContext<'_, '_>) -> Self { let mut path = ecx.sess().source_map().span_to_filename(span).to_string(); // std lib paths are <::std::module::file type> - // so remove brackets and space + // so remove brackets, space and type. if path.contains('<') { path = path.replace(BRACKETS, ""); } @@ -57,13 +57,12 @@ impl MacroRefData { } #[derive(Default)] +#[allow(clippy::module_name_repetitions)] pub struct MacroUseImports { /// the actual import path used and the span of the attribute above it. imports: Vec<(String, Span)>, - /// the span of the macro reference and the `MacroRefData` - /// for the use of the macro. - /// TODO make this FxHashSet to guard against inserting already found macros - collected: FxHashMap, + /// the span of the macro reference, kept to ensure only one reference is used per macro call. + collected: FxHashSet, mac_refs: Vec<(Span, MacroRefData)>, } @@ -72,34 +71,28 @@ impl_lint_pass!(MacroUseImports => [MACRO_USE_IMPORTS]); impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { fn check_item(&mut self, lcx: &LateContext<'_, '_>, item: &hir::Item<'_>) { if_chain! { - if lcx.sess().opts.edition == Edition::Edition2018; - if let hir::ItemKind::Use(path, _kind) = &item.kind; - if let Some(mac_attr) = item - .attrs - .iter() - .find(|attr| attr.ident().map(|s| s.to_string()) == Some("macro_use".to_string())); - if let Res::Def(DefKind::Mod, id) = path.res; - then { - // println!("{:#?}", lcx.tcx.def_path_str(id)); - for kid in lcx.tcx.item_children(id).iter() { - // println!("{:#?}", kid); - if let Res::Def(DefKind::Macro(_mac_type), mac_id) = kid.res { - let span = mac_attr.span.clone(); - - // println!("{:#?}", lcx.tcx.def_path_str(mac_id)); - - self.imports.push((lcx.tcx.def_path_str(mac_id), span)); + if lcx.sess().opts.edition == Edition::Edition2018; + if let hir::ItemKind::Use(path, _kind) = &item.kind; + if let Some(mac_attr) = item + .attrs + .iter() + .find(|attr| attr.ident().map(|s| s.to_string()) == Some("macro_use".to_string())); + if let Res::Def(DefKind::Mod, id) = path.res; + then { + for kid in lcx.tcx.item_children(id).iter() { + if let Res::Def(DefKind::Macro(_mac_type), mac_id) = kid.res { + let span = mac_attr.span; + self.imports.push((lcx.tcx.def_path_str(mac_id), span)); + } } - } - } else { + } else { if in_macro(item.span) { let call_site = item.span.source_callsite(); let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = item.span.source_callee() { - if !self.collected.contains_key(&call_site) { - let mac = MacroRefData::new(name.to_string(), callee.def_site, lcx); - self.mac_refs.push((call_site, mac.clone())); - self.collected.insert(call_site, mac); + if !self.collected.contains(&call_site) { + self.mac_refs.push((call_site, MacroRefData::new(&name, callee.def_site, lcx))); + self.collected.insert(call_site); } } } @@ -111,18 +104,16 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { let call_site = attr.span.source_callsite(); let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = attr.span.source_callee() { - if !self.collected.contains_key(&call_site) { - println!("{:?}\n{:#?}", call_site, attr); - + if !self.collected.contains(&call_site) { let name = if name.contains("::") { name.split("::").last().unwrap().to_string() } else { name.to_string() }; - let mac = MacroRefData::new(name, callee.def_site, lcx); - self.mac_refs.push((call_site, mac.clone())); - self.collected.insert(call_site, mac); + self.mac_refs + .push((call_site, MacroRefData::new(&name, callee.def_site, lcx))); + self.collected.insert(call_site); } } } @@ -132,16 +123,16 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { let call_site = expr.span.source_callsite(); let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = expr.span.source_callee() { - if !self.collected.contains_key(&call_site) { + if !self.collected.contains(&call_site) { let name = if name.contains("::") { name.split("::").last().unwrap().to_string() } else { name.to_string() }; - let mac = MacroRefData::new(name, callee.def_site, lcx); - self.mac_refs.push((call_site, mac.clone())); - self.collected.insert(call_site, mac); + self.mac_refs + .push((call_site, MacroRefData::new(&name, callee.def_site, lcx))); + self.collected.insert(call_site); } } } @@ -151,16 +142,16 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { let call_site = stmt.span.source_callsite(); let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = stmt.span.source_callee() { - if !self.collected.contains_key(&call_site) { + if !self.collected.contains(&call_site) { let name = if name.contains("::") { name.split("::").last().unwrap().to_string() } else { name.to_string() }; - let mac = MacroRefData::new(name, callee.def_site, lcx); - self.mac_refs.push((call_site, mac.clone())); - self.collected.insert(call_site, mac); + self.mac_refs + .push((call_site, MacroRefData::new(&name, callee.def_site, lcx))); + self.collected.insert(call_site); } } } @@ -170,10 +161,10 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { let call_site = pat.span.source_callsite(); let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = pat.span.source_callee() { - if !self.collected.contains_key(&call_site) { - let mac = MacroRefData::new(name.to_string(), callee.def_site, lcx); - self.mac_refs.push((call_site, mac.clone())); - self.collected.insert(call_site, mac); + if !self.collected.contains(&call_site) { + self.mac_refs + .push((call_site, MacroRefData::new(&name, callee.def_site, lcx))); + self.collected.insert(call_site); } } } @@ -183,22 +174,18 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { let call_site = ty.span.source_callsite(); let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = ty.span.source_callee() { - if !self.collected.contains_key(&call_site) { - let mac = MacroRefData::new(name.to_string(), callee.def_site, lcx); - self.mac_refs.push((call_site, mac.clone())); - self.collected.insert(call_site, mac); + if !self.collected.contains(&call_site) { + self.mac_refs + .push((call_site, MacroRefData::new(&name, callee.def_site, lcx))); + self.collected.insert(call_site); } } } } fn check_crate_post(&mut self, lcx: &LateContext<'_, '_>, _krate: &hir::Crate<'_>) { - for (import, span) in self.imports.iter() { - let matched = self - .mac_refs - .iter() - .find(|(_span, mac)| import.ends_with(&mac.name)) - .is_some(); + for (import, span) in &self.imports { + let matched = self.mac_refs.iter().any(|(_span, mac)| import.ends_with(&mac.name)); if matched { self.mac_refs.retain(|(_span, mac)| !import.ends_with(&mac.name)); @@ -218,30 +205,8 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { if !self.mac_refs.is_empty() { // TODO if not empty we found one we could not make a suggestion for // such as std::prelude::v1 or something else I haven't thought of. - // println!("{:#?}", self.mac_refs); + // If we defer the calling of span_lint_and_sugg we can make a decision about its + // applicability? } } } - -const PRELUDE: &[&str] = &[ - "marker", "ops", "convert", "iter", "option", "result", "borrow", "boxed", "string", "vec", "macros", -]; - -/// This is somewhat of a fallback for imports from `std::prelude` because they -/// are not recognized by `LateLintPass::check_item` `lcx.tcx.item_children(id)` -fn make_path(mac: &MacroRefData, use_path: &str) -> String { - let segs = mac.path.split("::").filter(|s| *s != "").collect::>(); - - if segs.starts_with(&["std"]) && PRELUDE.iter().any(|m| segs.contains(m)) { - return format!( - "std::prelude::{} is imported by default, remove `use` statement", - mac.name - ); - } - - if use_path.split("::").count() == 1 { - return format!("{}::{}", use_path, mac.name); - } - - mac.path.clone() -} diff --git a/tests/ui/auxiliary/macro_use_helper.rs b/tests/ui/auxiliary/macro_use_helper.rs index c63149a6819c8..7cc4e1d736a3d 100644 --- a/tests/ui/auxiliary/macro_use_helper.rs +++ b/tests/ui/auxiliary/macro_use_helper.rs @@ -17,7 +17,7 @@ pub mod inner { // ITEM #[macro_export] - macro_rules! inner_mod { + macro_rules! inner_mod_macro { () => { #[allow(dead_code)] pub struct Tardis; @@ -27,7 +27,7 @@ pub mod inner { // EXPR #[macro_export] -macro_rules! function { +macro_rules! function_macro { () => { if true { } else { @@ -37,7 +37,7 @@ macro_rules! function { // TYPE #[macro_export] -macro_rules! ty_mac { +macro_rules! ty_macro { () => { Vec }; @@ -46,7 +46,7 @@ macro_rules! ty_mac { mod extern_exports { pub(super) mod private_inner { #[macro_export] - macro_rules! pub_in_private { + macro_rules! pub_in_private_macro { ($name:ident) => { let $name = String::from("secrets and lies"); }; diff --git a/tests/ui/macro_use_import.stdout b/tests/ui/macro_use_import.stdout deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/tests/ui/macro_use_imports.rs b/tests/ui/macro_use_imports.rs index 76911b0c565f0..bc8762df593b6 100644 --- a/tests/ui/macro_use_imports.rs +++ b/tests/ui/macro_use_imports.rs @@ -12,8 +12,6 @@ extern crate macro_use_helper as mac; extern crate clippy_mini_macro_test as mini_mac; mod a { - #[macro_use] - use std::prelude; #[macro_use] use mac; #[macro_use] @@ -26,15 +24,13 @@ mod a { fn main() { pub_macro!(); - inner_mod!(); - pub_in_private!(_var); - function!(); - let v: ty_mac!() = Vec::default(); + inner_mod_macro!(); + pub_in_private_macro!(_var); + function_macro!(); + let v: ty_macro!() = Vec::default(); inner::try_err!(); } } -fn main() { - println!(); -} +fn main() {} diff --git a/tests/ui/macro_use_imports.stderr b/tests/ui/macro_use_imports.stderr index b5e3dbec57277..6bcacd0be1921 100644 --- a/tests/ui/macro_use_imports.stderr +++ b/tests/ui/macro_use_imports.stderr @@ -1,10 +1,46 @@ error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:5:1 + --> $DIR/macro_use_imports.rs:15:5 | -LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use std::prelude::` +LL | #[macro_use] + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::pub_macro` | = note: `-D clippy::macro-use-imports` implied by `-D warnings` -error: aborting due to previous error +error: `macro_use` attributes are no longer needed in the Rust 2018 edition + --> $DIR/macro_use_imports.rs:15:5 + | +LL | #[macro_use] + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::inner_mod_macro` + +error: `macro_use` attributes are no longer needed in the Rust 2018 edition + --> $DIR/macro_use_imports.rs:15:5 + | +LL | #[macro_use] + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::function_macro` + +error: `macro_use` attributes are no longer needed in the Rust 2018 edition + --> $DIR/macro_use_imports.rs:15:5 + | +LL | #[macro_use] + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::ty_macro` + +error: `macro_use` attributes are no longer needed in the Rust 2018 edition + --> $DIR/macro_use_imports.rs:15:5 + | +LL | #[macro_use] + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::pub_in_private_macro` + +error: `macro_use` attributes are no longer needed in the Rust 2018 edition + --> $DIR/macro_use_imports.rs:17:5 + | +LL | #[macro_use] + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mini_mac::ClippyMiniMacroTest` + +error: `macro_use` attributes are no longer needed in the Rust 2018 edition + --> $DIR/macro_use_imports.rs:19:5 + | +LL | #[macro_use] + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::inner::try_err` + +error: aborting due to 7 previous errors From 1d9e80ad7b5b69caa8b9f9c44d47f26c4bbc4c7b Mon Sep 17 00:00:00 2001 From: Devin R Date: Mon, 23 Mar 2020 22:13:35 -0400 Subject: [PATCH 013/142] remove session --- clippy_lints/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index 89f55986f634f..991899f89bcb9 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -60,7 +60,6 @@ extern crate rustc_trait_selection; #[allow(unused_extern_crates)] extern crate rustc_typeck; -use rustc::session::Session; use rustc_data_structures::fx::FxHashSet; use rustc_lint::LintId; use rustc_session::Session; From 8bc106b29d3d2ee382f6dc4a2e9d6eecf534c6ed Mon Sep 17 00:00:00 2001 From: Devin R Date: Sun, 10 May 2020 09:06:33 -0400 Subject: [PATCH 014/142] fix some of the review, rename, fmt, refactor --- clippy_lints/src/lib.rs | 3 +- clippy_lints/src/macro_use.rs | 130 +++++++++++++++------------------- tests/ui/macro_use_imports.rs | 2 +- 3 files changed, 60 insertions(+), 75 deletions(-) diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index 991899f89bcb9..021fbe932d895 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -1060,7 +1060,8 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: let max_struct_bools = conf.max_struct_bools; store.register_early_pass(move || box excessive_bools::ExcessiveBools::new(max_struct_bools, max_fn_params_bools)); store.register_early_pass(|| box option_env_unwrap::OptionEnvUnwrap); - store.register_late_pass(|| box wildcard_imports::WildcardImports); + let warn_on_all_wildcard_imports = conf.warn_on_all_wildcard_imports; + store.register_late_pass(move || box wildcard_imports::WildcardImports::new(warn_on_all_wildcard_imports)); store.register_late_pass(|| box verbose_file_reads::VerboseFileReads); store.register_late_pass(|| box redundant_pub_crate::RedundantPubCrate::default()); store.register_late_pass(|| box unnamed_address::UnnamedAddress); diff --git a/clippy_lints/src/macro_use.rs b/clippy_lints/src/macro_use.rs index 9519fa6093bdc..9c8035f54a923 100644 --- a/clippy_lints/src/macro_use.rs +++ b/clippy_lints/src/macro_use.rs @@ -38,8 +38,8 @@ pub struct MacroRefData { } impl MacroRefData { - pub fn new(name: &str, span: Span, ecx: &LateContext<'_, '_>) -> Self { - let mut path = ecx.sess().source_map().span_to_filename(span).to_string(); + pub fn new(name: &str, callee: Span, cx: &LateContext<'_, '_>) -> Self { + let mut path = cx.sess().source_map().span_to_filename(callee).to_string(); // std lib paths are <::std::module::file type> // so remove brackets, space and type. @@ -63,15 +63,37 @@ pub struct MacroUseImports { imports: Vec<(String, Span)>, /// the span of the macro reference, kept to ensure only one reference is used per macro call. collected: FxHashSet, - mac_refs: Vec<(Span, MacroRefData)>, + mac_refs: Vec, } impl_lint_pass!(MacroUseImports => [MACRO_USE_IMPORTS]); +impl MacroUseImports { + fn push_unique_macro(&mut self, cx: &LateContext<'_, '_>, name: &str, call_site: Span, callee: Span) { + if !self.collected.contains(&call_site) { + let name = if name.contains("::") { + name.split("::").last().unwrap().to_string() + } else { + name.to_string() + }; + + self.mac_refs.push(MacroRefData::new(&name, callee, cx)); + self.collected.insert(call_site); + } + } + + fn push_unique_macro_pat_ty(&mut self, cx: &LateContext<'_, '_>, name: &str, call_site: Span, callee: Span) { + if !self.collected.contains(&call_site) { + self.mac_refs.push(MacroRefData::new(&name, callee, cx)); + self.collected.insert(call_site); + } + } +} + impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { - fn check_item(&mut self, lcx: &LateContext<'_, '_>, item: &hir::Item<'_>) { + fn check_item(&mut self, cx: &LateContext<'_, '_>, item: &hir::Item<'_>) { if_chain! { - if lcx.sess().opts.edition == Edition::Edition2018; + if cx.sess().opts.edition == Edition::Edition2018; if let hir::ItemKind::Use(path, _kind) = &item.kind; if let Some(mac_attr) = item .attrs @@ -79,126 +101,88 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { .find(|attr| attr.ident().map(|s| s.to_string()) == Some("macro_use".to_string())); if let Res::Def(DefKind::Mod, id) = path.res; then { - for kid in lcx.tcx.item_children(id).iter() { + for kid in cx.tcx.item_children(id).iter() { if let Res::Def(DefKind::Macro(_mac_type), mac_id) = kid.res { let span = mac_attr.span; - self.imports.push((lcx.tcx.def_path_str(mac_id), span)); + self.imports.push((cx.tcx.def_path_str(mac_id), span)); } } } else { - if in_macro(item.span) { - let call_site = item.span.source_callsite(); - let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); - if let Some(callee) = item.span.source_callee() { - if !self.collected.contains(&call_site) { - self.mac_refs.push((call_site, MacroRefData::new(&name, callee.def_site, lcx))); - self.collected.insert(call_site); + if in_macro(item.span) { + let call_site = item.span.source_callsite(); + let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); + if let Some(callee) = item.span.source_callee() { + if !self.collected.contains(&call_site) { + self.mac_refs.push(MacroRefData::new(&name, callee.def_site, cx)); + self.collected.insert(call_site); + } } } - } } } } - fn check_attribute(&mut self, lcx: &LateContext<'_, '_>, attr: &ast::Attribute) { + fn check_attribute(&mut self, cx: &LateContext<'_, '_>, attr: &ast::Attribute) { if in_macro(attr.span) { let call_site = attr.span.source_callsite(); - let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); + let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = attr.span.source_callee() { - if !self.collected.contains(&call_site) { - let name = if name.contains("::") { - name.split("::").last().unwrap().to_string() - } else { - name.to_string() - }; - - self.mac_refs - .push((call_site, MacroRefData::new(&name, callee.def_site, lcx))); - self.collected.insert(call_site); - } + self.push_unique_macro(cx, &name, call_site, callee.def_site); } } } - fn check_expr(&mut self, lcx: &LateContext<'_, '_>, expr: &hir::Expr<'_>) { + fn check_expr(&mut self, cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>) { if in_macro(expr.span) { let call_site = expr.span.source_callsite(); - let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); + let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = expr.span.source_callee() { - if !self.collected.contains(&call_site) { - let name = if name.contains("::") { - name.split("::").last().unwrap().to_string() - } else { - name.to_string() - }; - - self.mac_refs - .push((call_site, MacroRefData::new(&name, callee.def_site, lcx))); - self.collected.insert(call_site); - } + self.push_unique_macro(cx, &name, call_site, callee.def_site); } } } - fn check_stmt(&mut self, lcx: &LateContext<'_, '_>, stmt: &hir::Stmt<'_>) { + fn check_stmt(&mut self, cx: &LateContext<'_, '_>, stmt: &hir::Stmt<'_>) { if in_macro(stmt.span) { let call_site = stmt.span.source_callsite(); - let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); + let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = stmt.span.source_callee() { - if !self.collected.contains(&call_site) { - let name = if name.contains("::") { - name.split("::").last().unwrap().to_string() - } else { - name.to_string() - }; - - self.mac_refs - .push((call_site, MacroRefData::new(&name, callee.def_site, lcx))); - self.collected.insert(call_site); - } + self.push_unique_macro(cx, &name, call_site, callee.def_site); } } } - fn check_pat(&mut self, lcx: &LateContext<'_, '_>, pat: &hir::Pat<'_>) { + fn check_pat(&mut self, cx: &LateContext<'_, '_>, pat: &hir::Pat<'_>) { if in_macro(pat.span) { let call_site = pat.span.source_callsite(); - let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); + let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = pat.span.source_callee() { - if !self.collected.contains(&call_site) { - self.mac_refs - .push((call_site, MacroRefData::new(&name, callee.def_site, lcx))); - self.collected.insert(call_site); - } + self.push_unique_macro_pat_ty(cx, &name, call_site, callee.def_site); } } } - fn check_ty(&mut self, lcx: &LateContext<'_, '_>, ty: &hir::Ty<'_>) { + fn check_ty(&mut self, cx: &LateContext<'_, '_>, ty: &hir::Ty<'_>) { if in_macro(ty.span) { let call_site = ty.span.source_callsite(); - let name = snippet(lcx, lcx.sess().source_map().span_until_char(call_site, '!'), "_"); + let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = ty.span.source_callee() { - if !self.collected.contains(&call_site) { - self.mac_refs - .push((call_site, MacroRefData::new(&name, callee.def_site, lcx))); - self.collected.insert(call_site); - } + self.push_unique_macro_pat_ty(cx, &name, call_site, callee.def_site); } } } - fn check_crate_post(&mut self, lcx: &LateContext<'_, '_>, _krate: &hir::Crate<'_>) { + fn check_crate_post(&mut self, cx: &LateContext<'_, '_>, _krate: &hir::Crate<'_>) { for (import, span) in &self.imports { - let matched = self.mac_refs.iter().any(|(_span, mac)| import.ends_with(&mac.name)); + let matched = self.mac_refs.iter().any(|mac| import.ends_with(&mac.name)); if matched { - self.mac_refs.retain(|(_span, mac)| !import.ends_with(&mac.name)); + self.mac_refs.retain(|mac| !import.ends_with(&mac.name)); let msg = "`macro_use` attributes are no longer needed in the Rust 2018 edition"; let help = format!("use {}", import); span_lint_and_sugg( - lcx, + cx, MACRO_USE_IMPORTS, *span, msg, "remove the attribute and import the macro directly, try", help, - Applicability::HasPlaceholders, + Applicability::MaybeIncorrect, ) } } diff --git a/tests/ui/macro_use_imports.rs b/tests/ui/macro_use_imports.rs index bc8762df593b6..2d4f71e5d5329 100644 --- a/tests/ui/macro_use_imports.rs +++ b/tests/ui/macro_use_imports.rs @@ -22,7 +22,7 @@ mod a { #[derive(ClippyMiniMacroTest)] struct Test; - fn main() { + fn test() { pub_macro!(); inner_mod_macro!(); pub_in_private_macro!(_var); From 451363dc59b3030fee82e4faf04684c068f619cc Mon Sep 17 00:00:00 2001 From: Devin R Date: Thu, 14 May 2020 18:20:07 -0400 Subject: [PATCH 015/142] still working on displaying nested imports --- clippy_lints/src/macro_use.rs | 291 +++++++++++++++++++++++++--------- 1 file changed, 214 insertions(+), 77 deletions(-) diff --git a/clippy_lints/src/macro_use.rs b/clippy_lints/src/macro_use.rs index 9c8035f54a923..8dddd6d716d8e 100644 --- a/clippy_lints/src/macro_use.rs +++ b/clippy_lints/src/macro_use.rs @@ -2,7 +2,7 @@ use crate::utils::{in_macro, snippet, span_lint_and_sugg}; use hir::def::{DefKind, Res}; use if_chain::if_chain; use rustc_ast::ast; -use rustc_data_structures::fx::FxHashSet; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_errors::Applicability; use rustc_hir as hir; use rustc_lint::{LateContext, LateLintPass, LintContext}; @@ -38,7 +38,7 @@ pub struct MacroRefData { } impl MacroRefData { - pub fn new(name: &str, callee: Span, cx: &LateContext<'_, '_>) -> Self { + pub fn new(name: String, callee: Span, cx: &LateContext<'_, '_>) -> Self { let mut path = cx.sess().source_map().span_to_filename(callee).to_string(); // std lib paths are <::std::module::file type> @@ -50,7 +50,7 @@ impl MacroRefData { path = path.split(' ').next().unwrap().to_string(); } Self { - name: name.to_string(), + name, path, } } @@ -69,23 +69,31 @@ pub struct MacroUseImports { impl_lint_pass!(MacroUseImports => [MACRO_USE_IMPORTS]); impl MacroUseImports { - fn push_unique_macro(&mut self, cx: &LateContext<'_, '_>, name: &str, call_site: Span, callee: Span) { - if !self.collected.contains(&call_site) { - let name = if name.contains("::") { - name.split("::").last().unwrap().to_string() - } else { - name.to_string() - }; - - self.mac_refs.push(MacroRefData::new(&name, callee, cx)); - self.collected.insert(call_site); + fn push_unique_macro(&mut self, cx: &LateContext<'_, '_>, span: Span) { + let call_site = span.source_callsite(); + let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); + if let Some(callee) = span.source_callee() { + if !self.collected.contains(&call_site) { + let name = if name.contains("::") { + name.split("::").last().unwrap().to_string() + } else { + name.to_string() + }; + + self.mac_refs.push(MacroRefData::new(name, callee.def_site, cx)); + self.collected.insert(call_site); + } } } - fn push_unique_macro_pat_ty(&mut self, cx: &LateContext<'_, '_>, name: &str, call_site: Span, callee: Span) { - if !self.collected.contains(&call_site) { - self.mac_refs.push(MacroRefData::new(&name, callee, cx)); - self.collected.insert(call_site); + fn push_unique_macro_pat_ty(&mut self, cx: &LateContext<'_, '_>, span: Span) { + let call_site = span.source_callsite(); + let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); + if let Some(callee) = span.source_callee() { + if !self.collected.contains(&call_site) { + self.mac_refs.push(MacroRefData::new(name.to_string(), callee.def_site, cx)); + self.collected.insert(call_site); + } } } } @@ -93,104 +101,233 @@ impl MacroUseImports { impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { fn check_item(&mut self, cx: &LateContext<'_, '_>, item: &hir::Item<'_>) { if_chain! { - if cx.sess().opts.edition == Edition::Edition2018; - if let hir::ItemKind::Use(path, _kind) = &item.kind; - if let Some(mac_attr) = item - .attrs - .iter() - .find(|attr| attr.ident().map(|s| s.to_string()) == Some("macro_use".to_string())); - if let Res::Def(DefKind::Mod, id) = path.res; - then { - for kid in cx.tcx.item_children(id).iter() { - if let Res::Def(DefKind::Macro(_mac_type), mac_id) = kid.res { - let span = mac_attr.span; - self.imports.push((cx.tcx.def_path_str(mac_id), span)); - } - } - } else { - if in_macro(item.span) { - let call_site = item.span.source_callsite(); - let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); - if let Some(callee) = item.span.source_callee() { - if !self.collected.contains(&call_site) { - self.mac_refs.push(MacroRefData::new(&name, callee.def_site, cx)); - self.collected.insert(call_site); - } - } + if cx.sess().opts.edition == Edition::Edition2018; + if let hir::ItemKind::Use(path, _kind) = &item.kind; + if let Some(mac_attr) = item + .attrs + .iter() + .find(|attr| attr.ident().map(|s| s.to_string()) == Some("macro_use".to_string())); + if let Res::Def(DefKind::Mod, id) = path.res; + then { + for kid in cx.tcx.item_children(id).iter() { + if let Res::Def(DefKind::Macro(_mac_type), mac_id) = kid.res { + let span = mac_attr.span; + self.imports.push((cx.tcx.def_path_str(mac_id), span)); } + } + } else { + if in_macro(item.span) { + self.push_unique_macro_pat_ty(cx, item.span); + } } } } fn check_attribute(&mut self, cx: &LateContext<'_, '_>, attr: &ast::Attribute) { if in_macro(attr.span) { - let call_site = attr.span.source_callsite(); - let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); - if let Some(callee) = attr.span.source_callee() { - self.push_unique_macro(cx, &name, call_site, callee.def_site); - } + self.push_unique_macro(cx, attr.span); } } fn check_expr(&mut self, cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>) { if in_macro(expr.span) { - let call_site = expr.span.source_callsite(); - let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); - if let Some(callee) = expr.span.source_callee() { - self.push_unique_macro(cx, &name, call_site, callee.def_site); - } + self.push_unique_macro(cx, expr.span); } } fn check_stmt(&mut self, cx: &LateContext<'_, '_>, stmt: &hir::Stmt<'_>) { if in_macro(stmt.span) { - let call_site = stmt.span.source_callsite(); - let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); - if let Some(callee) = stmt.span.source_callee() { - self.push_unique_macro(cx, &name, call_site, callee.def_site); - } + self.push_unique_macro(cx, stmt.span); } } fn check_pat(&mut self, cx: &LateContext<'_, '_>, pat: &hir::Pat<'_>) { if in_macro(pat.span) { - let call_site = pat.span.source_callsite(); - let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); - if let Some(callee) = pat.span.source_callee() { - self.push_unique_macro_pat_ty(cx, &name, call_site, callee.def_site); - } + self.push_unique_macro_pat_ty(cx, pat.span); } } fn check_ty(&mut self, cx: &LateContext<'_, '_>, ty: &hir::Ty<'_>) { if in_macro(ty.span) { - let call_site = ty.span.source_callsite(); - let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); - if let Some(callee) = ty.span.source_callee() { - self.push_unique_macro_pat_ty(cx, &name, call_site, callee.def_site); - } + self.push_unique_macro_pat_ty(cx, ty.span); } } fn check_crate_post(&mut self, cx: &LateContext<'_, '_>, _krate: &hir::Crate<'_>) { + let mut import_map = FxHashMap::default(); for (import, span) in &self.imports { - let matched = self.mac_refs.iter().any(|mac| import.ends_with(&mac.name)); + let found_idx = self.mac_refs.iter().position(|mac| import.ends_with(&mac.name)); + + if let Some(idx) = found_idx { + let _ = self.mac_refs.remove(idx); + proccess_macro_path(*span, import, &mut import_map); + } + } + println!("{:#?}", import_map); + let mut imports = vec![]; + for (root, rest) in import_map { + let mut path = format!("use {}::", root); + let mut s = None; + let mut count = 1; + let rest_len = rest.len(); + if rest_len > 1 { + path.push_str("{"); + } + for m in &rest { + println!("{} => {:?}", root, m); + if count == 1 { + s = Some(m.span()); + } + + let comma = if rest_len == count { "" } else { ", " }; + match m { + ModPath::Item { item, .. } => { + path.push_str(&format!("{}{}", item, comma)); + } + ModPath::Nested { names, item, span } => { + let nested = rest.iter() + // filter "self" out + .filter(|other_m| other_m != &m) + // this matches the first path segment and filters non ModPath::Nested items + .filter(|other_m| other_m.matches(0, m)) + .collect::>(); + + println!("{:#?}", nested); + + if nested.is_empty() { + path.push_str(&format!("{}::{}{}", names.join("::").to_string(), item, comma)) + } else { + // use mod_a::{mod_b::{one, two}, mod_c::item, item1, item2} + let mod_path = if names.len() - 1 > 0 { + ModPath::Nested { names: names.clone(), item: item.to_string(), span: *span, } + } else { + ModPath::Item { item: names[0].to_string(), span: *span, } + }; + let names = recursive_path_push(mod_path, comma, &rest, String::new()); + path.push_str(&format!("{}::{{{}}}{}", names, item, comma)) + } + } + } + count += 1; + } + if rest_len > 1 { + path.push_str("};"); + } + if let Some(span) = s { + imports.push((span, path)) + } + } - if matched { - self.mac_refs.retain(|mac| !import.ends_with(&mac.name)); - let msg = "`macro_use` attributes are no longer needed in the Rust 2018 edition"; + if !self.mac_refs.is_empty() { + // TODO if not empty we found one we could not make a suggestion for + // such as std::prelude::v1 or something else I haven't thought of. + // If we defer the calling of span_lint_and_sugg we can make a decision about its + // applicability? + } else { + for (span, import) in imports { let help = format!("use {}", import); span_lint_and_sugg( cx, MACRO_USE_IMPORTS, - *span, - msg, + span, + "`macro_use` attributes are no longer needed in the Rust 2018 edition", "remove the attribute and import the macro directly, try", help, Applicability::MaybeIncorrect, ) } } - if !self.mac_refs.is_empty() { - // TODO if not empty we found one we could not make a suggestion for - // such as std::prelude::v1 or something else I haven't thought of. - // If we defer the calling of span_lint_and_sugg we can make a decision about its - // applicability? + } +} + +#[derive(Debug, PartialEq)] +enum ModPath { + Item { item: String, span: Span, }, + Nested { names: Vec, item: String, span: Span, }, +} + +impl ModPath { + fn span(&self) -> Span { + match self { + Self::Item { span, .. } => *span, + Self::Nested { span, .. } => *span, + } + } + + fn item(&self) -> &str { + match self { + Self::Item { item, .. } => item, + Self::Nested { item, .. } => item, + } + } + + fn matches(&self, idx: usize, other: &ModPath) -> bool { + match (self, other) { + (Self::Item { item, .. }, Self::Item { item: other_item, .. }) => item == other_item, + (Self::Nested { names, .. }, Self::Nested { names: other_names, .. }) => { + match (names.get(idx), other_names.get(idx)) { + (Some(seg), Some(other_seg)) => seg == other_seg, + (_, _) => false, + } + } + (_, _) => false, + } + } +} + +fn proccess_macro_path(span: Span, import: &str, import_map: &mut FxHashMap>) { + let mut mod_path = import.split("::").collect::>(); + + if mod_path.len() == 2 { + let item_list = import_map.entry(mod_path[0].to_string()) + .or_insert(vec![]); + + if !item_list.iter().any(|mods| mods.item() == mod_path[1]) { + item_list.push(ModPath::Item{ + item: mod_path[1].to_string(), + span, + }); + } + } else if mod_path.len() > 2 { + let first = mod_path.remove(0); + let name = mod_path.remove(mod_path.len() - 1); + + let nested = ModPath::Nested { + names: mod_path.into_iter().map(ToString::to_string).collect(), + item: name.to_string(), + span, + }; + import_map.entry(first.to_string()) + .or_insert(vec![]) + .push(nested); + } else { + unreachable!("test to see if code path hit TODO REMOVE") + } +} + +fn recursive_path_push(module: ModPath, comma: &str, rest: &[ModPath], mut path: String) -> String { + match &module { + ModPath::Item { item, .. } => { + path.push_str(&format!("{}{}", item, comma)); + } + ModPath::Nested { names, item, span } => { + let nested = rest.iter() + // filter "self" out + .filter(|other_m| other_m != &&module) + // this matches the first path segment and filters non ModPath::Nested items + .filter(|other_m| other_m.matches(0, &module)) + .collect::>(); + + println!("{:#?}", nested); + + if nested.is_empty() { + path.push_str(&format!("{}::{}{}", names.join("::").to_string(), item, comma)) + } else { + // use mod_a::{mod_b::{one, two}, mod_c::item, item1, item2} + let mod_path = if names.len() - 1 > 0 { + ModPath::Nested { names: names.clone(), item: item.to_string(), span: *span, } + } else { + ModPath::Item { item: names[0].to_string(), span: *span, } + }; + let names = recursive_path_push(mod_path, comma, rest, path.to_string()); + // path.push_str(&format!("{}{}", item, comma)); + } } } + path } From d4f60b5ff42a4e8b5889879664002f90dacd6c04 Mon Sep 17 00:00:00 2001 From: Devin R Date: Fri, 15 May 2020 08:36:56 -0400 Subject: [PATCH 016/142] wip: of handling nested import paths for multi-macro paths --- clippy_lints/src/macro_use.rs | 197 ++++++++++++++----------- tests/ui/auxiliary/macro_use_helper.rs | 5 + tests/ui/macro_use_imports.rs | 4 + tests/ui/macro_use_imports.stderr | 38 +---- 4 files changed, 122 insertions(+), 122 deletions(-) diff --git a/clippy_lints/src/macro_use.rs b/clippy_lints/src/macro_use.rs index 8dddd6d716d8e..1e1f27e9430c7 100644 --- a/clippy_lints/src/macro_use.rs +++ b/clippy_lints/src/macro_use.rs @@ -49,10 +49,7 @@ impl MacroRefData { if path.contains(' ') { path = path.split(' ').next().unwrap().to_string(); } - Self { - name, - path, - } + Self { name, path } } } @@ -79,7 +76,7 @@ impl MacroUseImports { } else { name.to_string() }; - + self.mac_refs.push(MacroRefData::new(name, callee.def_site, cx)); self.collected.insert(call_site); } @@ -91,7 +88,8 @@ impl MacroUseImports { let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_"); if let Some(callee) = span.source_callee() { if !self.collected.contains(&call_site) { - self.mac_refs.push(MacroRefData::new(name.to_string(), callee.def_site, cx)); + self.mac_refs + .push(MacroRefData::new(name.to_string(), callee.def_site, cx)); self.collected.insert(call_site); } } @@ -147,78 +145,123 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { self.push_unique_macro_pat_ty(cx, ty.span); } } - + #[allow(clippy::too_many_lines)] fn check_crate_post(&mut self, cx: &LateContext<'_, '_>, _krate: &hir::Crate<'_>) { let mut import_map = FxHashMap::default(); for (import, span) in &self.imports { let found_idx = self.mac_refs.iter().position(|mac| import.ends_with(&mac.name)); - + if let Some(idx) = found_idx { let _ = self.mac_refs.remove(idx); proccess_macro_path(*span, import, &mut import_map); } } - println!("{:#?}", import_map); + // println!("{:#?}", import_map); let mut imports = vec![]; for (root, rest) in import_map { let mut path = format!("use {}::", root); - let mut s = None; + let mut attr_span = None; + // when a multiple nested paths are found one may be written to the string + // before it is found in this loop so we make note and skip it when this + // loop finds it + let mut found_nested = vec![]; let mut count = 1; let rest_len = rest.len(); + if rest_len > 1 { path.push_str("{"); } + for m in &rest { - println!("{} => {:?}", root, m); - if count == 1 { - s = Some(m.span()); + if attr_span.is_none() { + attr_span = Some(m.span()); + } + if found_nested.contains(&m) { + continue; } - let comma = if rest_len == count { "" } else { ", " }; match m { ModPath::Item { item, .. } => { path.push_str(&format!("{}{}", item, comma)); - } - ModPath::Nested { names, item, span } => { - let nested = rest.iter() + }, + ModPath::Nested { segments, item, .. } => { + // do any other Nested paths match the current one + let nested = rest + .iter() // filter "self" out .filter(|other_m| other_m != &m) + // filters out Nested we have previously seen + .filter(|other_m| !found_nested.contains(other_m)) // this matches the first path segment and filters non ModPath::Nested items .filter(|other_m| other_m.matches(0, m)) .collect::>(); - println!("{:#?}", nested); - if nested.is_empty() { - path.push_str(&format!("{}::{}{}", names.join("::").to_string(), item, comma)) + path.push_str(&format!("{}::{}{}", segments.join("::").to_string(), item, comma)) + // use mod_a::{mod_b::{one, two}, mod_c::item} } else { - // use mod_a::{mod_b::{one, two}, mod_c::item, item1, item2} - let mod_path = if names.len() - 1 > 0 { - ModPath::Nested { names: names.clone(), item: item.to_string(), span: *span, } - } else { - ModPath::Item { item: names[0].to_string(), span: *span, } - }; - let names = recursive_path_push(mod_path, comma, &rest, String::new()); - path.push_str(&format!("{}::{{{}}}{}", names, item, comma)) + found_nested.extend(nested.iter()); + found_nested.push(&m); + // we check each segment for matches with other import paths if + // one differs we have to open a new `{}` + for (idx, seg) in segments.iter().enumerate() { + path.push_str(&format!("{}::", seg)); + if nested.iter().all(|other_m| other_m.matches(idx, &m)) { + continue; + } + + path.push_str("{"); + let matched_seg_items = nested + .iter() + .filter(|other_m| !other_m.matches(idx, &m)) + .collect::>(); + for item in matched_seg_items { + if let ModPath::Nested { item, .. } = item { + path.push_str(&format!( + "{}{}", + item, + if nested.len() == idx + 1 { "" } else { ", " } + )); + } + } + path.push_str("}"); + } + path.push_str(&format!("{{{}{}", item, comma)); + for (i, item) in nested.iter().enumerate() { + if let ModPath::Nested { item, segments: matched_seg, .. } = item { + path.push_str(&format!( + "{}{}{}", + if matched_seg > segments { + format!("{}::", matched_seg[segments.len()..].join("::")) + } else { + String::new() + }, + item, + if nested.len() == i + 1 { "" } else { ", " } + )); + } + } + path.push_str("}"); } - } + }, } - count += 1; + count += 1; } if rest_len > 1 { path.push_str("};"); + } else { + path.push_str(";"); } - if let Some(span) = s { + if let Some(span) = attr_span { imports.push((span, path)) + } else { + unreachable!("a span must always be attached to a macro_use attribute") } } - if !self.mac_refs.is_empty() { - // TODO if not empty we found one we could not make a suggestion for - // such as std::prelude::v1 or something else I haven't thought of. - // If we defer the calling of span_lint_and_sugg we can make a decision about its - // applicability? - } else { + // If mac_refs is not empty we have encountered an import we could not handle + // such as `std::prelude::v1::foo` or some other macro that expands to an import. + if self.mac_refs.is_empty() { for (span, import) in imports { let help = format!("use {}", import); span_lint_and_sugg( @@ -237,48 +280,56 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { #[derive(Debug, PartialEq)] enum ModPath { - Item { item: String, span: Span, }, - Nested { names: Vec, item: String, span: Span, }, + Item { + item: String, + span: Span, + }, + Nested { + segments: Vec, + item: String, + span: Span, + }, } impl ModPath { fn span(&self) -> Span { match self { - Self::Item { span, .. } => *span, - Self::Nested { span, .. } => *span, + Self::Item { span, .. } | Self::Nested { span, .. } => *span, } } fn item(&self) -> &str { match self { - Self::Item { item, .. } => item, - Self::Nested { item, .. } => item, + Self::Item { item, .. } | Self::Nested { item, .. } => item, } } fn matches(&self, idx: usize, other: &ModPath) -> bool { match (self, other) { (Self::Item { item, .. }, Self::Item { item: other_item, .. }) => item == other_item, - (Self::Nested { names, .. }, Self::Nested { names: other_names, .. }) => { - match (names.get(idx), other_names.get(idx)) { - (Some(seg), Some(other_seg)) => seg == other_seg, - (_, _) => false, - } - } + ( + Self::Nested { segments, .. }, + Self::Nested { + segments: other_names, .. + }, + ) => match (segments.get(idx), other_names.get(idx)) { + (Some(seg), Some(other_seg)) => seg == other_seg, + (_, _) => false, + }, (_, _) => false, } } } +#[allow(clippy::comparison_chain)] fn proccess_macro_path(span: Span, import: &str, import_map: &mut FxHashMap>) { let mut mod_path = import.split("::").collect::>(); if mod_path.len() == 2 { - let item_list = import_map.entry(mod_path[0].to_string()) - .or_insert(vec![]); + let item_list = import_map.entry(mod_path[0].to_string()).or_insert_with(Vec::new); if !item_list.iter().any(|mods| mods.item() == mod_path[1]) { - item_list.push(ModPath::Item{ + item_list.push(ModPath::Item { item: mod_path[1].to_string(), span, }); @@ -288,46 +339,16 @@ fn proccess_macro_path(span: Span, import: &str, import_map: &mut FxHashMap String { - match &module { - ModPath::Item { item, .. } => { - path.push_str(&format!("{}{}", item, comma)); - } - ModPath::Nested { names, item, span } => { - let nested = rest.iter() - // filter "self" out - .filter(|other_m| other_m != &&module) - // this matches the first path segment and filters non ModPath::Nested items - .filter(|other_m| other_m.matches(0, &module)) - .collect::>(); - - println!("{:#?}", nested); - - if nested.is_empty() { - path.push_str(&format!("{}::{}{}", names.join("::").to_string(), item, comma)) - } else { - // use mod_a::{mod_b::{one, two}, mod_c::item, item1, item2} - let mod_path = if names.len() - 1 > 0 { - ModPath::Nested { names: names.clone(), item: item.to_string(), span: *span, } - } else { - ModPath::Item { item: names[0].to_string(), span: *span, } - }; - let names = recursive_path_push(mod_path, comma, rest, path.to_string()); - // path.push_str(&format!("{}{}", item, comma)); - } - } - } - path -} diff --git a/tests/ui/auxiliary/macro_use_helper.rs b/tests/ui/auxiliary/macro_use_helper.rs index 7cc4e1d736a3d..ecb55d8cb48d5 100644 --- a/tests/ui/auxiliary/macro_use_helper.rs +++ b/tests/ui/auxiliary/macro_use_helper.rs @@ -13,8 +13,13 @@ pub mod inner { // RE-EXPORT // this will stick in `inner` module + pub use macro_rules::foofoo; pub use macro_rules::try_err; + pub mod nested { + pub use macro_rules::string_add; + } + // ITEM #[macro_export] macro_rules! inner_mod_macro { diff --git a/tests/ui/macro_use_imports.rs b/tests/ui/macro_use_imports.rs index 2d4f71e5d5329..52dec0e44b306 100644 --- a/tests/ui/macro_use_imports.rs +++ b/tests/ui/macro_use_imports.rs @@ -18,6 +18,8 @@ mod a { use mini_mac; #[macro_use] use mac::inner; + #[macro_use] + use mac::inner::nested; #[derive(ClippyMiniMacroTest)] struct Test; @@ -30,6 +32,8 @@ mod a { let v: ty_macro!() = Vec::default(); inner::try_err!(); + inner::foofoo!(); + nested::string_add!(); } } diff --git a/tests/ui/macro_use_imports.stderr b/tests/ui/macro_use_imports.stderr index 6bcacd0be1921..00c76c19ea9e8 100644 --- a/tests/ui/macro_use_imports.stderr +++ b/tests/ui/macro_use_imports.stderr @@ -1,8 +1,8 @@ error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:15:5 + --> $DIR/macro_use_imports.rs:17:5 | LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::pub_macro` + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use use mini_mac::ClippyMiniMacroTest;` | = note: `-D clippy::macro-use-imports` implied by `-D warnings` @@ -10,37 +10,7 @@ error: `macro_use` attributes are no longer needed in the Rust 2018 edition --> $DIR/macro_use_imports.rs:15:5 | LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::inner_mod_macro` - -error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:15:5 - | -LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::function_macro` - -error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:15:5 - | -LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::ty_macro` - -error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:15:5 - | -LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::pub_in_private_macro` - -error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:17:5 - | -LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mini_mac::ClippyMiniMacroTest` - -error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:19:5 - | -LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::inner::try_err` + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use use mac::{pub_macro, inner_mod_macro, function_macro, ty_macro, pub_in_private_macro, inner::{foofoo, try_err, nested::string_add}};` -error: aborting due to 7 previous errors +error: aborting due to 2 previous errors From 8c5a5a92ec6f298a067ba052a0d5b6150537c1c9 Mon Sep 17 00:00:00 2001 From: Devin R Date: Tue, 26 May 2020 19:57:36 -0400 Subject: [PATCH 017/142] cleaned up import suggestion formatter, look into code reuse with wildcard impotrs --- clippy_lints/src/macro_use.rs | 224 +++++++----------------------- tests/ui/macro_use_imports.stderr | 18 ++- 2 files changed, 64 insertions(+), 178 deletions(-) diff --git a/clippy_lints/src/macro_use.rs b/clippy_lints/src/macro_use.rs index 1e1f27e9430c7..089ae79b02c23 100644 --- a/clippy_lints/src/macro_use.rs +++ b/clippy_lints/src/macro_use.rs @@ -29,6 +29,12 @@ declare_clippy_lint! { const BRACKETS: &[char] = &['<', '>']; +#[derive(Clone, Debug, PartialEq, Eq)] +struct PathAndSpan { + path: String, + span: Span, +} + /// `MacroRefData` includes the name of the macro /// and the path from `SourceMap::span_to_filename`. #[derive(Debug, Clone)] @@ -110,7 +116,8 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { for kid in cx.tcx.item_children(id).iter() { if let Res::Def(DefKind::Macro(_mac_type), mac_id) = kid.res { let span = mac_attr.span; - self.imports.push((cx.tcx.def_path_str(mac_id), span)); + let def_path = cx.tcx.def_path_str(mac_id); + self.imports.push((def_path, span)); } } } else { @@ -147,127 +154,69 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { } #[allow(clippy::too_many_lines)] fn check_crate_post(&mut self, cx: &LateContext<'_, '_>, _krate: &hir::Crate<'_>) { - let mut import_map = FxHashMap::default(); + let mut used = FxHashMap::default(); + let mut check_dup = vec![]; for (import, span) in &self.imports { let found_idx = self.mac_refs.iter().position(|mac| import.ends_with(&mac.name)); if let Some(idx) = found_idx { let _ = self.mac_refs.remove(idx); - proccess_macro_path(*span, import, &mut import_map); - } - } - // println!("{:#?}", import_map); - let mut imports = vec![]; - for (root, rest) in import_map { - let mut path = format!("use {}::", root); - let mut attr_span = None; - // when a multiple nested paths are found one may be written to the string - // before it is found in this loop so we make note and skip it when this - // loop finds it - let mut found_nested = vec![]; - let mut count = 1; - let rest_len = rest.len(); - - if rest_len > 1 { - path.push_str("{"); - } - - for m in &rest { - if attr_span.is_none() { - attr_span = Some(m.span()); - } - if found_nested.contains(&m) { - continue; - } - let comma = if rest_len == count { "" } else { ", " }; - match m { - ModPath::Item { item, .. } => { - path.push_str(&format!("{}{}", item, comma)); + let seg = import.split("::").collect::>(); + + match seg.as_slice() { + [] => unreachable!("this should never be empty"), + [_] => unreachable!("path must have two segments ?"), + [root, item] => { + if !check_dup.contains(&item.to_string()) { + used.entry((root.to_string(), span)) + .or_insert(vec![]) + .push(item.to_string()); + check_dup.push(item.to_string()); + } }, - ModPath::Nested { segments, item, .. } => { - // do any other Nested paths match the current one - let nested = rest - .iter() - // filter "self" out - .filter(|other_m| other_m != &m) - // filters out Nested we have previously seen - .filter(|other_m| !found_nested.contains(other_m)) - // this matches the first path segment and filters non ModPath::Nested items - .filter(|other_m| other_m.matches(0, m)) - .collect::>(); - - if nested.is_empty() { - path.push_str(&format!("{}::{}{}", segments.join("::").to_string(), item, comma)) - // use mod_a::{mod_b::{one, two}, mod_c::item} + [root, rest @ ..] => { + if !rest.iter().all(|item| !check_dup.contains(&item.to_string())) { + let mut rest = rest.to_vec(); + rest.sort(); + used.entry((root.to_string(), span)) + .or_insert(vec![]) + .push(rest.join("::")); + check_dup.extend(rest.iter().map(ToString::to_string)); } else { - found_nested.extend(nested.iter()); - found_nested.push(&m); - // we check each segment for matches with other import paths if - // one differs we have to open a new `{}` - for (idx, seg) in segments.iter().enumerate() { - path.push_str(&format!("{}::", seg)); - if nested.iter().all(|other_m| other_m.matches(idx, &m)) { - continue; - } - - path.push_str("{"); - let matched_seg_items = nested - .iter() - .filter(|other_m| !other_m.matches(idx, &m)) - .collect::>(); - for item in matched_seg_items { - if let ModPath::Nested { item, .. } = item { - path.push_str(&format!( - "{}{}", - item, - if nested.len() == idx + 1 { "" } else { ", " } - )); - } - } - path.push_str("}"); - } - path.push_str(&format!("{{{}{}", item, comma)); - for (i, item) in nested.iter().enumerate() { - if let ModPath::Nested { item, segments: matched_seg, .. } = item { - path.push_str(&format!( - "{}{}{}", - if matched_seg > segments { - format!("{}::", matched_seg[segments.len()..].join("::")) - } else { - String::new() - }, - item, - if nested.len() == i + 1 { "" } else { ", " } - )); - } - } - path.push_str("}"); + let mut filtered = rest + .iter() + .filter(|item| !check_dup.contains(&item.to_string())) + .map(ToString::to_string) + .collect::>(); + filtered.sort(); + used.entry((root.to_string(), span)) + .or_insert(vec![]) + .push(filtered.join("::")); + check_dup.extend(filtered); } }, } - count += 1; } - if rest_len > 1 { - path.push_str("};"); - } else { - path.push_str(";"); - } - if let Some(span) = attr_span { - imports.push((span, path)) + } + + let mut suggestions = vec![]; + for ((root, span), path) in used { + if path.len() == 1 { + suggestions.push((span, format!("{}::{}", root, path[0]))) } else { - unreachable!("a span must always be attached to a macro_use attribute") + suggestions.push((span, format!("{}::{{{}}}", root, path.join(", ")))) } } // If mac_refs is not empty we have encountered an import we could not handle // such as `std::prelude::v1::foo` or some other macro that expands to an import. if self.mac_refs.is_empty() { - for (span, import) in imports { + for (span, import) in suggestions { let help = format!("use {}", import); span_lint_and_sugg( cx, MACRO_USE_IMPORTS, - span, + *span, "`macro_use` attributes are no longer needed in the Rust 2018 edition", "remove the attribute and import the macro directly, try", help, @@ -277,78 +226,3 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { } } } - -#[derive(Debug, PartialEq)] -enum ModPath { - Item { - item: String, - span: Span, - }, - Nested { - segments: Vec, - item: String, - span: Span, - }, -} - -impl ModPath { - fn span(&self) -> Span { - match self { - Self::Item { span, .. } | Self::Nested { span, .. } => *span, - } - } - - fn item(&self) -> &str { - match self { - Self::Item { item, .. } | Self::Nested { item, .. } => item, - } - } - - fn matches(&self, idx: usize, other: &ModPath) -> bool { - match (self, other) { - (Self::Item { item, .. }, Self::Item { item: other_item, .. }) => item == other_item, - ( - Self::Nested { segments, .. }, - Self::Nested { - segments: other_names, .. - }, - ) => match (segments.get(idx), other_names.get(idx)) { - (Some(seg), Some(other_seg)) => seg == other_seg, - (_, _) => false, - }, - (_, _) => false, - } - } -} - -#[allow(clippy::comparison_chain)] -fn proccess_macro_path(span: Span, import: &str, import_map: &mut FxHashMap>) { - let mut mod_path = import.split("::").collect::>(); - - if mod_path.len() == 2 { - let item_list = import_map.entry(mod_path[0].to_string()).or_insert_with(Vec::new); - - if !item_list.iter().any(|mods| mods.item() == mod_path[1]) { - item_list.push(ModPath::Item { - item: mod_path[1].to_string(), - span, - }); - } - } else if mod_path.len() > 2 { - let first = mod_path.remove(0); - let name = mod_path.remove(mod_path.len() - 1); - - let nested = ModPath::Nested { - segments: mod_path.into_iter().map(ToString::to_string).collect(), - item: name.to_string(), - span, - }; - // CLIPPY NOTE: this told me to use `or_insert_with(vec![])` - // import_map.entry(first.to_string()).or_insert(vec![]).push(nested); - // which failed as `vec!` is not a closure then told me to add `||` which failed - // with the redundant_closure lint so I finally gave up and used this. - import_map.entry(first.to_string()).or_insert_with(Vec::new).push(nested); - } else { - unreachable!("test to see if code path hit TODO REMOVE") - } -} diff --git a/tests/ui/macro_use_imports.stderr b/tests/ui/macro_use_imports.stderr index 00c76c19ea9e8..83c8ebe6ab9ed 100644 --- a/tests/ui/macro_use_imports.stderr +++ b/tests/ui/macro_use_imports.stderr @@ -2,15 +2,27 @@ error: `macro_use` attributes are no longer needed in the Rust 2018 edition --> $DIR/macro_use_imports.rs:17:5 | LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use use mini_mac::ClippyMiniMacroTest;` + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mini_mac::ClippyMiniMacroTest` | = note: `-D clippy::macro-use-imports` implied by `-D warnings` +error: `macro_use` attributes are no longer needed in the Rust 2018 edition + --> $DIR/macro_use_imports.rs:21:5 + | +LL | #[macro_use] + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::inner::nested::string_add` + +error: `macro_use` attributes are no longer needed in the Rust 2018 edition + --> $DIR/macro_use_imports.rs:19:5 + | +LL | #[macro_use] + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{foofoo::inner, inner::try_err}` + error: `macro_use` attributes are no longer needed in the Rust 2018 edition --> $DIR/macro_use_imports.rs:15:5 | LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use use mac::{pub_macro, inner_mod_macro, function_macro, ty_macro, pub_in_private_macro, inner::{foofoo, try_err, nested::string_add}};` + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{pub_macro, inner_mod_macro, function_macro, ty_macro, pub_in_private_macro}` -error: aborting due to 2 previous errors +error: aborting due to 4 previous errors From 288df59b25c04f05d08d817727a8ac9c8d0d6648 Mon Sep 17 00:00:00 2001 From: Devin R Date: Sun, 7 Jun 2020 16:12:35 -0400 Subject: [PATCH 018/142] Fix suggestion output, add run-rustfix to test file, stop sorting import segments duh --- clippy_lints/src/macro_use.rs | 35 +++++++++++++------------- tests/ui/macro_use_imports.fixed | 41 +++++++++++++++++++++++++++++++ tests/ui/macro_use_imports.rs | 1 + tests/ui/macro_use_imports.stderr | 16 ++++++------ 4 files changed, 68 insertions(+), 25 deletions(-) create mode 100644 tests/ui/macro_use_imports.fixed diff --git a/clippy_lints/src/macro_use.rs b/clippy_lints/src/macro_use.rs index 089ae79b02c23..7e3ce07254f7a 100644 --- a/clippy_lints/src/macro_use.rs +++ b/clippy_lints/src/macro_use.rs @@ -167,32 +167,33 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { [] => unreachable!("this should never be empty"), [_] => unreachable!("path must have two segments ?"), [root, item] => { - if !check_dup.contains(&item.to_string()) { + if !check_dup.contains(&(*item).to_string()) { used.entry((root.to_string(), span)) - .or_insert(vec![]) + .or_insert_with(|| vec![]) .push(item.to_string()); check_dup.push(item.to_string()); } }, [root, rest @ ..] => { - if !rest.iter().all(|item| !check_dup.contains(&item.to_string())) { - let mut rest = rest.to_vec(); - rest.sort(); - used.entry((root.to_string(), span)) - .or_insert(vec![]) - .push(rest.join("::")); - check_dup.extend(rest.iter().map(ToString::to_string)); - } else { - let mut filtered = rest + if rest.iter().all(|item| !check_dup.contains(&(*item).to_string())) { + let filtered = rest .iter() - .filter(|item| !check_dup.contains(&item.to_string())) - .map(ToString::to_string) + .filter_map(|item| if check_dup.contains(&(*item).to_string()) { + None + } else { + Some(item.to_string()) + }) .collect::>(); - filtered.sort(); - used.entry((root.to_string(), span)) - .or_insert(vec![]) + used.entry(((*root).to_string(), span)) + .or_insert_with(|| vec![]) .push(filtered.join("::")); check_dup.extend(filtered); + } else { + let rest = rest.to_vec(); + used.entry((root.to_string(), span)) + .or_insert_with(|| vec![]) + .push(rest.join("::")); + check_dup.extend(rest.iter().map(ToString::to_string)); } }, } @@ -212,7 +213,7 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { // such as `std::prelude::v1::foo` or some other macro that expands to an import. if self.mac_refs.is_empty() { for (span, import) in suggestions { - let help = format!("use {}", import); + let help = format!("use {};", import); span_lint_and_sugg( cx, MACRO_USE_IMPORTS, diff --git a/tests/ui/macro_use_imports.fixed b/tests/ui/macro_use_imports.fixed new file mode 100644 index 0000000000000..8034c56b59adb --- /dev/null +++ b/tests/ui/macro_use_imports.fixed @@ -0,0 +1,41 @@ +// compile-flags: --edition 2018 +// aux-build:macro_rules.rs +// aux-build:macro_use_helper.rs +// run-rustfix + +#![allow(clippy::single_component_path_imports)] +#![warn(clippy::macro_use_imports)] + +#[macro_use] +extern crate macro_use_helper as mac; + +#[macro_use] +extern crate clippy_mini_macro_test as mini_mac; + +mod a { + use mac::{pub_macro, inner_mod_macro, function_macro, ty_macro, pub_in_private_macro}; + use mac; + use mini_mac::ClippyMiniMacroTest; + use mini_mac; + use mac::{inner::foofoo, inner::try_err}; + use mac::inner; + use mac::inner::nested::string_add; + use mac::inner::nested; + + #[derive(ClippyMiniMacroTest)] + struct Test; + + fn test() { + pub_macro!(); + inner_mod_macro!(); + pub_in_private_macro!(_var); + function_macro!(); + let v: ty_macro!() = Vec::default(); + + inner::try_err!(); + inner::foofoo!(); + nested::string_add!(); + } +} + +fn main() {} diff --git a/tests/ui/macro_use_imports.rs b/tests/ui/macro_use_imports.rs index 52dec0e44b306..7d415222d64fc 100644 --- a/tests/ui/macro_use_imports.rs +++ b/tests/ui/macro_use_imports.rs @@ -1,6 +1,7 @@ // compile-flags: --edition 2018 // aux-build:macro_rules.rs // aux-build:macro_use_helper.rs +// run-rustfix #![allow(clippy::single_component_path_imports)] #![warn(clippy::macro_use_imports)] diff --git a/tests/ui/macro_use_imports.stderr b/tests/ui/macro_use_imports.stderr index 83c8ebe6ab9ed..6feda8a52226b 100644 --- a/tests/ui/macro_use_imports.stderr +++ b/tests/ui/macro_use_imports.stderr @@ -1,28 +1,28 @@ error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:17:5 + --> $DIR/macro_use_imports.rs:18:5 | LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mini_mac::ClippyMiniMacroTest` + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mini_mac::ClippyMiniMacroTest;` | = note: `-D clippy::macro-use-imports` implied by `-D warnings` error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:21:5 + --> $DIR/macro_use_imports.rs:20:5 | LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::inner::nested::string_add` + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{inner::foofoo, inner::try_err};` error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:19:5 + --> $DIR/macro_use_imports.rs:16:5 | LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{foofoo::inner, inner::try_err}` + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{pub_macro, inner_mod_macro, function_macro, ty_macro, pub_in_private_macro};` error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:15:5 + --> $DIR/macro_use_imports.rs:22:5 | LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{pub_macro, inner_mod_macro, function_macro, ty_macro, pub_in_private_macro}` + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::inner::nested::string_add;` error: aborting due to 4 previous errors From 8db24840f7457f005cb73807197992922ca960b1 Mon Sep 17 00:00:00 2001 From: Lzu Tao Date: Tue, 9 Jun 2020 14:36:01 +0000 Subject: [PATCH 019/142] Merge commit 'ff0993c5e9162ddaea78e83d0f0161e68bd4ea73' into clippy --- .github/workflows/clippy_bors.yml | 3 +- CHANGELOG.md | 87 ++- CONTRIBUTING.md | 36 +- Cargo.toml | 2 +- clippy_dev/src/lib.rs | 3 +- clippy_dev/src/main.rs | 16 +- clippy_dev/src/new_lint.rs | 2 + clippy_dev/src/ra_setup.rs | 90 +++ clippy_lints/Cargo.toml | 4 +- clippy_lints/src/assign_ops.rs | 4 + clippy_lints/src/await_holding_lock.rs | 19 +- clippy_lints/src/cargo_common_metadata.rs | 13 +- clippy_lints/src/checked_conversions.rs | 78 +-- clippy_lints/src/copies.rs | 14 +- clippy_lints/src/double_parens.rs | 18 +- clippy_lints/src/drop_bounds.rs | 4 + clippy_lints/src/duration_subsec.rs | 6 + clippy_lints/src/enum_variants.rs | 32 +- clippy_lints/src/eq_op.rs | 4 + clippy_lints/src/escape.rs | 7 + clippy_lints/src/eta_reduction.rs | 4 + clippy_lints/src/eval_order_dependence.rs | 9 + clippy_lints/src/fallible_impl_from.rs | 21 +- clippy_lints/src/floating_point_arithmetic.rs | 2 - clippy_lints/src/format.rs | 6 +- clippy_lints/src/formatting.rs | 8 +- clippy_lints/src/functions.rs | 16 +- clippy_lints/src/implicit_saturating_sub.rs | 7 - clippy_lints/src/int_plus_one.rs | 1 - clippy_lints/src/integer_division.rs | 11 +- clippy_lints/src/items_after_statements.rs | 16 + clippy_lints/src/len_zero.rs | 17 +- clippy_lints/src/let_and_return.rs | 141 +++++ clippy_lints/src/lib.rs | 31 +- clippy_lints/src/literal_representation.rs | 12 + clippy_lints/src/loops.rs | 34 +- clippy_lints/src/matches.rs | 43 +- .../methods/manual_saturating_arithmetic.rs | 2 +- clippy_lints/src/methods/mod.rs | 178 ++++-- clippy_lints/src/misc.rs | 50 +- clippy_lints/src/misc_early.rs | 34 +- clippy_lints/src/multiple_crate_versions.rs | 10 +- clippy_lints/src/mut_reference.rs | 4 + clippy_lints/src/mutex_atomic.rs | 12 +- clippy_lints/src/needless_bool.rs | 3 +- clippy_lints/src/needless_borrow.rs | 8 +- clippy_lints/src/needless_continue.rs | 2 +- clippy_lints/src/needless_update.rs | 10 + clippy_lints/src/new_without_default.rs | 6 +- clippy_lints/src/no_effect.rs | 2 +- clippy_lints/src/ptr.rs | 23 +- clippy_lints/src/question_mark.rs | 2 +- clippy_lints/src/ranges.rs | 62 +-- clippy_lints/src/reference.rs | 5 + clippy_lints/src/regex.rs | 12 +- clippy_lints/src/returns.rs | 82 +-- clippy_lints/src/shadow.rs | 10 + .../src/single_component_path_imports.rs | 4 +- .../src/slow_vector_initialization.rs | 8 +- clippy_lints/src/strings.rs | 8 + clippy_lints/src/suspicious_trait_impl.rs | 6 +- clippy_lints/src/transmute.rs | 47 +- clippy_lints/src/types.rs | 142 ++++- clippy_lints/src/unnecessary_sort_by.rs | 267 +++++++++ clippy_lints/src/unnested_or_patterns.rs | 407 ++++++++++++++ clippy_lints/src/unwrap.rs | 2 +- clippy_lints/src/useless_conversion.rs | 14 +- clippy_lints/src/utils/ast_utils.rs | 526 ++++++++++++++++++ clippy_lints/src/utils/hir_utils.rs | 10 +- clippy_lints/src/utils/mod.rs | 64 ++- clippy_lints/src/utils/paths.rs | 1 + clippy_lints/src/vec.rs | 10 +- clippy_lints/src/vec_resize_to_zero.rs | 59 ++ clippy_lints/src/verbose_file_reads.rs | 1 + clippy_lints/src/wildcard_dependencies.rs | 7 +- clippy_lints/src/wildcard_imports.rs | 12 +- clippy_lints/src/zero_div_zero.rs | 6 +- doc/changelog_update.md | 12 +- doc/common_tools_writing_lints.md | 48 ++ doc/release.md | 88 ++- src/lintlist/mod.rs | 34 +- tests/compile-test.rs | 9 +- .../cargo_common_metadata/fail/Cargo.toml | 2 + .../cargo_common_metadata/pass/Cargo.toml | 2 + .../5041_allow_dev_build/Cargo.toml | 2 + .../multiple_crate_versions/fail/Cargo.toml | 2 + .../multiple_crate_versions/pass/Cargo.toml | 2 + .../wildcard_dependencies/fail/Cargo.toml | 2 + .../wildcard_dependencies/pass/Cargo.toml | 2 + tests/ui/checked_conversions.fixed | 106 ++-- tests/ui/checked_conversions.rs | 106 ++-- tests/ui/checked_conversions.stderr | 98 +++- tests/ui/checked_conversions.stdout | 0 tests/ui/crashes/ice-3969.rs | 51 ++ tests/ui/crashes/ice-3969.stderr | 22 + tests/ui/crashes/regressions.rs | 4 + tests/ui/into_iter_on_ref.fixed | 2 + tests/ui/into_iter_on_ref.rs | 2 + tests/ui/into_iter_on_ref.stderr | 8 +- tests/ui/iter_next_slice.fixed | 24 + tests/ui/iter_next_slice.rs | 24 + tests/ui/iter_next_slice.stderr | 28 + tests/ui/len_zero.fixed | 8 + tests/ui/len_zero.rs | 8 + tests/ui/len_zero_ranges.fixed | 14 + tests/ui/len_zero_ranges.rs | 14 + tests/ui/len_zero_ranges.stderr | 10 + tests/ui/let_and_return.rs | 138 +++++ ...et_return.stderr => let_and_return.stderr} | 4 +- tests/ui/let_return.rs | 70 --- tests/ui/needless_collect.fixed | 2 +- tests/ui/needless_collect.stderr | 16 +- tests/ui/neg_cmp_op_on_partial_ord.rs | 1 + tests/ui/neg_cmp_op_on_partial_ord.stderr | 8 +- tests/ui/or_fun_call.fixed | 4 +- tests/ui/or_fun_call.stderr | 18 +- tests/ui/reversed_empty_ranges_fixable.fixed | 8 +- tests/ui/reversed_empty_ranges_fixable.rs | 8 +- tests/ui/reversed_empty_ranges_fixable.stderr | 16 +- tests/ui/reversed_empty_ranges_unfixable.rs | 5 +- .../ui/reversed_empty_ranges_unfixable.stderr | 18 +- tests/ui/string_lit_as_bytes.fixed | 2 + tests/ui/string_lit_as_bytes.rs | 2 + tests/ui/string_lit_as_bytes.stderr | 4 +- tests/ui/unit_arg.fixed | 64 --- tests/ui/unit_arg.rs | 27 +- tests/ui/unit_arg.stderr | 178 ++++-- tests/ui/unit_arg_empty_blocks.rs | 26 + tests/ui/unit_arg_empty_blocks.stderr | 51 ++ tests/ui/unnecessary_sort_by.fixed | 26 + tests/ui/unnecessary_sort_by.rs | 26 + tests/ui/unnecessary_sort_by.stderr | 46 ++ tests/ui/unnested_or_patterns.fixed | 33 ++ tests/ui/unnested_or_patterns.rs | 33 ++ tests/ui/unnested_or_patterns.stderr | 179 ++++++ tests/ui/unnested_or_patterns2.fixed | 18 + tests/ui/unnested_or_patterns2.rs | 18 + tests/ui/unnested_or_patterns2.stderr | 91 +++ tests/ui/vec_resize_to_zero.rs | 15 + tests/ui/vec_resize_to_zero.stderr | 13 + tests/ui/wildcard_enum_match_arm.fixed | 3 +- tests/ui/wildcard_enum_match_arm.rs | 3 +- tests/ui/wildcard_enum_match_arm.stderr | 10 +- 143 files changed, 3943 insertions(+), 914 deletions(-) create mode 100644 clippy_dev/src/ra_setup.rs create mode 100644 clippy_lints/src/let_and_return.rs create mode 100644 clippy_lints/src/unnecessary_sort_by.rs create mode 100644 clippy_lints/src/unnested_or_patterns.rs create mode 100755 clippy_lints/src/utils/ast_utils.rs create mode 100644 clippy_lints/src/vec_resize_to_zero.rs delete mode 100644 tests/ui/checked_conversions.stdout create mode 100644 tests/ui/crashes/ice-3969.rs create mode 100644 tests/ui/crashes/ice-3969.stderr create mode 100644 tests/ui/iter_next_slice.fixed create mode 100644 tests/ui/iter_next_slice.rs create mode 100644 tests/ui/iter_next_slice.stderr create mode 100644 tests/ui/len_zero_ranges.fixed create mode 100644 tests/ui/len_zero_ranges.rs create mode 100644 tests/ui/len_zero_ranges.stderr create mode 100644 tests/ui/let_and_return.rs rename tests/ui/{let_return.stderr => let_and_return.stderr} (89%) delete mode 100644 tests/ui/let_return.rs delete mode 100644 tests/ui/unit_arg.fixed create mode 100644 tests/ui/unit_arg_empty_blocks.rs create mode 100644 tests/ui/unit_arg_empty_blocks.stderr create mode 100644 tests/ui/unnecessary_sort_by.fixed create mode 100644 tests/ui/unnecessary_sort_by.rs create mode 100644 tests/ui/unnecessary_sort_by.stderr create mode 100644 tests/ui/unnested_or_patterns.fixed create mode 100644 tests/ui/unnested_or_patterns.rs create mode 100644 tests/ui/unnested_or_patterns.stderr create mode 100644 tests/ui/unnested_or_patterns2.fixed create mode 100644 tests/ui/unnested_or_patterns2.rs create mode 100644 tests/ui/unnested_or_patterns2.stderr create mode 100644 tests/ui/vec_resize_to_zero.rs create mode 100644 tests/ui/vec_resize_to_zero.stderr diff --git a/.github/workflows/clippy_bors.yml b/.github/workflows/clippy_bors.yml index 3958ba012467b..0c80394f03e3c 100644 --- a/.github/workflows/clippy_bors.yml +++ b/.github/workflows/clippy_bors.yml @@ -232,7 +232,8 @@ jobs: matrix: integration: - 'rust-lang/cargo' - - 'rust-lang/rls' + # FIXME: re-enable once fmt_macros is renamed in RLS + # - 'rust-lang/rls' - 'rust-lang/chalk' - 'rust-lang/rustfmt' - 'Marwes/combine' diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ac9057199ff3..adc945a69441d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,88 @@ document. ## Unreleased / In Rust Nightly -[891e1a8...master](https://github.com/rust-lang/rust-clippy/compare/891e1a8...master) +[7ea7cd1...master](https://github.com/rust-lang/rust-clippy/compare/7ea7cd1...master) + +## Rust 1.45 + +Current beta, release 2020-07-16 + +[891e1a8...7ea7cd1](https://github.com/rust-lang/rust-clippy/compare/891e1a8...7ea7cd1) + +### New lints + +* [`match_wildcard_for_single_variants`] [#5582](https://github.com/rust-lang/rust-clippy/pull/5582) +* [`unsafe_derive_deserialize`] [#5493](https://github.com/rust-lang/rust-clippy/pull/5493) +* [`if_let_mutex`] [#5332](https://github.com/rust-lang/rust-clippy/pull/5332) +* [`mismatched_target_os`] [#5506](https://github.com/rust-lang/rust-clippy/pull/5506) +* [`await_holding_lock`] [#5439](https://github.com/rust-lang/rust-clippy/pull/5439) +* [`match_on_vec_items`] [#5522](https://github.com/rust-lang/rust-clippy/pull/5522) +* [`manual_async_fn`] [#5576](https://github.com/rust-lang/rust-clippy/pull/5576) +* [`reversed_empty_ranges`] [#5583](https://github.com/rust-lang/rust-clippy/pull/5583) +* [`manual_non_exhaustive`] [#5550](https://github.com/rust-lang/rust-clippy/pull/5550) + +### Moves and Deprecations + +* Downgrade [`match_bool`] to pedantic [#5408](https://github.com/rust-lang/rust-clippy/pull/5408) +* Downgrade [`match_wild_err_arm`] to pedantic and update help messages. [#5622](https://github.com/rust-lang/rust-clippy/pull/5622) +* Downgrade [`useless_let_if_seq`] to nursery. [#5599](https://github.com/rust-lang/rust-clippy/pull/5599) +* Generalize `option_and_then_some` and rename to [`bind_instead_of_map`]. [#5529](https://github.com/rust-lang/rust-clippy/pull/5529) +* Rename `identity_conversion` to [`useless_conversion`]. [#5568](https://github.com/rust-lang/rust-clippy/pull/5568) +* Merge `block_in_if_condition_expr` and `block_in_if_condition_stmt` into [`blocks_in_if_conditions`]. +[#5563](https://github.com/rust-lang/rust-clippy/pull/5563) +* Merge `option_map_unwrap_or`, `option_map_unwrap_or_else` and `result_map_unwrap_or_else` into [`map_unwrap_or`]. +[#5563](https://github.com/rust-lang/rust-clippy/pull/5563) +* Merge `option_unwrap_used` and `result_unwrap_used` into [`unwrap_used`]. +[#5563](https://github.com/rust-lang/rust-clippy/pull/5563) +* Merge `option_expect_used` and `result_expect_used` into [`expect_used`]. +[#5563](https://github.com/rust-lang/rust-clippy/pull/5563) +* Merge `for_loop_over_option` and `for_loop_over_result` into [`for_loops_over_fallibles`]. +[#5563](https://github.com/rust-lang/rust-clippy/pull/5563) + +### Enhancements + +* Avoid running cargo lints when not enabled to improve performance. [#5505](https://github.com/rust-lang/rust-clippy/pull/5505) +* Extend [`useless_conversion`] with `TryFrom` and `TryInto`. [#5631](https://github.com/rust-lang/rust-clippy/pull/5631) +* Lint also in type parameters and where clauses in [`unused_unit`]. [#5592](https://github.com/rust-lang/rust-clippy/pull/5592) +* Do not suggest deriving `Default` in [`new_without_default`]. [#5616](https://github.com/rust-lang/rust-clippy/pull/5616) + +### False Positive Fixes + +* [`while_let_on_iterator`] [#5525](https://github.com/rust-lang/rust-clippy/pull/5525) +* [`empty_line_after_outer_attr`] [#5609](https://github.com/rust-lang/rust-clippy/pull/5609) +* [`unnecessary_unwrap`] [#5558](https://github.com/rust-lang/rust-clippy/pull/5558) +* [`comparison_chain`] [#5596](https://github.com/rust-lang/rust-clippy/pull/5596) +* Don't trigger [`used_underscore_binding`] in await desugaring. [#5535](https://github.com/rust-lang/rust-clippy/pull/5535) +* Don't trigger [`borrowed_box`] on mutable references. [#5491](https://github.com/rust-lang/rust-clippy/pull/5491) +* Allow `1 << 0` in [`identity_op`]. [#5602](https://github.com/rust-lang/rust-clippy/pull/5602) +* Allow `use super::*;` glob imports in [`wildcard_imports`]. [#5564](https://github.com/rust-lang/rust-clippy/pull/5564) +* Whitelist more words in [`doc_markdown`]. [#5611](https://github.com/rust-lang/rust-clippy/pull/5611) +* Skip dev and build deps in [`multiple_crate_versions`]. [#5636](https://github.com/rust-lang/rust-clippy/pull/5636) +* Honor `allow` attribute on arguments in [`ptr_arg`]. [#5647](https://github.com/rust-lang/rust-clippy/pull/5647) +* Honor lint level attributes for [`redundant_field_names`], [`just_underscores_and_digits`], [`many_single_char_names`] +and [`similar_names`]. [#5651](https://github.com/rust-lang/rust-clippy/pull/5651) +* Ignore calls to `len` in [`or_fun_call`]. [#4429](https://github.com/rust-lang/rust-clippy/pull/4429) + +### Suggestion Improvements + +* Simplify suggestions in [`manual_memcpy`]. [#5536](https://github.com/rust-lang/rust-clippy/pull/5536) +* Fix suggestion in [`redundant_pattern_matching`] for macros. [#5511](https://github.com/rust-lang/rust-clippy/pull/5511) +* Avoid suggesting `copied()` for mutable references in [`map_clone`]. [#5530](https://github.com/rust-lang/rust-clippy/pull/5530) +* Improve help message for [`clone_double_ref`]. [#5547](https://github.com/rust-lang/rust-clippy/pull/5547) + +### ICE Fixes + +* Fix ICE caused in unwrap module. [#5590](https://github.com/rust-lang/rust-clippy/pull/5590) +* Fix ICE on rustc test issue-69020-assoc-const-arith-overflow.rs [#5499](https://github.com/rust-lang/rust-clippy/pull/5499) + +### Documentation + +* Clarify the documentation of [`unnecessary_mut_passed`]. [#5639](https://github.com/rust-lang/rust-clippy/pull/5639) +* Extend example for [`unneeded_field_pattern`]. [#5541](https://github.com/rust-lang/rust-clippy/pull/5541) ## Rust 1.44 -Current beta, release 2020-06-04 +Current stable, released 2020-06-04 [204bb9b...891e1a8](https://github.com/rust-lang/rust-clippy/compare/204bb9b...891e1a8) @@ -93,7 +170,7 @@ Current beta, release 2020-06-04 ## Rust 1.43 -Current stable, released 2020-04-23 +Released 2020-04-23 [4ee1206...204bb9b](https://github.com/rust-lang/rust-clippy/compare/4ee1206...204bb9b) @@ -1401,6 +1478,7 @@ Released 2018-09-13 [`items_after_statements`]: https://rust-lang.github.io/rust-clippy/master/index.html#items_after_statements [`iter_cloned_collect`]: https://rust-lang.github.io/rust-clippy/master/index.html#iter_cloned_collect [`iter_next_loop`]: https://rust-lang.github.io/rust-clippy/master/index.html#iter_next_loop +[`iter_next_slice`]: https://rust-lang.github.io/rust-clippy/master/index.html#iter_next_slice [`iter_nth`]: https://rust-lang.github.io/rust-clippy/master/index.html#iter_nth [`iter_nth_zero`]: https://rust-lang.github.io/rust-clippy/master/index.html#iter_nth_zero [`iter_skip_next`]: https://rust-lang.github.io/rust-clippy/master/index.html#iter_skip_next @@ -1601,9 +1679,11 @@ Released 2018-09-13 [`unnecessary_fold`]: https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_fold [`unnecessary_mut_passed`]: https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_mut_passed [`unnecessary_operation`]: https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_operation +[`unnecessary_sort_by`]: https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_sort_by [`unnecessary_unwrap`]: https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [`unneeded_field_pattern`]: https://rust-lang.github.io/rust-clippy/master/index.html#unneeded_field_pattern [`unneeded_wildcard_pattern`]: https://rust-lang.github.io/rust-clippy/master/index.html#unneeded_wildcard_pattern +[`unnested_or_patterns`]: https://rust-lang.github.io/rust-clippy/master/index.html#unnested_or_patterns [`unreachable`]: https://rust-lang.github.io/rust-clippy/master/index.html#unreachable [`unreadable_literal`]: https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [`unsafe_derive_deserialize`]: https://rust-lang.github.io/rust-clippy/master/index.html#unsafe_derive_deserialize @@ -1630,6 +1710,7 @@ Released 2018-09-13 [`useless_transmute`]: https://rust-lang.github.io/rust-clippy/master/index.html#useless_transmute [`useless_vec`]: https://rust-lang.github.io/rust-clippy/master/index.html#useless_vec [`vec_box`]: https://rust-lang.github.io/rust-clippy/master/index.html#vec_box +[`vec_resize_to_zero`]: https://rust-lang.github.io/rust-clippy/master/index.html#vec_resize_to_zero [`verbose_bit_mask`]: https://rust-lang.github.io/rust-clippy/master/index.html#verbose_bit_mask [`verbose_file_reads`]: https://rust-lang.github.io/rust-clippy/master/index.html#verbose_file_reads [`vtable_address_comparisons`]: https://rust-lang.github.io/rust-clippy/master/index.html#vtable_address_comparisons diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0f47ac98fd20a..9f7bdcb1be7e5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,14 +12,16 @@ anything, feel free to ask questions on issues or visit the `#clippy` on [Discor All contributors are expected to follow the [Rust Code of Conduct]. -* [Getting started](#getting-started) - * [Finding something to fix/improve](#finding-something-to-fiximprove) -* [Writing code](#writing-code) -* [How Clippy works](#how-clippy-works) -* [Fixing nightly build failures](#fixing-build-failures-caused-by-rust) -* [Issue and PR Triage](#issue-and-pr-triage) -* [Bors and Homu](#bors-and-homu) -* [Contributions](#contributions) +- [Contributing to Clippy](#contributing-to-clippy) + - [Getting started](#getting-started) + - [Finding something to fix/improve](#finding-something-to-fiximprove) + - [Writing code](#writing-code) + - [Getting code-completion for rustc internals to work](#getting-code-completion-for-rustc-internals-to-work) + - [How Clippy works](#how-clippy-works) + - [Fixing build failures caused by Rust](#fixing-build-failures-caused-by-rust) + - [Issue and PR triage](#issue-and-pr-triage) + - [Bors and Homu](#bors-and-homu) + - [Contributions](#contributions) [Discord]: https://discord.gg/rust-lang [Rust Code of Conduct]: https://www.rust-lang.org/policies/code-of-conduct @@ -91,6 +93,24 @@ quick read. [rfc_stability]: https://github.com/rust-lang/rfcs/blob/master/text/2476-clippy-uno.md#stability-guarantees [rfc_lint_cats]: https://github.com/rust-lang/rfcs/blob/master/text/2476-clippy-uno.md#lint-audit-and-categories +## Getting code-completion for rustc internals to work + +Unfortunately, [`rust-analyzer`][ra_homepage] does not (yet?) understand how Clippy uses compiler-internals +using `extern crate` and it also needs to be able to read the source files of the rustc-compiler which are not +available via a `rustup` component at the time of writing. +To work around this, you need to have a copy of the [rustc-repo][rustc_repo] available which can be obtained via +`git clone https://github.com/rust-lang/rust/`. +Then you can run a `cargo dev` command to automatically make Clippy use the rustc-repo via path-dependencies +which rust-analyzer will be able to understand. +Run `cargo dev ra-setup --repo-path ` where `` is an absolute path to the rustc repo +you just cloned. +The command will add path-dependencies pointing towards rustc-crates inside the rustc repo to +Clippys `Cargo.toml`s and should allow rust-analyzer to understand most of the types that Clippy uses. +Just make sure to remove the dependencies again before finally making a pull request! + +[ra_homepage]: https://rust-analyzer.github.io/ +[rustc_repo]: https://github.com/rust-lang/rust/ + ## How Clippy works [`clippy_lints/src/lib.rs`][lint_crate_entry] imports all the different lint modules and registers in the [`LintStore`]. diff --git a/Cargo.toml b/Cargo.toml index 6999b6bd74040..836897927b015 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,7 @@ tempfile = { version = "3.1.0", optional = true } lazy_static = "1.0" [dev-dependencies] -cargo_metadata = "0.9.0" +cargo_metadata = "0.9.1" compiletest_rs = { version = "0.5.0", features = ["tmp"] } tester = "0.7" lazy_static = "1.0" diff --git a/clippy_dev/src/lib.rs b/clippy_dev/src/lib.rs index 6fdd282c6849e..5baa31d5cde0c 100644 --- a/clippy_dev/src/lib.rs +++ b/clippy_dev/src/lib.rs @@ -11,6 +11,7 @@ use walkdir::WalkDir; pub mod fmt; pub mod new_lint; +pub mod ra_setup; pub mod stderr_length_check; pub mod update_lints; @@ -400,7 +401,7 @@ fn test_replace_region_no_changes() { changed: false, new_lines: "123\n456\n789".to_string(), }; - let result = replace_region_in_text(text, r#"^\s*123$"#, r#"^\s*456"#, false, || vec![]); + let result = replace_region_in_text(text, r#"^\s*123$"#, r#"^\s*456"#, false, Vec::new); assert_eq!(expected, result); } diff --git a/clippy_dev/src/main.rs b/clippy_dev/src/main.rs index d99235f7c07a7..281037ae37c97 100644 --- a/clippy_dev/src/main.rs +++ b/clippy_dev/src/main.rs @@ -1,7 +1,7 @@ #![cfg_attr(feature = "deny-warnings", deny(warnings))] use clap::{App, Arg, SubCommand}; -use clippy_dev::{fmt, new_lint, stderr_length_check, update_lints}; +use clippy_dev::{fmt, new_lint, ra_setup, stderr_length_check, update_lints}; fn main() { let matches = App::new("Clippy developer tooling") @@ -87,6 +87,19 @@ fn main() { SubCommand::with_name("limit_stderr_length") .about("Ensures that stderr files do not grow longer than a certain amount of lines."), ) + .subcommand( + SubCommand::with_name("ra-setup") + .about("Alter dependencies so rust-analyzer can find rustc internals") + .arg( + Arg::with_name("rustc-repo-path") + .long("repo-path") + .short("r") + .help("The path to a rustc repo that will be used for setting the dependencies") + .takes_value(true) + .value_name("path") + .required(true), + ), + ) .get_matches(); match matches.subcommand() { @@ -115,6 +128,7 @@ fn main() { ("limit_stderr_length", _) => { stderr_length_check::check(); }, + ("ra-setup", Some(matches)) => ra_setup::run(matches.value_of("rustc-repo-path")), _ => {}, } } diff --git a/clippy_dev/src/new_lint.rs b/clippy_dev/src/new_lint.rs index c0b2dac2f60ff..1e032a7bc20cd 100644 --- a/clippy_dev/src/new_lint.rs +++ b/clippy_dev/src/new_lint.rs @@ -147,6 +147,8 @@ fn get_manifest_contents(lint_name: &str, hint: &str) -> String { name = "{}" version = "0.1.0" publish = false + +[workspace] "#, hint, lint_name ) diff --git a/clippy_dev/src/ra_setup.rs b/clippy_dev/src/ra_setup.rs new file mode 100644 index 0000000000000..8617445c8a600 --- /dev/null +++ b/clippy_dev/src/ra_setup.rs @@ -0,0 +1,90 @@ +#![allow(clippy::filter_map)] + +use std::fs; +use std::fs::File; +use std::io::prelude::*; +use std::path::PathBuf; + +// This module takes an absolute path to a rustc repo and alters the dependencies to point towards +// the respective rustc subcrates instead of using extern crate xyz. +// This allows rust analyzer to analyze rustc internals and show proper information inside clippy +// code. See https://github.com/rust-analyzer/rust-analyzer/issues/3517 and https://github.com/rust-lang/rust-clippy/issues/5514 for details + +pub fn run(rustc_path: Option<&str>) { + // we can unwrap here because the arg is required here + let rustc_path = PathBuf::from(rustc_path.unwrap()); + assert!(rustc_path.is_dir(), "path is not a directory"); + let rustc_source_basedir = rustc_path.join("src"); + assert!( + rustc_source_basedir.is_dir(), + "are you sure the path leads to a rustc repo?" + ); + + let clippy_root_manifest = fs::read_to_string("Cargo.toml").expect("failed to read ./Cargo.toml"); + let clippy_root_lib_rs = fs::read_to_string("src/driver.rs").expect("failed to read ./src/driver.rs"); + inject_deps_into_manifest( + &rustc_source_basedir, + "Cargo.toml", + &clippy_root_manifest, + &clippy_root_lib_rs, + ) + .expect("Failed to inject deps into ./Cargo.toml"); + + let clippy_lints_manifest = + fs::read_to_string("clippy_lints/Cargo.toml").expect("failed to read ./clippy_lints/Cargo.toml"); + let clippy_lints_lib_rs = + fs::read_to_string("clippy_lints/src/lib.rs").expect("failed to read ./clippy_lints/src/lib.rs"); + inject_deps_into_manifest( + &rustc_source_basedir, + "clippy_lints/Cargo.toml", + &clippy_lints_manifest, + &clippy_lints_lib_rs, + ) + .expect("Failed to inject deps into ./clippy_lints/Cargo.toml"); +} + +fn inject_deps_into_manifest( + rustc_source_dir: &PathBuf, + manifest_path: &str, + cargo_toml: &str, + lib_rs: &str, +) -> std::io::Result<()> { + let extern_crates = lib_rs + .lines() + // get the deps + .filter(|line| line.starts_with("extern crate")) + // we have something like "extern crate foo;", we only care about the "foo" + // ↓ ↓ + // extern crate rustc_middle; + .map(|s| &s[13..(s.len() - 1)]); + + let new_deps = extern_crates.map(|dep| { + // format the dependencies that are going to be put inside the Cargo.toml + format!( + "{dep} = {{ path = \"{source_path}/lib{dep}\" }}\n", + dep = dep, + source_path = rustc_source_dir.display() + ) + }); + + // format a new [dependencies]-block with the new deps we need to inject + let mut all_deps = String::from("[dependencies]\n"); + new_deps.for_each(|dep_line| { + all_deps.push_str(&dep_line); + }); + + // replace "[dependencies]" with + // [dependencies] + // dep1 = { path = ... } + // dep2 = { path = ... } + // etc + let new_manifest = cargo_toml.replacen("[dependencies]\n", &all_deps, 1); + + // println!("{}", new_manifest); + let mut file = File::create(manifest_path)?; + file.write_all(new_manifest.as_bytes())?; + + println!("Dependency paths injected: {}", manifest_path); + + Ok(()) +} diff --git a/clippy_lints/Cargo.toml b/clippy_lints/Cargo.toml index 76baf27fb2dbf..e959c1a651122 100644 --- a/clippy_lints/Cargo.toml +++ b/clippy_lints/Cargo.toml @@ -17,11 +17,11 @@ keywords = ["clippy", "lint", "plugin"] edition = "2018" [dependencies] -cargo_metadata = "0.9.0" +cargo_metadata = "0.9.1" if_chain = "1.0.0" itertools = "0.9" lazy_static = "1.0.2" -pulldown-cmark = { version = "0.7", default-features = false } +pulldown-cmark = { version = "0.7.1", default-features = false } quine-mc_cluskey = "0.2.2" regex-syntax = "0.6" serde = { version = "1.0", features = ["derive"] } diff --git a/clippy_lints/src/assign_ops.rs b/clippy_lints/src/assign_ops.rs index 05e2650d0b715..13e61fe98bac1 100644 --- a/clippy_lints/src/assign_ops.rs +++ b/clippy_lints/src/assign_ops.rs @@ -24,7 +24,11 @@ declare_clippy_lint! { /// let mut a = 5; /// let b = 0; /// // ... + /// // Bad /// a = a + b; + /// + /// // Good + /// a += b; /// ``` pub ASSIGN_OP_PATTERN, style, diff --git a/clippy_lints/src/await_holding_lock.rs b/clippy_lints/src/await_holding_lock.rs index 832910763e60c..a88f922d8e03d 100644 --- a/clippy_lints/src/await_holding_lock.rs +++ b/clippy_lints/src/await_holding_lock.rs @@ -54,18 +54,13 @@ declare_lint_pass!(AwaitHoldingLock => [AWAIT_HOLDING_LOCK]); impl LateLintPass<'_, '_> for AwaitHoldingLock { fn check_body(&mut self, cx: &LateContext<'_, '_>, body: &'_ Body<'_>) { use AsyncGeneratorKind::{Block, Closure, Fn}; - match body.generator_kind { - Some(GeneratorKind::Async(Block)) - | Some(GeneratorKind::Async(Closure)) - | Some(GeneratorKind::Async(Fn)) => { - let body_id = BodyId { - hir_id: body.value.hir_id, - }; - let def_id = cx.tcx.hir().body_owner_def_id(body_id); - let tables = cx.tcx.typeck_tables_of(def_id); - check_interior_types(cx, &tables.generator_interior_types, body.value.span); - }, - _ => {}, + if let Some(GeneratorKind::Async(Block | Closure | Fn)) = body.generator_kind { + let body_id = BodyId { + hir_id: body.value.hir_id, + }; + let def_id = cx.tcx.hir().body_owner_def_id(body_id); + let tables = cx.tcx.typeck_tables_of(def_id); + check_interior_types(cx, &tables.generator_interior_types, body.value.span); } } } diff --git a/clippy_lints/src/cargo_common_metadata.rs b/clippy_lints/src/cargo_common_metadata.rs index 16b46423c8f01..c40a387d29797 100644 --- a/clippy_lints/src/cargo_common_metadata.rs +++ b/clippy_lints/src/cargo_common_metadata.rs @@ -36,13 +36,9 @@ declare_clippy_lint! { "common metadata is defined in `Cargo.toml`" } -fn warning(cx: &LateContext<'_, '_>, message: &str) { - span_lint(cx, CARGO_COMMON_METADATA, DUMMY_SP, message); -} - fn missing_warning(cx: &LateContext<'_, '_>, package: &cargo_metadata::Package, field: &str) { let message = format!("package `{}` is missing `{}` metadata", package.name, field); - warning(cx, &message); + span_lint(cx, CARGO_COMMON_METADATA, DUMMY_SP, &message); } fn is_empty_str(value: &Option) -> bool { @@ -66,12 +62,7 @@ impl LateLintPass<'_, '_> for CargoCommonMetadata { return; } - let metadata = if let Ok(metadata) = cargo_metadata::MetadataCommand::new().no_deps().exec() { - metadata - } else { - warning(cx, "could not read cargo metadata"); - return; - }; + let metadata = unwrap_cargo_metadata!(cx, CARGO_COMMON_METADATA, false); for package in metadata.packages { if is_empty_vec(&package.authors) { diff --git a/clippy_lints/src/checked_conversions.rs b/clippy_lints/src/checked_conversions.rs index d9776dd50a836..e845ef99c7cc0 100644 --- a/clippy_lints/src/checked_conversions.rs +++ b/clippy_lints/src/checked_conversions.rs @@ -58,24 +58,18 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for CheckedConversions { } }; - if_chain! { - if let Some(cv) = result; - if let Some(to_type) = cv.to_type; - - then { + if let Some(cv) = result { + if let Some(to_type) = cv.to_type { let mut applicability = Applicability::MachineApplicable; - let snippet = snippet_with_applicability(cx, cv.expr_to_cast.span, "_", &mut - applicability); + let snippet = snippet_with_applicability(cx, cv.expr_to_cast.span, "_", &mut applicability); span_lint_and_sugg( cx, CHECKED_CONVERSIONS, item.span, "Checked cast can be simplified.", "try", - format!("{}::try_from({}).is_ok()", - to_type, - snippet), - applicability + format!("{}::try_from({}).is_ok()", to_type, snippet), + applicability, ); } } @@ -184,7 +178,7 @@ fn check_upper_bound<'tcx>(expr: &'tcx Expr<'tcx>) -> Option> { if_chain! { if let ExprKind::Binary(ref op, ref left, ref right) = &expr.kind; if let Some((candidate, check)) = normalize_le_ge(op, left, right); - if let Some((from, to)) = get_types_from_cast(check, MAX_VALUE, INTS); + if let Some((from, to)) = get_types_from_cast(check, INTS, "max_value", "MAX"); then { Conversion::try_new(candidate, from, to) @@ -224,7 +218,7 @@ fn check_lower_bound_zero<'a>(candidate: &'a Expr<'_>, check: &'a Expr<'_>) -> O /// Check for `expr >= (to_type::MIN as from_type)` fn check_lower_bound_min<'a>(candidate: &'a Expr<'_>, check: &'a Expr<'_>) -> Option> { - if let Some((from, to)) = get_types_from_cast(check, MIN_VALUE, SINTS) { + if let Some((from, to)) = get_types_from_cast(check, SINTS, "min_value", "MIN") { Conversion::try_new(candidate, from, to) } else { None @@ -232,10 +226,16 @@ fn check_lower_bound_min<'a>(candidate: &'a Expr<'_>, check: &'a Expr<'_>) -> Op } /// Tries to extract the from- and to-type from a cast expression -fn get_types_from_cast<'a>(expr: &'a Expr<'_>, func: &'a str, types: &'a [&str]) -> Option<(&'a str, &'a str)> { - // `to_type::maxmin_value() as from_type` +fn get_types_from_cast<'a>( + expr: &'a Expr<'_>, + types: &'a [&str], + func: &'a str, + assoc_const: &'a str, +) -> Option<(&'a str, &'a str)> { + // `to_type::max_value() as from_type` + // or `to_type::MAX as from_type` let call_from_cast: Option<(&Expr<'_>, &str)> = if_chain! { - // to_type::maxmin_value(), from_type + // to_type::max_value(), from_type if let ExprKind::Cast(ref limit, ref from_type) = &expr.kind; if let TyKind::Path(ref from_type_path) = &from_type.kind; if let Some(from_sym) = int_ty_to_sym(from_type_path); @@ -247,17 +247,17 @@ fn get_types_from_cast<'a>(expr: &'a Expr<'_>, func: &'a str, types: &'a [&str]) } }; - // `from_type::from(to_type::maxmin_value())` + // `from_type::from(to_type::max_value())` let limit_from: Option<(&Expr<'_>, &str)> = call_from_cast.or_else(|| { if_chain! { - // `from_type::from, to_type::maxmin_value()` + // `from_type::from, to_type::max_value()` if let ExprKind::Call(ref from_func, ref args) = &expr.kind; - // `to_type::maxmin_value()` + // `to_type::max_value()` if args.len() == 1; if let limit = &args[0]; // `from_type::from` if let ExprKind::Path(ref path) = &from_func.kind; - if let Some(from_sym) = get_implementing_type(path, INTS, FROM); + if let Some(from_sym) = get_implementing_type(path, INTS, "from"); then { Some((limit, from_sym)) @@ -268,22 +268,26 @@ fn get_types_from_cast<'a>(expr: &'a Expr<'_>, func: &'a str, types: &'a [&str]) }); if let Some((limit, from_type)) = limit_from { - if_chain! { - if let ExprKind::Call(ref fun_name, _) = &limit.kind; - // `to_type, maxmin_value` - if let ExprKind::Path(ref path) = &fun_name.kind; - // `to_type` - if let Some(to_type) = get_implementing_type(path, types, func); - - then { - Some((from_type, to_type)) - } else { - None - } + match limit.kind { + // `from_type::from(_)` + ExprKind::Call(path, _) => { + if let ExprKind::Path(ref path) = path.kind { + // `to_type` + if let Some(to_type) = get_implementing_type(path, types, func) { + return Some((from_type, to_type)); + } + } + }, + // `to_type::MAX` + ExprKind::Path(ref path) => { + if let Some(to_type) = get_implementing_type(path, types, assoc_const) { + return Some((from_type, to_type)); + } + }, + _ => {}, } - } else { - None - } + }; + None } /// Gets the type which implements the called function @@ -336,10 +340,6 @@ fn normalize_le_ge<'a>(op: &BinOp, left: &'a Expr<'a>, right: &'a Expr<'a>) -> O } // Constants -const FROM: &str = "from"; -const MAX_VALUE: &str = "max_value"; -const MIN_VALUE: &str = "min_value"; - const UINTS: &[&str] = &["u8", "u16", "u32", "u64", "usize"]; const SINTS: &[&str] = &["i8", "i16", "i32", "i64", "isize"]; const INTS: &[&str] = &["u8", "u16", "u32", "u64", "usize", "i8", "i16", "i32", "i64", "isize"]; diff --git a/clippy_lints/src/copies.rs b/clippy_lints/src/copies.rs index 66722786eab49..b6d50bdfa1466 100644 --- a/clippy_lints/src/copies.rs +++ b/clippy_lints/src/copies.rs @@ -1,9 +1,9 @@ -use crate::utils::{get_parent_expr, higher, if_sequence, same_tys, snippet, span_lint_and_note, span_lint_and_then}; +use crate::utils::{get_parent_expr, higher, if_sequence, snippet, span_lint_and_note, span_lint_and_then}; use crate::utils::{SpanlessEq, SpanlessHash}; use rustc_data_structures::fx::FxHashMap; use rustc_hir::{Arm, Block, Expr, ExprKind, MatchSource, Pat, PatKind}; use rustc_lint::{LateContext, LateLintPass}; -use rustc_middle::ty::Ty; +use rustc_middle::ty::{Ty, TyS}; use rustc_session::{declare_lint_pass, declare_tool_lint}; use rustc_span::symbol::Symbol; use std::collections::hash_map::Entry; @@ -242,15 +242,11 @@ fn lint_same_fns_in_if_cond(cx: &LateContext<'_, '_>, conds: &[&Expr<'_>]) { /// Implementation of `MATCH_SAME_ARMS`. fn lint_match_arms<'tcx>(cx: &LateContext<'_, 'tcx>, expr: &Expr<'_>) { - fn same_bindings<'tcx>( - cx: &LateContext<'_, 'tcx>, - lhs: &FxHashMap>, - rhs: &FxHashMap>, - ) -> bool { + fn same_bindings<'tcx>(lhs: &FxHashMap>, rhs: &FxHashMap>) -> bool { lhs.len() == rhs.len() && lhs .iter() - .all(|(name, l_ty)| rhs.get(name).map_or(false, |r_ty| same_tys(cx, l_ty, r_ty))) + .all(|(name, l_ty)| rhs.get(name).map_or(false, |r_ty| TyS::same_type(l_ty, r_ty))) } if let ExprKind::Match(_, ref arms, MatchSource::Normal) = expr.kind { @@ -269,7 +265,7 @@ fn lint_match_arms<'tcx>(cx: &LateContext<'_, 'tcx>, expr: &Expr<'_>) { (min_index..=max_index).all(|index| arms[index].guard.is_none()) && SpanlessEq::new(cx).eq_expr(&lhs.body, &rhs.body) && // all patterns should have the same bindings - same_bindings(cx, &bindings(cx, &lhs.pat), &bindings(cx, &rhs.pat)) + same_bindings(&bindings(cx, &lhs.pat), &bindings(cx, &rhs.pat)) }; let indexed_arms: Vec<(usize, &Arm<'_>)> = arms.iter().enumerate().collect(); diff --git a/clippy_lints/src/double_parens.rs b/clippy_lints/src/double_parens.rs index 7f2ff8b9b26f6..05517f6f9f0cc 100644 --- a/clippy_lints/src/double_parens.rs +++ b/clippy_lints/src/double_parens.rs @@ -13,10 +13,24 @@ declare_clippy_lint! { /// /// **Example:** /// ```rust + /// // Bad + /// fn simple_double_parens() -> i32 { + /// ((0)) + /// } + /// + /// // Good + /// fn simple_no_parens() -> i32 { + /// 0 + /// } + /// + /// // or + /// /// # fn foo(bar: usize) {} - /// ((0)); + /// // Bad /// foo((0)); - /// ((1, 2)); + /// + /// // Good + /// foo(0); /// ``` pub DOUBLE_PARENS, complexity, diff --git a/clippy_lints/src/drop_bounds.rs b/clippy_lints/src/drop_bounds.rs index f496680827913..5a7f759486edd 100644 --- a/clippy_lints/src/drop_bounds.rs +++ b/clippy_lints/src/drop_bounds.rs @@ -27,6 +27,10 @@ declare_clippy_lint! { /// ```rust /// fn foo() {} /// ``` + /// Could be written as: + /// ```rust + /// fn foo() {} + /// ``` pub DROP_BOUNDS, correctness, "Bounds of the form `T: Drop` are useless" diff --git a/clippy_lints/src/duration_subsec.rs b/clippy_lints/src/duration_subsec.rs index b35a8facf8b99..afefa2506381b 100644 --- a/clippy_lints/src/duration_subsec.rs +++ b/clippy_lints/src/duration_subsec.rs @@ -22,8 +22,14 @@ declare_clippy_lint! { /// ```rust /// # use std::time::Duration; /// let dur = Duration::new(5, 0); + /// + /// // Bad /// let _micros = dur.subsec_nanos() / 1_000; /// let _millis = dur.subsec_nanos() / 1_000_000; + /// + /// // Good + /// let _micros = dur.subsec_micros(); + /// let _millis = dur.subsec_millis(); /// ``` pub DURATION_SUBSEC, complexity, diff --git a/clippy_lints/src/enum_variants.rs b/clippy_lints/src/enum_variants.rs index a5871cf0cd4dd..cb0fd59a2d407 100644 --- a/clippy_lints/src/enum_variants.rs +++ b/clippy_lints/src/enum_variants.rs @@ -25,31 +25,47 @@ declare_clippy_lint! { /// BattenbergCake, /// } /// ``` + /// Could be written as: + /// ```rust + /// enum Cake { + /// BlackForest, + /// Hummingbird, + /// Battenberg, + /// } + /// ``` pub ENUM_VARIANT_NAMES, style, "enums where all variants share a prefix/postfix" } declare_clippy_lint! { - /// **What it does:** Detects enumeration variants that are prefixed or suffixed - /// by the same characters. + /// **What it does:** Detects public enumeration variants that are + /// prefixed or suffixed by the same characters. /// - /// **Why is this bad?** Enumeration variant names should specify their variant, + /// **Why is this bad?** Public enumeration variant names should specify their variant, /// not repeat the enumeration name. /// /// **Known problems:** None. /// /// **Example:** /// ```rust - /// enum Cake { + /// pub enum Cake { /// BlackForestCake, /// HummingbirdCake, /// BattenbergCake, /// } /// ``` + /// Could be written as: + /// ```rust + /// pub enum Cake { + /// BlackForest, + /// Hummingbird, + /// Battenberg, + /// } + /// ``` pub PUB_ENUM_VARIANT_NAMES, pedantic, - "enums where all variants share a prefix/postfix" + "public enums where all variants share a prefix/postfix" } declare_clippy_lint! { @@ -66,6 +82,12 @@ declare_clippy_lint! { /// struct BlackForestCake; /// } /// ``` + /// Could be written as: + /// ```rust + /// mod cake { + /// struct BlackForest; + /// } + /// ``` pub MODULE_NAME_REPETITIONS, pedantic, "type names prefixed/postfixed with their containing module's name" diff --git a/clippy_lints/src/eq_op.rs b/clippy_lints/src/eq_op.rs index 4e1c1f131405f..d7819d737ea04 100644 --- a/clippy_lints/src/eq_op.rs +++ b/clippy_lints/src/eq_op.rs @@ -39,7 +39,11 @@ declare_clippy_lint! { /// /// **Example:** /// ```ignore + /// // Bad /// &x == y + /// + /// // Good + /// x == *y /// ``` pub OP_REF, style, diff --git a/clippy_lints/src/escape.rs b/clippy_lints/src/escape.rs index 1ec60a0e6e67a..7227683aa5ac2 100644 --- a/clippy_lints/src/escape.rs +++ b/clippy_lints/src/escape.rs @@ -28,9 +28,16 @@ declare_clippy_lint! { /// **Example:** /// ```rust /// # fn foo(bar: usize) {} + /// + /// // Bad /// let x = Box::new(1); /// foo(*x); /// println!("{}", *x); + /// + /// // Good + /// let x = 1; + /// foo(x); + /// println!("{}", x); /// ``` pub BOXED_LOCAL, perf, diff --git a/clippy_lints/src/eta_reduction.rs b/clippy_lints/src/eta_reduction.rs index e3e1136b67693..d093025fd3d7a 100644 --- a/clippy_lints/src/eta_reduction.rs +++ b/clippy_lints/src/eta_reduction.rs @@ -26,7 +26,11 @@ declare_clippy_lint! { /// /// **Example:** /// ```rust,ignore + /// // Bad /// xs.map(|x| foo(x)) + /// + /// // Good + /// xs.map(foo) /// ``` /// where `foo(_)` is a plain function that takes the exact argument type of /// `x`. diff --git a/clippy_lints/src/eval_order_dependence.rs b/clippy_lints/src/eval_order_dependence.rs index 5206266ccf2a6..74144fb299de2 100644 --- a/clippy_lints/src/eval_order_dependence.rs +++ b/clippy_lints/src/eval_order_dependence.rs @@ -21,11 +21,20 @@ declare_clippy_lint! { /// **Example:** /// ```rust /// let mut x = 0; + /// + /// // Bad /// let a = { /// x = 1; /// 1 /// } + x; /// // Unclear whether a is 1 or 2. + /// + /// // Good + /// let tmp = { + /// x = 1; + /// 1 + /// }; + /// let a = tmp + x; /// ``` pub EVAL_ORDER_DEPENDENCE, complexity, diff --git a/clippy_lints/src/fallible_impl_from.rs b/clippy_lints/src/fallible_impl_from.rs index 17639cc2a0643..92812816461c5 100644 --- a/clippy_lints/src/fallible_impl_from.rs +++ b/clippy_lints/src/fallible_impl_from.rs @@ -20,12 +20,31 @@ declare_clippy_lint! { /// **Example:** /// ```rust /// struct Foo(i32); + /// + /// // Bad /// impl From for Foo { /// fn from(s: String) -> Self { /// Foo(s.parse().unwrap()) /// } /// } /// ``` + /// + /// ```rust + /// // Good + /// struct Foo(i32); + /// + /// use std::convert::TryFrom; + /// impl TryFrom for Foo { + /// type Error = (); + /// fn try_from(s: String) -> Result { + /// if let Ok(parsed) = s.parse() { + /// Ok(Foo(parsed)) + /// } else { + /// Err(()) + /// } + /// } + /// } + /// ``` pub FALLIBLE_IMPL_FROM, nursery, "Warn on impls of `From<..>` that contain `panic!()` or `unwrap()`" @@ -120,7 +139,7 @@ fn lint_impl_body<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, impl_span: Span, impl_it move |diag| { diag.help( "`From` is intended for infallible conversions only. \ - Use `TryFrom` if there's a possibility for the conversion to fail."); + Use `TryFrom` if there's a possibility for the conversion to fail."); diag.span_note(fpu.result, "potential failure(s)"); }); } diff --git a/clippy_lints/src/floating_point_arithmetic.rs b/clippy_lints/src/floating_point_arithmetic.rs index 86317fb8bd5c4..3a912d928375d 100644 --- a/clippy_lints/src/floating_point_arithmetic.rs +++ b/clippy_lints/src/floating_point_arithmetic.rs @@ -28,7 +28,6 @@ declare_clippy_lint! { /// **Example:** /// /// ```rust - /// /// let a = 3f32; /// let _ = a.powf(1.0 / 3.0); /// let _ = (1.0 + a).ln(); @@ -38,7 +37,6 @@ declare_clippy_lint! { /// is better expressed as /// /// ```rust - /// /// let a = 3f32; /// let _ = a.cbrt(); /// let _ = a.ln_1p(); diff --git a/clippy_lints/src/format.rs b/clippy_lints/src/format.rs index 5b092526ce4f2..1530538aa7d13 100644 --- a/clippy_lints/src/format.rs +++ b/clippy_lints/src/format.rs @@ -25,9 +25,13 @@ declare_clippy_lint! { /// /// **Examples:** /// ```rust + /// + /// // Bad /// # let foo = "foo"; - /// format!("foo"); /// format!("{}", foo); + /// + /// // Good + /// format!("foo"); /// ``` pub USELESS_FORMAT, complexity, diff --git a/clippy_lints/src/formatting.rs b/clippy_lints/src/formatting.rs index eb4b7a826f2ce..156246fb8bbb0 100644 --- a/clippy_lints/src/formatting.rs +++ b/clippy_lints/src/formatting.rs @@ -112,12 +112,8 @@ declare_lint_pass!(Formatting => [ impl EarlyLintPass for Formatting { fn check_block(&mut self, cx: &EarlyContext<'_>, block: &Block) { for w in block.stmts.windows(2) { - match (&w[0].kind, &w[1].kind) { - (&StmtKind::Expr(ref first), &StmtKind::Expr(ref second)) - | (&StmtKind::Expr(ref first), &StmtKind::Semi(ref second)) => { - check_missing_else(cx, first, second); - }, - _ => (), + if let (StmtKind::Expr(first), StmtKind::Expr(second) | StmtKind::Semi(second)) = (&w[0].kind, &w[1].kind) { + check_missing_else(cx, first, second); } } } diff --git a/clippy_lints/src/functions.rs b/clippy_lints/src/functions.rs index c24a24733d7f3..325b6cf32a3d2 100644 --- a/clippy_lints/src/functions.rs +++ b/clippy_lints/src/functions.rs @@ -49,11 +49,11 @@ declare_clippy_lint! { /// **Known problems:** None. /// /// **Example:** - /// ``` rust + /// ```rust /// fn im_too_long() { - /// println!(""); - /// // ... 100 more LoC - /// println!(""); + /// println!(""); + /// // ... 100 more LoC + /// println!(""); /// } /// ``` pub TOO_MANY_LINES, @@ -79,10 +79,16 @@ declare_clippy_lint! { /// `some_argument.get_raw_ptr()`). /// /// **Example:** - /// ```rust + /// ```rust,ignore + /// // Bad /// pub fn foo(x: *const u8) { /// println!("{}", unsafe { *x }); /// } + /// + /// // Good + /// pub unsafe fn foo(x: *const u8) { + /// println!("{}", unsafe { *x }); + /// } /// ``` pub NOT_UNSAFE_PTR_ARG_DEREF, correctness, diff --git a/clippy_lints/src/implicit_saturating_sub.rs b/clippy_lints/src/implicit_saturating_sub.rs index 155a93de4facf..fdaf37e5e08fa 100644 --- a/clippy_lints/src/implicit_saturating_sub.rs +++ b/clippy_lints/src/implicit_saturating_sub.rs @@ -25,13 +25,6 @@ declare_clippy_lint! { /// if i != 0 { /// i -= 1; /// } - /// ``` - /// Use instead: - /// ```rust - /// let end: u32 = 10; - /// let start: u32 = 5; - /// - /// let mut i: u32 = end - start; /// /// // Good /// i = i.saturating_sub(1); diff --git a/clippy_lints/src/int_plus_one.rs b/clippy_lints/src/int_plus_one.rs index d5dbd495680b2..e91fb0c2f27cd 100644 --- a/clippy_lints/src/int_plus_one.rs +++ b/clippy_lints/src/int_plus_one.rs @@ -10,7 +10,6 @@ use crate::utils::{snippet_opt, span_lint_and_sugg}; declare_clippy_lint! { /// **What it does:** Checks for usage of `x >= y + 1` or `x - 1 >= y` (and `<=`) in a block /// - /// /// **Why is this bad?** Readability -- better to use `> y` instead of `>= y + 1`. /// /// **Known problems:** None. diff --git a/clippy_lints/src/integer_division.rs b/clippy_lints/src/integer_division.rs index fe34d33fe652c..d537ef3f3238e 100644 --- a/clippy_lints/src/integer_division.rs +++ b/clippy_lints/src/integer_division.rs @@ -15,10 +15,13 @@ declare_clippy_lint! { /// /// **Example:** /// ```rust - /// fn main() { - /// let x = 3 / 2; - /// println!("{}", x); - /// } + /// // Bad + /// let x = 3 / 2; + /// println!("{}", x); + /// + /// // Good + /// let x = 3f32 / 2f32; + /// println!("{}", x); /// ``` pub INTEGER_DIVISION, restriction, diff --git a/clippy_lints/src/items_after_statements.rs b/clippy_lints/src/items_after_statements.rs index e7062b7c16bb9..c8576bcfcb444 100644 --- a/clippy_lints/src/items_after_statements.rs +++ b/clippy_lints/src/items_after_statements.rs @@ -16,6 +16,7 @@ declare_clippy_lint! { /// /// **Example:** /// ```rust + /// // Bad /// fn foo() { /// println!("cake"); /// } @@ -28,6 +29,21 @@ declare_clippy_lint! { /// foo(); // prints "foo" /// } /// ``` + /// + /// ```rust + /// // Good + /// fn foo() { + /// println!("cake"); + /// } + /// + /// fn main() { + /// fn foo() { + /// println!("foo"); + /// } + /// foo(); // prints "foo" + /// foo(); // prints "foo" + /// } + /// ``` pub ITEMS_AFTER_STATEMENTS, pedantic, "blocks where an item comes after a statement" diff --git a/clippy_lints/src/len_zero.rs b/clippy_lints/src/len_zero.rs index 2ec0b5a8d6fb4..f5bfede75a761 100644 --- a/clippy_lints/src/len_zero.rs +++ b/clippy_lints/src/len_zero.rs @@ -1,4 +1,4 @@ -use crate::utils::{get_item_name, snippet_with_applicability, span_lint, span_lint_and_sugg, walk_ptrs_ty}; +use crate::utils::{get_item_name, higher, snippet_with_applicability, span_lint, span_lint_and_sugg, walk_ptrs_ty}; use rustc_ast::ast::LitKind; use rustc_data_structures::fx::FxHashSet; use rustc_errors::Applicability; @@ -259,6 +259,17 @@ fn check_len( /// Checks if this type has an `is_empty` method. fn has_is_empty(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { + /// Special case ranges until `range_is_empty` is stabilized. See issue 3807. + fn should_skip_range(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { + higher::range(cx, expr).map_or(false, |_| { + !cx.tcx + .features() + .declared_lib_features + .iter() + .any(|(name, _)| name.as_str() == "range_is_empty") + }) + } + /// Gets an `AssocItem` and return true if it matches `is_empty(self)`. fn is_is_empty(cx: &LateContext<'_, '_>, item: &ty::AssocItem) -> bool { if let ty::AssocKind::Fn = item.kind { @@ -284,6 +295,10 @@ fn has_is_empty(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { }) } + if should_skip_range(cx, expr) { + return false; + } + let ty = &walk_ptrs_ty(cx.tables.expr_ty(expr)); match ty.kind { ty::Dynamic(ref tt, ..) => { diff --git a/clippy_lints/src/let_and_return.rs b/clippy_lints/src/let_and_return.rs new file mode 100644 index 0000000000000..6d3fb317bcfc5 --- /dev/null +++ b/clippy_lints/src/let_and_return.rs @@ -0,0 +1,141 @@ +use if_chain::if_chain; +use rustc_errors::Applicability; +use rustc_hir::def_id::DefId; +use rustc_hir::intravisit::{walk_expr, NestedVisitorMap, Visitor}; +use rustc_hir::{Block, Expr, ExprKind, PatKind, StmtKind}; +use rustc_lint::{LateContext, LateLintPass, LintContext}; +use rustc_middle::hir::map::Map; +use rustc_middle::lint::in_external_macro; +use rustc_middle::ty::subst::GenericArgKind; +use rustc_session::{declare_lint_pass, declare_tool_lint}; + +use crate::utils::{in_macro, match_qpath, snippet_opt, span_lint_and_then}; + +declare_clippy_lint! { + /// **What it does:** Checks for `let`-bindings, which are subsequently + /// returned. + /// + /// **Why is this bad?** It is just extraneous code. Remove it to make your code + /// more rusty. + /// + /// **Known problems:** None. + /// + /// **Example:** + /// ```rust + /// fn foo() -> String { + /// let x = String::new(); + /// x + /// } + /// ``` + /// instead, use + /// ``` + /// fn foo() -> String { + /// String::new() + /// } + /// ``` + pub LET_AND_RETURN, + style, + "creating a let-binding and then immediately returning it like `let x = expr; x` at the end of a block" +} + +declare_lint_pass!(LetReturn => [LET_AND_RETURN]); + +impl<'a, 'tcx> LateLintPass<'a, 'tcx> for LetReturn { + fn check_block(&mut self, cx: &LateContext<'a, 'tcx>, block: &'tcx Block<'_>) { + // we need both a let-binding stmt and an expr + if_chain! { + if let Some(retexpr) = block.expr; + if let Some(stmt) = block.stmts.iter().last(); + if let StmtKind::Local(local) = &stmt.kind; + if local.ty.is_none(); + if local.attrs.is_empty(); + if let Some(initexpr) = &local.init; + if let PatKind::Binding(.., ident, _) = local.pat.kind; + if let ExprKind::Path(qpath) = &retexpr.kind; + if match_qpath(qpath, &[&*ident.name.as_str()]); + if !last_statement_borrows(cx, initexpr); + if !in_external_macro(cx.sess(), initexpr.span); + if !in_external_macro(cx.sess(), retexpr.span); + if !in_external_macro(cx.sess(), local.span); + if !in_macro(local.span); + then { + span_lint_and_then( + cx, + LET_AND_RETURN, + retexpr.span, + "returning the result of a `let` binding from a block", + |err| { + err.span_label(local.span, "unnecessary `let` binding"); + + if let Some(snippet) = snippet_opt(cx, initexpr.span) { + err.multipart_suggestion( + "return the expression directly", + vec![ + (local.span, String::new()), + (retexpr.span, snippet), + ], + Applicability::MachineApplicable, + ); + } else { + err.span_help(initexpr.span, "this expression can be directly returned"); + } + }, + ); + } + } + } +} + +fn last_statement_borrows<'tcx>(cx: &LateContext<'_, 'tcx>, expr: &'tcx Expr<'tcx>) -> bool { + let mut visitor = BorrowVisitor { cx, borrows: false }; + walk_expr(&mut visitor, expr); + visitor.borrows +} + +struct BorrowVisitor<'a, 'tcx> { + cx: &'a LateContext<'a, 'tcx>, + borrows: bool, +} + +impl BorrowVisitor<'_, '_> { + fn fn_def_id(&self, expr: &Expr<'_>) -> Option { + match &expr.kind { + ExprKind::MethodCall(..) => self.cx.tables.type_dependent_def_id(expr.hir_id), + ExprKind::Call( + Expr { + kind: ExprKind::Path(qpath), + .. + }, + .., + ) => self.cx.tables.qpath_res(qpath, expr.hir_id).opt_def_id(), + _ => None, + } + } +} + +impl<'tcx> Visitor<'tcx> for BorrowVisitor<'_, 'tcx> { + type Map = Map<'tcx>; + + fn visit_expr(&mut self, expr: &'tcx Expr<'_>) { + if self.borrows { + return; + } + + if let Some(def_id) = self.fn_def_id(expr) { + self.borrows = self + .cx + .tcx + .fn_sig(def_id) + .output() + .skip_binder() + .walk() + .any(|arg| matches!(arg.unpack(), GenericArgKind::Lifetime(_))); + } + + walk_expr(self, expr); + } + + fn nested_visit_map(&mut self) -> NestedVisitorMap { + NestedVisitorMap::None + } +} diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index b7d928d249f96..cd258c7b506c3 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -1,5 +1,6 @@ // error-pattern:cargo-clippy +#![feature(bindings_after_at)] #![feature(box_syntax)] #![feature(box_patterns)] #![feature(or_patterns)] @@ -12,6 +13,7 @@ #![cfg_attr(feature = "deny-warnings", deny(warnings))] #![feature(crate_visibility_modifier)] #![feature(concat_idents)] +#![feature(drain_filter)] // FIXME: switch to something more ergonomic here, once available. // (Currently there is no way to opt into sysroot crates without `extern crate`.) @@ -239,6 +241,7 @@ mod large_const_arrays; mod large_enum_variant; mod large_stack_arrays; mod len_zero; +mod let_and_return; mod let_if_seq; mod let_underscore; mod lifetimes; @@ -318,6 +321,8 @@ mod try_err; mod types; mod unicode; mod unnamed_address; +mod unnecessary_sort_by; +mod unnested_or_patterns; mod unsafe_removed_from_name; mod unused_io_amount; mod unused_self; @@ -325,6 +330,7 @@ mod unwrap; mod use_self; mod useless_conversion; mod vec; +mod vec_resize_to_zero; mod verbose_file_reads; mod wildcard_dependencies; mod wildcard_imports; @@ -594,6 +600,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: &large_stack_arrays::LARGE_STACK_ARRAYS, &len_zero::LEN_WITHOUT_IS_EMPTY, &len_zero::LEN_ZERO, + &let_and_return::LET_AND_RETURN, &let_if_seq::USELESS_LET_IF_SEQ, &let_underscore::LET_UNDERSCORE_LOCK, &let_underscore::LET_UNDERSCORE_MUST_USE, @@ -664,6 +671,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: &methods::INTO_ITER_ON_REF, &methods::ITERATOR_STEP_BY_ZERO, &methods::ITER_CLONED_COLLECT, + &methods::ITER_NEXT_SLICE, &methods::ITER_NTH, &methods::ITER_NTH_ZERO, &methods::ITER_SKIP_NEXT, @@ -769,7 +777,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: ®ex::INVALID_REGEX, ®ex::REGEX_MACRO, ®ex::TRIVIAL_REGEX, - &returns::LET_AND_RETURN, &returns::NEEDLESS_RETURN, &returns::UNUSED_UNIT, &serde_api::SERDE_API_MISUSE, @@ -832,6 +839,8 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: &unicode::ZERO_WIDTH_SPACE, &unnamed_address::FN_ADDRESS_COMPARISONS, &unnamed_address::VTABLE_ADDRESS_COMPARISONS, + &unnecessary_sort_by::UNNECESSARY_SORT_BY, + &unnested_or_patterns::UNNESTED_OR_PATTERNS, &unsafe_removed_from_name::UNSAFE_REMOVED_FROM_NAME, &unused_io_amount::UNUSED_IO_AMOUNT, &unused_self::UNUSED_SELF, @@ -847,6 +856,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: &utils::internal_lints::OUTER_EXPN_EXPN_DATA, &utils::internal_lints::PRODUCE_ICE, &vec::USELESS_VEC, + &vec_resize_to_zero::VEC_RESIZE_TO_ZERO, &verbose_file_reads::VERBOSE_FILE_READS, &wildcard_dependencies::WILDCARD_DEPENDENCIES, &wildcard_imports::ENUM_GLOB_USE, @@ -994,6 +1004,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: store.register_late_pass(|| box ptr_offset_with_cast::PtrOffsetWithCast); store.register_late_pass(|| box redundant_clone::RedundantClone); store.register_late_pass(|| box slow_vector_initialization::SlowVectorInit); + store.register_late_pass(|| box unnecessary_sort_by::UnnecessarySortBy); store.register_late_pass(|| box types::RefToMut); store.register_late_pass(|| box assertions_on_constants::AssertionsOnConstants); store.register_late_pass(|| box missing_const_for_fn::MissingConstForFn); @@ -1016,6 +1027,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: store.register_early_pass(|| box formatting::Formatting); store.register_early_pass(|| box misc_early::MiscEarlyLints); store.register_early_pass(|| box returns::Return); + store.register_late_pass(|| box let_and_return::LetReturn); store.register_early_pass(|| box collapsible_if::CollapsibleIf); store.register_early_pass(|| box items_after_statements::ItemsAfterStatements); store.register_early_pass(|| box precedence::Precedence); @@ -1062,10 +1074,12 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: store.register_early_pass(|| box manual_non_exhaustive::ManualNonExhaustive); store.register_late_pass(|| box manual_async_fn::ManualAsyncFn); store.register_early_pass(|| box redundant_field_names::RedundantFieldNames); + store.register_late_pass(|| box vec_resize_to_zero::VecResizeToZero); let single_char_binding_names_threshold = conf.single_char_binding_names_threshold; store.register_early_pass(move || box non_expressive_names::NonExpressiveNames { single_char_binding_names_threshold, }); + store.register_early_pass(|| box unnested_or_patterns::UnnestedOrPatterns); store.register_group(true, "clippy::restriction", Some("clippy_restriction"), vec![ LintId::of(&arithmetic::FLOAT_ARITHMETIC), @@ -1164,6 +1178,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(&types::CAST_POSSIBLE_TRUNCATION), LintId::of(&types::CAST_POSSIBLE_WRAP), LintId::of(&types::CAST_PRECISION_LOSS), + LintId::of(&types::CAST_PTR_ALIGNMENT), LintId::of(&types::CAST_SIGN_LOSS), LintId::of(&types::IMPLICIT_HASHER), LintId::of(&types::INVALID_UPCAST_COMPARISONS), @@ -1257,6 +1272,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(&large_enum_variant::LARGE_ENUM_VARIANT), LintId::of(&len_zero::LEN_WITHOUT_IS_EMPTY), LintId::of(&len_zero::LEN_ZERO), + LintId::of(&let_and_return::LET_AND_RETURN), LintId::of(&let_underscore::LET_UNDERSCORE_LOCK), LintId::of(&lifetimes::EXTRA_UNUSED_LIFETIMES), LintId::of(&lifetimes::NEEDLESS_LIFETIMES), @@ -1303,6 +1319,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(&methods::INTO_ITER_ON_REF), LintId::of(&methods::ITERATOR_STEP_BY_ZERO), LintId::of(&methods::ITER_CLONED_COLLECT), + LintId::of(&methods::ITER_NEXT_SLICE), LintId::of(&methods::ITER_NTH), LintId::of(&methods::ITER_NTH_ZERO), LintId::of(&methods::ITER_SKIP_NEXT), @@ -1381,7 +1398,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(®ex::INVALID_REGEX), LintId::of(®ex::REGEX_MACRO), LintId::of(®ex::TRIVIAL_REGEX), - LintId::of(&returns::LET_AND_RETURN), LintId::of(&returns::NEEDLESS_RETURN), LintId::of(&returns::UNUSED_UNIT), LintId::of(&serde_api::SERDE_API_MISUSE), @@ -1410,7 +1426,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(&types::ABSURD_EXTREME_COMPARISONS), LintId::of(&types::BORROWED_BOX), LintId::of(&types::BOX_VEC), - LintId::of(&types::CAST_PTR_ALIGNMENT), LintId::of(&types::CAST_REF_TO_MUT), LintId::of(&types::CHAR_LIT_AS_U8), LintId::of(&types::FN_TO_NUMERIC_CAST), @@ -1424,12 +1439,15 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(&unicode::ZERO_WIDTH_SPACE), LintId::of(&unnamed_address::FN_ADDRESS_COMPARISONS), LintId::of(&unnamed_address::VTABLE_ADDRESS_COMPARISONS), + LintId::of(&unnecessary_sort_by::UNNECESSARY_SORT_BY), + LintId::of(&unnested_or_patterns::UNNESTED_OR_PATTERNS), LintId::of(&unsafe_removed_from_name::UNSAFE_REMOVED_FROM_NAME), LintId::of(&unused_io_amount::UNUSED_IO_AMOUNT), LintId::of(&unwrap::PANICKING_UNWRAP), LintId::of(&unwrap::UNNECESSARY_UNWRAP), LintId::of(&useless_conversion::USELESS_CONVERSION), LintId::of(&vec::USELESS_VEC), + LintId::of(&vec_resize_to_zero::VEC_RESIZE_TO_ZERO), LintId::of(&write::PRINTLN_EMPTY_STRING), LintId::of(&write::PRINT_LITERAL), LintId::of(&write::PRINT_WITH_NEWLINE), @@ -1464,6 +1482,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(&inherent_to_string::INHERENT_TO_STRING), LintId::of(&len_zero::LEN_WITHOUT_IS_EMPTY), LintId::of(&len_zero::LEN_ZERO), + LintId::of(&let_and_return::LET_AND_RETURN), LintId::of(&literal_representation::INCONSISTENT_DIGIT_GROUPING), LintId::of(&loops::EMPTY_LOOP), LintId::of(&loops::FOR_KV_MAP), @@ -1483,6 +1502,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(&methods::CHARS_NEXT_CMP), LintId::of(&methods::INTO_ITER_ON_REF), LintId::of(&methods::ITER_CLONED_COLLECT), + LintId::of(&methods::ITER_NEXT_SLICE), LintId::of(&methods::ITER_NTH_ZERO), LintId::of(&methods::ITER_SKIP_NEXT), LintId::of(&methods::MANUAL_SATURATING_ARITHMETIC), @@ -1515,7 +1535,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(&redundant_static_lifetimes::REDUNDANT_STATIC_LIFETIMES), LintId::of(®ex::REGEX_MACRO), LintId::of(®ex::TRIVIAL_REGEX), - LintId::of(&returns::LET_AND_RETURN), LintId::of(&returns::NEEDLESS_RETURN), LintId::of(&returns::UNUSED_UNIT), LintId::of(&single_component_path_imports::SINGLE_COMPONENT_PATH_IMPORTS), @@ -1604,6 +1623,8 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(&types::UNIT_ARG), LintId::of(&types::UNNECESSARY_CAST), LintId::of(&types::VEC_BOX), + LintId::of(&unnecessary_sort_by::UNNECESSARY_SORT_BY), + LintId::of(&unnested_or_patterns::UNNESTED_OR_PATTERNS), LintId::of(&unwrap::UNNECESSARY_UNWRAP), LintId::of(&useless_conversion::USELESS_CONVERSION), LintId::of(&zero_div_zero::ZERO_DIVIDED_BY_ZERO), @@ -1669,7 +1690,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(&transmute::WRONG_TRANSMUTE), LintId::of(&transmuting_null::TRANSMUTING_NULL), LintId::of(&types::ABSURD_EXTREME_COMPARISONS), - LintId::of(&types::CAST_PTR_ALIGNMENT), LintId::of(&types::CAST_REF_TO_MUT), LintId::of(&types::UNIT_CMP), LintId::of(&unicode::ZERO_WIDTH_SPACE), @@ -1677,6 +1697,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(&unnamed_address::VTABLE_ADDRESS_COMPARISONS), LintId::of(&unused_io_amount::UNUSED_IO_AMOUNT), LintId::of(&unwrap::PANICKING_UNWRAP), + LintId::of(&vec_resize_to_zero::VEC_RESIZE_TO_ZERO), ]); store.register_group(true, "clippy::perf", Some("clippy_perf"), vec![ diff --git a/clippy_lints/src/literal_representation.rs b/clippy_lints/src/literal_representation.rs index ec7c4531ed716..7ba43562d7d44 100644 --- a/clippy_lints/src/literal_representation.rs +++ b/clippy_lints/src/literal_representation.rs @@ -24,7 +24,11 @@ declare_clippy_lint! { /// **Example:** /// /// ```rust + /// // Bad /// let x: u64 = 61864918973511; + /// + /// // Good + /// let x: u64 = 61_864_918_973_511; /// ``` pub UNREADABLE_LITERAL, pedantic, @@ -44,7 +48,11 @@ declare_clippy_lint! { /// **Example:** /// /// ```rust + /// // Probably mistyped /// 2_32; + /// + /// // Good + /// 2_i32; /// ``` pub MISTYPED_LITERAL_SUFFIXES, correctness, @@ -63,7 +71,11 @@ declare_clippy_lint! { /// **Example:** /// /// ```rust + /// // Bad /// let x: u64 = 618_64_9189_73_511; + /// + /// // Good + /// let x: u64 = 61_864_918_973_511; /// ``` pub INCONSISTENT_DIGIT_GROUPING, style, diff --git a/clippy_lints/src/loops.rs b/clippy_lints/src/loops.rs index 38a5829b3f745..57c62d739640f 100644 --- a/clippy_lints/src/loops.rs +++ b/clippy_lints/src/loops.rs @@ -8,7 +8,7 @@ use crate::utils::{ multispan_sugg, snippet, snippet_opt, snippet_with_applicability, span_lint, span_lint_and_help, span_lint_and_sugg, span_lint_and_then, SpanlessEq, }; -use crate::utils::{is_type_diagnostic_item, qpath_res, same_tys, sugg}; +use crate::utils::{is_type_diagnostic_item, qpath_res, sugg}; use if_chain::if_chain; use rustc_ast::ast; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; @@ -24,10 +24,10 @@ use rustc_lint::{LateContext, LateLintPass, LintContext}; use rustc_middle::hir::map::Map; use rustc_middle::lint::in_external_macro; use rustc_middle::middle::region; -use rustc_middle::ty::{self, Ty}; +use rustc_middle::ty::{self, Ty, TyS}; use rustc_session::{declare_lint_pass, declare_tool_lint}; use rustc_span::source_map::Span; -use rustc_span::BytePos; +use rustc_span::symbol::Symbol; use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, Place, PlaceBase}; use std::iter::{once, Iterator}; use std::mem; @@ -1256,7 +1256,7 @@ fn check_for_loop_arg(cx: &LateContext<'_, '_>, pat: &Pat<'_>, arg: &Expr<'_>, e } else if method_name == "into_iter" && match_trait_method(cx, arg, &paths::INTO_ITERATOR) { let receiver_ty = cx.tables.expr_ty(&args[0]); let receiver_ty_adjusted = cx.tables.expr_ty_adjusted(&args[0]); - if same_tys(cx, receiver_ty, receiver_ty_adjusted) { + if TyS::same_type(receiver_ty, receiver_ty_adjusted) { let mut applicability = Applicability::MachineApplicable; let object = snippet_with_applicability(cx, args[0].span, "_", &mut applicability); span_lint_and_sugg( @@ -1277,7 +1277,7 @@ fn check_for_loop_arg(cx: &LateContext<'_, '_>, pat: &Pat<'_>, arg: &Expr<'_>, e mutbl: Mutability::Not, }, ); - if same_tys(cx, receiver_ty_adjusted, ref_receiver_ty) { + if TyS::same_type(receiver_ty_adjusted, ref_receiver_ty) { lint_iter_method(cx, args, arg, method_name) } } @@ -2381,32 +2381,32 @@ fn check_needless_collect<'a, 'tcx>(expr: &'tcx Expr<'_>, cx: &LateContext<'a, ' match_type(cx, ty, &paths::BTREEMAP) || is_type_diagnostic_item(cx, ty, sym!(hashmap_type)) { if method.ident.name == sym!(len) { - let span = shorten_needless_collect_span(expr); + let span = shorten_span(expr, sym!(collect)); span_lint_and_sugg( cx, NEEDLESS_COLLECT, span, NEEDLESS_COLLECT_MSG, "replace with", - ".count()".to_string(), + "count()".to_string(), Applicability::MachineApplicable, ); } if method.ident.name == sym!(is_empty) { - let span = shorten_needless_collect_span(expr); + let span = shorten_span(expr, sym!(iter)); span_lint_and_sugg( cx, NEEDLESS_COLLECT, span, NEEDLESS_COLLECT_MSG, "replace with", - ".next().is_none()".to_string(), + "get(0).is_none()".to_string(), Applicability::MachineApplicable, ); } if method.ident.name == sym!(contains) { let contains_arg = snippet(cx, args[1].span, "??"); - let span = shorten_needless_collect_span(expr); + let span = shorten_span(expr, sym!(collect)); span_lint_and_then( cx, NEEDLESS_COLLECT, @@ -2422,7 +2422,7 @@ fn check_needless_collect<'a, 'tcx>(expr: &'tcx Expr<'_>, cx: &LateContext<'a, ' span, "replace with", format!( - ".any(|{}| x == {})", + "any(|{}| x == {})", arg, pred ), Applicability::MachineApplicable, @@ -2435,13 +2435,13 @@ fn check_needless_collect<'a, 'tcx>(expr: &'tcx Expr<'_>, cx: &LateContext<'a, ' } } -fn shorten_needless_collect_span(expr: &Expr<'_>) -> Span { - if_chain! { - if let ExprKind::MethodCall(_, _, ref args) = expr.kind; - if let ExprKind::MethodCall(_, ref span, _) = args[0].kind; - then { - return expr.span.with_lo(span.lo() - BytePos(1)); +fn shorten_span(expr: &Expr<'_>, target_fn_name: Symbol) -> Span { + let mut current_expr = expr; + while let ExprKind::MethodCall(ref path, ref span, ref args) = current_expr.kind { + if path.ident.name == target_fn_name { + return expr.span.with_lo(span.lo()); } + current_expr = &args[0]; } unreachable!() } diff --git a/clippy_lints/src/matches.rs b/clippy_lints/src/matches.rs index 94380acfcfd4c..6d7af45a47224 100644 --- a/clippy_lints/src/matches.rs +++ b/clippy_lints/src/matches.rs @@ -36,10 +36,17 @@ declare_clippy_lint! { /// ```rust /// # fn bar(stool: &str) {} /// # let x = Some("abc"); + /// + /// // Bad /// match x { /// Some(ref foo) => bar(foo), /// _ => (), /// } + /// + /// // Good + /// if let Some(ref foo) = x { + /// bar(foo); + /// } /// ``` pub SINGLE_MATCH, style, @@ -97,11 +104,19 @@ declare_clippy_lint! { /// /// **Example:** /// ```rust,ignore + /// // Bad /// match x { /// &A(ref y) => foo(y), /// &B => bar(), /// _ => frob(&x), /// } + /// + /// // Good + /// match *x { + /// A(ref y) => foo(y), + /// B => bar(), + /// _ => frob(x), + /// } /// ``` pub MATCH_REF_PATS, style, @@ -197,10 +212,15 @@ declare_clippy_lint! { /// **Example:** /// ```rust /// let x: Option<()> = None; + /// + /// // Bad /// let r: Option<&()> = match x { /// None => None, /// Some(ref v) => Some(v), /// }; + /// + /// // Good + /// let r: Option<&()> = x.as_ref(); /// ``` pub MATCH_AS_REF, complexity, @@ -219,10 +239,18 @@ declare_clippy_lint! { /// ```rust /// # enum Foo { A(usize), B(usize) } /// # let x = Foo::B(1); + /// + /// // Bad /// match x { /// Foo::A(_) => {}, /// _ => {}, /// } + /// + /// // Good + /// match x { + /// Foo::A(_) => {}, + /// Foo::B(_) => {}, + /// } /// ``` pub WILDCARD_ENUM_MATCH_ARM, restriction, @@ -242,16 +270,14 @@ declare_clippy_lint! { /// ```rust /// # enum Foo { A, B, C } /// # let x = Foo::B; + /// // Bad /// match x { /// Foo::A => {}, /// Foo::B => {}, /// _ => {}, /// } - /// ``` - /// Use instead: - /// ```rust - /// # enum Foo { A, B, C } - /// # let x = Foo::B; + /// + /// // Good /// match x { /// Foo::A => {}, /// Foo::B => {}, @@ -273,10 +299,17 @@ declare_clippy_lint! { /// /// **Example:** /// ```rust + /// // Bad /// match "foo" { /// "a" => {}, /// "bar" | _ => {}, /// } + /// + /// // Good + /// match "foo" { + /// "a" => {}, + /// _ => {}, + /// } /// ``` pub WILDCARD_IN_OR_PATTERNS, complexity, diff --git a/clippy_lints/src/methods/manual_saturating_arithmetic.rs b/clippy_lints/src/methods/manual_saturating_arithmetic.rs index aaed6d75048c6..4f5c06e785c23 100644 --- a/clippy_lints/src/methods/manual_saturating_arithmetic.rs +++ b/clippy_lints/src/methods/manual_saturating_arithmetic.rs @@ -57,7 +57,7 @@ pub fn lint(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, args: &[&[hir::Expr< ); } else { match (mm, arith) { - (MinMax::Max, "add") | (MinMax::Max, "mul") | (MinMax::Min, "sub") => (), + (MinMax::Max, "add" | "mul") | (MinMax::Min, "sub") => (), _ => return, } diff --git a/clippy_lints/src/methods/mod.rs b/clippy_lints/src/methods/mod.rs index 52ca962e7ef97..214cf0c130f21 100644 --- a/clippy_lints/src/methods/mod.rs +++ b/clippy_lints/src/methods/mod.rs @@ -18,7 +18,7 @@ use rustc_lint::{LateContext, LateLintPass, Lint, LintContext}; use rustc_middle::hir::map::Map; use rustc_middle::lint::in_external_macro; use rustc_middle::ty::subst::GenericArgKind; -use rustc_middle::ty::{self, Ty}; +use rustc_middle::ty::{self, Ty, TyS}; use rustc_session::{declare_lint_pass, declare_tool_lint}; use rustc_span::source_map::Span; use rustc_span::symbol::{sym, SymbolStr}; @@ -26,12 +26,12 @@ use rustc_span::symbol::{sym, SymbolStr}; use crate::consts::{constant, Constant}; use crate::utils::usage::mutated_variables; use crate::utils::{ - get_arg_name, get_parent_expr, get_trait_def_id, has_iter_method, implements_trait, in_macro, is_copy, + get_arg_name, get_parent_expr, get_trait_def_id, has_iter_method, higher, implements_trait, in_macro, is_copy, is_ctor_or_promotable_const_function, is_expn_of, is_type_diagnostic_item, iter_input_pats, last_path_segment, match_def_path, match_qpath, match_trait_method, match_type, match_var, method_calls, method_chain_args, paths, - remove_blocks, return_ty, same_tys, single_segment_path, snippet, snippet_with_applicability, - snippet_with_macro_callsite, span_lint, span_lint_and_help, span_lint_and_note, span_lint_and_sugg, - span_lint_and_then, sugg, walk_ptrs_ty, walk_ptrs_ty_depth, SpanlessEq, + remove_blocks, return_ty, single_segment_path, snippet, snippet_with_applicability, snippet_with_macro_callsite, + span_lint, span_lint_and_help, span_lint_and_note, span_lint_and_sugg, span_lint_and_then, sugg, walk_ptrs_ty, + walk_ptrs_ty_depth, SpanlessEq, }; declare_clippy_lint! { @@ -218,7 +218,12 @@ declare_clippy_lint! { /// **Example:** /// ```rust /// # let x = Ok::<_, ()>(()); - /// x.ok().expect("why did I do this again?") + /// + /// // Bad + /// x.ok().expect("why did I do this again?"); + /// + /// // Good + /// x.expect("why did I do this again?"); /// ``` pub OK_EXPECT, style, @@ -273,8 +278,12 @@ declare_clippy_lint! { /// **Example:** /// ```rust /// # let opt = Some(1); - /// opt.map_or(None, |a| Some(a + 1)) - /// # ; + /// + /// // Bad + /// opt.map_or(None, |a| Some(a + 1)); + /// + /// // Good + /// opt.and_then(|a| Some(a + 1)); /// ``` pub OPTION_MAP_OR_NONE, style, @@ -390,14 +399,19 @@ declare_clippy_lint! { /// **What it does:** Checks for usage of `_.map(_).flatten(_)`, /// /// **Why is this bad?** Readability, this can be written more concisely as a - /// single method call. + /// single method call using `_.flat_map(_)` /// /// **Known problems:** /// /// **Example:** /// ```rust /// let vec = vec![vec![1]]; + /// + /// // Bad /// vec.iter().map(|x| x.iter()).flatten(); + /// + /// // Good + /// vec.iter().flat_map(|x| x.iter()); /// ``` pub MAP_FLATTEN, pedantic, @@ -417,7 +431,16 @@ declare_clippy_lint! { /// **Example:** /// ```rust /// let vec = vec![1]; + /// + /// // Bad /// vec.iter().filter(|x| **x == 0).map(|x| *x * 2); + /// + /// // Good + /// vec.iter().filter_map(|x| if *x == 0 { + /// Some(*x * 2) + /// } else { + /// None + /// }); /// ``` pub FILTER_MAP, pedantic, @@ -634,7 +657,12 @@ declare_clippy_lint! { /// ```rust /// # use std::rc::Rc; /// let x = Rc::new(1); + /// + /// // Bad /// x.clone(); + /// + /// // Good + /// Rc::clone(&x); /// ``` pub CLONE_ON_REF_PTR, restriction, @@ -741,7 +769,12 @@ declare_clippy_lint! { /// **Known problems:** Does not catch multi-byte unicode characters. /// /// **Example:** - /// `_.split("x")` could be `_.split('x')` + /// ```rust,ignore + /// // Bad + /// _.split("x"); + /// + /// // Good + /// _.split('x'); pub SINGLE_CHAR_PATTERN, perf, "using a single-character str where a char could be used, e.g., `_.split(\"x\")`" @@ -964,8 +997,8 @@ declare_clippy_lint! { } declare_clippy_lint! { - /// **What it does:** Checks for usage of `.chars().last()` or - /// `.chars().next_back()` on a `str` to check if it ends with a given char. + /// **What it does:** Checks for usage of `_.chars().last()` or + /// `_.chars().next_back()` on a `str` to check if it ends with a given char. /// /// **Why is this bad?** Readability, this can be written more concisely as /// `_.ends_with(_)`. @@ -975,8 +1008,12 @@ declare_clippy_lint! { /// **Example:** /// ```rust /// # let name = "_"; - /// name.chars().last() == Some('_') || name.chars().next_back() == Some('-') - /// # ; + /// + /// // Bad + /// name.chars().last() == Some('_') || name.chars().next_back() == Some('-'); + /// + /// // Good + /// name.ends_with('_') || name.ends_with('-'); /// ``` pub CHARS_LAST_CMP, style, @@ -1044,17 +1081,15 @@ declare_clippy_lint! { /// **Example:** /// ```rust /// let _ = (0..3).filter_map(|x| if x > 2 { Some(x) } else { None }); - /// ``` - /// As there is no transformation of the argument this could be written as: - /// ```rust + /// + /// // As there is no transformation of the argument this could be written as: /// let _ = (0..3).filter(|&x| x > 2); /// ``` /// /// ```rust /// let _ = (0..4).filter_map(|x| Some(x + 1)); - /// ``` - /// As there is no conditional check on the argument this could be written as: - /// ```rust + /// + /// // As there is no conditional check on the argument this could be written as: /// let _ = (0..4).map(|x| x + 1); /// ``` pub UNNECESSARY_FILTER_MAP, @@ -1075,7 +1110,11 @@ declare_clippy_lint! { /// **Example:** /// /// ```rust + /// // Bad /// let _ = (&vec![3, 4, 5]).into_iter(); + /// + /// // Good + /// let _ = (&vec![3, 4, 5]).iter(); /// ``` pub INTO_ITER_ON_REF, style, @@ -1242,6 +1281,32 @@ declare_clippy_lint! { "using `as_ref().map(Deref::deref)`, which is more succinctly expressed as `as_deref()`" } +declare_clippy_lint! { + /// **What it does:** Checks for usage of `iter().next()` on a Slice or an Array + /// + /// **Why is this bad?** These can be shortened into `.get()` + /// + /// **Known problems:** None. + /// + /// **Example:** + /// ```rust + /// # let a = [1, 2, 3]; + /// # let b = vec![1, 2, 3]; + /// a[2..].iter().next(); + /// b.iter().next(); + /// ``` + /// should be written as: + /// ```rust + /// # let a = [1, 2, 3]; + /// # let b = vec![1, 2, 3]; + /// a.get(2); + /// b.get(0); + /// ``` + pub ITER_NEXT_SLICE, + style, + "using `.iter().next()` on a sliced array, which can be shortened to just `.get()`" +} + declare_lint_pass!(Methods => [ UNWRAP_USED, EXPECT_USED, @@ -1273,6 +1338,7 @@ declare_lint_pass!(Methods => [ FIND_MAP, MAP_FLATTEN, ITERATOR_STEP_BY_ZERO, + ITER_NEXT_SLICE, ITER_NTH, ITER_NTH_ZERO, ITER_SKIP_NEXT, @@ -1320,6 +1386,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Methods { }, ["next", "filter"] => lint_filter_next(cx, expr, arg_lists[1]), ["next", "skip_while"] => lint_skip_while_next(cx, expr, arg_lists[1]), + ["next", "iter"] => lint_iter_next(cx, expr, arg_lists[1]), ["map", "filter"] => lint_filter_map(cx, expr, arg_lists[1], arg_lists[0]), ["map", "filter_map"] => lint_filter_map_map(cx, expr, arg_lists[1], arg_lists[0]), ["next", "filter_map"] => lint_filter_map_next(cx, expr, arg_lists[1]), @@ -1336,9 +1403,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Methods { lint_search_is_some(cx, expr, "rposition", arg_lists[1], arg_lists[0], method_spans[1]) }, ["extend", ..] => lint_extend(cx, expr, arg_lists[0]), - ["as_ptr", "unwrap"] | ["as_ptr", "expect"] => { - lint_cstring_as_ptr(cx, expr, &arg_lists[1][0], &arg_lists[0][0]) - }, + ["as_ptr", "unwrap" | "expect"] => lint_cstring_as_ptr(cx, expr, &arg_lists[1][0], &arg_lists[0][0]), ["nth", "iter"] => lint_iter_nth(cx, expr, &arg_lists, false), ["nth", "iter_mut"] => lint_iter_nth(cx, expr, &arg_lists, true), ["nth", ..] => lint_iter_nth_zero(cx, expr, arg_lists[0]), @@ -1351,12 +1416,10 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Methods { ["filter_map", ..] => unnecessary_filter_map::lint(cx, expr, arg_lists[0]), ["count", "map"] => lint_suspicious_map(cx, expr), ["assume_init"] => lint_maybe_uninit(cx, &arg_lists[0][0], expr), - ["unwrap_or", arith @ "checked_add"] - | ["unwrap_or", arith @ "checked_sub"] - | ["unwrap_or", arith @ "checked_mul"] => { + ["unwrap_or", arith @ ("checked_add" | "checked_sub" | "checked_mul")] => { manual_saturating_arithmetic::lint(cx, expr, &arg_lists, &arith["checked_".len()..]) }, - ["add"] | ["offset"] | ["sub"] | ["wrapping_offset"] | ["wrapping_add"] | ["wrapping_sub"] => { + ["add" | "offset" | "sub" | "wrapping_offset" | "wrapping_add" | "wrapping_sub"] => { check_pointer_offset(cx, expr, arg_lists[0]) }, ["is_file", ..] => lint_filetype_is_file(cx, expr, arg_lists[0]), @@ -1481,7 +1544,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Methods { let contains_self_ty = |ty: Ty<'tcx>| { ty.walk().any(|inner| match inner.unpack() { - GenericArgKind::Type(inner_ty) => same_tys(cx, self_ty, inner_ty), + GenericArgKind::Type(inner_ty) => TyS::same_type(self_ty, inner_ty), GenericArgKind::Lifetime(_) | GenericArgKind::Const(_) => false, }) @@ -1508,7 +1571,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Methods { } } - if name == "new" && !same_tys(cx, ret_ty, self_ty) { + if name == "new" && !TyS::same_type(ret_ty, self_ty) { span_lint( cx, NEW_RET_NO_SELF, @@ -1762,8 +1825,7 @@ fn lint_expect_fun_call( hir::ExprKind::Call(fun, _) => { if let hir::ExprKind::Path(ref p) = fun.kind { match cx.tables.qpath_res(p, fun.hir_id) { - hir::def::Res::Def(hir::def::DefKind::Fn, def_id) - | hir::def::Res::Def(hir::def::DefKind::AssocFn, def_id) => matches!( + hir::def::Res::Def(hir::def::DefKind::Fn | hir::def::DefKind::AssocFn, def_id) => matches!( cx.tcx.fn_sig(def_id).output().skip_binder().kind, ty::Ref(ty::ReStatic, ..) ), @@ -2199,6 +2261,60 @@ fn lint_step_by<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &hir::Expr<'_>, args } } +fn lint_iter_next<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx hir::Expr<'_>, iter_args: &'tcx [hir::Expr<'_>]) { + let caller_expr = &iter_args[0]; + + // Skip lint if the `iter().next()` expression is a for loop argument, + // since it is already covered by `&loops::ITER_NEXT_LOOP` + let mut parent_expr_opt = get_parent_expr(cx, expr); + while let Some(parent_expr) = parent_expr_opt { + if higher::for_loop(parent_expr).is_some() { + return; + } + parent_expr_opt = get_parent_expr(cx, parent_expr); + } + + if derefs_to_slice(cx, caller_expr, cx.tables.expr_ty(caller_expr)).is_some() { + // caller is a Slice + if_chain! { + if let hir::ExprKind::Index(ref caller_var, ref index_expr) = &caller_expr.kind; + if let Some(higher::Range { start: Some(start_expr), end: None, limits: ast::RangeLimits::HalfOpen }) + = higher::range(cx, index_expr); + if let hir::ExprKind::Lit(ref start_lit) = &start_expr.kind; + if let ast::LitKind::Int(start_idx, _) = start_lit.node; + then { + let mut applicability = Applicability::MachineApplicable; + span_lint_and_sugg( + cx, + ITER_NEXT_SLICE, + expr.span, + "Using `.iter().next()` on a Slice without end index.", + "try calling", + format!("{}.get({})", snippet_with_applicability(cx, caller_var.span, "..", &mut applicability), start_idx), + applicability, + ); + } + } + } else if is_type_diagnostic_item(cx, cx.tables.expr_ty(caller_expr), sym!(vec_type)) + || matches!(&walk_ptrs_ty(cx.tables.expr_ty(caller_expr)).kind, ty::Array(_, _)) + { + // caller is a Vec or an Array + let mut applicability = Applicability::MachineApplicable; + span_lint_and_sugg( + cx, + ITER_NEXT_SLICE, + expr.span, + "Using `.iter().next()` on an array", + "try calling", + format!( + "{}.get(0)", + snippet_with_applicability(cx, caller_expr.span, "..", &mut applicability) + ), + applicability, + ); + } +} + fn lint_iter_nth<'a, 'tcx>( cx: &LateContext<'a, 'tcx>, expr: &hir::Expr<'_>, diff --git a/clippy_lints/src/misc.rs b/clippy_lints/src/misc.rs index e1d524c2231e4..f513161bbbc52 100644 --- a/clippy_lints/src/misc.rs +++ b/clippy_lints/src/misc.rs @@ -38,10 +38,16 @@ declare_clippy_lint! { /// dereferences, e.g., changing `*x` to `x` within the function. /// /// **Example:** - /// ```rust + /// ```rust,ignore + /// // Bad /// fn foo(ref x: u8) -> bool { /// true /// } + /// + /// // Good + /// fn foo(x: &u8) -> bool { + /// true + /// } /// ``` pub TOPLEVEL_REF_ARG, style, @@ -60,7 +66,11 @@ declare_clippy_lint! { /// ```rust /// # let x = 1.0; /// + /// // Bad /// if x == f32::NAN { } + /// + /// // Good + /// if x.is_nan() { } /// ``` pub CMP_NAN, correctness, @@ -83,8 +93,15 @@ declare_clippy_lint! { /// ```rust /// let x = 1.2331f64; /// let y = 1.2332f64; + /// + /// // Bad /// if y == 1.23f64 { } /// if y != x {} // where both are floats + /// + /// // Good + /// let error = 0.01f64; // Use an epsilon for comparison + /// if (y - 1.23f64).abs() < error { } + /// if (y - x).abs() > error { } /// ``` pub FLOAT_CMP, correctness, @@ -191,7 +208,11 @@ declare_clippy_lint! { /// **Example:** /// /// ```rust + /// // Bad /// let a = 0 as *const u32; + /// + /// // Good + /// let a = std::ptr::null::(); /// ``` pub ZERO_PTR, style, @@ -214,7 +235,13 @@ declare_clippy_lint! { /// ```rust /// let x: f64 = 1.0; /// const ONE: f64 = 1.00; - /// x == ONE; // where both are floats + /// + /// // Bad + /// if x == ONE { } // where both are floats + /// + /// // Good + /// let error = 0.1f64; // Use an epsilon for comparison + /// if (x - ONE).abs() < error { } /// ``` pub FLOAT_CMP_CONST, restriction, @@ -248,17 +275,14 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MiscLints { return; } for arg in iter_input_pats(decl, body) { - match arg.pat.kind { - PatKind::Binding(BindingAnnotation::Ref, ..) | PatKind::Binding(BindingAnnotation::RefMut, ..) => { - span_lint( - cx, - TOPLEVEL_REF_ARG, - arg.pat.span, - "`ref` directly on a function argument is ignored. Consider using a reference type \ - instead.", - ); - }, - _ => {}, + if let PatKind::Binding(BindingAnnotation::Ref | BindingAnnotation::RefMut, ..) = arg.pat.kind { + span_lint( + cx, + TOPLEVEL_REF_ARG, + arg.pat.span, + "`ref` directly on a function argument is ignored. \ + Consider using a reference type instead.", + ); } } } diff --git a/clippy_lints/src/misc_early.rs b/clippy_lints/src/misc_early.rs index 552222eba2ee2..ad39e59d0678a 100644 --- a/clippy_lints/src/misc_early.rs +++ b/clippy_lints/src/misc_early.rs @@ -59,7 +59,11 @@ declare_clippy_lint! { /// /// **Example:** /// ```rust + /// // Bad /// fn foo(a: i32, _a: i32) {} + /// + /// // Good + /// fn bar(a: i32, _b: i32) {} /// ``` pub DUPLICATE_UNDERSCORE_ARGUMENT, style, @@ -77,7 +81,11 @@ declare_clippy_lint! { /// /// **Example:** /// ```rust,ignore - /// (|| 42)() + /// // Bad + /// let a = (|| 42)() + /// + /// // Good + /// let a = 42 /// ``` pub REDUNDANT_CLOSURE_CALL, complexity, @@ -112,7 +120,11 @@ declare_clippy_lint! { /// /// **Example:** /// ```rust + /// // Bad /// let y = 0x1a9BAcD; + /// + /// // Good + /// let y = 0x1A9BACD; /// ``` pub MIXED_CASE_HEX_LITERALS, style, @@ -129,7 +141,11 @@ declare_clippy_lint! { /// /// **Example:** /// ```rust + /// // Bad /// let y = 123832i32; + /// + /// // Good + /// let y = 123832_i32; /// ``` pub UNSEPARATED_LITERAL_SUFFIX, pedantic, @@ -207,9 +223,16 @@ declare_clippy_lint! { /// ```rust /// # let v = Some("abc"); /// + /// // Bad + /// match v { + /// Some(x) => (), + /// y @ _ => (), + /// } + /// + /// // Good /// match v { /// Some(x) => (), - /// y @ _ => (), // easier written as `y`, + /// y => (), /// } /// ``` pub REDUNDANT_PATTERN, @@ -235,16 +258,13 @@ declare_clippy_lint! { /// # struct TupleStruct(u32, u32, u32); /// # let t = TupleStruct(1, 2, 3); /// + /// // Bad /// match t { /// TupleStruct(0, .., _) => (), /// _ => (), /// } - /// ``` - /// can be written as - /// ```rust - /// # struct TupleStruct(u32, u32, u32); - /// # let t = TupleStruct(1, 2, 3); /// + /// // Good /// match t { /// TupleStruct(0, ..) => (), /// _ => (), diff --git a/clippy_lints/src/multiple_crate_versions.rs b/clippy_lints/src/multiple_crate_versions.rs index b6770804e1801..6c42014b4c8a1 100644 --- a/clippy_lints/src/multiple_crate_versions.rs +++ b/clippy_lints/src/multiple_crate_versions.rs @@ -7,7 +7,7 @@ use rustc_lint::{LateContext, LateLintPass}; use rustc_session::{declare_lint_pass, declare_tool_lint}; use rustc_span::source_map::DUMMY_SP; -use cargo_metadata::{DependencyKind, MetadataCommand, Node, Package, PackageId}; +use cargo_metadata::{DependencyKind, Node, Package, PackageId}; use if_chain::if_chain; use itertools::Itertools; @@ -42,13 +42,7 @@ impl LateLintPass<'_, '_> for MultipleCrateVersions { return; } - let metadata = if let Ok(metadata) = MetadataCommand::new().exec() { - metadata - } else { - span_lint(cx, MULTIPLE_CRATE_VERSIONS, DUMMY_SP, "could not read cargo metadata"); - return; - }; - + let metadata = unwrap_cargo_metadata!(cx, MULTIPLE_CRATE_VERSIONS, true); let local_name = cx.tcx.crate_name(LOCAL_CRATE).as_str(); let mut packages = metadata.packages; packages.sort_by(|a, b| a.name.cmp(&b.name)); diff --git a/clippy_lints/src/mut_reference.rs b/clippy_lints/src/mut_reference.rs index 67a1ac78a6777..58a8e1a1064ae 100644 --- a/clippy_lints/src/mut_reference.rs +++ b/clippy_lints/src/mut_reference.rs @@ -16,7 +16,11 @@ declare_clippy_lint! { /// /// **Example:** /// ```ignore + /// // Bad /// my_vec.push(&mut value) + /// + /// // Good + /// my_vec.push(&value) /// ``` pub UNNECESSARY_MUT_PASSED, style, diff --git a/clippy_lints/src/mutex_atomic.rs b/clippy_lints/src/mutex_atomic.rs index 4e1a8be4892e6..78b15afc5a7fa 100644 --- a/clippy_lints/src/mutex_atomic.rs +++ b/clippy_lints/src/mutex_atomic.rs @@ -22,9 +22,15 @@ declare_clippy_lint! { /// /// **Example:** /// ```rust + /// # let y = true; + /// + /// // Bad /// # use std::sync::Mutex; - /// # let y = 1; /// let x = Mutex::new(&y); + /// + /// // Good + /// # use std::sync::atomic::AtomicBool; + /// let x = AtomicBool::new(y); /// ``` pub MUTEX_ATOMIC, perf, @@ -46,6 +52,10 @@ declare_clippy_lint! { /// ```rust /// # use std::sync::Mutex; /// let x = Mutex::new(0usize); + /// + /// // Good + /// # use std::sync::atomic::AtomicUsize; + /// let x = AtomicUsize::new(0usize); /// ``` pub MUTEX_INTEGER, nursery, diff --git a/clippy_lints/src/needless_bool.rs b/clippy_lints/src/needless_bool.rs index efa77db822dd0..15b129fa09802 100644 --- a/clippy_lints/src/needless_bool.rs +++ b/clippy_lints/src/needless_bool.rs @@ -15,8 +15,7 @@ use rustc_span::Span; declare_clippy_lint! { /// **What it does:** Checks for expressions of the form `if c { true } else { - /// false }` - /// (or vice versa) and suggest using the condition directly. + /// false }` (or vice versa) and suggests using the condition directly. /// /// **Why is this bad?** Redundant code. /// diff --git a/clippy_lints/src/needless_borrow.rs b/clippy_lints/src/needless_borrow.rs index 9ee875d7516eb..5880d1d610206 100644 --- a/clippy_lints/src/needless_borrow.rs +++ b/clippy_lints/src/needless_borrow.rs @@ -18,12 +18,16 @@ declare_clippy_lint! { /// **Why is this bad?** Suggests that the receiver of the expression borrows /// the expression. /// + /// **Known problems:** None. + /// /// **Example:** /// ```rust + /// // Bad /// let x: &i32 = &&&&&&5; - /// ``` /// - /// **Known problems:** None. + /// // Good + /// let x: &i32 = &5; + /// ``` pub NEEDLESS_BORROW, nursery, "taking a reference that is going to be automatically dereferenced" diff --git a/clippy_lints/src/needless_continue.rs b/clippy_lints/src/needless_continue.rs index 28183810df489..a971d041ca661 100644 --- a/clippy_lints/src/needless_continue.rs +++ b/clippy_lints/src/needless_continue.rs @@ -424,7 +424,7 @@ fn erode_from_back(s: &str) -> String { } fn span_of_first_expr_in_block(block: &ast::Block) -> Option { - block.stmts.iter().next().map(|stmt| stmt.span) + block.stmts.get(0).map(|stmt| stmt.span) } #[cfg(test)] diff --git a/clippy_lints/src/needless_update.rs b/clippy_lints/src/needless_update.rs index 4b2586877e562..d866bab2f642c 100644 --- a/clippy_lints/src/needless_update.rs +++ b/clippy_lints/src/needless_update.rs @@ -21,6 +21,16 @@ declare_clippy_lint! { /// # z: i32, /// # } /// # let zero_point = Point { x: 0, y: 0, z: 0 }; + /// + /// // Bad + /// Point { + /// x: 1, + /// y: 1, + /// z: 1, + /// ..zero_point + /// }; + /// + /// // Ok /// Point { /// x: 1, /// y: 1, diff --git a/clippy_lints/src/new_without_default.rs b/clippy_lints/src/new_without_default.rs index e556e5d59c188..dd236535c18ad 100644 --- a/clippy_lints/src/new_without_default.rs +++ b/clippy_lints/src/new_without_default.rs @@ -1,13 +1,13 @@ use crate::utils::paths; use crate::utils::sugg::DiagnosticBuilderExt; -use crate::utils::{get_trait_def_id, return_ty, same_tys, span_lint_hir_and_then}; +use crate::utils::{get_trait_def_id, return_ty, span_lint_hir_and_then}; use if_chain::if_chain; use rustc_errors::Applicability; use rustc_hir as hir; use rustc_hir::HirIdSet; use rustc_lint::{LateContext, LateLintPass, LintContext}; use rustc_middle::lint::in_external_macro; -use rustc_middle::ty::Ty; +use rustc_middle::ty::{Ty, TyS}; use rustc_session::{declare_tool_lint, impl_lint_pass}; declare_clippy_lint! { @@ -93,7 +93,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NewWithoutDefault { let self_def_id = cx.tcx.hir().local_def_id(cx.tcx.hir().get_parent_item(id)); let self_ty = cx.tcx.type_of(self_def_id); if_chain! { - if same_tys(cx, self_ty, return_ty(cx, id)); + if TyS::same_type(self_ty, return_ty(cx, id)); if let Some(default_trait_id) = get_trait_def_id(cx, &paths::DEFAULT_TRAIT); then { if self.impling_types.is_none() { diff --git a/clippy_lints/src/no_effect.rs b/clippy_lints/src/no_effect.rs index b8bfa676a1608..2eacd3c80c486 100644 --- a/clippy_lints/src/no_effect.rs +++ b/clippy_lints/src/no_effect.rs @@ -147,7 +147,7 @@ fn reduce_expression<'a>(cx: &LateContext<'_, '_>, expr: &'a Expr<'a>) -> Option if let ExprKind::Path(ref qpath) = callee.kind { let res = qpath_res(cx, qpath, callee.hir_id); match res { - Res::Def(DefKind::Struct, ..) | Res::Def(DefKind::Variant, ..) | Res::Def(DefKind::Ctor(..), _) + Res::Def(DefKind::Struct | DefKind::Variant | DefKind::Ctor(..), ..) if !has_drop(cx, cx.tables.expr_ty(expr)) => { Some(args.iter().collect()) diff --git a/clippy_lints/src/ptr.rs b/clippy_lints/src/ptr.rs index 4eac571f96620..c77b44e0c99c7 100644 --- a/clippy_lints/src/ptr.rs +++ b/clippy_lints/src/ptr.rs @@ -47,7 +47,11 @@ declare_clippy_lint! { /// /// **Example:** /// ```ignore + /// // Bad /// fn foo(&Vec) { .. } + /// + /// // Good + /// fn foo(&[u32]) { .. } /// ``` pub PTR_ARG, style, @@ -65,9 +69,15 @@ declare_clippy_lint! { /// /// **Example:** /// ```ignore + /// // Bad /// if x == ptr::null { /// .. /// } + /// + /// // Good + /// if x.is_null() { + /// .. + /// } /// ``` pub CMP_NULL, style, @@ -76,19 +86,16 @@ declare_clippy_lint! { declare_clippy_lint! { /// **What it does:** This lint checks for functions that take immutable - /// references and return - /// mutable ones. + /// references and return mutable ones. /// /// **Why is this bad?** This is trivially unsound, as one can create two - /// mutable references - /// from the same (immutable!) source. This - /// [error](https://github.com/rust-lang/rust/issues/39465) + /// mutable references from the same (immutable!) source. + /// This [error](https://github.com/rust-lang/rust/issues/39465) /// actually lead to an interim Rust release 1.15.1. /// /// **Known problems:** To be on the conservative side, if there's at least one - /// mutable reference - /// with the output lifetime, this lint will not trigger. In practice, this - /// case is unlikely anyway. + /// mutable reference with the output lifetime, this lint will not trigger. + /// In practice, this case is unlikely anyway. /// /// **Example:** /// ```ignore diff --git a/clippy_lints/src/question_mark.rs b/clippy_lints/src/question_mark.rs index ea654467b8668..e4361b00fb4c2 100644 --- a/clippy_lints/src/question_mark.rs +++ b/clippy_lints/src/question_mark.rs @@ -88,7 +88,7 @@ impl QuestionMark { replacement_str, applicability, ) - } + } } } } diff --git a/clippy_lints/src/ranges.rs b/clippy_lints/src/ranges.rs index 1eb26d97ed4d2..52e540d4e00db 100644 --- a/clippy_lints/src/ranges.rs +++ b/clippy_lints/src/ranges.rs @@ -241,14 +241,26 @@ fn check_inclusive_range_minus_one(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { } fn check_reversed_empty_range(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { - fn inside_indexing_expr<'a>(cx: &'a LateContext<'_, '_>, expr: &Expr<'_>) -> Option<&'a Expr<'a>> { - match get_parent_expr(cx, expr) { - parent_expr @ Some(Expr { + fn inside_indexing_expr(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { + matches!( + get_parent_expr(cx, expr), + Some(Expr { kind: ExprKind::Index(..), .. - }) => parent_expr, - _ => None, + }) + ) + } + + fn is_for_loop_arg(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { + let mut cur_expr = expr; + while let Some(parent_expr) = get_parent_expr(cx, cur_expr) { + match higher::for_loop(parent_expr) { + Some((_, args, _)) if args.hir_id == expr.hir_id => return true, + _ => cur_expr = parent_expr, + } } + + false } fn is_empty_range(limits: RangeLimits, ordering: Ordering) -> bool { @@ -267,34 +279,18 @@ fn check_reversed_empty_range(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { if let Some(ordering) = Constant::partial_cmp(cx.tcx, ty, &start_idx, &end_idx); if is_empty_range(limits, ordering); then { - if let Some(parent_expr) = inside_indexing_expr(cx, expr) { - let (reason, outcome) = if ordering == Ordering::Equal { - ("empty", "always yield an empty slice") - } else { - ("reversed", "panic at run-time") - }; - - span_lint_and_then( - cx, - REVERSED_EMPTY_RANGES, - expr.span, - &format!("this range is {} and using it to index a slice will {}", reason, outcome), - |diag| { - if_chain! { - if ordering == Ordering::Equal; - if let ty::Slice(slice_ty) = cx.tables.expr_ty(parent_expr).kind; - then { - diag.span_suggestion( - parent_expr.span, - "if you want an empty slice, use", - format!("[] as &[{}]", slice_ty), - Applicability::MaybeIncorrect - ); - } - } - } - ); - } else { + if inside_indexing_expr(cx, expr) { + // Avoid linting `N..N` as it has proven to be useful, see #5689 and #5628 ... + if ordering != Ordering::Equal { + span_lint( + cx, + REVERSED_EMPTY_RANGES, + expr.span, + "this range is reversed and using it to index a slice will panic at run-time", + ); + } + // ... except in for loop arguments for backwards compatibility with `reverse_range_loop` + } else if ordering != Ordering::Equal || is_for_loop_arg(cx, expr) { span_lint_and_then( cx, REVERSED_EMPTY_RANGES, diff --git a/clippy_lints/src/reference.rs b/clippy_lints/src/reference.rs index d5797468e9d53..fe457aad50e36 100644 --- a/clippy_lints/src/reference.rs +++ b/clippy_lints/src/reference.rs @@ -16,8 +16,13 @@ declare_clippy_lint! { /// /// **Example:** /// ```rust,ignore + /// // Bad /// let a = f(*&mut b); /// let c = *&d; + /// + /// // Good + /// let a = f(b); + /// let c = d; /// ``` pub DEREF_ADDROF, complexity, diff --git a/clippy_lints/src/regex.rs b/clippy_lints/src/regex.rs index 30084e3e1ffce..a2c35c4267344 100644 --- a/clippy_lints/src/regex.rs +++ b/clippy_lints/src/regex.rs @@ -86,11 +86,13 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Regex { if let Some(span) = is_expn_of(expr.span, "regex"); then { if !self.spans.contains(&span) { - span_lint(cx, - REGEX_MACRO, - span, - "`regex!(_)` found. \ - Please use `Regex::new(_)`, which is faster for now."); + span_lint( + cx, + REGEX_MACRO, + span, + "`regex!(_)` found. \ + Please use `Regex::new(_)`, which is faster for now." + ); self.spans.insert(span); } self.last = Some(block.hir_id); diff --git a/clippy_lints/src/returns.rs b/clippy_lints/src/returns.rs index 35464f629c364..3c93974417356 100644 --- a/clippy_lints/src/returns.rs +++ b/clippy_lints/src/returns.rs @@ -8,7 +8,7 @@ use rustc_session::{declare_lint_pass, declare_tool_lint}; use rustc_span::source_map::Span; use rustc_span::BytePos; -use crate::utils::{in_macro, match_path_ast, snippet_opt, span_lint_and_sugg, span_lint_and_then}; +use crate::utils::{snippet_opt, span_lint_and_sugg, span_lint_and_then}; declare_clippy_lint! { /// **What it does:** Checks for return statements at the end of a block. @@ -36,33 +36,6 @@ declare_clippy_lint! { "using a return statement like `return expr;` where an expression would suffice" } -declare_clippy_lint! { - /// **What it does:** Checks for `let`-bindings, which are subsequently - /// returned. - /// - /// **Why is this bad?** It is just extraneous code. Remove it to make your code - /// more rusty. - /// - /// **Known problems:** None. - /// - /// **Example:** - /// ```rust - /// fn foo() -> String { - /// let x = String::new(); - /// x - /// } - /// ``` - /// instead, use - /// ``` - /// fn foo() -> String { - /// String::new() - /// } - /// ``` - pub LET_AND_RETURN, - style, - "creating a let-binding and then immediately returning it like `let x = expr; x` at the end of a block" -} - declare_clippy_lint! { /// **What it does:** Checks for unit (`()`) expressions that can be removed. /// @@ -90,7 +63,7 @@ enum RetReplacement { Block, } -declare_lint_pass!(Return => [NEEDLESS_RETURN, LET_AND_RETURN, UNUSED_UNIT]); +declare_lint_pass!(Return => [NEEDLESS_RETURN, UNUSED_UNIT]); impl Return { // Check the final stmt or expr in a block for unnecessary return. @@ -105,7 +78,7 @@ impl Return { } } - // Check a the final expression in a block if it's a return. + // Check the final expression in a block if it's a return. fn check_final_expr( &mut self, cx: &EarlyContext<'_>, @@ -186,54 +159,6 @@ impl Return { }, } } - - // Check for "let x = EXPR; x" - fn check_let_return(cx: &EarlyContext<'_>, block: &ast::Block) { - let mut it = block.stmts.iter(); - - // we need both a let-binding stmt and an expr - if_chain! { - if let Some(retexpr) = it.next_back(); - if let ast::StmtKind::Expr(ref retexpr) = retexpr.kind; - if let Some(stmt) = it.next_back(); - if let ast::StmtKind::Local(ref local) = stmt.kind; - // don't lint in the presence of type inference - if local.ty.is_none(); - if local.attrs.is_empty(); - if let Some(ref initexpr) = local.init; - if let ast::PatKind::Ident(_, ident, _) = local.pat.kind; - if let ast::ExprKind::Path(_, ref path) = retexpr.kind; - if match_path_ast(path, &[&*ident.name.as_str()]); - if !in_external_macro(cx.sess(), initexpr.span); - if !in_external_macro(cx.sess(), retexpr.span); - if !in_external_macro(cx.sess(), local.span); - if !in_macro(local.span); - then { - span_lint_and_then( - cx, - LET_AND_RETURN, - retexpr.span, - "returning the result of a `let` binding from a block", - |err| { - err.span_label(local.span, "unnecessary `let` binding"); - - if let Some(snippet) = snippet_opt(cx, initexpr.span) { - err.multipart_suggestion( - "return the expression directly", - vec![ - (local.span, String::new()), - (retexpr.span, snippet), - ], - Applicability::MachineApplicable, - ); - } else { - err.span_help(initexpr.span, "this expression can be directly returned"); - } - }, - ); - } - } - } } impl EarlyLintPass for Return { @@ -254,7 +179,6 @@ impl EarlyLintPass for Return { } fn check_block(&mut self, cx: &EarlyContext<'_>, block: &ast::Block) { - Self::check_let_return(cx, block); if_chain! { if let Some(ref stmt) = block.stmts.last(); if let ast::StmtKind::Expr(ref expr) = stmt.kind; diff --git a/clippy_lints/src/shadow.rs b/clippy_lints/src/shadow.rs index 11360b0ef8495..68c36f9189184 100644 --- a/clippy_lints/src/shadow.rs +++ b/clippy_lints/src/shadow.rs @@ -25,7 +25,12 @@ declare_clippy_lint! { /// **Example:** /// ```rust /// # let x = 1; + /// + /// // Bad /// let x = &x; + /// + /// // Good + /// let y = &x; // use different variable name /// ``` pub SHADOW_SAME, restriction, @@ -77,7 +82,12 @@ declare_clippy_lint! { /// # let y = 1; /// # let z = 2; /// let x = y; + /// + /// // Bad /// let x = z; // shadows the earlier binding + /// + /// // Good + /// let w = z; // use different variable name /// ``` pub SHADOW_UNRELATED, pedantic, diff --git a/clippy_lints/src/single_component_path_imports.rs b/clippy_lints/src/single_component_path_imports.rs index 8d767a7fec88d..2e853e8301d69 100644 --- a/clippy_lints/src/single_component_path_imports.rs +++ b/clippy_lints/src/single_component_path_imports.rs @@ -16,7 +16,7 @@ declare_clippy_lint! { /// /// **Example:** /// - /// ```rust, ignore + /// ```rust,ignore /// use regex; /// /// fn main() { @@ -24,7 +24,7 @@ declare_clippy_lint! { /// } /// ``` /// Better as - /// ```rust, ignore + /// ```rust,ignore /// fn main() { /// regex::Regex::new(r"^\d{4}-\d{2}-\d{2}$").unwrap(); /// } diff --git a/clippy_lints/src/slow_vector_initialization.rs b/clippy_lints/src/slow_vector_initialization.rs index fb3706be1c213..a7c4f2c2291f1 100644 --- a/clippy_lints/src/slow_vector_initialization.rs +++ b/clippy_lints/src/slow_vector_initialization.rs @@ -22,11 +22,17 @@ declare_clippy_lint! { /// ```rust /// # use core::iter::repeat; /// # let len = 4; + /// + /// // Bad /// let mut vec1 = Vec::with_capacity(len); /// vec1.resize(len, 0); /// /// let mut vec2 = Vec::with_capacity(len); - /// vec2.extend(repeat(0).take(len)) + /// vec2.extend(repeat(0).take(len)); + /// + /// // Good + /// let mut vec1 = vec![0; len]; + /// let mut vec2 = vec![0; len]; /// ``` pub SLOW_VECTOR_INITIALIZATION, perf, diff --git a/clippy_lints/src/strings.rs b/clippy_lints/src/strings.rs index 2c51271e312de..f84566ef707a8 100644 --- a/clippy_lints/src/strings.rs +++ b/clippy_lints/src/strings.rs @@ -24,6 +24,10 @@ declare_clippy_lint! { /// ```rust /// let mut x = "Hello".to_owned(); /// x = x + ", World"; + /// + /// // More readable + /// x += ", World"; + /// x.push_str(", World"); /// ``` pub STRING_ADD_ASSIGN, pedantic, @@ -69,7 +73,11 @@ declare_clippy_lint! { /// /// **Example:** /// ```rust + /// // Bad /// let bs = "a byte string".as_bytes(); + /// + /// // Good + /// let bs = b"a byte string"; /// ``` pub STRING_LIT_AS_BYTES, style, diff --git a/clippy_lints/src/suspicious_trait_impl.rs b/clippy_lints/src/suspicious_trait_impl.rs index f1e223d9a48c6..a9e6fa329c0f0 100644 --- a/clippy_lints/src/suspicious_trait_impl.rs +++ b/clippy_lints/src/suspicious_trait_impl.rs @@ -71,8 +71,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for SuspiciousImpl { if let hir::Node::Expr(e) = cx.tcx.hir().get(parent_expr) { match e.kind { hir::ExprKind::Binary(..) - | hir::ExprKind::Unary(hir::UnOp::UnNot, _) - | hir::ExprKind::Unary(hir::UnOp::UnNeg, _) + | hir::ExprKind::Unary(hir::UnOp::UnNot | hir::UnOp::UnNeg, _) | hir::ExprKind::AssignOp(..) => return, _ => {}, } @@ -191,8 +190,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BinaryExprVisitor { fn visit_expr(&mut self, expr: &'tcx hir::Expr<'_>) { match expr.kind { hir::ExprKind::Binary(..) - | hir::ExprKind::Unary(hir::UnOp::UnNot, _) - | hir::ExprKind::Unary(hir::UnOp::UnNeg, _) + | hir::ExprKind::Unary(hir::UnOp::UnNot | hir::UnOp::UnNeg, _) | hir::ExprKind::AssignOp(..) => self.in_binary_expr = true, _ => {}, } diff --git a/clippy_lints/src/transmute.rs b/clippy_lints/src/transmute.rs index e24d2c4f495db..1869638f6ffb1 100644 --- a/clippy_lints/src/transmute.rs +++ b/clippy_lints/src/transmute.rs @@ -312,7 +312,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { e.span, &format!("transmute from a type (`{}`) to itself", from_ty), ), - (&ty::Ref(_, rty, rty_mutbl), &ty::RawPtr(ptr_ty)) => span_lint_and_then( + (ty::Ref(_, rty, rty_mutbl), ty::RawPtr(ptr_ty)) => span_lint_and_then( cx, USELESS_TRANSMUTE, e.span, @@ -321,10 +321,10 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { if let Some(arg) = sugg::Sugg::hir_opt(cx, &args[0]) { let rty_and_mut = ty::TypeAndMut { ty: rty, - mutbl: rty_mutbl, + mutbl: *rty_mutbl, }; - let sugg = if ptr_ty == rty_and_mut { + let sugg = if *ptr_ty == rty_and_mut { arg.as_ty(to_ty) } else { arg.as_ty(cx.tcx.mk_ptr(rty_and_mut)).as_ty(to_ty) @@ -334,7 +334,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { } }, ), - (&ty::Int(_), &ty::RawPtr(_)) | (&ty::Uint(_), &ty::RawPtr(_)) => span_lint_and_then( + (ty::Int(_) | ty::Uint(_), ty::RawPtr(_)) => span_lint_and_then( cx, USELESS_TRANSMUTE, e.span, @@ -350,16 +350,13 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { } }, ), - (&ty::Float(_), &ty::Ref(..)) - | (&ty::Float(_), &ty::RawPtr(_)) - | (&ty::Char, &ty::Ref(..)) - | (&ty::Char, &ty::RawPtr(_)) => span_lint( + (ty::Float(_) | ty::Char, ty::Ref(..) | ty::RawPtr(_)) => span_lint( cx, WRONG_TRANSMUTE, e.span, &format!("transmute from a `{}` to a pointer", from_ty), ), - (&ty::RawPtr(from_ptr), _) if from_ptr.ty == to_ty => span_lint( + (ty::RawPtr(from_ptr), _) if from_ptr.ty == to_ty => span_lint( cx, CROSSPOINTER_TRANSMUTE, e.span, @@ -368,7 +365,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { from_ty, to_ty ), ), - (_, &ty::RawPtr(to_ptr)) if to_ptr.ty == from_ty => span_lint( + (_, ty::RawPtr(to_ptr)) if to_ptr.ty == from_ty => span_lint( cx, CROSSPOINTER_TRANSMUTE, e.span, @@ -377,7 +374,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { from_ty, to_ty ), ), - (&ty::RawPtr(from_pty), &ty::Ref(_, to_ref_ty, mutbl)) => span_lint_and_then( + (ty::RawPtr(from_pty), ty::Ref(_, to_ref_ty, mutbl)) => span_lint_and_then( cx, TRANSMUTE_PTR_TO_REF, e.span, @@ -388,13 +385,13 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { ), |diag| { let arg = sugg::Sugg::hir(cx, &args[0], ".."); - let (deref, cast) = if mutbl == Mutability::Mut { + let (deref, cast) = if *mutbl == Mutability::Mut { ("&mut *", "*mut") } else { ("&*", "*const") }; - let arg = if from_pty.ty == to_ref_ty { + let arg = if from_pty.ty == *to_ref_ty { arg } else { arg.as_ty(&format!("{} {}", cast, get_type_snippet(cx, qpath, to_ref_ty))) @@ -408,7 +405,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { ); }, ), - (&ty::Int(ast::IntTy::I32), &ty::Char) | (&ty::Uint(ast::UintTy::U32), &ty::Char) => { + (ty::Int(ast::IntTy::I32) | ty::Uint(ast::UintTy::U32), &ty::Char) => { span_lint_and_then( cx, TRANSMUTE_INT_TO_CHAR, @@ -430,13 +427,13 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { }, ) }, - (&ty::Ref(_, ty_from, from_mutbl), &ty::Ref(_, ty_to, to_mutbl)) => { + (ty::Ref(_, ty_from, from_mutbl), ty::Ref(_, ty_to, to_mutbl)) => { if_chain! { if let (&ty::Slice(slice_ty), &ty::Str) = (&ty_from.kind, &ty_to.kind); if let ty::Uint(ast::UintTy::U8) = slice_ty.kind; if from_mutbl == to_mutbl; then { - let postfix = if from_mutbl == Mutability::Mut { + let postfix = if *from_mutbl == Mutability::Mut { "_mut" } else { "" @@ -465,13 +462,13 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { |diag| if let Some(arg) = sugg::Sugg::hir_opt(cx, &args[0]) { let ty_from_and_mut = ty::TypeAndMut { ty: ty_from, - mutbl: from_mutbl + mutbl: *from_mutbl }; - let ty_to_and_mut = ty::TypeAndMut { ty: ty_to, mutbl: to_mutbl }; + let ty_to_and_mut = ty::TypeAndMut { ty: ty_to, mutbl: *to_mutbl }; let sugg_paren = arg .as_ty(cx.tcx.mk_ptr(ty_from_and_mut)) .as_ty(cx.tcx.mk_ptr(ty_to_and_mut)); - let sugg = if to_mutbl == Mutability::Mut { + let sugg = if *to_mutbl == Mutability::Mut { sugg_paren.mut_addr_deref() } else { sugg_paren.addr_deref() @@ -488,19 +485,19 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { } } }, - (&ty::RawPtr(_), &ty::RawPtr(to_ty)) => span_lint_and_then( + (ty::RawPtr(_), ty::RawPtr(to_ty)) => span_lint_and_then( cx, TRANSMUTE_PTR_TO_PTR, e.span, "transmute from a pointer to a pointer", |diag| { if let Some(arg) = sugg::Sugg::hir_opt(cx, &args[0]) { - let sugg = arg.as_ty(cx.tcx.mk_ptr(to_ty)); + let sugg = arg.as_ty(cx.tcx.mk_ptr(*to_ty)); diag.span_suggestion(e.span, "try", sugg.to_string(), Applicability::Unspecified); } }, ), - (&ty::Int(ast::IntTy::I8), &ty::Bool) | (&ty::Uint(ast::UintTy::U8), &ty::Bool) => { + (ty::Int(ast::IntTy::I8) | ty::Uint(ast::UintTy::U8), ty::Bool) => { span_lint_and_then( cx, TRANSMUTE_INT_TO_BOOL, @@ -518,7 +515,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { }, ) }, - (&ty::Int(_), &ty::Float(_)) | (&ty::Uint(_), &ty::Float(_)) => span_lint_and_then( + (ty::Int(_) | ty::Uint(_), ty::Float(_)) => span_lint_and_then( cx, TRANSMUTE_INT_TO_FLOAT, e.span, @@ -541,7 +538,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { ); }, ), - (&ty::Float(float_ty), &ty::Int(_)) | (&ty::Float(float_ty), &ty::Uint(_)) => span_lint_and_then( + (ty::Float(float_ty), ty::Int(_) | ty::Uint(_)) => span_lint_and_then( cx, TRANSMUTE_FLOAT_TO_INT, e.span, @@ -585,7 +582,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { ); }, ), - (&ty::Adt(ref from_adt, ref from_substs), &ty::Adt(ref to_adt, ref to_substs)) => { + (ty::Adt(from_adt, from_substs), ty::Adt(to_adt, to_substs)) => { if from_adt.did != to_adt.did || !COLLECTIONS.iter().any(|path| match_def_path(cx, to_adt.did, path)) { return; diff --git a/clippy_lints/src/types.rs b/clippy_lints/src/types.rs index 6ed9ff22e4664..bc5fe44b30f8f 100644 --- a/clippy_lints/src/types.rs +++ b/clippy_lints/src/types.rs @@ -10,14 +10,14 @@ use rustc_errors::{Applicability, DiagnosticBuilder}; use rustc_hir as hir; use rustc_hir::intravisit::{walk_body, walk_expr, walk_ty, FnKind, NestedVisitorMap, Visitor}; use rustc_hir::{ - BinOpKind, Body, Expr, ExprKind, FnDecl, FnRetTy, FnSig, GenericArg, GenericParamKind, HirId, ImplItem, + BinOpKind, Block, Body, Expr, ExprKind, FnDecl, FnRetTy, FnSig, GenericArg, GenericParamKind, HirId, ImplItem, ImplItemKind, Item, ItemKind, Lifetime, Local, MatchSource, MutTy, Mutability, QPath, Stmt, StmtKind, TraitFn, TraitItem, TraitItemKind, TyKind, UnOp, }; use rustc_lint::{LateContext, LateLintPass, LintContext}; use rustc_middle::hir::map::Map; use rustc_middle::lint::in_external_macro; -use rustc_middle::ty::{self, InferTy, Ty, TyCtxt, TypeckTables}; +use rustc_middle::ty::{self, InferTy, Ty, TyCtxt, TyS, TypeckTables}; use rustc_session::{declare_lint_pass, declare_tool_lint, impl_lint_pass}; use rustc_span::hygiene::{ExpnKind, MacroKind}; use rustc_span::source_map::Span; @@ -29,10 +29,10 @@ use rustc_typeck::hir_ty_to_ty; use crate::consts::{constant, Constant}; use crate::utils::paths; use crate::utils::{ - clip, comparisons, differing_macro_contexts, higher, in_constant, int_bits, is_type_diagnostic_item, + clip, comparisons, differing_macro_contexts, higher, in_constant, indent_of, int_bits, is_type_diagnostic_item, last_path_segment, match_def_path, match_path, method_chain_args, multispan_sugg, numeric_literal::NumericLiteral, - qpath_res, same_tys, sext, snippet, snippet_opt, snippet_with_applicability, snippet_with_macro_callsite, - span_lint, span_lint_and_help, span_lint_and_sugg, span_lint_and_then, unsext, + qpath_res, sext, snippet, snippet_block_with_applicability, snippet_opt, snippet_with_applicability, + snippet_with_macro_callsite, span_lint, span_lint_and_help, span_lint_and_sugg, span_lint_and_then, unsext, }; declare_clippy_lint! { @@ -779,24 +779,22 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnitArg { match expr.kind { ExprKind::Call(_, args) | ExprKind::MethodCall(_, _, args) => { - for arg in args { - if is_unit(cx.tables.expr_ty(arg)) && !is_unit_literal(arg) { - if let ExprKind::Match(.., match_source) = &arg.kind { - if *match_source == MatchSource::TryDesugar { - continue; + let args_to_recover = args + .iter() + .filter(|arg| { + if is_unit(cx.tables.expr_ty(arg)) && !is_unit_literal(arg) { + if let ExprKind::Match(.., MatchSource::TryDesugar) = &arg.kind { + false + } else { + true } + } else { + false } - - span_lint_and_sugg( - cx, - UNIT_ARG, - arg.span, - "passing a unit value to a function", - "if you intended to pass a unit value, use a unit literal instead", - "()".to_string(), - Applicability::MaybeIncorrect, - ); - } + }) + .collect::>(); + if !args_to_recover.is_empty() { + lint_unit_args(cx, expr, &args_to_recover); } }, _ => (), @@ -804,6 +802,101 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnitArg { } } +fn lint_unit_args(cx: &LateContext<'_, '_>, expr: &Expr<'_>, args_to_recover: &[&Expr<'_>]) { + let mut applicability = Applicability::MachineApplicable; + let (singular, plural) = if args_to_recover.len() > 1 { + ("", "s") + } else { + ("a ", "") + }; + span_lint_and_then( + cx, + UNIT_ARG, + expr.span, + &format!("passing {}unit value{} to a function", singular, plural), + |db| { + let mut or = ""; + args_to_recover + .iter() + .filter_map(|arg| { + if_chain! { + if let ExprKind::Block(block, _) = arg.kind; + if block.expr.is_none(); + if let Some(last_stmt) = block.stmts.iter().last(); + if let StmtKind::Semi(last_expr) = last_stmt.kind; + if let Some(snip) = snippet_opt(cx, last_expr.span); + then { + Some(( + last_stmt.span, + snip, + )) + } + else { + None + } + } + }) + .for_each(|(span, sugg)| { + db.span_suggestion( + span, + "remove the semicolon from the last statement in the block", + sugg, + Applicability::MaybeIncorrect, + ); + or = "or "; + }); + let sugg = args_to_recover + .iter() + .filter(|arg| !is_empty_block(arg)) + .enumerate() + .map(|(i, arg)| { + let indent = if i == 0 { + 0 + } else { + indent_of(cx, expr.span).unwrap_or(0) + }; + format!( + "{}{};", + " ".repeat(indent), + snippet_block_with_applicability(cx, arg.span, "..", Some(expr.span), &mut applicability) + ) + }) + .collect::>(); + let mut and = ""; + if !sugg.is_empty() { + let plural = if sugg.len() > 1 { "s" } else { "" }; + db.span_suggestion( + expr.span.with_hi(expr.span.lo()), + &format!("{}move the expression{} in front of the call...", or, plural), + format!("{}\n", sugg.join("\n")), + applicability, + ); + and = "...and " + } + db.multipart_suggestion( + &format!("{}use {}unit literal{} instead", and, singular, plural), + args_to_recover + .iter() + .map(|arg| (arg.span, "()".to_string())) + .collect::>(), + applicability, + ); + }, + ); +} + +fn is_empty_block(expr: &Expr<'_>) -> bool { + matches!( + expr.kind, + ExprKind::Block( + Block { + stmts: &[], expr: None, .. + }, + _, + ) + ) +} + fn is_questionmark_desugar_marked_call(expr: &Expr<'_>) -> bool { use rustc_span::hygiene::DesugaringKind; if let ExprKind::Call(ref callee, _) = expr.kind { @@ -974,7 +1067,8 @@ declare_clippy_lint! { /// behavior. /// /// **Known problems:** Using `std::ptr::read_unaligned` and `std::ptr::write_unaligned` or similar - /// on the resulting pointer is fine. + /// on the resulting pointer is fine. Is over-zealous: Casts with manual alignment checks or casts like + /// u64-> u8 -> u16 can be fine. Miri is able to do a more in-depth analysis. /// /// **Example:** /// ```rust @@ -982,7 +1076,7 @@ declare_clippy_lint! { /// let _ = (&mut 1u8 as *mut u8) as *mut u16; /// ``` pub CAST_PTR_ALIGNMENT, - correctness, + pedantic, "cast from a pointer to a more-strictly-aligned pointer" } @@ -2462,7 +2556,7 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for ImplicitHasherConstructorVisitor<'a, 'b, 't if let ExprKind::Path(QPath::TypeRelative(ref ty, ref method)) = fun.kind; if let TyKind::Path(QPath::Resolved(None, ty_path)) = ty.kind; then { - if !same_tys(self.cx, self.target.ty(), self.body.expr_ty(e)) { + if !TyS::same_type(self.target.ty(), self.body.expr_ty(e)) { return; } diff --git a/clippy_lints/src/unnecessary_sort_by.rs b/clippy_lints/src/unnecessary_sort_by.rs new file mode 100644 index 0000000000000..33d8331c2923c --- /dev/null +++ b/clippy_lints/src/unnecessary_sort_by.rs @@ -0,0 +1,267 @@ +use crate::utils; +use crate::utils::paths; +use crate::utils::sugg::Sugg; +use if_chain::if_chain; +use rustc_errors::Applicability; +use rustc_hir::{Expr, ExprKind, Mutability, Param, Pat, PatKind, Path, PathSegment, QPath}; +use rustc_lint::{LateContext, LateLintPass}; +use rustc_session::{declare_lint_pass, declare_tool_lint}; +use rustc_span::symbol::Ident; + +declare_clippy_lint! { + /// **What it does:** + /// Detects when people use `Vec::sort_by` and pass in a function + /// which compares the two arguments, either directly or indirectly. + /// + /// **Why is this bad?** + /// It is more clear to use `Vec::sort_by_key` (or `Vec::sort` if + /// possible) than to use `Vec::sort_by` and and a more complicated + /// closure. + /// + /// **Known problems:** + /// If the suggested `Vec::sort_by_key` uses Reverse and it isn't + /// imported by a use statement in the current frame, then a `use` + /// statement that imports it will need to be added (which this lint + /// can't do). + /// + /// **Example:** + /// + /// ```rust + /// # struct A; + /// # impl A { fn foo(&self) {} } + /// # let mut vec: Vec = Vec::new(); + /// vec.sort_by(|a, b| a.foo().cmp(&b.foo())); + /// ``` + /// Use instead: + /// ```rust + /// # struct A; + /// # impl A { fn foo(&self) {} } + /// # let mut vec: Vec = Vec::new(); + /// vec.sort_by_key(|a| a.foo()); + /// ``` + pub UNNECESSARY_SORT_BY, + complexity, + "Use of `Vec::sort_by` when `Vec::sort_by_key` or `Vec::sort` would be clearer" +} + +declare_lint_pass!(UnnecessarySortBy => [UNNECESSARY_SORT_BY]); + +enum LintTrigger { + Sort(SortDetection), + SortByKey(SortByKeyDetection), +} + +struct SortDetection { + vec_name: String, + unstable: bool, +} + +struct SortByKeyDetection { + vec_name: String, + closure_arg: String, + closure_body: String, + reverse: bool, + unstable: bool, +} + +/// Detect if the two expressions are mirrored (identical, except one +/// contains a and the other replaces it with b) +fn mirrored_exprs( + cx: &LateContext<'_, '_>, + a_expr: &Expr<'_>, + a_ident: &Ident, + b_expr: &Expr<'_>, + b_ident: &Ident, +) -> bool { + match (&a_expr.kind, &b_expr.kind) { + // Two boxes with mirrored contents + (ExprKind::Box(left_expr), ExprKind::Box(right_expr)) => { + mirrored_exprs(cx, left_expr, a_ident, right_expr, b_ident) + }, + // Two arrays with mirrored contents + (ExprKind::Array(left_exprs), ExprKind::Array(right_exprs)) => left_exprs + .iter() + .zip(right_exprs.iter()) + .all(|(left, right)| mirrored_exprs(cx, left, a_ident, right, b_ident)), + // The two exprs are function calls. + // Check to see that the function itself and its arguments are mirrored + (ExprKind::Call(left_expr, left_args), ExprKind::Call(right_expr, right_args)) => { + mirrored_exprs(cx, left_expr, a_ident, right_expr, b_ident) + && left_args + .iter() + .zip(right_args.iter()) + .all(|(left, right)| mirrored_exprs(cx, left, a_ident, right, b_ident)) + }, + // The two exprs are method calls. + // Check to see that the function is the same and the arguments are mirrored + // This is enough because the receiver of the method is listed in the arguments + (ExprKind::MethodCall(left_segment, _, left_args), ExprKind::MethodCall(right_segment, _, right_args)) => { + left_segment.ident == right_segment.ident + && left_args + .iter() + .zip(right_args.iter()) + .all(|(left, right)| mirrored_exprs(cx, left, a_ident, right, b_ident)) + }, + // Two tuples with mirrored contents + (ExprKind::Tup(left_exprs), ExprKind::Tup(right_exprs)) => left_exprs + .iter() + .zip(right_exprs.iter()) + .all(|(left, right)| mirrored_exprs(cx, left, a_ident, right, b_ident)), + // Two binary ops, which are the same operation and which have mirrored arguments + (ExprKind::Binary(left_op, left_left, left_right), ExprKind::Binary(right_op, right_left, right_right)) => { + left_op.node == right_op.node + && mirrored_exprs(cx, left_left, a_ident, right_left, b_ident) + && mirrored_exprs(cx, left_right, a_ident, right_right, b_ident) + }, + // Two unary ops, which are the same operation and which have the same argument + (ExprKind::Unary(left_op, left_expr), ExprKind::Unary(right_op, right_expr)) => { + left_op == right_op && mirrored_exprs(cx, left_expr, a_ident, right_expr, b_ident) + }, + // The two exprs are literals of some kind + (ExprKind::Lit(left_lit), ExprKind::Lit(right_lit)) => left_lit.node == right_lit.node, + (ExprKind::Cast(left, _), ExprKind::Cast(right, _)) => mirrored_exprs(cx, left, a_ident, right, b_ident), + (ExprKind::DropTemps(left_block), ExprKind::DropTemps(right_block)) => { + mirrored_exprs(cx, left_block, a_ident, right_block, b_ident) + }, + (ExprKind::Field(left_expr, left_ident), ExprKind::Field(right_expr, right_ident)) => { + left_ident.name == right_ident.name && mirrored_exprs(cx, left_expr, a_ident, right_expr, right_ident) + }, + // Two paths: either one is a and the other is b, or they're identical to each other + ( + ExprKind::Path(QPath::Resolved( + _, + Path { + segments: left_segments, + .. + }, + )), + ExprKind::Path(QPath::Resolved( + _, + Path { + segments: right_segments, + .. + }, + )), + ) => { + (left_segments + .iter() + .zip(right_segments.iter()) + .all(|(left, right)| left.ident == right.ident) + && left_segments + .iter() + .all(|seg| &seg.ident != a_ident && &seg.ident != b_ident)) + || (left_segments.len() == 1 + && &left_segments[0].ident == a_ident + && right_segments.len() == 1 + && &right_segments[0].ident == b_ident) + }, + // Matching expressions, but one or both is borrowed + ( + ExprKind::AddrOf(left_kind, Mutability::Not, left_expr), + ExprKind::AddrOf(right_kind, Mutability::Not, right_expr), + ) => left_kind == right_kind && mirrored_exprs(cx, left_expr, a_ident, right_expr, b_ident), + (_, ExprKind::AddrOf(_, Mutability::Not, right_expr)) => { + mirrored_exprs(cx, a_expr, a_ident, right_expr, b_ident) + }, + (ExprKind::AddrOf(_, Mutability::Not, left_expr), _) => mirrored_exprs(cx, left_expr, a_ident, b_expr, b_ident), + _ => false, + } +} + +fn detect_lint(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> Option { + if_chain! { + if let ExprKind::MethodCall(name_ident, _, args) = &expr.kind; + if let name = name_ident.ident.name.to_ident_string(); + if name == "sort_by" || name == "sort_unstable_by"; + if let [vec, Expr { kind: ExprKind::Closure(_, _, closure_body_id, _, _), .. }] = args; + if utils::match_type(cx, &cx.tables.expr_ty(vec), &paths::VEC); + if let closure_body = cx.tcx.hir().body(*closure_body_id); + if let &[ + Param { pat: Pat { kind: PatKind::Binding(_, _, left_ident, _), .. }, ..}, + Param { pat: Pat { kind: PatKind::Binding(_, _, right_ident, _), .. }, .. } + ] = &closure_body.params; + if let ExprKind::MethodCall(method_path, _, [ref left_expr, ref right_expr]) = &closure_body.value.kind; + if method_path.ident.name.to_ident_string() == "cmp"; + then { + let (closure_body, closure_arg, reverse) = if mirrored_exprs( + &cx, + &left_expr, + &left_ident, + &right_expr, + &right_ident + ) { + (Sugg::hir(cx, &left_expr, "..").to_string(), left_ident.name.to_string(), false) + } else if mirrored_exprs(&cx, &left_expr, &right_ident, &right_expr, &left_ident) { + (Sugg::hir(cx, &left_expr, "..").to_string(), right_ident.name.to_string(), true) + } else { + return None; + }; + let vec_name = Sugg::hir(cx, &args[0], "..").to_string(); + let unstable = name == "sort_unstable_by"; + if_chain! { + if let ExprKind::Path(QPath::Resolved(_, Path { + segments: [PathSegment { ident: left_name, .. }], .. + })) = &left_expr.kind; + if left_name == left_ident; + then { + Some(LintTrigger::Sort(SortDetection { vec_name, unstable })) + } + else { + Some(LintTrigger::SortByKey(SortByKeyDetection { + vec_name, + unstable, + closure_arg, + closure_body, + reverse + })) + } + } + } else { + None + } + } +} + +impl LateLintPass<'_, '_> for UnnecessarySortBy { + fn check_expr(&mut self, cx: &LateContext<'_, '_>, expr: &Expr<'_>) { + match detect_lint(cx, expr) { + Some(LintTrigger::SortByKey(trigger)) => utils::span_lint_and_sugg( + cx, + UNNECESSARY_SORT_BY, + expr.span, + "use Vec::sort_by_key here instead", + "try", + format!( + "{}.sort{}_by_key(|&{}| {})", + trigger.vec_name, + if trigger.unstable { "_unstable" } else { "" }, + trigger.closure_arg, + if trigger.reverse { + format!("Reverse({})", trigger.closure_body) + } else { + trigger.closure_body.to_string() + }, + ), + if trigger.reverse { + Applicability::MaybeIncorrect + } else { + Applicability::MachineApplicable + }, + ), + Some(LintTrigger::Sort(trigger)) => utils::span_lint_and_sugg( + cx, + UNNECESSARY_SORT_BY, + expr.span, + "use Vec::sort here instead", + "try", + format!( + "{}.sort{}()", + trigger.vec_name, + if trigger.unstable { "_unstable" } else { "" }, + ), + Applicability::MachineApplicable, + ), + None => {}, + } + } +} diff --git a/clippy_lints/src/unnested_or_patterns.rs b/clippy_lints/src/unnested_or_patterns.rs new file mode 100644 index 0000000000000..8c281126c32bf --- /dev/null +++ b/clippy_lints/src/unnested_or_patterns.rs @@ -0,0 +1,407 @@ +#![allow(clippy::wildcard_imports, clippy::enum_glob_use)] + +use crate::utils::ast_utils::{eq_field_pat, eq_id, eq_pat, eq_path}; +use crate::utils::{over, span_lint_and_then}; +use rustc_ast::ast::{self, Pat, PatKind, PatKind::*, DUMMY_NODE_ID}; +use rustc_ast::mut_visit::*; +use rustc_ast::ptr::P; +use rustc_ast_pretty::pprust; +use rustc_errors::Applicability; +use rustc_lint::{EarlyContext, EarlyLintPass}; +use rustc_session::{declare_lint_pass, declare_tool_lint}; +use rustc_span::DUMMY_SP; + +use std::cell::Cell; +use std::mem; + +declare_clippy_lint! { + /// **What it does:** + /// + /// Checks for unnested or-patterns, e.g., `Some(0) | Some(2)` and + /// suggests replacing the pattern with a nested one, `Some(0 | 2)`. + /// + /// Another way to think of this is that it rewrites patterns in + /// *disjunctive normal form (DNF)* into *conjunctive normal form (CNF)*. + /// + /// **Why is this bad?** + /// + /// In the example above, `Some` is repeated, which unncessarily complicates the pattern. + /// + /// **Known problems:** None. + /// + /// **Example:** + /// + /// ```rust + /// fn main() { + /// if let Some(0) | Some(2) = Some(0) {} + /// } + /// ``` + /// Use instead: + /// ```rust + /// #![feature(or_patterns)] + /// + /// fn main() { + /// if let Some(0 | 2) = Some(0) {} + /// } + /// ``` + pub UNNESTED_OR_PATTERNS, + complexity, + "unnested or-patterns, e.g., `Foo(Bar) | Foo(Baz) instead of `Foo(Bar | Baz)`" +} + +declare_lint_pass!(UnnestedOrPatterns => [UNNESTED_OR_PATTERNS]); + +impl EarlyLintPass for UnnestedOrPatterns { + fn check_arm(&mut self, cx: &EarlyContext<'_>, a: &ast::Arm) { + lint_unnested_or_patterns(cx, &a.pat); + } + + fn check_expr(&mut self, cx: &EarlyContext<'_>, e: &ast::Expr) { + if let ast::ExprKind::Let(pat, _) = &e.kind { + lint_unnested_or_patterns(cx, pat); + } + } + + fn check_param(&mut self, cx: &EarlyContext<'_>, p: &ast::Param) { + lint_unnested_or_patterns(cx, &p.pat); + } + + fn check_local(&mut self, cx: &EarlyContext<'_>, l: &ast::Local) { + lint_unnested_or_patterns(cx, &l.pat); + } +} + +fn lint_unnested_or_patterns(cx: &EarlyContext<'_>, pat: &Pat) { + if !cx.sess.opts.unstable_features.is_nightly_build() { + // User cannot do `#![feature(or_patterns)]`, so bail. + return; + } + + if let Ident(.., None) | Lit(_) | Wild | Path(..) | Range(..) | Rest | MacCall(_) = pat.kind { + // This is a leaf pattern, so cloning is unprofitable. + return; + } + + let mut pat = P(pat.clone()); + + // Nix all the paren patterns everywhere so that they aren't in our way. + remove_all_parens(&mut pat); + + // Transform all unnested or-patterns into nested ones, and if there were none, quit. + if !unnest_or_patterns(&mut pat) { + return; + } + + span_lint_and_then(cx, UNNESTED_OR_PATTERNS, pat.span, "unnested or-patterns", |db| { + insert_necessary_parens(&mut pat); + db.span_suggestion_verbose( + pat.span, + "nest the patterns", + pprust::pat_to_string(&pat), + Applicability::MachineApplicable, + ); + }); +} + +/// Remove all `(p)` patterns in `pat`. +fn remove_all_parens(pat: &mut P) { + struct Visitor; + impl MutVisitor for Visitor { + fn visit_pat(&mut self, pat: &mut P) { + noop_visit_pat(pat, self); + let inner = match &mut pat.kind { + Paren(i) => mem::replace(&mut i.kind, Wild), + _ => return, + }; + pat.kind = inner; + } + } + Visitor.visit_pat(pat); +} + +/// Insert parens where necessary according to Rust's precedence rules for patterns. +fn insert_necessary_parens(pat: &mut P) { + struct Visitor; + impl MutVisitor for Visitor { + fn visit_pat(&mut self, pat: &mut P) { + use ast::{BindingMode::*, Mutability::*}; + noop_visit_pat(pat, self); + let target = match &mut pat.kind { + // `i @ a | b`, `box a | b`, and `& mut? a | b`. + Ident(.., Some(p)) | Box(p) | Ref(p, _) if matches!(&p.kind, Or(ps) if ps.len() > 1) => p, + Ref(p, Not) if matches!(p.kind, Ident(ByValue(Mut), ..)) => p, // `&(mut x)` + _ => return, + }; + target.kind = Paren(P(take_pat(target))); + } + } + Visitor.visit_pat(pat); +} + +/// Unnest or-patterns `p0 | ... | p1` in the pattern `pat`. +/// For example, this would transform `Some(0) | FOO | Some(2)` into `Some(0 | 2) | FOO`. +fn unnest_or_patterns(pat: &mut P) -> bool { + struct Visitor { + changed: bool, + } + impl MutVisitor for Visitor { + fn visit_pat(&mut self, p: &mut P) { + // This is a bottom up transformation, so recurse first. + noop_visit_pat(p, self); + + // Don't have an or-pattern? Just quit early on. + let alternatives = match &mut p.kind { + Or(ps) => ps, + _ => return, + }; + + // Collapse or-patterns directly nested in or-patterns. + let mut idx = 0; + let mut this_level_changed = false; + while idx < alternatives.len() { + let inner = if let Or(ps) = &mut alternatives[idx].kind { + mem::take(ps) + } else { + idx += 1; + continue; + }; + this_level_changed = true; + alternatives.splice(idx..=idx, inner); + } + + // Focus on `p_n` and then try to transform all `p_i` where `i > n`. + let mut focus_idx = 0; + while focus_idx < alternatives.len() { + this_level_changed |= transform_with_focus_on_idx(alternatives, focus_idx); + focus_idx += 1; + } + self.changed |= this_level_changed; + + // Deal with `Some(Some(0)) | Some(Some(1))`. + if this_level_changed { + noop_visit_pat(p, self); + } + } + } + + let mut visitor = Visitor { changed: false }; + visitor.visit_pat(pat); + visitor.changed +} + +/// Match `$scrutinee` against `$pat` and extract `$then` from it. +/// Panics if there is no match. +macro_rules! always_pat { + ($scrutinee:expr, $pat:pat => $then:expr) => { + match $scrutinee { + $pat => $then, + _ => unreachable!(), + } + }; +} + +/// Focus on `focus_idx` in `alternatives`, +/// attempting to extend it with elements of the same constructor `C` +/// in `alternatives[focus_idx + 1..]`. +fn transform_with_focus_on_idx(alternatives: &mut Vec>, focus_idx: usize) -> bool { + // Extract the kind; we'll need to make some changes in it. + let mut focus_kind = mem::replace(&mut alternatives[focus_idx].kind, PatKind::Wild); + // We'll focus on `alternatives[focus_idx]`, + // so we're draining from `alternatives[focus_idx + 1..]`. + let start = focus_idx + 1; + + // We're trying to find whatever kind (~"constructor") we found in `alternatives[start..]`. + let changed = match &mut focus_kind { + // These pattern forms are "leafs" and do not have sub-patterns. + // Therefore they are not some form of constructor `C`, + // with which a pattern `C(p_0)` may be formed, + // which we would want to join with other `C(p_j)`s. + Ident(.., None) | Lit(_) | Wild | Path(..) | Range(..) | Rest | MacCall(_) + // Dealt with elsewhere. + | Or(_) | Paren(_) => false, + // Transform `box x | ... | box y` into `box (x | y)`. + // + // The cases below until `Slice(...)` deal with *singleton* products. + // These patterns have the shape `C(p)`, and not e.g., `C(p0, ..., pn)`. + Box(target) => extend_with_matching( + target, start, alternatives, + |k| matches!(k, Box(_)), + |k| always_pat!(k, Box(p) => p), + ), + // Transform `&m x | ... | &m y` into `&m (x | y)`. + Ref(target, m1) => extend_with_matching( + target, start, alternatives, + |k| matches!(k, Ref(_, m2) if m1 == m2), // Mutabilities must match. + |k| always_pat!(k, Ref(p, _) => p), + ), + // Transform `b @ p0 | ... b @ p1` into `b @ (p0 | p1)`. + Ident(b1, i1, Some(target)) => extend_with_matching( + target, start, alternatives, + // Binding names must match. + |k| matches!(k, Ident(b2, i2, Some(_)) if b1 == b2 && eq_id(*i1, *i2)), + |k| always_pat!(k, Ident(_, _, Some(p)) => p), + ), + // Transform `[pre, x, post] | ... | [pre, y, post]` into `[pre, x | y, post]`. + Slice(ps1) => extend_with_matching_product( + ps1, start, alternatives, + |k, ps1, idx| matches!(k, Slice(ps2) if eq_pre_post(ps1, ps2, idx)), + |k| always_pat!(k, Slice(ps) => ps), + ), + // Transform `(pre, x, post) | ... | (pre, y, post)` into `(pre, x | y, post)`. + Tuple(ps1) => extend_with_matching_product( + ps1, start, alternatives, + |k, ps1, idx| matches!(k, Tuple(ps2) if eq_pre_post(ps1, ps2, idx)), + |k| always_pat!(k, Tuple(ps) => ps), + ), + // Transform `S(pre, x, post) | ... | S(pre, y, post)` into `S(pre, x | y, post)`. + TupleStruct(path1, ps1) => extend_with_matching_product( + ps1, start, alternatives, + |k, ps1, idx| matches!( + k, + TupleStruct(path2, ps2) if eq_path(path1, path2) && eq_pre_post(ps1, ps2, idx) + ), + |k| always_pat!(k, TupleStruct(_, ps) => ps), + ), + // Transform a record pattern `S { fp_0, ..., fp_n }`. + Struct(path1, fps1, rest1) => extend_with_struct_pat(path1, fps1, *rest1, start, alternatives), + }; + + alternatives[focus_idx].kind = focus_kind; + changed +} + +/// Here we focusing on a record pattern `S { fp_0, ..., fp_n }`. +/// In particular, for a record pattern, the order in which the field patterns is irrelevant. +/// So when we fixate on some `ident_k: pat_k`, we try to find `ident_k` in the other pattern +/// and check that all `fp_i` where `i ∈ ((0...n) \ k)` between two patterns are equal. +fn extend_with_struct_pat( + path1: &ast::Path, + fps1: &mut Vec, + rest1: bool, + start: usize, + alternatives: &mut Vec>, +) -> bool { + (0..fps1.len()).any(|idx| { + let pos_in_2 = Cell::new(None); // The element `k`. + let tail_or = drain_matching( + start, + alternatives, + |k| { + matches!(k, Struct(path2, fps2, rest2) + if rest1 == *rest2 // If one struct pattern has `..` so must the other. + && eq_path(path1, path2) + && fps1.len() == fps2.len() + && fps1.iter().enumerate().all(|(idx_1, fp1)| { + if idx_1 == idx { + // In the case of `k`, we merely require identical field names + // so that we will transform into `ident_k: p1_k | p2_k`. + let pos = fps2.iter().position(|fp2| eq_id(fp1.ident, fp2.ident)); + pos_in_2.set(pos); + pos.is_some() + } else { + fps2.iter().any(|fp2| eq_field_pat(fp1, fp2)) + } + })) + }, + // Extract `p2_k`. + |k| always_pat!(k, Struct(_, mut fps, _) => fps.swap_remove(pos_in_2.take().unwrap()).pat), + ); + extend_with_tail_or(&mut fps1[idx].pat, tail_or) + }) +} + +/// Like `extend_with_matching` but for products with > 1 factor, e.g., `C(p_0, ..., p_n)`. +/// Here, the idea is that we fixate on some `p_k` in `C`, +/// allowing it to vary between two `targets` and `ps2` (returned by `extract`), +/// while also requiring `ps1[..n] ~ ps2[..n]` (pre) and `ps1[n + 1..] ~ ps2[n + 1..]` (post), +/// where `~` denotes semantic equality. +fn extend_with_matching_product( + targets: &mut Vec>, + start: usize, + alternatives: &mut Vec>, + predicate: impl Fn(&PatKind, &[P], usize) -> bool, + extract: impl Fn(PatKind) -> Vec>, +) -> bool { + (0..targets.len()).any(|idx| { + let tail_or = drain_matching( + start, + alternatives, + |k| predicate(k, targets, idx), + |k| extract(k).swap_remove(idx), + ); + extend_with_tail_or(&mut targets[idx], tail_or) + }) +} + +/// Extract the pattern from the given one and replace it with `Wild`. +/// This is meant for temporarily swapping out the pattern for manipulation. +fn take_pat(from: &mut Pat) -> Pat { + let dummy = Pat { + id: DUMMY_NODE_ID, + kind: Wild, + span: DUMMY_SP, + }; + mem::replace(from, dummy) +} + +/// Extend `target` as an or-pattern with the alternatives +/// in `tail_or` if there are any and return if there were. +fn extend_with_tail_or(target: &mut Pat, tail_or: Vec>) -> bool { + fn extend(target: &mut Pat, mut tail_or: Vec>) { + match target { + // On an existing or-pattern in the target, append to it. + Pat { kind: Or(ps), .. } => ps.append(&mut tail_or), + // Otherwise convert the target to an or-pattern. + target => { + let mut init_or = vec![P(take_pat(target))]; + init_or.append(&mut tail_or); + target.kind = Or(init_or); + }, + } + } + + let changed = !tail_or.is_empty(); + if changed { + // Extend the target. + extend(target, tail_or); + } + changed +} + +// Extract all inner patterns in `alternatives` matching our `predicate`. +// Only elements beginning with `start` are considered for extraction. +fn drain_matching( + start: usize, + alternatives: &mut Vec>, + predicate: impl Fn(&PatKind) -> bool, + extract: impl Fn(PatKind) -> P, +) -> Vec> { + let mut tail_or = vec![]; + let mut idx = 0; + for pat in alternatives.drain_filter(|p| { + // Check if we should extract, but only if `idx >= start`. + idx += 1; + idx > start && predicate(&p.kind) + }) { + tail_or.push(extract(pat.into_inner().kind)); + } + tail_or +} + +fn extend_with_matching( + target: &mut Pat, + start: usize, + alternatives: &mut Vec>, + predicate: impl Fn(&PatKind) -> bool, + extract: impl Fn(PatKind) -> P, +) -> bool { + extend_with_tail_or(target, drain_matching(start, alternatives, predicate, extract)) +} + +/// Are the patterns in `ps1` and `ps2` equal save for `ps1[idx]` compared to `ps2[idx]`? +fn eq_pre_post(ps1: &[P], ps2: &[P], idx: usize) -> bool { + ps1[idx].is_rest() == ps2[idx].is_rest() // Avoid `[x, ..] | [x, 0]` => `[x, .. | 0]`. + && ps1.len() == ps2.len() + && over(&ps1[..idx], &ps2[..idx], |l, r| eq_pat(l, r)) + && over(&ps1[idx + 1..], &ps2[idx + 1..], |l, r| eq_pat(l, r)) +} diff --git a/clippy_lints/src/unwrap.rs b/clippy_lints/src/unwrap.rs index 8b971e7064b52..036dd16a224af 100644 --- a/clippy_lints/src/unwrap.rs +++ b/clippy_lints/src/unwrap.rs @@ -101,7 +101,7 @@ fn collect_unwrap_info<'a, 'tcx>( if let ExprKind::Binary(op, left, right) = &expr.kind { match (invert, op.node) { - (false, BinOpKind::And) | (false, BinOpKind::BitAnd) | (true, BinOpKind::Or) | (true, BinOpKind::BitOr) => { + (false, BinOpKind::And | BinOpKind::BitAnd) | (true, BinOpKind::Or | BinOpKind::BitOr) => { let mut unwrap_info = collect_unwrap_info(cx, left, branch, invert); unwrap_info.append(&mut collect_unwrap_info(cx, right, branch, invert)); return unwrap_info; diff --git a/clippy_lints/src/useless_conversion.rs b/clippy_lints/src/useless_conversion.rs index 7fa97b2469912..141035a980ade 100644 --- a/clippy_lints/src/useless_conversion.rs +++ b/clippy_lints/src/useless_conversion.rs @@ -1,12 +1,12 @@ use crate::utils::{ - is_type_diagnostic_item, match_def_path, match_trait_method, paths, same_tys, snippet, snippet_with_macro_callsite, + is_type_diagnostic_item, match_def_path, match_trait_method, paths, snippet, snippet_with_macro_callsite, span_lint_and_help, span_lint_and_sugg, }; use if_chain::if_chain; use rustc_errors::Applicability; use rustc_hir::{Expr, ExprKind, HirId, MatchSource}; use rustc_lint::{LateContext, LateLintPass}; -use rustc_middle::ty; +use rustc_middle::ty::{self, TyS}; use rustc_session::{declare_tool_lint, impl_lint_pass}; declare_clippy_lint! { @@ -65,7 +65,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UselessConversion { if match_trait_method(cx, e, &paths::INTO) && &*name.ident.as_str() == "into" { let a = cx.tables.expr_ty(e); let b = cx.tables.expr_ty(&args[0]); - if same_tys(cx, a, b) { + if TyS::same_type(a, b) { let sugg = snippet_with_macro_callsite(cx, args[0].span, "").to_string(); span_lint_and_sugg( cx, @@ -81,7 +81,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UselessConversion { if match_trait_method(cx, e, &paths::INTO_ITERATOR) && &*name.ident.as_str() == "into_iter" { let a = cx.tables.expr_ty(e); let b = cx.tables.expr_ty(&args[0]); - if same_tys(cx, a, b) { + if TyS::same_type(a, b) { let sugg = snippet(cx, args[0].span, "").into_owned(); span_lint_and_sugg( cx, @@ -101,7 +101,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UselessConversion { if is_type_diagnostic_item(cx, a, sym!(result_type)); if let ty::Adt(_, substs) = a.kind; if let Some(a_type) = substs.types().next(); - if same_tys(cx, a_type, b); + if TyS::same_type(a_type, b); then { span_lint_and_help( @@ -131,7 +131,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UselessConversion { if is_type_diagnostic_item(cx, a, sym!(result_type)); if let ty::Adt(_, substs) = a.kind; if let Some(a_type) = substs.types().next(); - if same_tys(cx, a_type, b); + if TyS::same_type(a_type, b); then { let hint = format!("consider removing `{}()`", snippet(cx, path.span, "TryFrom::try_from")); @@ -148,7 +148,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UselessConversion { if_chain! { if match_def_path(cx, def_id, &paths::FROM_FROM); - if same_tys(cx, a, b); + if TyS::same_type(a, b); then { let sugg = snippet(cx, args[0].span.source_callsite(), "").into_owned(); diff --git a/clippy_lints/src/utils/ast_utils.rs b/clippy_lints/src/utils/ast_utils.rs new file mode 100755 index 0000000000000..dcf09da198e2f --- /dev/null +++ b/clippy_lints/src/utils/ast_utils.rs @@ -0,0 +1,526 @@ +//! Utilities for manipulating and extracting information from `rustc_ast::ast`. +//! +//! - The `eq_foobar` functions test for semantic equality but ignores `NodeId`s and `Span`s. + +#![allow(clippy::similar_names, clippy::wildcard_imports, clippy::enum_glob_use)] + +use crate::utils::{both, over}; +use rustc_ast::ast::{self, *}; +use rustc_ast::ptr::P; +use rustc_span::symbol::Ident; +use std::mem; + +/// Checks if each element in the first slice is contained within the latter as per `eq_fn`. +pub fn unordered_over(left: &[X], right: &[X], mut eq_fn: impl FnMut(&X, &X) -> bool) -> bool { + left.len() == right.len() && left.iter().all(|l| right.iter().any(|r| eq_fn(l, r))) +} + +pub fn eq_id(l: Ident, r: Ident) -> bool { + l.name == r.name +} + +pub fn eq_pat(l: &Pat, r: &Pat) -> bool { + use PatKind::*; + match (&l.kind, &r.kind) { + (Paren(l), _) => eq_pat(l, r), + (_, Paren(r)) => eq_pat(l, r), + (Wild, Wild) | (Rest, Rest) => true, + (Lit(l), Lit(r)) => eq_expr(l, r), + (Ident(b1, i1, s1), Ident(b2, i2, s2)) => b1 == b2 && eq_id(*i1, *i2) && both(s1, s2, |l, r| eq_pat(l, r)), + (Range(lf, lt, le), Range(rf, rt, re)) => { + eq_expr_opt(lf, rf) && eq_expr_opt(lt, rt) && eq_range_end(&le.node, &re.node) + }, + (Box(l), Box(r)) + | (Ref(l, Mutability::Not), Ref(r, Mutability::Not)) + | (Ref(l, Mutability::Mut), Ref(r, Mutability::Mut)) => eq_pat(l, r), + (Tuple(l), Tuple(r)) | (Slice(l), Slice(r)) => over(l, r, |l, r| eq_pat(l, r)), + (Path(lq, lp), Path(rq, rp)) => both(lq, rq, |l, r| eq_qself(l, r)) && eq_path(lp, rp), + (TupleStruct(lp, lfs), TupleStruct(rp, rfs)) => eq_path(lp, rp) && over(lfs, rfs, |l, r| eq_pat(l, r)), + (Struct(lp, lfs, lr), Struct(rp, rfs, rr)) => { + lr == rr && eq_path(lp, rp) && unordered_over(lfs, rfs, |lf, rf| eq_field_pat(lf, rf)) + }, + (Or(ls), Or(rs)) => unordered_over(ls, rs, |l, r| eq_pat(l, r)), + (MacCall(l), MacCall(r)) => eq_mac_call(l, r), + _ => false, + } +} + +pub fn eq_range_end(l: &RangeEnd, r: &RangeEnd) -> bool { + match (l, r) { + (RangeEnd::Excluded, RangeEnd::Excluded) => true, + (RangeEnd::Included(l), RangeEnd::Included(r)) => { + matches!(l, RangeSyntax::DotDotEq) == matches!(r, RangeSyntax::DotDotEq) + }, + _ => false, + } +} + +pub fn eq_field_pat(l: &FieldPat, r: &FieldPat) -> bool { + l.is_placeholder == r.is_placeholder + && eq_id(l.ident, r.ident) + && eq_pat(&l.pat, &r.pat) + && over(&l.attrs, &r.attrs, |l, r| eq_attr(l, r)) +} + +pub fn eq_qself(l: &QSelf, r: &QSelf) -> bool { + l.position == r.position && eq_ty(&l.ty, &r.ty) +} + +pub fn eq_path(l: &Path, r: &Path) -> bool { + over(&l.segments, &r.segments, |l, r| eq_path_seg(l, r)) +} + +pub fn eq_path_seg(l: &PathSegment, r: &PathSegment) -> bool { + eq_id(l.ident, r.ident) && both(&l.args, &r.args, |l, r| eq_generic_args(l, r)) +} + +pub fn eq_generic_args(l: &GenericArgs, r: &GenericArgs) -> bool { + match (l, r) { + (GenericArgs::AngleBracketed(l), GenericArgs::AngleBracketed(r)) => { + over(&l.args, &r.args, |l, r| eq_angle_arg(l, r)) + }, + (GenericArgs::Parenthesized(l), GenericArgs::Parenthesized(r)) => { + over(&l.inputs, &r.inputs, |l, r| eq_ty(l, r)) && eq_fn_ret_ty(&l.output, &r.output) + }, + _ => false, + } +} + +pub fn eq_angle_arg(l: &AngleBracketedArg, r: &AngleBracketedArg) -> bool { + match (l, r) { + (AngleBracketedArg::Arg(l), AngleBracketedArg::Arg(r)) => eq_generic_arg(l, r), + (AngleBracketedArg::Constraint(l), AngleBracketedArg::Constraint(r)) => eq_assoc_constraint(l, r), + _ => false, + } +} + +pub fn eq_generic_arg(l: &GenericArg, r: &GenericArg) -> bool { + match (l, r) { + (GenericArg::Lifetime(l), GenericArg::Lifetime(r)) => eq_id(l.ident, r.ident), + (GenericArg::Type(l), GenericArg::Type(r)) => eq_ty(l, r), + (GenericArg::Const(l), GenericArg::Const(r)) => eq_expr(&l.value, &r.value), + _ => false, + } +} + +pub fn eq_expr_opt(l: &Option>, r: &Option>) -> bool { + both(l, r, |l, r| eq_expr(l, r)) +} + +pub fn eq_expr(l: &Expr, r: &Expr) -> bool { + use ExprKind::*; + if !over(&l.attrs, &r.attrs, |l, r| eq_attr(l, r)) { + return false; + } + match (&l.kind, &r.kind) { + (Paren(l), _) => eq_expr(l, r), + (_, Paren(r)) => eq_expr(l, r), + (Err, Err) => true, + (Box(l), Box(r)) | (Try(l), Try(r)) | (Await(l), Await(r)) => eq_expr(l, r), + (Array(l), Array(r)) | (Tup(l), Tup(r)) => over(l, r, |l, r| eq_expr(l, r)), + (Repeat(le, ls), Repeat(re, rs)) => eq_expr(le, re) && eq_expr(&ls.value, &rs.value), + (Call(lc, la), Call(rc, ra)) => eq_expr(lc, rc) && over(la, ra, |l, r| eq_expr(l, r)), + (MethodCall(lc, la), MethodCall(rc, ra)) => eq_path_seg(lc, rc) && over(la, ra, |l, r| eq_expr(l, r)), + (Binary(lo, ll, lr), Binary(ro, rl, rr)) => lo.node == ro.node && eq_expr(ll, rl) && eq_expr(lr, rr), + (Unary(lo, l), Unary(ro, r)) => mem::discriminant(lo) == mem::discriminant(ro) && eq_expr(l, r), + (Lit(l), Lit(r)) => l.kind == r.kind, + (Cast(l, lt), Cast(r, rt)) | (Type(l, lt), Type(r, rt)) => eq_expr(l, r) && eq_ty(lt, rt), + (Let(lp, le), Let(rp, re)) => eq_pat(lp, rp) && eq_expr(le, re), + (If(lc, lt, le), If(rc, rt, re)) => eq_expr(lc, rc) && eq_block(lt, rt) && eq_expr_opt(le, re), + (While(lc, lt, ll), While(rc, rt, rl)) => eq_label(ll, rl) && eq_expr(lc, rc) && eq_block(lt, rt), + (ForLoop(lp, li, lt, ll), ForLoop(rp, ri, rt, rl)) => { + eq_label(ll, rl) && eq_pat(lp, rp) && eq_expr(li, ri) && eq_block(lt, rt) + }, + (Loop(lt, ll), Loop(rt, rl)) => eq_label(ll, rl) && eq_block(lt, rt), + (Block(lb, ll), Block(rb, rl)) => eq_label(ll, rl) && eq_block(lb, rb), + (TryBlock(l), TryBlock(r)) => eq_block(l, r), + (Yield(l), Yield(r)) | (Ret(l), Ret(r)) => eq_expr_opt(l, r), + (Break(ll, le), Break(rl, re)) => eq_label(ll, rl) && eq_expr_opt(le, re), + (Continue(ll), Continue(rl)) => eq_label(ll, rl), + (Assign(l1, l2, _), Assign(r1, r2, _)) | (Index(l1, l2), Index(r1, r2)) => eq_expr(l1, r1) && eq_expr(l2, r2), + (AssignOp(lo, lp, lv), AssignOp(ro, rp, rv)) => lo.node == ro.node && eq_expr(lp, rp) && eq_expr(lv, rv), + (Field(lp, lf), Field(rp, rf)) => eq_id(*lf, *rf) && eq_expr(lp, rp), + (Match(ls, la), Match(rs, ra)) => eq_expr(ls, rs) && over(la, ra, |l, r| eq_arm(l, r)), + (Closure(lc, la, lm, lf, lb, _), Closure(rc, ra, rm, rf, rb, _)) => { + lc == rc && la.is_async() == ra.is_async() && lm == rm && eq_fn_decl(lf, rf) && eq_expr(lb, rb) + }, + (Async(lc, _, lb), Async(rc, _, rb)) => lc == rc && eq_block(lb, rb), + (Range(lf, lt, ll), Range(rf, rt, rl)) => ll == rl && eq_expr_opt(lf, rf) && eq_expr_opt(lt, rt), + (AddrOf(lbk, lm, le), AddrOf(rbk, rm, re)) => lbk == rbk && lm == rm && eq_expr(le, re), + (Path(lq, lp), Path(rq, rp)) => both(lq, rq, |l, r| eq_qself(l, r)) && eq_path(lp, rp), + (MacCall(l), MacCall(r)) => eq_mac_call(l, r), + (Struct(lp, lfs, lb), Struct(rp, rfs, rb)) => { + eq_path(lp, rp) && eq_expr_opt(lb, rb) && unordered_over(lfs, rfs, |l, r| eq_field(l, r)) + }, + _ => false, + } +} + +pub fn eq_field(l: &Field, r: &Field) -> bool { + l.is_placeholder == r.is_placeholder + && eq_id(l.ident, r.ident) + && eq_expr(&l.expr, &r.expr) + && over(&l.attrs, &r.attrs, |l, r| eq_attr(l, r)) +} + +pub fn eq_arm(l: &Arm, r: &Arm) -> bool { + l.is_placeholder == r.is_placeholder + && eq_pat(&l.pat, &r.pat) + && eq_expr(&l.body, &r.body) + && eq_expr_opt(&l.guard, &r.guard) + && over(&l.attrs, &r.attrs, |l, r| eq_attr(l, r)) +} + +pub fn eq_label(l: &Option: Sized, +{ + let x: Dst = *(Box::new(Dst { x: 1 }) as Box>); +} + +fn return_str() -> str +where + str: Sized, +{ + *"Sized".to_string().into_boxed_str() +} + +fn use_op(s: String) -> String +where + String: ::std::ops::Neg, +{ + -s +} + +fn use_for() +where + i32: Iterator, +{ + for _ in 2i32 {} +} + +fn main() {} diff --git a/tests/ui/crashes/ice-3969.stderr b/tests/ui/crashes/ice-3969.stderr new file mode 100644 index 0000000000000..923db0664a714 --- /dev/null +++ b/tests/ui/crashes/ice-3969.stderr @@ -0,0 +1,22 @@ +error: trait objects without an explicit `dyn` are deprecated + --> $DIR/ice-3969.rs:25:17 + | +LL | for<'a> Dst: Sized, + | ^^^^^^ help: use `dyn`: `dyn A + 'a` + | + = note: `-D bare-trait-objects` implied by `-D warnings` + +error: trait objects without an explicit `dyn` are deprecated + --> $DIR/ice-3969.rs:27:16 + | +LL | let x: Dst = *(Box::new(Dst { x: 1 }) as Box>); + | ^ help: use `dyn`: `dyn A` + +error: trait objects without an explicit `dyn` are deprecated + --> $DIR/ice-3969.rs:27:57 + | +LL | let x: Dst = *(Box::new(Dst { x: 1 }) as Box>); + | ^ help: use `dyn`: `dyn A` + +error: aborting due to 3 previous errors + diff --git a/tests/ui/crashes/regressions.rs b/tests/ui/crashes/regressions.rs index 623ae51f9f08c..3d5063d1a3a7d 100644 --- a/tests/ui/crashes/regressions.rs +++ b/tests/ui/crashes/regressions.rs @@ -6,4 +6,8 @@ pub fn foo(bar: *const u8) { println!("{:#p}", bar); } +// Regression test for https://github.com/rust-lang/rust-clippy/issues/4917 +/// ::new()).iter(); //~ WARN equivalent to .iter() let _ = std::path::Path::new("12/34").iter(); //~ WARN equivalent to .iter() let _ = std::path::PathBuf::from("12/34").iter(); //~ ERROR equivalent to .iter() + + let _ = (&[1, 2, 3]).iter().next(); //~ WARN equivalent to .iter() } diff --git a/tests/ui/into_iter_on_ref.rs b/tests/ui/into_iter_on_ref.rs index 94bc1689619a2..416056d3fdb9c 100644 --- a/tests/ui/into_iter_on_ref.rs +++ b/tests/ui/into_iter_on_ref.rs @@ -40,4 +40,6 @@ fn main() { let _ = (&HashSet::::new()).into_iter(); //~ WARN equivalent to .iter() let _ = std::path::Path::new("12/34").into_iter(); //~ WARN equivalent to .iter() let _ = std::path::PathBuf::from("12/34").into_iter(); //~ ERROR equivalent to .iter() + + let _ = (&[1, 2, 3]).into_iter().next(); //~ WARN equivalent to .iter() } diff --git a/tests/ui/into_iter_on_ref.stderr b/tests/ui/into_iter_on_ref.stderr index 80e2d104f824f..1cd6400b0195b 100644 --- a/tests/ui/into_iter_on_ref.stderr +++ b/tests/ui/into_iter_on_ref.stderr @@ -156,5 +156,11 @@ error: this `.into_iter()` call is equivalent to `.iter()` and will not move the LL | let _ = std::path::PathBuf::from("12/34").into_iter(); //~ ERROR equivalent to .iter() | ^^^^^^^^^ help: call directly: `iter` -error: aborting due to 26 previous errors +error: this `.into_iter()` call is equivalent to `.iter()` and will not move the `array` + --> $DIR/into_iter_on_ref.rs:44:26 + | +LL | let _ = (&[1, 2, 3]).into_iter().next(); //~ WARN equivalent to .iter() + | ^^^^^^^^^ help: call directly: `iter` + +error: aborting due to 27 previous errors diff --git a/tests/ui/iter_next_slice.fixed b/tests/ui/iter_next_slice.fixed new file mode 100644 index 0000000000000..79c1db87ac3c4 --- /dev/null +++ b/tests/ui/iter_next_slice.fixed @@ -0,0 +1,24 @@ +// run-rustfix +#![warn(clippy::iter_next_slice)] + +fn main() { + // test code goes here + let s = [1, 2, 3]; + let v = vec![1, 2, 3]; + + s.get(0); + // Should be replaced by s.get(0) + + s.get(2); + // Should be replaced by s.get(2) + + v.get(5); + // Should be replaced by v.get(5) + + v.get(0); + // Should be replaced by v.get(0) + + let o = Some(5); + o.iter().next(); + // Shouldn't be linted since this is not a Slice or an Array +} diff --git a/tests/ui/iter_next_slice.rs b/tests/ui/iter_next_slice.rs new file mode 100644 index 0000000000000..ef9a55f3d997c --- /dev/null +++ b/tests/ui/iter_next_slice.rs @@ -0,0 +1,24 @@ +// run-rustfix +#![warn(clippy::iter_next_slice)] + +fn main() { + // test code goes here + let s = [1, 2, 3]; + let v = vec![1, 2, 3]; + + s.iter().next(); + // Should be replaced by s.get(0) + + s[2..].iter().next(); + // Should be replaced by s.get(2) + + v[5..].iter().next(); + // Should be replaced by v.get(5) + + v.iter().next(); + // Should be replaced by v.get(0) + + let o = Some(5); + o.iter().next(); + // Shouldn't be linted since this is not a Slice or an Array +} diff --git a/tests/ui/iter_next_slice.stderr b/tests/ui/iter_next_slice.stderr new file mode 100644 index 0000000000000..bbf61df0cda68 --- /dev/null +++ b/tests/ui/iter_next_slice.stderr @@ -0,0 +1,28 @@ +error: Using `.iter().next()` on an array + --> $DIR/iter_next_slice.rs:9:5 + | +LL | s.iter().next(); + | ^^^^^^^^^^^^^^^ help: try calling: `s.get(0)` + | + = note: `-D clippy::iter-next-slice` implied by `-D warnings` + +error: Using `.iter().next()` on a Slice without end index. + --> $DIR/iter_next_slice.rs:12:5 + | +LL | s[2..].iter().next(); + | ^^^^^^^^^^^^^^^^^^^^ help: try calling: `s.get(2)` + +error: Using `.iter().next()` on a Slice without end index. + --> $DIR/iter_next_slice.rs:15:5 + | +LL | v[5..].iter().next(); + | ^^^^^^^^^^^^^^^^^^^^ help: try calling: `v.get(5)` + +error: Using `.iter().next()` on an array + --> $DIR/iter_next_slice.rs:18:5 + | +LL | v.iter().next(); + | ^^^^^^^^^^^^^^^ help: try calling: `v.get(0)` + +error: aborting due to 4 previous errors + diff --git a/tests/ui/len_zero.fixed b/tests/ui/len_zero.fixed index 624e5ef8fcf13..a29b832eb6019 100644 --- a/tests/ui/len_zero.fixed +++ b/tests/ui/len_zero.fixed @@ -141,3 +141,11 @@ fn main() { fn test_slice(b: &[u8]) { if !b.is_empty() {} } + +mod issue_3807 { + // Avoid suggesting changes to ranges if the user did not enable `range_is_empty`. + // See https://github.com/rust-lang/rust/issues/48111#issuecomment-445132965 + fn no_suggestion() { + let _ = (0..42).len() == 0; + } +} diff --git a/tests/ui/len_zero.rs b/tests/ui/len_zero.rs index 7fba971cfd887..8fd0093f4fdbb 100644 --- a/tests/ui/len_zero.rs +++ b/tests/ui/len_zero.rs @@ -141,3 +141,11 @@ fn main() { fn test_slice(b: &[u8]) { if b.len() != 0 {} } + +mod issue_3807 { + // Avoid suggesting changes to ranges if the user did not enable `range_is_empty`. + // See https://github.com/rust-lang/rust/issues/48111#issuecomment-445132965 + fn no_suggestion() { + let _ = (0..42).len() == 0; + } +} diff --git a/tests/ui/len_zero_ranges.fixed b/tests/ui/len_zero_ranges.fixed new file mode 100644 index 0000000000000..7da26f8ff4d47 --- /dev/null +++ b/tests/ui/len_zero_ranges.fixed @@ -0,0 +1,14 @@ +// run-rustfix + +#![feature(range_is_empty)] +#![warn(clippy::len_zero)] +#![allow(unused)] + +mod issue_3807 { + // With the feature enabled, `is_empty` should be suggested + fn suggestion_is_fine() { + let _ = (0..42).is_empty(); + } +} + +fn main() {} diff --git a/tests/ui/len_zero_ranges.rs b/tests/ui/len_zero_ranges.rs new file mode 100644 index 0000000000000..be7b4244bc06c --- /dev/null +++ b/tests/ui/len_zero_ranges.rs @@ -0,0 +1,14 @@ +// run-rustfix + +#![feature(range_is_empty)] +#![warn(clippy::len_zero)] +#![allow(unused)] + +mod issue_3807 { + // With the feature enabled, `is_empty` should be suggested + fn suggestion_is_fine() { + let _ = (0..42).len() == 0; + } +} + +fn main() {} diff --git a/tests/ui/len_zero_ranges.stderr b/tests/ui/len_zero_ranges.stderr new file mode 100644 index 0000000000000..6e5fa41fb08a5 --- /dev/null +++ b/tests/ui/len_zero_ranges.stderr @@ -0,0 +1,10 @@ +error: length comparison to zero + --> $DIR/len_zero_ranges.rs:10:17 + | +LL | let _ = (0..42).len() == 0; + | ^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `(0..42).is_empty()` + | + = note: `-D clippy::len-zero` implied by `-D warnings` + +error: aborting due to previous error + diff --git a/tests/ui/let_and_return.rs b/tests/ui/let_and_return.rs new file mode 100644 index 0000000000000..09614b8c1ad78 --- /dev/null +++ b/tests/ui/let_and_return.rs @@ -0,0 +1,138 @@ +#![allow(unused)] +#![warn(clippy::let_and_return)] + +fn test() -> i32 { + let _y = 0; // no warning + let x = 5; + x +} + +fn test_inner() -> i32 { + if true { + let x = 5; + x + } else { + 0 + } +} + +fn test_nowarn_1() -> i32 { + let mut x = 5; + x += 1; + x +} + +fn test_nowarn_2() -> i32 { + let x = 5; + x + 1 +} + +fn test_nowarn_3() -> (i32, i32) { + // this should technically warn, but we do not compare complex patterns + let (x, y) = (5, 9); + (x, y) +} + +fn test_nowarn_4() -> i32 { + // this should technically warn, but not b/c of clippy::let_and_return, but b/c of useless type + let x: i32 = 5; + x +} + +fn test_nowarn_5(x: i16) -> u16 { + #[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)] + let x = x as u16; + x +} + +// False positive example +trait Decode { + fn decode(d: D) -> Result + where + Self: Sized; +} + +macro_rules! tuple_encode { + ($($x:ident),*) => ( + impl<$($x: Decode),*> Decode for ($($x),*) { + #[inline] + #[allow(non_snake_case)] + fn decode(mut d: D) -> Result { + // Shouldn't trigger lint + Ok(($({let $x = Decode::decode(&mut d)?; $x }),*)) + } + } + ); +} + +tuple_encode!(T0, T1, T2, T3, T4, T5, T6, T7); + +mod no_lint_if_stmt_borrows { + mod issue_3792 { + use std::io::{self, BufRead, Stdin}; + + fn read_line() -> String { + let stdin = io::stdin(); + let line = stdin.lock().lines().next().unwrap().unwrap(); + line + } + } + + mod issue_3324 { + use std::cell::RefCell; + use std::rc::{Rc, Weak}; + + fn test(value: Weak>) -> u32 { + let value = value.upgrade().unwrap(); + let ret = value.borrow().baz(); + ret + } + + struct Bar {} + + impl Bar { + fn new() -> Self { + Bar {} + } + fn baz(&self) -> u32 { + 0 + } + } + + fn main() { + let a = Rc::new(RefCell::new(Bar::new())); + let b = Rc::downgrade(&a); + test(b); + } + } + + mod free_function { + struct Inner; + + struct Foo<'a> { + inner: &'a Inner, + } + + impl Drop for Foo<'_> { + fn drop(&mut self) {} + } + + impl Foo<'_> { + fn value(&self) -> i32 { + 42 + } + } + + fn some_foo(inner: &Inner) -> Foo<'_> { + Foo { inner } + } + + fn test() -> i32 { + let x = Inner {}; + let value = some_foo(&x).value(); + value + } + } +} + +fn main() {} diff --git a/tests/ui/let_return.stderr b/tests/ui/let_and_return.stderr similarity index 89% rename from tests/ui/let_return.stderr rename to tests/ui/let_and_return.stderr index 128a22c86e360..eacf948b3927a 100644 --- a/tests/ui/let_return.stderr +++ b/tests/ui/let_and_return.stderr @@ -1,5 +1,5 @@ error: returning the result of a `let` binding from a block - --> $DIR/let_return.rs:7:5 + --> $DIR/let_and_return.rs:7:5 | LL | let x = 5; | ---------- unnecessary `let` binding @@ -14,7 +14,7 @@ LL | 5 | error: returning the result of a `let` binding from a block - --> $DIR/let_return.rs:13:9 + --> $DIR/let_and_return.rs:13:9 | LL | let x = 5; | ---------- unnecessary `let` binding diff --git a/tests/ui/let_return.rs b/tests/ui/let_return.rs deleted file mode 100644 index 23645d48fe799..0000000000000 --- a/tests/ui/let_return.rs +++ /dev/null @@ -1,70 +0,0 @@ -#![allow(unused)] -#![warn(clippy::let_and_return)] - -fn test() -> i32 { - let _y = 0; // no warning - let x = 5; - x -} - -fn test_inner() -> i32 { - if true { - let x = 5; - x - } else { - 0 - } -} - -fn test_nowarn_1() -> i32 { - let mut x = 5; - x += 1; - x -} - -fn test_nowarn_2() -> i32 { - let x = 5; - x + 1 -} - -fn test_nowarn_3() -> (i32, i32) { - // this should technically warn, but we do not compare complex patterns - let (x, y) = (5, 9); - (x, y) -} - -fn test_nowarn_4() -> i32 { - // this should technically warn, but not b/c of clippy::let_and_return, but b/c of useless type - let x: i32 = 5; - x -} - -fn test_nowarn_5(x: i16) -> u16 { - #[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)] - let x = x as u16; - x -} - -// False positive example -trait Decode { - fn decode(d: D) -> Result - where - Self: Sized; -} - -macro_rules! tuple_encode { - ($($x:ident),*) => ( - impl<$($x: Decode),*> Decode for ($($x),*) { - #[inline] - #[allow(non_snake_case)] - fn decode(mut d: D) -> Result { - // Shouldn't trigger lint - Ok(($({let $x = Decode::decode(&mut d)?; $x }),*)) - } - } - ); -} - -tuple_encode!(T0, T1, T2, T3, T4, T5, T6, T7); - -fn main() {} diff --git a/tests/ui/needless_collect.fixed b/tests/ui/needless_collect.fixed index b4227eaf2f8bb..be37dc16b9a3e 100644 --- a/tests/ui/needless_collect.fixed +++ b/tests/ui/needless_collect.fixed @@ -9,7 +9,7 @@ use std::collections::{BTreeSet, HashMap, HashSet}; fn main() { let sample = [1; 5]; let len = sample.iter().count(); - if sample.iter().next().is_none() { + if sample.get(0).is_none() { // Empty } sample.iter().cloned().any(|x| x == 1); diff --git a/tests/ui/needless_collect.stderr b/tests/ui/needless_collect.stderr index 8884c8e161293..9113aad90dd7c 100644 --- a/tests/ui/needless_collect.stderr +++ b/tests/ui/needless_collect.stderr @@ -1,28 +1,28 @@ error: avoid using `collect()` when not needed - --> $DIR/needless_collect.rs:11:28 + --> $DIR/needless_collect.rs:11:29 | LL | let len = sample.iter().collect::>().len(); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `.count()` + | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `count()` | = note: `-D clippy::needless-collect` implied by `-D warnings` error: avoid using `collect()` when not needed - --> $DIR/needless_collect.rs:12:21 + --> $DIR/needless_collect.rs:12:15 | LL | if sample.iter().collect::>().is_empty() { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `.next().is_none()` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `get(0).is_none()` error: avoid using `collect()` when not needed - --> $DIR/needless_collect.rs:15:27 + --> $DIR/needless_collect.rs:15:28 | LL | sample.iter().cloned().collect::>().contains(&1); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `.any(|x| x == 1)` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `any(|x| x == 1)` error: avoid using `collect()` when not needed - --> $DIR/needless_collect.rs:16:34 + --> $DIR/needless_collect.rs:16:35 | LL | sample.iter().map(|x| (x, x)).collect::>().len(); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `.count()` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `count()` error: aborting due to 4 previous errors diff --git a/tests/ui/neg_cmp_op_on_partial_ord.rs b/tests/ui/neg_cmp_op_on_partial_ord.rs index 856a430ba2b55..ca70e3b7148ef 100644 --- a/tests/ui/neg_cmp_op_on_partial_ord.rs +++ b/tests/ui/neg_cmp_op_on_partial_ord.rs @@ -4,6 +4,7 @@ use std::cmp::Ordering; +#[allow(clippy::unnested_or_patterns)] #[warn(clippy::neg_cmp_op_on_partial_ord)] fn main() { let a_value = 1.0; diff --git a/tests/ui/neg_cmp_op_on_partial_ord.stderr b/tests/ui/neg_cmp_op_on_partial_ord.stderr index d05fd34ce33be..8c5d548222e0d 100644 --- a/tests/ui/neg_cmp_op_on_partial_ord.stderr +++ b/tests/ui/neg_cmp_op_on_partial_ord.stderr @@ -1,5 +1,5 @@ error: The use of negated comparison operators on partially ordered types produces code that is hard to read and refactor. Please consider using the `partial_cmp` method instead, to make it clear that the two values could be incomparable. - --> $DIR/neg_cmp_op_on_partial_ord.rs:15:21 + --> $DIR/neg_cmp_op_on_partial_ord.rs:16:21 | LL | let _not_less = !(a_value < another_value); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -7,19 +7,19 @@ LL | let _not_less = !(a_value < another_value); = note: `-D clippy::neg-cmp-op-on-partial-ord` implied by `-D warnings` error: The use of negated comparison operators on partially ordered types produces code that is hard to read and refactor. Please consider using the `partial_cmp` method instead, to make it clear that the two values could be incomparable. - --> $DIR/neg_cmp_op_on_partial_ord.rs:18:30 + --> $DIR/neg_cmp_op_on_partial_ord.rs:19:30 | LL | let _not_less_or_equal = !(a_value <= another_value); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: The use of negated comparison operators on partially ordered types produces code that is hard to read and refactor. Please consider using the `partial_cmp` method instead, to make it clear that the two values could be incomparable. - --> $DIR/neg_cmp_op_on_partial_ord.rs:21:24 + --> $DIR/neg_cmp_op_on_partial_ord.rs:22:24 | LL | let _not_greater = !(a_value > another_value); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ error: The use of negated comparison operators on partially ordered types produces code that is hard to read and refactor. Please consider using the `partial_cmp` method instead, to make it clear that the two values could be incomparable. - --> $DIR/neg_cmp_op_on_partial_ord.rs:24:33 + --> $DIR/neg_cmp_op_on_partial_ord.rs:25:33 | LL | let _not_greater_or_equal = !(a_value >= another_value); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/ui/or_fun_call.fixed b/tests/ui/or_fun_call.fixed index 7bb08797ef396..2045ffdb5f09d 100644 --- a/tests/ui/or_fun_call.fixed +++ b/tests/ui/or_fun_call.fixed @@ -29,7 +29,7 @@ fn or_fun_call() { with_enum.unwrap_or(Enum::A(5)); let with_const_fn = Some(Duration::from_secs(1)); - with_const_fn.unwrap_or(Duration::from_secs(5)); + with_const_fn.unwrap_or_else(|| Duration::from_secs(5)); let with_constructor = Some(vec![1]); with_constructor.unwrap_or_else(make); @@ -94,7 +94,7 @@ fn test_or_with_ctors() { let b = "b".to_string(); let _ = Some(Bar("a".to_string(), Duration::from_secs(1))) - .or(Some(Bar(b, Duration::from_secs(2)))); + .or_else(|| Some(Bar(b, Duration::from_secs(2)))); let vec = vec!["foo"]; let _ = opt.ok_or(vec.len()); diff --git a/tests/ui/or_fun_call.stderr b/tests/ui/or_fun_call.stderr index 96d55771e6cef..bc5978b538f16 100644 --- a/tests/ui/or_fun_call.stderr +++ b/tests/ui/or_fun_call.stderr @@ -1,10 +1,16 @@ +error: use of `unwrap_or` followed by a function call + --> $DIR/or_fun_call.rs:32:19 + | +LL | with_const_fn.unwrap_or(Duration::from_secs(5)); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| Duration::from_secs(5))` + | + = note: `-D clippy::or-fun-call` implied by `-D warnings` + error: use of `unwrap_or` followed by a function call --> $DIR/or_fun_call.rs:35:22 | LL | with_constructor.unwrap_or(make()); | ^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(make)` - | - = note: `-D clippy::or-fun-call` implied by `-D warnings` error: use of `unwrap_or` followed by a call to `new` --> $DIR/or_fun_call.rs:38:5 @@ -78,5 +84,11 @@ error: use of `or` followed by a function call LL | let _ = Some("a".to_string()).or(Some("b".to_string())); | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `or_else(|| Some("b".to_string()))` -error: aborting due to 13 previous errors +error: use of `or` followed by a function call + --> $DIR/or_fun_call.rs:97:10 + | +LL | .or(Some(Bar(b, Duration::from_secs(2)))); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `or_else(|| Some(Bar(b, Duration::from_secs(2))))` + +error: aborting due to 15 previous errors diff --git a/tests/ui/reversed_empty_ranges_fixable.fixed b/tests/ui/reversed_empty_ranges_fixable.fixed index 332c0427ef65a..79e482eec3037 100644 --- a/tests/ui/reversed_empty_ranges_fixable.fixed +++ b/tests/ui/reversed_empty_ranges_fixable.fixed @@ -4,8 +4,6 @@ const ANSWER: i32 = 42; fn main() { - let arr = [1, 2, 3, 4, 5]; - // These should be linted: (21..=42).rev().for_each(|x| println!("{}", x)); @@ -14,16 +12,18 @@ fn main() { for _ in (-42..=-21).rev() {} for _ in (21u32..42u32).rev() {} - let _ = &[] as &[i32]; - // These should be ignored as they are not empty ranges: (21..=42).for_each(|x| println!("{}", x)); (21..42).for_each(|x| println!("{}", x)); + let arr = [1, 2, 3, 4, 5]; let _ = &arr[1..=3]; let _ = &arr[1..3]; for _ in 21..=42 {} for _ in 21..42 {} + + // This range is empty but should be ignored, see issue #5689 + let _ = &arr[0..0]; } diff --git a/tests/ui/reversed_empty_ranges_fixable.rs b/tests/ui/reversed_empty_ranges_fixable.rs index 901ec8bcc09f4..b2e8bf33771ac 100644 --- a/tests/ui/reversed_empty_ranges_fixable.rs +++ b/tests/ui/reversed_empty_ranges_fixable.rs @@ -4,8 +4,6 @@ const ANSWER: i32 = 42; fn main() { - let arr = [1, 2, 3, 4, 5]; - // These should be linted: (42..=21).for_each(|x| println!("{}", x)); @@ -14,16 +12,18 @@ fn main() { for _ in -21..=-42 {} for _ in 42u32..21u32 {} - let _ = &arr[3..3]; - // These should be ignored as they are not empty ranges: (21..=42).for_each(|x| println!("{}", x)); (21..42).for_each(|x| println!("{}", x)); + let arr = [1, 2, 3, 4, 5]; let _ = &arr[1..=3]; let _ = &arr[1..3]; for _ in 21..=42 {} for _ in 21..42 {} + + // This range is empty but should be ignored, see issue #5689 + let _ = &arr[0..0]; } diff --git a/tests/ui/reversed_empty_ranges_fixable.stderr b/tests/ui/reversed_empty_ranges_fixable.stderr index 9a646fd99398d..de83c4f3d633c 100644 --- a/tests/ui/reversed_empty_ranges_fixable.stderr +++ b/tests/ui/reversed_empty_ranges_fixable.stderr @@ -1,5 +1,5 @@ error: this range is empty so it will yield no values - --> $DIR/reversed_empty_ranges_fixable.rs:11:5 + --> $DIR/reversed_empty_ranges_fixable.rs:9:5 | LL | (42..=21).for_each(|x| println!("{}", x)); | ^^^^^^^^^ @@ -11,7 +11,7 @@ LL | (21..=42).rev().for_each(|x| println!("{}", x)); | ^^^^^^^^^^^^^^^ error: this range is empty so it will yield no values - --> $DIR/reversed_empty_ranges_fixable.rs:12:13 + --> $DIR/reversed_empty_ranges_fixable.rs:10:13 | LL | let _ = (ANSWER..21).filter(|x| x % 2 == 0).take(10).collect::>(); | ^^^^^^^^^^^^ @@ -22,7 +22,7 @@ LL | let _ = (21..ANSWER).rev().filter(|x| x % 2 == 0).take(10).collect:: $DIR/reversed_empty_ranges_fixable.rs:14:14 + --> $DIR/reversed_empty_ranges_fixable.rs:12:14 | LL | for _ in -21..=-42 {} | ^^^^^^^^^ @@ -33,7 +33,7 @@ LL | for _ in (-42..=-21).rev() {} | ^^^^^^^^^^^^^^^^^ error: this range is empty so it will yield no values - --> $DIR/reversed_empty_ranges_fixable.rs:15:14 + --> $DIR/reversed_empty_ranges_fixable.rs:13:14 | LL | for _ in 42u32..21u32 {} | ^^^^^^^^^^^^ @@ -43,11 +43,5 @@ help: consider using the following if you are attempting to iterate over this ra LL | for _ in (21u32..42u32).rev() {} | ^^^^^^^^^^^^^^^^^^^^ -error: this range is empty and using it to index a slice will always yield an empty slice - --> $DIR/reversed_empty_ranges_fixable.rs:17:18 - | -LL | let _ = &arr[3..3]; - | ----^^^^- help: if you want an empty slice, use: `[] as &[i32]` - -error: aborting due to 5 previous errors +error: aborting due to 4 previous errors diff --git a/tests/ui/reversed_empty_ranges_unfixable.rs b/tests/ui/reversed_empty_ranges_unfixable.rs index 561a35625f02e..264d3d1e95af4 100644 --- a/tests/ui/reversed_empty_ranges_unfixable.rs +++ b/tests/ui/reversed_empty_ranges_unfixable.rs @@ -4,11 +4,12 @@ const ANSWER: i32 = 42; const SOME_NUM: usize = 3; fn main() { - let _ = (42 + 10..42 + 10).map(|x| x / 2).find(|&x| x == 21); - let arr = [1, 2, 3, 4, 5]; let _ = &arr[3usize..=1usize]; let _ = &arr[SOME_NUM..1]; for _ in ANSWER..ANSWER {} + + // Should not be linted, see issue #5689 + let _ = (42 + 10..42 + 10).map(|x| x / 2).find(|&x| x == 21); } diff --git a/tests/ui/reversed_empty_ranges_unfixable.stderr b/tests/ui/reversed_empty_ranges_unfixable.stderr index 240188cbb46cb..f23d4eb0f9ca4 100644 --- a/tests/ui/reversed_empty_ranges_unfixable.stderr +++ b/tests/ui/reversed_empty_ranges_unfixable.stderr @@ -1,28 +1,22 @@ -error: this range is empty so it will yield no values - --> $DIR/reversed_empty_ranges_unfixable.rs:7:13 - | -LL | let _ = (42 + 10..42 + 10).map(|x| x / 2).find(|&x| x == 21); - | ^^^^^^^^^^^^^^^^^^ - | - = note: `-D clippy::reversed-empty-ranges` implied by `-D warnings` - error: this range is reversed and using it to index a slice will panic at run-time - --> $DIR/reversed_empty_ranges_unfixable.rs:10:18 + --> $DIR/reversed_empty_ranges_unfixable.rs:8:18 | LL | let _ = &arr[3usize..=1usize]; | ^^^^^^^^^^^^^^^ + | + = note: `-D clippy::reversed-empty-ranges` implied by `-D warnings` error: this range is reversed and using it to index a slice will panic at run-time - --> $DIR/reversed_empty_ranges_unfixable.rs:11:18 + --> $DIR/reversed_empty_ranges_unfixable.rs:9:18 | LL | let _ = &arr[SOME_NUM..1]; | ^^^^^^^^^^^ error: this range is empty so it will yield no values - --> $DIR/reversed_empty_ranges_unfixable.rs:13:14 + --> $DIR/reversed_empty_ranges_unfixable.rs:11:14 | LL | for _ in ANSWER..ANSWER {} | ^^^^^^^^^^^^^^ -error: aborting due to 4 previous errors +error: aborting due to 3 previous errors diff --git a/tests/ui/string_lit_as_bytes.fixed b/tests/ui/string_lit_as_bytes.fixed index 7ad272ade5f9c..ccf8f61c4a92c 100644 --- a/tests/ui/string_lit_as_bytes.fixed +++ b/tests/ui/string_lit_as_bytes.fixed @@ -14,6 +14,8 @@ fn str_lit_as_bytes() { let strify = stringify!(foobar).as_bytes(); + let current_version = env!("CARGO_PKG_VERSION").as_bytes(); + let includestr = include_bytes!("entry_unfixable.rs"); let _ = b"string with newline\t\n"; diff --git a/tests/ui/string_lit_as_bytes.rs b/tests/ui/string_lit_as_bytes.rs index 1bf4538b7c94f..178df08e249ef 100644 --- a/tests/ui/string_lit_as_bytes.rs +++ b/tests/ui/string_lit_as_bytes.rs @@ -14,6 +14,8 @@ fn str_lit_as_bytes() { let strify = stringify!(foobar).as_bytes(); + let current_version = env!("CARGO_PKG_VERSION").as_bytes(); + let includestr = include_str!("entry_unfixable.rs").as_bytes(); let _ = "string with newline\t\n".as_bytes(); diff --git a/tests/ui/string_lit_as_bytes.stderr b/tests/ui/string_lit_as_bytes.stderr index ff6e3346dfc75..99c512354d589 100644 --- a/tests/ui/string_lit_as_bytes.stderr +++ b/tests/ui/string_lit_as_bytes.stderr @@ -13,13 +13,13 @@ LL | let bs = r###"raw string with 3# plus " ""###.as_bytes(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a byte string literal instead: `br###"raw string with 3# plus " ""###` error: calling `as_bytes()` on `include_str!(..)` - --> $DIR/string_lit_as_bytes.rs:17:22 + --> $DIR/string_lit_as_bytes.rs:19:22 | LL | let includestr = include_str!("entry_unfixable.rs").as_bytes(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `include_bytes!(..)` instead: `include_bytes!("entry_unfixable.rs")` error: calling `as_bytes()` on a string literal - --> $DIR/string_lit_as_bytes.rs:19:13 + --> $DIR/string_lit_as_bytes.rs:21:13 | LL | let _ = "string with newline/t/n".as_bytes(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a byte string literal instead: `b"string with newline/t/n"` diff --git a/tests/ui/unit_arg.fixed b/tests/ui/unit_arg.fixed deleted file mode 100644 index a739cf7ad814e..0000000000000 --- a/tests/ui/unit_arg.fixed +++ /dev/null @@ -1,64 +0,0 @@ -// run-rustfix -#![warn(clippy::unit_arg)] -#![allow(unused_braces, clippy::no_effect, unused_must_use)] - -use std::fmt::Debug; - -fn foo(t: T) { - println!("{:?}", t); -} - -fn foo3(t1: T1, t2: T2, t3: T3) { - println!("{:?}, {:?}, {:?}", t1, t2, t3); -} - -struct Bar; - -impl Bar { - fn bar(&self, t: T) { - println!("{:?}", t); - } -} - -fn bad() { - foo(()); - foo(()); - foo(()); - foo(()); - foo3((), 2, 2); - let b = Bar; - b.bar(()); -} - -fn ok() { - foo(()); - foo(1); - foo({ 1 }); - foo3("a", 3, vec![3]); - let b = Bar; - b.bar({ 1 }); - b.bar(()); - question_mark(); -} - -fn question_mark() -> Result<(), ()> { - Ok(Ok(())?)?; - Ok(Ok(()))??; - Ok(()) -} - -#[allow(dead_code)] -mod issue_2945 { - fn unit_fn() -> Result<(), i32> { - Ok(()) - } - - fn fallible() -> Result<(), i32> { - Ok(unit_fn()?) - } -} - -fn main() { - bad(); - ok(); -} diff --git a/tests/ui/unit_arg.rs b/tests/ui/unit_arg.rs index d90c49f79de62..2992abae775b8 100644 --- a/tests/ui/unit_arg.rs +++ b/tests/ui/unit_arg.rs @@ -1,6 +1,5 @@ -// run-rustfix #![warn(clippy::unit_arg)] -#![allow(unused_braces, clippy::no_effect, unused_must_use)] +#![allow(clippy::no_effect, unused_must_use, unused_variables)] use std::fmt::Debug; @@ -21,7 +20,6 @@ impl Bar { } fn bad() { - foo({}); foo({ 1; }); @@ -30,11 +28,25 @@ fn bad() { foo(1); foo(2); }); - foo3({}, 2, 2); let b = Bar; b.bar({ 1; }); + taking_multiple_units(foo(0), foo(1)); + taking_multiple_units(foo(0), { + foo(1); + foo(2); + }); + taking_multiple_units( + { + foo(0); + foo(1); + }, + { + foo(2); + foo(3); + }, + ); } fn ok() { @@ -65,6 +77,13 @@ mod issue_2945 { } } +#[allow(dead_code)] +fn returning_expr() -> Option<()> { + Some(foo(1)) +} + +fn taking_multiple_units(a: (), b: ()) {} + fn main() { bad(); ok(); diff --git a/tests/ui/unit_arg.stderr b/tests/ui/unit_arg.stderr index 21ccc684ea9de..56f6a855dfa55 100644 --- a/tests/ui/unit_arg.stderr +++ b/tests/ui/unit_arg.stderr @@ -1,79 +1,181 @@ error: passing a unit value to a function - --> $DIR/unit_arg.rs:24:9 + --> $DIR/unit_arg.rs:23:5 | -LL | foo({}); - | ^^ +LL | / foo({ +LL | | 1; +LL | | }); + | |______^ | = note: `-D clippy::unit-arg` implied by `-D warnings` -help: if you intended to pass a unit value, use a unit literal instead +help: remove the semicolon from the last statement in the block | -LL | foo(()); - | ^^ - -error: passing a unit value to a function - --> $DIR/unit_arg.rs:25:9 +LL | 1 | -LL | foo({ - | _________^ -LL | | 1; -LL | | }); - | |_____^ +help: or move the expression in front of the call... | -help: if you intended to pass a unit value, use a unit literal instead +LL | { +LL | 1; +LL | }; + | +help: ...and use a unit literal instead | LL | foo(()); | ^^ error: passing a unit value to a function - --> $DIR/unit_arg.rs:28:9 + --> $DIR/unit_arg.rs:26:5 | LL | foo(foo(1)); - | ^^^^^^ + | ^^^^^^^^^^^ + | +help: move the expression in front of the call... | -help: if you intended to pass a unit value, use a unit literal instead +LL | foo(1); + | +help: ...and use a unit literal instead | LL | foo(()); | ^^ error: passing a unit value to a function - --> $DIR/unit_arg.rs:29:9 + --> $DIR/unit_arg.rs:27:5 | -LL | foo({ - | _________^ +LL | / foo({ LL | | foo(1); LL | | foo(2); LL | | }); - | |_____^ + | |______^ + | +help: remove the semicolon from the last statement in the block + | +LL | foo(2) | -help: if you intended to pass a unit value, use a unit literal instead +help: or move the expression in front of the call... + | +LL | { +LL | foo(1); +LL | foo(2); +LL | }; + | +help: ...and use a unit literal instead | LL | foo(()); | ^^ error: passing a unit value to a function - --> $DIR/unit_arg.rs:33:10 + --> $DIR/unit_arg.rs:32:5 | -LL | foo3({}, 2, 2); - | ^^ +LL | / b.bar({ +LL | | 1; +LL | | }); + | |______^ | -help: if you intended to pass a unit value, use a unit literal instead +help: remove the semicolon from the last statement in the block | -LL | foo3((), 2, 2); - | ^^ +LL | 1 + | +help: or move the expression in front of the call... + | +LL | { +LL | 1; +LL | }; + | +help: ...and use a unit literal instead + | +LL | b.bar(()); + | ^^ -error: passing a unit value to a function - --> $DIR/unit_arg.rs:35:11 +error: passing unit values to a function + --> $DIR/unit_arg.rs:35:5 | -LL | b.bar({ - | ___________^ -LL | | 1; +LL | taking_multiple_units(foo(0), foo(1)); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: move the expressions in front of the call... + | +LL | foo(0); +LL | foo(1); + | +help: ...and use unit literals instead + | +LL | taking_multiple_units((), ()); + | ^^ ^^ + +error: passing unit values to a function + --> $DIR/unit_arg.rs:36:5 + | +LL | / taking_multiple_units(foo(0), { +LL | | foo(1); +LL | | foo(2); LL | | }); + | |______^ + | +help: remove the semicolon from the last statement in the block + | +LL | foo(2) + | +help: or move the expressions in front of the call... + | +LL | foo(0); +LL | { +LL | foo(1); +LL | foo(2); +LL | }; + | +help: ...and use unit literals instead + | +LL | taking_multiple_units((), ()); + | ^^ ^^ + +error: passing unit values to a function + --> $DIR/unit_arg.rs:40:5 + | +LL | / taking_multiple_units( +LL | | { +LL | | foo(0); +LL | | foo(1); +... | +LL | | }, +LL | | ); | |_____^ | -help: if you intended to pass a unit value, use a unit literal instead +help: remove the semicolon from the last statement in the block | -LL | b.bar(()); - | ^^ +LL | foo(1) + | +help: remove the semicolon from the last statement in the block + | +LL | foo(3) + | +help: or move the expressions in front of the call... + | +LL | { +LL | foo(0); +LL | foo(1); +LL | }; +LL | { +LL | foo(2); + ... +help: ...and use unit literals instead + | +LL | (), +LL | (), + | + +error: passing a unit value to a function + --> $DIR/unit_arg.rs:82:5 + | +LL | Some(foo(1)) + | ^^^^^^^^^^^^ + | +help: move the expression in front of the call... + | +LL | foo(1); + | +help: ...and use a unit literal instead + | +LL | Some(()) + | ^^ -error: aborting due to 6 previous errors +error: aborting due to 8 previous errors diff --git a/tests/ui/unit_arg_empty_blocks.rs b/tests/ui/unit_arg_empty_blocks.rs new file mode 100644 index 0000000000000..18a31eb3deee2 --- /dev/null +++ b/tests/ui/unit_arg_empty_blocks.rs @@ -0,0 +1,26 @@ +#![warn(clippy::unit_arg)] +#![allow(clippy::no_effect, unused_must_use, unused_variables)] + +use std::fmt::Debug; + +fn foo(t: T) { + println!("{:?}", t); +} + +fn foo3(t1: T1, t2: T2, t3: T3) { + println!("{:?}, {:?}, {:?}", t1, t2, t3); +} + +fn bad() { + foo({}); + foo3({}, 2, 2); + taking_two_units({}, foo(0)); + taking_three_units({}, foo(0), foo(1)); +} + +fn taking_two_units(a: (), b: ()) {} +fn taking_three_units(a: (), b: (), c: ()) {} + +fn main() { + bad(); +} diff --git a/tests/ui/unit_arg_empty_blocks.stderr b/tests/ui/unit_arg_empty_blocks.stderr new file mode 100644 index 0000000000000..bb58483584b3e --- /dev/null +++ b/tests/ui/unit_arg_empty_blocks.stderr @@ -0,0 +1,51 @@ +error: passing a unit value to a function + --> $DIR/unit_arg_empty_blocks.rs:15:5 + | +LL | foo({}); + | ^^^^--^ + | | + | help: use a unit literal instead: `()` + | + = note: `-D clippy::unit-arg` implied by `-D warnings` + +error: passing a unit value to a function + --> $DIR/unit_arg_empty_blocks.rs:16:5 + | +LL | foo3({}, 2, 2); + | ^^^^^--^^^^^^^ + | | + | help: use a unit literal instead: `()` + +error: passing unit values to a function + --> $DIR/unit_arg_empty_blocks.rs:17:5 + | +LL | taking_two_units({}, foo(0)); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: move the expression in front of the call... + | +LL | foo(0); + | +help: ...and use unit literals instead + | +LL | taking_two_units((), ()); + | ^^ ^^ + +error: passing unit values to a function + --> $DIR/unit_arg_empty_blocks.rs:18:5 + | +LL | taking_three_units({}, foo(0), foo(1)); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: move the expressions in front of the call... + | +LL | foo(0); +LL | foo(1); + | +help: ...and use unit literals instead + | +LL | taking_three_units((), (), ()); + | ^^ ^^ ^^ + +error: aborting due to 4 previous errors + diff --git a/tests/ui/unnecessary_sort_by.fixed b/tests/ui/unnecessary_sort_by.fixed new file mode 100644 index 0000000000000..779fd57707ad4 --- /dev/null +++ b/tests/ui/unnecessary_sort_by.fixed @@ -0,0 +1,26 @@ +// run-rustfix + +use std::cmp::Reverse; + +fn id(x: isize) -> isize { + x +} + +fn main() { + let mut vec: Vec = vec![3, 6, 1, 2, 5]; + // Forward examples + vec.sort(); + vec.sort_unstable(); + vec.sort_by_key(|&a| (a + 5).abs()); + vec.sort_unstable_by_key(|&a| id(-a)); + // Reverse examples + vec.sort_by_key(|&b| Reverse(b)); + vec.sort_by_key(|&b| Reverse((b + 5).abs())); + vec.sort_unstable_by_key(|&b| Reverse(id(-b))); + // Negative examples (shouldn't be changed) + let c = &7; + vec.sort_by(|a, b| (b - a).cmp(&(a - b))); + vec.sort_by(|_, b| b.cmp(&5)); + vec.sort_by(|_, b| b.cmp(c)); + vec.sort_unstable_by(|a, _| a.cmp(c)); +} diff --git a/tests/ui/unnecessary_sort_by.rs b/tests/ui/unnecessary_sort_by.rs new file mode 100644 index 0000000000000..0485a5630afef --- /dev/null +++ b/tests/ui/unnecessary_sort_by.rs @@ -0,0 +1,26 @@ +// run-rustfix + +use std::cmp::Reverse; + +fn id(x: isize) -> isize { + x +} + +fn main() { + let mut vec: Vec = vec![3, 6, 1, 2, 5]; + // Forward examples + vec.sort_by(|a, b| a.cmp(b)); + vec.sort_unstable_by(|a, b| a.cmp(b)); + vec.sort_by(|a, b| (a + 5).abs().cmp(&(b + 5).abs())); + vec.sort_unstable_by(|a, b| id(-a).cmp(&id(-b))); + // Reverse examples + vec.sort_by(|a, b| b.cmp(a)); + vec.sort_by(|a, b| (b + 5).abs().cmp(&(a + 5).abs())); + vec.sort_unstable_by(|a, b| id(-b).cmp(&id(-a))); + // Negative examples (shouldn't be changed) + let c = &7; + vec.sort_by(|a, b| (b - a).cmp(&(a - b))); + vec.sort_by(|_, b| b.cmp(&5)); + vec.sort_by(|_, b| b.cmp(c)); + vec.sort_unstable_by(|a, _| a.cmp(c)); +} diff --git a/tests/ui/unnecessary_sort_by.stderr b/tests/ui/unnecessary_sort_by.stderr new file mode 100644 index 0000000000000..903b6e5099ce8 --- /dev/null +++ b/tests/ui/unnecessary_sort_by.stderr @@ -0,0 +1,46 @@ +error: use Vec::sort here instead + --> $DIR/unnecessary_sort_by.rs:12:5 + | +LL | vec.sort_by(|a, b| a.cmp(b)); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec.sort()` + | + = note: `-D clippy::unnecessary-sort-by` implied by `-D warnings` + +error: use Vec::sort here instead + --> $DIR/unnecessary_sort_by.rs:13:5 + | +LL | vec.sort_unstable_by(|a, b| a.cmp(b)); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec.sort_unstable()` + +error: use Vec::sort_by_key here instead + --> $DIR/unnecessary_sort_by.rs:14:5 + | +LL | vec.sort_by(|a, b| (a + 5).abs().cmp(&(b + 5).abs())); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec.sort_by_key(|&a| (a + 5).abs())` + +error: use Vec::sort_by_key here instead + --> $DIR/unnecessary_sort_by.rs:15:5 + | +LL | vec.sort_unstable_by(|a, b| id(-a).cmp(&id(-b))); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec.sort_unstable_by_key(|&a| id(-a))` + +error: use Vec::sort_by_key here instead + --> $DIR/unnecessary_sort_by.rs:17:5 + | +LL | vec.sort_by(|a, b| b.cmp(a)); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec.sort_by_key(|&b| Reverse(b))` + +error: use Vec::sort_by_key here instead + --> $DIR/unnecessary_sort_by.rs:18:5 + | +LL | vec.sort_by(|a, b| (b + 5).abs().cmp(&(a + 5).abs())); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec.sort_by_key(|&b| Reverse((b + 5).abs()))` + +error: use Vec::sort_by_key here instead + --> $DIR/unnecessary_sort_by.rs:19:5 + | +LL | vec.sort_unstable_by(|a, b| id(-b).cmp(&id(-a))); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec.sort_unstable_by_key(|&b| Reverse(id(-b)))` + +error: aborting due to 7 previous errors + diff --git a/tests/ui/unnested_or_patterns.fixed b/tests/ui/unnested_or_patterns.fixed new file mode 100644 index 0000000000000..b39e891094fd9 --- /dev/null +++ b/tests/ui/unnested_or_patterns.fixed @@ -0,0 +1,33 @@ +// run-rustfix + +#![feature(or_patterns)] +#![feature(box_patterns)] +#![warn(clippy::unnested_or_patterns)] +#![allow(clippy::cognitive_complexity, clippy::match_ref_pats)] +#![allow(unreachable_patterns, irrefutable_let_patterns, unused_variables)] + +fn main() { + if let box (0 | 2) = Box::new(0) {} + if let box (0 | 1 | 2 | 3 | 4) = Box::new(0) {} + const C0: &u8 = &1; + if let &(0 | 2) | C0 = &0 {} + if let &mut (0 | 2) = &mut 0 {} + if let x @ (0 | 2) = 0 {} + if let (0, 1 | 2 | 3) = (0, 0) {} + if let (1 | 2 | 3, 0) = (0, 0) {} + if let (x, ..) | (x, 1 | 2) = (0, 1) {} + if let [0 | 1] = [0] {} + if let [x, 0 | 1] = [0, 1] {} + if let [x, 0 | 1 | 2] = [0, 1] {} + if let [x, ..] | [x, 1 | 2] = [0, 1] {} + struct TS(u8, u8); + if let TS(0 | 1, x) = TS(0, 0) {} + if let TS(1 | 2 | 3, 0) = TS(0, 0) {} + if let TS(x, ..) | TS(x, 1 | 2) = TS(0, 0) {} + struct S { + x: u8, + y: u8, + } + if let S { x: 0 | 1, y } = (S { x: 0, y: 1 }) {} + if let S { x: 0, y, .. } | S { y, x: 1 } = (S { x: 0, y: 1 }) {} +} diff --git a/tests/ui/unnested_or_patterns.rs b/tests/ui/unnested_or_patterns.rs new file mode 100644 index 0000000000000..096f5a71150b8 --- /dev/null +++ b/tests/ui/unnested_or_patterns.rs @@ -0,0 +1,33 @@ +// run-rustfix + +#![feature(or_patterns)] +#![feature(box_patterns)] +#![warn(clippy::unnested_or_patterns)] +#![allow(clippy::cognitive_complexity, clippy::match_ref_pats)] +#![allow(unreachable_patterns, irrefutable_let_patterns, unused_variables)] + +fn main() { + if let box 0 | box 2 = Box::new(0) {} + if let box ((0 | 1)) | box (2 | 3) | box 4 = Box::new(0) {} + const C0: &u8 = &1; + if let &0 | C0 | &2 = &0 {} + if let &mut 0 | &mut 2 = &mut 0 {} + if let x @ 0 | x @ 2 = 0 {} + if let (0, 1) | (0, 2) | (0, 3) = (0, 0) {} + if let (1, 0) | (2, 0) | (3, 0) = (0, 0) {} + if let (x, ..) | (x, 1) | (x, 2) = (0, 1) {} + if let [0] | [1] = [0] {} + if let [x, 0] | [x, 1] = [0, 1] {} + if let [x, 0] | [x, 1] | [x, 2] = [0, 1] {} + if let [x, ..] | [x, 1] | [x, 2] = [0, 1] {} + struct TS(u8, u8); + if let TS(0, x) | TS(1, x) = TS(0, 0) {} + if let TS(1, 0) | TS(2, 0) | TS(3, 0) = TS(0, 0) {} + if let TS(x, ..) | TS(x, 1) | TS(x, 2) = TS(0, 0) {} + struct S { + x: u8, + y: u8, + } + if let S { x: 0, y } | S { y, x: 1 } = (S { x: 0, y: 1 }) {} + if let S { x: 0, y, .. } | S { y, x: 1 } = (S { x: 0, y: 1 }) {} +} diff --git a/tests/ui/unnested_or_patterns.stderr b/tests/ui/unnested_or_patterns.stderr new file mode 100644 index 0000000000000..1899dc657dfee --- /dev/null +++ b/tests/ui/unnested_or_patterns.stderr @@ -0,0 +1,179 @@ +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:10:12 + | +LL | if let box 0 | box 2 = Box::new(0) {} + | ^^^^^^^^^^^^^ + | + = note: `-D clippy::unnested-or-patterns` implied by `-D warnings` +help: nest the patterns + | +LL | if let box (0 | 2) = Box::new(0) {} + | ^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:11:12 + | +LL | if let box ((0 | 1)) | box (2 | 3) | box 4 = Box::new(0) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let box (0 | 1 | 2 | 3 | 4) = Box::new(0) {} + | ^^^^^^^^^^^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:13:12 + | +LL | if let &0 | C0 | &2 = &0 {} + | ^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let &(0 | 2) | C0 = &0 {} + | ^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:14:12 + | +LL | if let &mut 0 | &mut 2 = &mut 0 {} + | ^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let &mut (0 | 2) = &mut 0 {} + | ^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:15:12 + | +LL | if let x @ 0 | x @ 2 = 0 {} + | ^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let x @ (0 | 2) = 0 {} + | ^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:16:12 + | +LL | if let (0, 1) | (0, 2) | (0, 3) = (0, 0) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let (0, 1 | 2 | 3) = (0, 0) {} + | ^^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:17:12 + | +LL | if let (1, 0) | (2, 0) | (3, 0) = (0, 0) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let (1 | 2 | 3, 0) = (0, 0) {} + | ^^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:18:12 + | +LL | if let (x, ..) | (x, 1) | (x, 2) = (0, 1) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let (x, ..) | (x, 1 | 2) = (0, 1) {} + | ^^^^^^^^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:19:12 + | +LL | if let [0] | [1] = [0] {} + | ^^^^^^^^^ + | +help: nest the patterns + | +LL | if let [0 | 1] = [0] {} + | ^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:20:12 + | +LL | if let [x, 0] | [x, 1] = [0, 1] {} + | ^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let [x, 0 | 1] = [0, 1] {} + | ^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:21:12 + | +LL | if let [x, 0] | [x, 1] | [x, 2] = [0, 1] {} + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let [x, 0 | 1 | 2] = [0, 1] {} + | ^^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:22:12 + | +LL | if let [x, ..] | [x, 1] | [x, 2] = [0, 1] {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let [x, ..] | [x, 1 | 2] = [0, 1] {} + | ^^^^^^^^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:24:12 + | +LL | if let TS(0, x) | TS(1, x) = TS(0, 0) {} + | ^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let TS(0 | 1, x) = TS(0, 0) {} + | ^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:25:12 + | +LL | if let TS(1, 0) | TS(2, 0) | TS(3, 0) = TS(0, 0) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let TS(1 | 2 | 3, 0) = TS(0, 0) {} + | ^^^^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:26:12 + | +LL | if let TS(x, ..) | TS(x, 1) | TS(x, 2) = TS(0, 0) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let TS(x, ..) | TS(x, 1 | 2) = TS(0, 0) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns.rs:31:12 + | +LL | if let S { x: 0, y } | S { y, x: 1 } = (S { x: 0, y: 1 }) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let S { x: 0 | 1, y } = (S { x: 0, y: 1 }) {} + | ^^^^^^^^^^^^^^^^^ + +error: aborting due to 16 previous errors + diff --git a/tests/ui/unnested_or_patterns2.fixed b/tests/ui/unnested_or_patterns2.fixed new file mode 100644 index 0000000000000..02a129c55a3f5 --- /dev/null +++ b/tests/ui/unnested_or_patterns2.fixed @@ -0,0 +1,18 @@ +// run-rustfix + +#![feature(or_patterns)] +#![feature(box_patterns)] +#![warn(clippy::unnested_or_patterns)] +#![allow(clippy::cognitive_complexity, clippy::match_ref_pats)] +#![allow(unreachable_patterns, irrefutable_let_patterns, unused_variables)] + +fn main() { + if let Some(Some(0 | 1)) = None {} + if let Some(Some(0 | 1 | 2)) = None {} + if let Some(Some(0 | 1 | 2 | 3 | 4)) = None {} + if let Some(Some(0 | 1 | 2)) = None {} + if let ((0 | 1 | 2,),) = ((0,),) {} + if let 0 | 1 | 2 = 0 {} + if let box (0 | 1 | 2 | 3 | 4) = Box::new(0) {} + if let box box (0 | 2 | 4) = Box::new(Box::new(0)) {} +} diff --git a/tests/ui/unnested_or_patterns2.rs b/tests/ui/unnested_or_patterns2.rs new file mode 100644 index 0000000000000..acf3158989dcc --- /dev/null +++ b/tests/ui/unnested_or_patterns2.rs @@ -0,0 +1,18 @@ +// run-rustfix + +#![feature(or_patterns)] +#![feature(box_patterns)] +#![warn(clippy::unnested_or_patterns)] +#![allow(clippy::cognitive_complexity, clippy::match_ref_pats)] +#![allow(unreachable_patterns, irrefutable_let_patterns, unused_variables)] + +fn main() { + if let Some(Some(0)) | Some(Some(1)) = None {} + if let Some(Some(0)) | Some(Some(1) | Some(2)) = None {} + if let Some(Some(0 | 1) | Some(2)) | Some(Some(3) | Some(4)) = None {} + if let Some(Some(0) | Some(1 | 2)) = None {} + if let ((0,),) | ((1,) | (2,),) = ((0,),) {} + if let 0 | (1 | 2) = 0 {} + if let box (0 | 1) | (box 2 | box (3 | 4)) = Box::new(0) {} + if let box box 0 | box (box 2 | box 4) = Box::new(Box::new(0)) {} +} diff --git a/tests/ui/unnested_or_patterns2.stderr b/tests/ui/unnested_or_patterns2.stderr new file mode 100644 index 0000000000000..1847fd8e098c7 --- /dev/null +++ b/tests/ui/unnested_or_patterns2.stderr @@ -0,0 +1,91 @@ +error: unnested or-patterns + --> $DIR/unnested_or_patterns2.rs:10:12 + | +LL | if let Some(Some(0)) | Some(Some(1)) = None {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `-D clippy::unnested-or-patterns` implied by `-D warnings` +help: nest the patterns + | +LL | if let Some(Some(0 | 1)) = None {} + | ^^^^^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns2.rs:11:12 + | +LL | if let Some(Some(0)) | Some(Some(1) | Some(2)) = None {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let Some(Some(0 | 1 | 2)) = None {} + | ^^^^^^^^^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns2.rs:12:12 + | +LL | if let Some(Some(0 | 1) | Some(2)) | Some(Some(3) | Some(4)) = None {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let Some(Some(0 | 1 | 2 | 3 | 4)) = None {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns2.rs:13:12 + | +LL | if let Some(Some(0) | Some(1 | 2)) = None {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let Some(Some(0 | 1 | 2)) = None {} + | ^^^^^^^^^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns2.rs:14:12 + | +LL | if let ((0,),) | ((1,) | (2,),) = ((0,),) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let ((0 | 1 | 2,),) = ((0,),) {} + | ^^^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns2.rs:15:12 + | +LL | if let 0 | (1 | 2) = 0 {} + | ^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let 0 | 1 | 2 = 0 {} + | ^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns2.rs:16:12 + | +LL | if let box (0 | 1) | (box 2 | box (3 | 4)) = Box::new(0) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let box (0 | 1 | 2 | 3 | 4) = Box::new(0) {} + | ^^^^^^^^^^^^^^^^^^^^^^^ + +error: unnested or-patterns + --> $DIR/unnested_or_patterns2.rs:17:12 + | +LL | if let box box 0 | box (box 2 | box 4) = Box::new(Box::new(0)) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: nest the patterns + | +LL | if let box box (0 | 2 | 4) = Box::new(Box::new(0)) {} + | ^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 8 previous errors + diff --git a/tests/ui/vec_resize_to_zero.rs b/tests/ui/vec_resize_to_zero.rs new file mode 100644 index 0000000000000..0263e2f5f20c1 --- /dev/null +++ b/tests/ui/vec_resize_to_zero.rs @@ -0,0 +1,15 @@ +#![warn(clippy::vec_resize_to_zero)] + +fn main() { + // applicable here + vec![1, 2, 3, 4, 5].resize(0, 5); + + // not applicable + vec![1, 2, 3, 4, 5].resize(2, 5); + + // applicable here, but only implemented for integer litterals for now + vec!["foo", "bar", "baz"].resize(0, "bar"); + + // not applicable + vec!["foo", "bar", "baz"].resize(2, "bar") +} diff --git a/tests/ui/vec_resize_to_zero.stderr b/tests/ui/vec_resize_to_zero.stderr new file mode 100644 index 0000000000000..feb846298c656 --- /dev/null +++ b/tests/ui/vec_resize_to_zero.stderr @@ -0,0 +1,13 @@ +error: emptying a vector with `resize` + --> $DIR/vec_resize_to_zero.rs:5:5 + | +LL | vec![1, 2, 3, 4, 5].resize(0, 5); + | ^^^^^^^^^^^^^^^^^^^^------------ + | | + | help: ...or you can empty the vector with: `clear()` + | + = note: `-D clippy::vec-resize-to-zero` implied by `-D warnings` + = help: the arguments may be inverted... + +error: aborting due to previous error + diff --git a/tests/ui/wildcard_enum_match_arm.fixed b/tests/ui/wildcard_enum_match_arm.fixed index 2aa24ea1156aa..4f8754a930120 100644 --- a/tests/ui/wildcard_enum_match_arm.fixed +++ b/tests/ui/wildcard_enum_match_arm.fixed @@ -6,7 +6,8 @@ unused_variables, dead_code, clippy::single_match, - clippy::wildcard_in_or_patterns + clippy::wildcard_in_or_patterns, + clippy::unnested_or_patterns )] use std::io::ErrorKind; diff --git a/tests/ui/wildcard_enum_match_arm.rs b/tests/ui/wildcard_enum_match_arm.rs index 07c93feaf284e..5e66644ceca0f 100644 --- a/tests/ui/wildcard_enum_match_arm.rs +++ b/tests/ui/wildcard_enum_match_arm.rs @@ -6,7 +6,8 @@ unused_variables, dead_code, clippy::single_match, - clippy::wildcard_in_or_patterns + clippy::wildcard_in_or_patterns, + clippy::unnested_or_patterns )] use std::io::ErrorKind; diff --git a/tests/ui/wildcard_enum_match_arm.stderr b/tests/ui/wildcard_enum_match_arm.stderr index 7151a5c5770bf..e03b3be43ed23 100644 --- a/tests/ui/wildcard_enum_match_arm.stderr +++ b/tests/ui/wildcard_enum_match_arm.stderr @@ -1,5 +1,5 @@ error: wildcard match will miss any future added variants - --> $DIR/wildcard_enum_match_arm.rs:37:9 + --> $DIR/wildcard_enum_match_arm.rs:38:9 | LL | _ => eprintln!("Not red"), | ^ help: try this: `Color::Green | Color::Blue | Color::Rgb(..) | Color::Cyan` @@ -11,25 +11,25 @@ LL | #![deny(clippy::wildcard_enum_match_arm)] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: wildcard match will miss any future added variants - --> $DIR/wildcard_enum_match_arm.rs:41:9 + --> $DIR/wildcard_enum_match_arm.rs:42:9 | LL | _not_red => eprintln!("Not red"), | ^^^^^^^^ help: try this: `_not_red @ Color::Green | _not_red @ Color::Blue | _not_red @ Color::Rgb(..) | _not_red @ Color::Cyan` error: wildcard match will miss any future added variants - --> $DIR/wildcard_enum_match_arm.rs:45:9 + --> $DIR/wildcard_enum_match_arm.rs:46:9 | LL | not_red => format!("{:?}", not_red), | ^^^^^^^ help: try this: `not_red @ Color::Green | not_red @ Color::Blue | not_red @ Color::Rgb(..) | not_red @ Color::Cyan` error: wildcard match will miss any future added variants - --> $DIR/wildcard_enum_match_arm.rs:61:9 + --> $DIR/wildcard_enum_match_arm.rs:62:9 | LL | _ => "No red", | ^ help: try this: `Color::Red | Color::Green | Color::Blue | Color::Rgb(..) | Color::Cyan` error: match on non-exhaustive enum doesn't explicitly match all known variants - --> $DIR/wildcard_enum_match_arm.rs:78:9 + --> $DIR/wildcard_enum_match_arm.rs:79:9 | LL | _ => {}, | ^ help: try this: `std::io::ErrorKind::PermissionDenied | std::io::ErrorKind::ConnectionRefused | std::io::ErrorKind::ConnectionReset | std::io::ErrorKind::ConnectionAborted | std::io::ErrorKind::NotConnected | std::io::ErrorKind::AddrInUse | std::io::ErrorKind::AddrNotAvailable | std::io::ErrorKind::BrokenPipe | std::io::ErrorKind::AlreadyExists | std::io::ErrorKind::WouldBlock | std::io::ErrorKind::InvalidInput | std::io::ErrorKind::InvalidData | std::io::ErrorKind::TimedOut | std::io::ErrorKind::WriteZero | std::io::ErrorKind::Interrupted | std::io::ErrorKind::Other | std::io::ErrorKind::UnexpectedEof | _` From e521a4ed3818c02a1831db570e69d056c351ee05 Mon Sep 17 00:00:00 2001 From: Devin R Date: Sun, 7 Jun 2020 16:25:21 -0400 Subject: [PATCH 020/142] Add enough attrs to the test file so the fix compiles with no errors, fmt/`clippy` --- clippy_lints/src/macro_use.rs | 29 ++++++++++++++++------------- tests/ui/macro_use_imports.fixed | 2 ++ tests/ui/macro_use_imports.rs | 2 ++ tests/ui/macro_use_imports.stderr | 10 +++++----- 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/clippy_lints/src/macro_use.rs b/clippy_lints/src/macro_use.rs index 7e3ce07254f7a..b845b20d2c012 100644 --- a/clippy_lints/src/macro_use.rs +++ b/clippy_lints/src/macro_use.rs @@ -164,34 +164,37 @@ impl<'l, 'txc> LateLintPass<'l, 'txc> for MacroUseImports { let seg = import.split("::").collect::>(); match seg.as_slice() { - [] => unreachable!("this should never be empty"), - [_] => unreachable!("path must have two segments ?"), + // an empty path is impossible + // a path should always consist of 2 or more segments + [] | [_] => return, [root, item] => { if !check_dup.contains(&(*item).to_string()) { - used.entry((root.to_string(), span)) - .or_insert_with(|| vec![]) - .push(item.to_string()); - check_dup.push(item.to_string()); + used.entry(((*root).to_string(), span)) + .or_insert_with(Vec::new) + .push((*item).to_string()); + check_dup.push((*item).to_string()); } }, [root, rest @ ..] => { if rest.iter().all(|item| !check_dup.contains(&(*item).to_string())) { let filtered = rest .iter() - .filter_map(|item| if check_dup.contains(&(*item).to_string()) { - None - } else { - Some(item.to_string()) + .filter_map(|item| { + if check_dup.contains(&(*item).to_string()) { + None + } else { + Some((*item).to_string()) + } }) .collect::>(); used.entry(((*root).to_string(), span)) - .or_insert_with(|| vec![]) + .or_insert_with(Vec::new) .push(filtered.join("::")); check_dup.extend(filtered); } else { let rest = rest.to_vec(); - used.entry((root.to_string(), span)) - .or_insert_with(|| vec![]) + used.entry(((*root).to_string(), span)) + .or_insert_with(Vec::new) .push(rest.join("::")); check_dup.extend(rest.iter().map(ToString::to_string)); } diff --git a/tests/ui/macro_use_imports.fixed b/tests/ui/macro_use_imports.fixed index 8034c56b59adb..91e34c62160a1 100644 --- a/tests/ui/macro_use_imports.fixed +++ b/tests/ui/macro_use_imports.fixed @@ -2,7 +2,9 @@ // aux-build:macro_rules.rs // aux-build:macro_use_helper.rs // run-rustfix +// ignore-32bit +#![allow(unused_imports, unreachable_code, unused_variables, dead_code)] #![allow(clippy::single_component_path_imports)] #![warn(clippy::macro_use_imports)] diff --git a/tests/ui/macro_use_imports.rs b/tests/ui/macro_use_imports.rs index 7d415222d64fc..9c3c50c5d49f2 100644 --- a/tests/ui/macro_use_imports.rs +++ b/tests/ui/macro_use_imports.rs @@ -2,7 +2,9 @@ // aux-build:macro_rules.rs // aux-build:macro_use_helper.rs // run-rustfix +// ignore-32bit +#![allow(unused_imports, unreachable_code, unused_variables, dead_code)] #![allow(clippy::single_component_path_imports)] #![warn(clippy::macro_use_imports)] diff --git a/tests/ui/macro_use_imports.stderr b/tests/ui/macro_use_imports.stderr index 6feda8a52226b..f8c86c8d9179f 100644 --- a/tests/ui/macro_use_imports.stderr +++ b/tests/ui/macro_use_imports.stderr @@ -2,7 +2,7 @@ error: `macro_use` attributes are no longer needed in the Rust 2018 edition --> $DIR/macro_use_imports.rs:18:5 | LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mini_mac::ClippyMiniMacroTest;` + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{pub_macro, inner_mod_macro, function_macro, ty_macro, pub_in_private_macro};` | = note: `-D clippy::macro-use-imports` implied by `-D warnings` @@ -10,16 +10,16 @@ error: `macro_use` attributes are no longer needed in the Rust 2018 edition --> $DIR/macro_use_imports.rs:20:5 | LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{inner::foofoo, inner::try_err};` + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mini_mac::ClippyMiniMacroTest;` error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:16:5 + --> $DIR/macro_use_imports.rs:22:5 | LL | #[macro_use] - | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{pub_macro, inner_mod_macro, function_macro, ty_macro, pub_in_private_macro};` + | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{inner::foofoo, inner::try_err};` error: `macro_use` attributes are no longer needed in the Rust 2018 edition - --> $DIR/macro_use_imports.rs:22:5 + --> $DIR/macro_use_imports.rs:24:5 | LL | #[macro_use] | ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::inner::nested::string_add;` From a083b84b783a2c9e622c9d618e751da22adaff37 Mon Sep 17 00:00:00 2001 From: Eduardo Broto Date: Tue, 9 Jun 2020 23:49:21 +0200 Subject: [PATCH 021/142] if_same_then_else: don't assume multiplication is always commutative --- clippy_lints/src/utils/hir_utils.rs | 13 +++++-------- tests/ui/if_same_then_else.rs | 12 ++++++++++++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/clippy_lints/src/utils/hir_utils.rs b/clippy_lints/src/utils/hir_utils.rs index f8d197c15e8d6..6846658b6e29d 100644 --- a/clippy_lints/src/utils/hir_utils.rs +++ b/clippy_lints/src/utils/hir_utils.rs @@ -309,18 +309,15 @@ fn swap_binop<'a>( rhs: &'a Expr<'a>, ) -> Option<(BinOpKind, &'a Expr<'a>, &'a Expr<'a>)> { match binop { - BinOpKind::Add - | BinOpKind::Mul - | BinOpKind::Eq - | BinOpKind::Ne - | BinOpKind::BitAnd - | BinOpKind::BitXor - | BinOpKind::BitOr => Some((binop, rhs, lhs)), + BinOpKind::Add | BinOpKind::Eq | BinOpKind::Ne | BinOpKind::BitAnd | BinOpKind::BitXor | BinOpKind::BitOr => { + Some((binop, rhs, lhs)) + }, BinOpKind::Lt => Some((BinOpKind::Gt, rhs, lhs)), BinOpKind::Le => Some((BinOpKind::Ge, rhs, lhs)), BinOpKind::Ge => Some((BinOpKind::Le, rhs, lhs)), BinOpKind::Gt => Some((BinOpKind::Lt, rhs, lhs)), - BinOpKind::Shl + BinOpKind::Mul + | BinOpKind::Shl | BinOpKind::Shr | BinOpKind::Rem | BinOpKind::Sub diff --git a/tests/ui/if_same_then_else.rs b/tests/ui/if_same_then_else.rs index 6bbf79edfcf70..9c5fe02f7519b 100644 --- a/tests/ui/if_same_then_else.rs +++ b/tests/ui/if_same_then_else.rs @@ -142,4 +142,16 @@ fn func() { fn f(val: &[u8]) {} +mod issue_5698 { + fn mul_not_always_commutative(x: i32, y: i32) -> i32 { + if x == 42 { + x * y + } else if x == 21 { + y * x + } else { + 0 + } + } +} + fn main() {} From 2f74283fce768a262387fe7f51e1e4ebb9b0e300 Mon Sep 17 00:00:00 2001 From: Eduardo Broto Date: Wed, 10 Jun 2020 00:14:02 +0200 Subject: [PATCH 022/142] Add a comment linking to the issue --- clippy_lints/src/utils/hir_utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clippy_lints/src/utils/hir_utils.rs b/clippy_lints/src/utils/hir_utils.rs index 6846658b6e29d..9c2c96203c032 100644 --- a/clippy_lints/src/utils/hir_utils.rs +++ b/clippy_lints/src/utils/hir_utils.rs @@ -316,7 +316,7 @@ fn swap_binop<'a>( BinOpKind::Le => Some((BinOpKind::Ge, rhs, lhs)), BinOpKind::Ge => Some((BinOpKind::Le, rhs, lhs)), BinOpKind::Gt => Some((BinOpKind::Lt, rhs, lhs)), - BinOpKind::Mul + BinOpKind::Mul // Not always commutative, e.g. with matrices. See issue #5698 | BinOpKind::Shl | BinOpKind::Shr | BinOpKind::Rem From c9bd35cac3bb43dc15d3b8318fa9b6646b1b0aa7 Mon Sep 17 00:00:00 2001 From: Lzu Tao Date: Tue, 2 Jun 2020 07:59:11 +0000 Subject: [PATCH 023/142] Migrate to numeric associated consts --- clippy_lints/src/consts.rs | 10 ++--- clippy_lints/src/enum_clike.rs | 2 +- clippy_lints/src/types.rs | 52 ++++++++++++------------- tests/ui/cast.rs | 10 ++--- tests/ui/implicit_saturating_sub.rs | 14 +++---- tests/ui/implicit_saturating_sub.stderr | 14 +++---- 6 files changed, 51 insertions(+), 51 deletions(-) diff --git a/clippy_lints/src/consts.rs b/clippy_lints/src/consts.rs index 81ddc8c0067c7..22c5acca064e9 100644 --- a/clippy_lints/src/consts.rs +++ b/clippy_lints/src/consts.rs @@ -254,11 +254,11 @@ impl<'c, 'cc> ConstEvalLateContext<'c, 'cc> { if let ["core", "num", int_impl, "max_value"] = *def_path; then { let value = match int_impl { - "" => i8::max_value() as u128, - "" => i16::max_value() as u128, - "" => i32::max_value() as u128, - "" => i64::max_value() as u128, - "" => i128::max_value() as u128, + "" => i8::MAX as u128, + "" => i16::MAX as u128, + "" => i32::MAX as u128, + "" => i64::MAX as u128, + "" => i128::MAX as u128, _ => return None, }; Some(Constant::Int(value)) diff --git a/clippy_lints/src/enum_clike.rs b/clippy_lints/src/enum_clike.rs index a1fed3fb6e205..12b62f5cf9789 100644 --- a/clippy_lints/src/enum_clike.rs +++ b/clippy_lints/src/enum_clike.rs @@ -65,7 +65,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnportableVariant { continue; } }, - ty::Uint(UintTy::Usize) if val > u128::from(u32::max_value()) => {}, + ty::Uint(UintTy::Usize) if val > u128::from(u32::MAX) => {}, _ => continue, } span_lint( diff --git a/clippy_lints/src/types.rs b/clippy_lints/src/types.rs index bc5fe44b30f8f..a9d8c66f26189 100644 --- a/clippy_lints/src/types.rs +++ b/clippy_lints/src/types.rs @@ -1946,18 +1946,18 @@ fn detect_extreme_expr<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_ let which = match (&ty.kind, cv) { (&ty::Bool, Constant::Bool(false)) | (&ty::Uint(_), Constant::Int(0)) => Minimum, (&ty::Int(ity), Constant::Int(i)) - if i == unsext(cx.tcx, i128::min_value() >> (128 - int_bits(cx.tcx, ity)), ity) => + if i == unsext(cx.tcx, i128::MIN >> (128 - int_bits(cx.tcx, ity)), ity) => { Minimum }, (&ty::Bool, Constant::Bool(true)) => Maximum, (&ty::Int(ity), Constant::Int(i)) - if i == unsext(cx.tcx, i128::max_value() >> (128 - int_bits(cx.tcx, ity)), ity) => + if i == unsext(cx.tcx, i128::MAX >> (128 - int_bits(cx.tcx, ity)), ity) => { Maximum }, - (&ty::Uint(uty), Constant::Int(i)) if clip(cx.tcx, u128::max_value(), uty) == i => Maximum, + (&ty::Uint(uty), Constant::Int(i)) if clip(cx.tcx, u128::MAX, uty) == i => Maximum, _ => return None, }; @@ -2039,7 +2039,7 @@ impl FullInt { fn cmp_s_u(s: i128, u: u128) -> Ordering { if s < 0 { Ordering::Less - } else if u > (i128::max_value() as u128) { + } else if u > (i128::MAX as u128) { Ordering::Greater } else { (s as u128).cmp(&u) @@ -2084,48 +2084,48 @@ fn numeric_cast_precast_bounds<'a>(cx: &LateContext<'_, '_>, expr: &'a Expr<'_>) match pre_cast_ty.kind { ty::Int(int_ty) => Some(match int_ty { IntTy::I8 => ( - FullInt::S(i128::from(i8::min_value())), - FullInt::S(i128::from(i8::max_value())), + FullInt::S(i128::from(i8::MIN)), + FullInt::S(i128::from(i8::MAX)), ), IntTy::I16 => ( - FullInt::S(i128::from(i16::min_value())), - FullInt::S(i128::from(i16::max_value())), + FullInt::S(i128::from(i16::MIN)), + FullInt::S(i128::from(i16::MAX)), ), IntTy::I32 => ( - FullInt::S(i128::from(i32::min_value())), - FullInt::S(i128::from(i32::max_value())), + FullInt::S(i128::from(i32::MIN)), + FullInt::S(i128::from(i32::MAX)), ), IntTy::I64 => ( - FullInt::S(i128::from(i64::min_value())), - FullInt::S(i128::from(i64::max_value())), + FullInt::S(i128::from(i64::MIN)), + FullInt::S(i128::from(i64::MAX)), ), - IntTy::I128 => (FullInt::S(i128::min_value()), FullInt::S(i128::max_value())), + IntTy::I128 => (FullInt::S(i128::MIN), FullInt::S(i128::MAX)), IntTy::Isize => ( - FullInt::S(isize::min_value() as i128), - FullInt::S(isize::max_value() as i128), + FullInt::S(isize::MIN as i128), + FullInt::S(isize::MAX as i128), ), }), ty::Uint(uint_ty) => Some(match uint_ty { UintTy::U8 => ( - FullInt::U(u128::from(u8::min_value())), - FullInt::U(u128::from(u8::max_value())), + FullInt::U(u128::from(u8::MIN)), + FullInt::U(u128::from(u8::MAX)), ), UintTy::U16 => ( - FullInt::U(u128::from(u16::min_value())), - FullInt::U(u128::from(u16::max_value())), + FullInt::U(u128::from(u16::MIN)), + FullInt::U(u128::from(u16::MAX)), ), UintTy::U32 => ( - FullInt::U(u128::from(u32::min_value())), - FullInt::U(u128::from(u32::max_value())), + FullInt::U(u128::from(u32::MIN)), + FullInt::U(u128::from(u32::MAX)), ), UintTy::U64 => ( - FullInt::U(u128::from(u64::min_value())), - FullInt::U(u128::from(u64::max_value())), + FullInt::U(u128::from(u64::MIN)), + FullInt::U(u128::from(u64::MAX)), ), - UintTy::U128 => (FullInt::U(u128::min_value()), FullInt::U(u128::max_value())), + UintTy::U128 => (FullInt::U(u128::MIN), FullInt::U(u128::MAX)), UintTy::Usize => ( - FullInt::U(usize::min_value() as u128), - FullInt::U(usize::max_value() as u128), + FullInt::U(usize::MIN as u128), + FullInt::U(usize::MAX as u128), ), }), _ => None, diff --git a/tests/ui/cast.rs b/tests/ui/cast.rs index 7e0b211d862ca..8ee0969b0f076 100644 --- a/tests/ui/cast.rs +++ b/tests/ui/cast.rs @@ -37,11 +37,11 @@ fn main() { 1isize as usize; -1isize as usize; 0i8 as u8; - i8::max_value() as u8; - i16::max_value() as u16; - i32::max_value() as u32; - i64::max_value() as u64; - i128::max_value() as u128; + i8::MAX as u8; + i16::MAX as u16; + i32::MAX as u32; + i64::MAX as u64; + i128::MAX as u128; (-1i8).abs() as u8; (-1i16).abs() as u16; diff --git a/tests/ui/implicit_saturating_sub.rs b/tests/ui/implicit_saturating_sub.rs index 24cb216e79bf3..2f32a7b157821 100644 --- a/tests/ui/implicit_saturating_sub.rs +++ b/tests/ui/implicit_saturating_sub.rs @@ -110,7 +110,7 @@ fn main() { } // Lint - if i_8 > i8::min_value() { + if i_8 > i8::MIN { i_8 -= 1; } @@ -120,7 +120,7 @@ fn main() { } // Lint - if i_8 != i8::min_value() { + if i_8 != i8::MIN { i_8 -= 1; } @@ -135,7 +135,7 @@ fn main() { } // Lint - if i_16 > i16::min_value() { + if i_16 > i16::MIN { i_16 -= 1; } @@ -145,7 +145,7 @@ fn main() { } // Lint - if i_16 != i16::min_value() { + if i_16 != i16::MIN { i_16 -= 1; } @@ -160,7 +160,7 @@ fn main() { } // Lint - if i_32 > i32::min_value() { + if i_32 > i32::MIN { i_32 -= 1; } @@ -170,7 +170,7 @@ fn main() { } // Lint - if i_32 != i32::min_value() { + if i_32 != i32::MIN { i_32 -= 1; } @@ -180,7 +180,7 @@ fn main() { let mut i_64: i64 = endi_64 - starti_64; // Lint - if i64::min_value() < i_64 { + if i64::MIN < i_64 { i_64 -= 1; } diff --git a/tests/ui/implicit_saturating_sub.stderr b/tests/ui/implicit_saturating_sub.stderr index a8ba870b1dda6..2eb2023b3b9ef 100644 --- a/tests/ui/implicit_saturating_sub.stderr +++ b/tests/ui/implicit_saturating_sub.stderr @@ -75,7 +75,7 @@ LL | | } error: Implicitly performing saturating subtraction --> $DIR/implicit_saturating_sub.rs:113:5 | -LL | / if i_8 > i8::min_value() { +LL | / if i_8 > i8::MIN { LL | | i_8 -= 1; LL | | } | |_____^ help: try: `i_8 = i_8.saturating_sub(1);` @@ -91,7 +91,7 @@ LL | | } error: Implicitly performing saturating subtraction --> $DIR/implicit_saturating_sub.rs:123:5 | -LL | / if i_8 != i8::min_value() { +LL | / if i_8 != i8::MIN { LL | | i_8 -= 1; LL | | } | |_____^ help: try: `i_8 = i_8.saturating_sub(1);` @@ -107,7 +107,7 @@ LL | | } error: Implicitly performing saturating subtraction --> $DIR/implicit_saturating_sub.rs:138:5 | -LL | / if i_16 > i16::min_value() { +LL | / if i_16 > i16::MIN { LL | | i_16 -= 1; LL | | } | |_____^ help: try: `i_16 = i_16.saturating_sub(1);` @@ -123,7 +123,7 @@ LL | | } error: Implicitly performing saturating subtraction --> $DIR/implicit_saturating_sub.rs:148:5 | -LL | / if i_16 != i16::min_value() { +LL | / if i_16 != i16::MIN { LL | | i_16 -= 1; LL | | } | |_____^ help: try: `i_16 = i_16.saturating_sub(1);` @@ -139,7 +139,7 @@ LL | | } error: Implicitly performing saturating subtraction --> $DIR/implicit_saturating_sub.rs:163:5 | -LL | / if i_32 > i32::min_value() { +LL | / if i_32 > i32::MIN { LL | | i_32 -= 1; LL | | } | |_____^ help: try: `i_32 = i_32.saturating_sub(1);` @@ -155,7 +155,7 @@ LL | | } error: Implicitly performing saturating subtraction --> $DIR/implicit_saturating_sub.rs:173:5 | -LL | / if i_32 != i32::min_value() { +LL | / if i_32 != i32::MIN { LL | | i_32 -= 1; LL | | } | |_____^ help: try: `i_32 = i_32.saturating_sub(1);` @@ -163,7 +163,7 @@ LL | | } error: Implicitly performing saturating subtraction --> $DIR/implicit_saturating_sub.rs:183:5 | -LL | / if i64::min_value() < i_64 { +LL | / if i64::MIN < i_64 { LL | | i_64 -= 1; LL | | } | |_____^ help: try: `i_64 = i_64.saturating_sub(1);` From 6b3ee8f6000ea0fe88d1d19bceac9441a43d8694 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Tue, 9 Jun 2020 17:44:04 -0400 Subject: [PATCH 024/142] Update Clippy for MethodCall changes --- clippy_lints/src/atomic_ordering.rs | 2 +- clippy_lints/src/booleans.rs | 2 +- clippy_lints/src/bytecount.rs | 6 ++--- clippy_lints/src/dereference.rs | 2 +- clippy_lints/src/double_parens.rs | 2 +- clippy_lints/src/duration_subsec.rs | 2 +- clippy_lints/src/entry.rs | 4 ++-- clippy_lints/src/eta_reduction.rs | 4 ++-- clippy_lints/src/explicit_write.rs | 4 ++-- clippy_lints/src/floating_point_arithmetic.rs | 4 ++-- clippy_lints/src/format.rs | 2 +- clippy_lints/src/functions.rs | 4 ++-- clippy_lints/src/get_last_with_len.rs | 4 ++-- clippy_lints/src/if_let_mutex.rs | 2 +- clippy_lints/src/if_let_some_result.rs | 2 +- clippy_lints/src/infinite_iter.rs | 4 ++-- clippy_lints/src/len_zero.rs | 2 +- clippy_lints/src/loops.rs | 22 +++++++++---------- clippy_lints/src/map_clone.rs | 4 ++-- clippy_lints/src/map_unit_fn.rs | 2 +- clippy_lints/src/methods/mod.rs | 16 +++++++------- clippy_lints/src/misc.rs | 4 ++-- clippy_lints/src/mut_reference.rs | 2 +- clippy_lints/src/open_options.rs | 4 ++-- clippy_lints/src/option_env_unwrap.rs | 2 +- clippy_lints/src/path_buf_push_overwrite.rs | 2 +- clippy_lints/src/precedence.rs | 2 +- clippy_lints/src/ptr_offset_with_cast.rs | 2 +- clippy_lints/src/question_mark.rs | 2 +- clippy_lints/src/ranges.rs | 6 ++--- .../src/redundant_pattern_matching.rs | 2 +- .../src/slow_vector_initialization.rs | 6 ++--- clippy_lints/src/strings.rs | 2 +- clippy_lints/src/to_digit_is_some.rs | 4 ++-- clippy_lints/src/types.rs | 6 ++--- clippy_lints/src/unused_io_amount.rs | 4 ++-- clippy_lints/src/unwrap.rs | 4 ++-- clippy_lints/src/useless_conversion.rs | 2 +- clippy_lints/src/utils/author.rs | 4 ++-- clippy_lints/src/utils/hir_utils.rs | 4 ++-- clippy_lints/src/utils/inspector.rs | 2 +- clippy_lints/src/utils/internal_lints.rs | 4 ++-- clippy_lints/src/utils/mod.rs | 6 ++--- clippy_lints/src/utils/ptr.rs | 2 +- clippy_lints/src/verbose_file_reads.rs | 4 ++-- 45 files changed, 89 insertions(+), 89 deletions(-) diff --git a/clippy_lints/src/atomic_ordering.rs b/clippy_lints/src/atomic_ordering.rs index 73b4cef472505..fca9aaaff9dce 100644 --- a/clippy_lints/src/atomic_ordering.rs +++ b/clippy_lints/src/atomic_ordering.rs @@ -70,7 +70,7 @@ fn match_ordering_def_path(cx: &LateContext<'_, '_>, did: DefId, orderings: &[&s fn check_atomic_load_store(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { if_chain! { - if let ExprKind::MethodCall(ref method_path, _, args) = &expr.kind; + if let ExprKind::MethodCall(ref method_path, _, args, _) = &expr.kind; let method = method_path.ident.name.as_str(); if type_is_atomic(cx, &args[0]); if method == "load" || method == "store"; diff --git a/clippy_lints/src/booleans.rs b/clippy_lints/src/booleans.rs index 8031052e073d5..f92c564543b89 100644 --- a/clippy_lints/src/booleans.rs +++ b/clippy_lints/src/booleans.rs @@ -247,7 +247,7 @@ fn simplify_not(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> Option { )) }) }, - ExprKind::MethodCall(path, _, args) if args.len() == 1 => { + ExprKind::MethodCall(path, _, args, _) if args.len() == 1 => { let type_of_receiver = cx.tables.expr_ty(&args[0]); if !is_type_diagnostic_item(cx, type_of_receiver, sym!(option_type)) && !is_type_diagnostic_item(cx, type_of_receiver, sym!(result_type)) diff --git a/clippy_lints/src/bytecount.rs b/clippy_lints/src/bytecount.rs index 90c00ad098ffe..531531a654d0e 100644 --- a/clippy_lints/src/bytecount.rs +++ b/clippy_lints/src/bytecount.rs @@ -38,10 +38,10 @@ declare_lint_pass!(ByteCount => [NAIVE_BYTECOUNT]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ByteCount { fn check_expr(&mut self, cx: &LateContext<'_, '_>, expr: &Expr<'_>) { if_chain! { - if let ExprKind::MethodCall(ref count, _, ref count_args) = expr.kind; + if let ExprKind::MethodCall(ref count, _, ref count_args, _) = expr.kind; if count.ident.name == sym!(count); if count_args.len() == 1; - if let ExprKind::MethodCall(ref filter, _, ref filter_args) = count_args[0].kind; + if let ExprKind::MethodCall(ref filter, _, ref filter_args, _) = count_args[0].kind; if filter.ident.name == sym!(filter); if filter_args.len() == 2; if let ExprKind::Closure(_, _, body_id, _, _) = filter_args[1].kind; @@ -66,7 +66,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ByteCount { if ty::Uint(UintTy::U8) != walk_ptrs_ty(cx.tables.expr_ty(needle)).kind { return; } - let haystack = if let ExprKind::MethodCall(ref path, _, ref args) = + let haystack = if let ExprKind::MethodCall(ref path, _, ref args, _) = filter_args[0].kind { let p = path.ident.name; if (p == sym!(iter) || p == sym!(iter_mut)) && args.len() == 1 { diff --git a/clippy_lints/src/dereference.rs b/clippy_lints/src/dereference.rs index 68ec07e2bcb0f..1cd30ae2c6381 100644 --- a/clippy_lints/src/dereference.rs +++ b/clippy_lints/src/dereference.rs @@ -42,7 +42,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Dereferencing { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) { if_chain! { if !expr.span.from_expansion(); - if let ExprKind::MethodCall(ref method_name, _, ref args) = &expr.kind; + if let ExprKind::MethodCall(ref method_name, _, ref args, _) = &expr.kind; if args.len() == 1; then { diff --git a/clippy_lints/src/double_parens.rs b/clippy_lints/src/double_parens.rs index 05517f6f9f0cc..1eb380a22cc6b 100644 --- a/clippy_lints/src/double_parens.rs +++ b/clippy_lints/src/double_parens.rs @@ -70,7 +70,7 @@ impl EarlyLintPass for DoubleParens { } } }, - ExprKind::MethodCall(_, ref params) => { + ExprKind::MethodCall(_, ref params, _) => { if params.len() == 2 { let param = ¶ms[1]; if let ExprKind::Paren(_) = param.kind { diff --git a/clippy_lints/src/duration_subsec.rs b/clippy_lints/src/duration_subsec.rs index afefa2506381b..7171dcef968c1 100644 --- a/clippy_lints/src/duration_subsec.rs +++ b/clippy_lints/src/duration_subsec.rs @@ -42,7 +42,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for DurationSubsec { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) { if_chain! { if let ExprKind::Binary(Spanned { node: BinOpKind::Div, .. }, ref left, ref right) = expr.kind; - if let ExprKind::MethodCall(ref method_path, _ , ref args) = left.kind; + if let ExprKind::MethodCall(ref method_path, _ , ref args, _) = left.kind; if match_type(cx, walk_ptrs_ty(cx.tables.expr_ty(&args[0])), &paths::DURATION); if let Some((Constant::Int(divisor), _)) = constant(cx, cx.tables, right); then { diff --git a/clippy_lints/src/entry.rs b/clippy_lints/src/entry.rs index 7b332c761a0c4..f625058b6703c 100644 --- a/clippy_lints/src/entry.rs +++ b/clippy_lints/src/entry.rs @@ -103,7 +103,7 @@ fn check_cond<'a, 'tcx, 'b>( check: &'b Expr<'b>, ) -> Option<(&'static str, &'b Expr<'b>, &'b Expr<'b>)> { if_chain! { - if let ExprKind::MethodCall(ref path, _, ref params) = check.kind; + if let ExprKind::MethodCall(ref path, _, ref params, _) = check.kind; if params.len() >= 2; if path.ident.name == sym!(contains_key); if let ExprKind::AddrOf(BorrowKind::Ref, _, ref key) = params[1].kind; @@ -140,7 +140,7 @@ impl<'a, 'tcx, 'b> Visitor<'tcx> for InsertVisitor<'a, 'tcx, 'b> { fn visit_expr(&mut self, expr: &'tcx Expr<'_>) { if_chain! { - if let ExprKind::MethodCall(ref path, _, ref params) = expr.kind; + if let ExprKind::MethodCall(ref path, _, ref params, _) = expr.kind; if params.len() == 3; if path.ident.name == sym!(insert); if get_item_name(self.cx, self.map) == get_item_name(self.cx, ¶ms[0]); diff --git a/clippy_lints/src/eta_reduction.rs b/clippy_lints/src/eta_reduction.rs index d093025fd3d7a..a889856de2742 100644 --- a/clippy_lints/src/eta_reduction.rs +++ b/clippy_lints/src/eta_reduction.rs @@ -71,7 +71,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for EtaReduction { } match expr.kind { - ExprKind::Call(_, args) | ExprKind::MethodCall(_, _, args) => { + ExprKind::Call(_, args) | ExprKind::MethodCall(_, _, args, _) => { for arg in args { check_closure(cx, arg) } @@ -120,7 +120,7 @@ fn check_closure(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { ); if_chain!( - if let ExprKind::MethodCall(ref path, _, ref args) = ex.kind; + if let ExprKind::MethodCall(ref path, _, ref args, _) = ex.kind; // Not the same number of arguments, there is no way the closure is the same as the function return; if args.len() == decl.inputs.len(); diff --git a/clippy_lints/src/explicit_write.rs b/clippy_lints/src/explicit_write.rs index 320121b277140..7269e2b52c2ce 100644 --- a/clippy_lints/src/explicit_write.rs +++ b/clippy_lints/src/explicit_write.rs @@ -32,11 +32,11 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ExplicitWrite { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) { if_chain! { // match call to unwrap - if let ExprKind::MethodCall(ref unwrap_fun, _, ref unwrap_args) = expr.kind; + if let ExprKind::MethodCall(ref unwrap_fun, _, ref unwrap_args, _) = expr.kind; if unwrap_fun.ident.name == sym!(unwrap); // match call to write_fmt if !unwrap_args.is_empty(); - if let ExprKind::MethodCall(ref write_fun, _, write_args) = + if let ExprKind::MethodCall(ref write_fun, _, write_args, _) = unwrap_args[0].kind; if write_fun.ident.name == sym!(write_fmt); // match calls to std::io::stdout() / std::io::stderr () diff --git a/clippy_lints/src/floating_point_arithmetic.rs b/clippy_lints/src/floating_point_arithmetic.rs index 3a912d928375d..ad4f66c52c2c8 100644 --- a/clippy_lints/src/floating_point_arithmetic.rs +++ b/clippy_lints/src/floating_point_arithmetic.rs @@ -301,7 +301,7 @@ fn check_expm1(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { if cx.tables.expr_ty(lhs).is_floating_point(); if let Some((value, _)) = constant(cx, cx.tables, rhs); if F32(1.0) == value || F64(1.0) == value; - if let ExprKind::MethodCall(ref path, _, ref method_args) = lhs.kind; + if let ExprKind::MethodCall(ref path, _, ref method_args, _) = lhs.kind; if cx.tables.expr_ty(&method_args[0]).is_floating_point(); if path.ident.name.as_str() == "exp"; then { @@ -481,7 +481,7 @@ fn check_custom_abs(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { impl<'a, 'tcx> LateLintPass<'a, 'tcx> for FloatingPointArithmetic { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) { - if let ExprKind::MethodCall(ref path, _, args) = &expr.kind { + if let ExprKind::MethodCall(ref path, _, args, _) = &expr.kind { let recv_ty = cx.tables.expr_ty(&args[0]); if recv_ty.is_floating_point() { diff --git a/clippy_lints/src/format.rs b/clippy_lints/src/format.rs index 1530538aa7d13..4cae5ca2c4326 100644 --- a/clippy_lints/src/format.rs +++ b/clippy_lints/src/format.rs @@ -104,7 +104,7 @@ fn on_argumentv1_new<'a, 'tcx>( } } else { let snip = snippet(cx, format_args.span, ""); - if let ExprKind::MethodCall(ref path, _, _) = format_args.kind { + if let ExprKind::MethodCall(ref path, _, _, _) = format_args.kind { if path.ident.name == sym!(to_string) { return Some(format!("{}", snip)); } diff --git a/clippy_lints/src/functions.rs b/clippy_lints/src/functions.rs index 325b6cf32a3d2..991d129e8f0d6 100644 --- a/clippy_lints/src/functions.rs +++ b/clippy_lints/src/functions.rs @@ -556,7 +556,7 @@ impl<'a, 'tcx> intravisit::Visitor<'tcx> for DerefVisitor<'a, 'tcx> { } } }, - hir::ExprKind::MethodCall(_, _, args) => { + hir::ExprKind::MethodCall(_, _, args, _) => { let def_id = self.tables.type_dependent_def_id(expr.hir_id).unwrap(); let base_type = self.cx.tcx.type_of(def_id); @@ -610,7 +610,7 @@ impl<'a, 'tcx> intravisit::Visitor<'tcx> for StaticMutVisitor<'a, 'tcx> { return; } match expr.kind { - Call(_, args) | MethodCall(_, _, args) => { + Call(_, args) | MethodCall(_, _, args, _) => { let mut tys = FxHashSet::default(); for arg in args { let def_id = arg.hir_id.owner.to_def_id(); diff --git a/clippy_lints/src/get_last_with_len.rs b/clippy_lints/src/get_last_with_len.rs index c32e0a2290d12..3629ba623ce43 100644 --- a/clippy_lints/src/get_last_with_len.rs +++ b/clippy_lints/src/get_last_with_len.rs @@ -47,7 +47,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for GetLastWithLen { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) { if_chain! { // Is a method call - if let ExprKind::MethodCall(ref path, _, ref args) = expr.kind; + if let ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind; // Method name is "get" if path.ident.name == sym!(get); @@ -69,7 +69,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for GetLastWithLen { ) = &get_index_arg.kind; // LHS of subtraction is "x.len()" - if let ExprKind::MethodCall(arg_lhs_path, _, lhs_args) = &lhs.kind; + if let ExprKind::MethodCall(arg_lhs_path, _, lhs_args, _) = &lhs.kind; if arg_lhs_path.ident.name == sym!(len); if let Some(arg_lhs_struct) = lhs_args.get(0); diff --git a/clippy_lints/src/if_let_mutex.rs b/clippy_lints/src/if_let_mutex.rs index ae92a96d16347..04d17c91d63c1 100644 --- a/clippy_lints/src/if_let_mutex.rs +++ b/clippy_lints/src/if_let_mutex.rs @@ -147,7 +147,7 @@ impl<'tcx, 'l> ArmVisitor<'tcx, 'l> { fn is_mutex_lock_call<'a>(cx: &LateContext<'a, '_>, expr: &'a Expr<'_>) -> Option<&'a Expr<'a>> { if_chain! { - if let ExprKind::MethodCall(path, _span, args) = &expr.kind; + if let ExprKind::MethodCall(path, _span, args, _) = &expr.kind; if path.ident.to_string() == "lock"; let ty = cx.tables.expr_ty(&args[0]); if is_type_diagnostic_item(cx, ty, sym!(mutex_type)); diff --git a/clippy_lints/src/if_let_some_result.rs b/clippy_lints/src/if_let_some_result.rs index 9b13f7609247a..6a1fcdd1ce445 100644 --- a/clippy_lints/src/if_let_some_result.rs +++ b/clippy_lints/src/if_let_some_result.rs @@ -42,7 +42,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for OkIfLet { if_chain! { //begin checking variables if let ExprKind::Match(ref op, ref body, source) = expr.kind; //test if expr is a match if let MatchSource::IfLetDesugar { .. } = source; //test if it is an If Let - if let ExprKind::MethodCall(_, ok_span, ref result_types) = op.kind; //check is expr.ok() has type Result.ok() + if let ExprKind::MethodCall(_, ok_span, ref result_types, _) = op.kind; //check is expr.ok() has type Result.ok(, _) if let PatKind::TupleStruct(QPath::Resolved(_, ref x), ref y, _) = body[0].pat.kind; //get operation if method_chain_args(op, &["ok"]).is_some(); //test to see if using ok() methoduse std::marker::Sized; if is_type_diagnostic_item(cx, cx.tables.expr_ty(&result_types[0]), sym!(result_type)); diff --git a/clippy_lints/src/infinite_iter.rs b/clippy_lints/src/infinite_iter.rs index cd989c0ea6f67..a860a9def2422 100644 --- a/clippy_lints/src/infinite_iter.rs +++ b/clippy_lints/src/infinite_iter.rs @@ -142,7 +142,7 @@ const HEURISTICS: [(&str, usize, Heuristic, Finiteness); 19] = [ fn is_infinite(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> Finiteness { match expr.kind { - ExprKind::MethodCall(ref method, _, ref args) => { + ExprKind::MethodCall(ref method, _, ref args, _) => { for &(name, len, heuristic, cap) in &HEURISTICS { if method.ident.name.as_str() == name && args.len() == len { return (match heuristic { @@ -218,7 +218,7 @@ const INFINITE_COLLECTORS: [&[&str]; 8] = [ fn complete_infinite_iter(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> Finiteness { match expr.kind { - ExprKind::MethodCall(ref method, _, ref args) => { + ExprKind::MethodCall(ref method, _, ref args, _) => { for &(name, len) in &COMPLETING_METHODS { if method.ident.name.as_str() == name && args.len() == len { return is_infinite(cx, &args[0]); diff --git a/clippy_lints/src/len_zero.rs b/clippy_lints/src/len_zero.rs index f5bfede75a761..13e85fda8ffeb 100644 --- a/clippy_lints/src/len_zero.rs +++ b/clippy_lints/src/len_zero.rs @@ -211,7 +211,7 @@ fn check_impl_items(cx: &LateContext<'_, '_>, item: &Item<'_>, impl_items: &[Imp } fn check_cmp(cx: &LateContext<'_, '_>, span: Span, method: &Expr<'_>, lit: &Expr<'_>, op: &str, compare_to: u32) { - if let (&ExprKind::MethodCall(ref method_path, _, ref args), &ExprKind::Lit(ref lit)) = (&method.kind, &lit.kind) { + if let (&ExprKind::MethodCall(ref method_path, _, ref args, _), &ExprKind::Lit(ref lit)) = (&method.kind, &lit.kind) { // check if we are in an is_empty() method if let Some(name) = get_item_name(cx, method) { if name.as_str() == "is_empty" { diff --git a/clippy_lints/src/loops.rs b/clippy_lints/src/loops.rs index 57c62d739640f..771bc8d055825 100644 --- a/clippy_lints/src/loops.rs +++ b/clippy_lints/src/loops.rs @@ -526,7 +526,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Loops { let pat = &arms[0].pat.kind; if let ( &PatKind::TupleStruct(ref qpath, ref pat_args, _), - &ExprKind::MethodCall(ref method_path, _, ref method_args), + &ExprKind::MethodCall(ref method_path, _, ref method_args, _), ) = (pat, &match_expr.kind) { let iter_expr = &method_args[0]; @@ -654,7 +654,7 @@ fn never_loop_expr(expr: &Expr<'_>, main_loop_id: HirId) -> NeverLoopResult { | ExprKind::Struct(_, _, Some(ref e)) | ExprKind::Repeat(ref e, _) | ExprKind::DropTemps(ref e) => never_loop_expr(e, main_loop_id), - ExprKind::Array(ref es) | ExprKind::MethodCall(_, _, ref es) | ExprKind::Tup(ref es) => { + ExprKind::Array(ref es) | ExprKind::MethodCall(_, _, ref es, _) | ExprKind::Tup(ref es) => { never_loop_expr_all(&mut es.iter(), main_loop_id) }, ExprKind::Call(ref e, ref es) => never_loop_expr_all(&mut once(&**e).chain(es.iter()), main_loop_id), @@ -806,7 +806,7 @@ fn is_slice_like<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, ty: Ty<'_>) -> bool { fn fetch_cloned_expr<'tcx>(expr: &'tcx Expr<'tcx>) -> &'tcx Expr<'tcx> { if_chain! { - if let ExprKind::MethodCall(method, _, args) = expr.kind; + if let ExprKind::MethodCall(method, _, args, _) = expr.kind; if method.ident.name == sym!(clone); if args.len() == 1; if let Some(arg) = args.get(0); @@ -915,7 +915,7 @@ fn build_manual_memcpy_suggestion<'a, 'tcx>( let print_limit = |end: &Expr<'_>, offset: Offset, var: &Expr<'_>| { if_chain! { - if let ExprKind::MethodCall(method, _, len_args) = end.kind; + if let ExprKind::MethodCall(method, _, len_args, _) = end.kind; if method.ident.name == sym!(len); if len_args.len() == 1; if let Some(arg) = len_args.get(0); @@ -1190,7 +1190,7 @@ fn check_for_loop_range<'a, 'tcx>( fn is_len_call(expr: &Expr<'_>, var: Name) -> bool { if_chain! { - if let ExprKind::MethodCall(ref method, _, ref len_args) = expr.kind; + if let ExprKind::MethodCall(ref method, _, ref len_args, _) = expr.kind; if len_args.len() == 1; if method.ident.name == sym!(len); if let ExprKind::Path(QPath::Resolved(_, ref path)) = len_args[0].kind; @@ -1244,7 +1244,7 @@ fn lint_iter_method(cx: &LateContext<'_, '_>, args: &[Expr<'_>], arg: &Expr<'_>, fn check_for_loop_arg(cx: &LateContext<'_, '_>, pat: &Pat<'_>, arg: &Expr<'_>, expr: &Expr<'_>) { let mut next_loop_linted = false; // whether or not ITER_NEXT_LOOP lint was used - if let ExprKind::MethodCall(ref method, _, ref args) = arg.kind { + if let ExprKind::MethodCall(ref method, _, ref args, _) = arg.kind { // just the receiver, no arguments if args.len() == 1 { let method_name = &*method.ident.as_str(); @@ -1718,7 +1718,7 @@ impl<'a, 'tcx> Visitor<'tcx> for VarVisitor<'a, 'tcx> { fn visit_expr(&mut self, expr: &'tcx Expr<'_>) { if_chain! { // a range index op - if let ExprKind::MethodCall(ref meth, _, ref args) = expr.kind; + if let ExprKind::MethodCall(ref meth, _, ref args, _) = expr.kind; if (meth.ident.name == sym!(index) && match_trait_method(self.cx, expr, &paths::INDEX)) || (meth.ident.name == sym!(index_mut) && match_trait_method(self.cx, expr, &paths::INDEX_MUT)); if !self.check(&args[1], &args[0], expr); @@ -1776,7 +1776,7 @@ impl<'a, 'tcx> Visitor<'tcx> for VarVisitor<'a, 'tcx> { self.visit_expr(expr); } }, - ExprKind::MethodCall(_, _, args) => { + ExprKind::MethodCall(_, _, args, _) => { let def_id = self.cx.tables.type_dependent_def_id(expr.hir_id).unwrap(); for (ty, expr) in self.cx.tcx.fn_sig(def_id).inputs().skip_binder().iter().zip(args) { self.prefer_mutable = false; @@ -2369,8 +2369,8 @@ const NEEDLESS_COLLECT_MSG: &str = "avoid using `collect()` when not needed"; fn check_needless_collect<'a, 'tcx>(expr: &'tcx Expr<'_>, cx: &LateContext<'a, 'tcx>) { if_chain! { - if let ExprKind::MethodCall(ref method, _, ref args) = expr.kind; - if let ExprKind::MethodCall(ref chain_method, _, _) = args[0].kind; + if let ExprKind::MethodCall(ref method, _, ref args, _) = expr.kind; + if let ExprKind::MethodCall(ref chain_method, _, _, _) = args[0].kind; if chain_method.ident.name == sym!(collect) && match_trait_method(cx, &args[0], &paths::ITERATOR); if let Some(ref generic_args) = chain_method.args; if let Some(GenericArg::Type(ref ty)) = generic_args.args.get(0); @@ -2437,7 +2437,7 @@ fn check_needless_collect<'a, 'tcx>(expr: &'tcx Expr<'_>, cx: &LateContext<'a, ' fn shorten_span(expr: &Expr<'_>, target_fn_name: Symbol) -> Span { let mut current_expr = expr; - while let ExprKind::MethodCall(ref path, ref span, ref args) = current_expr.kind { + while let ExprKind::MethodCall(ref path, ref span, ref args, _) = current_expr.kind { if path.ident.name == target_fn_name { return expr.span.with_lo(span.lo()); } diff --git a/clippy_lints/src/map_clone.rs b/clippy_lints/src/map_clone.rs index d5adf6b0f0dcb..8f4fdc685ef38 100644 --- a/clippy_lints/src/map_clone.rs +++ b/clippy_lints/src/map_clone.rs @@ -49,7 +49,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MapClone { } if_chain! { - if let hir::ExprKind::MethodCall(ref method, _, ref args) = e.kind; + if let hir::ExprKind::MethodCall(ref method, _, ref args, _) = e.kind; if args.len() == 2; if method.ident.as_str() == "map"; let ty = cx.tables.expr_ty(&args[0]); @@ -75,7 +75,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MapClone { } } }, - hir::ExprKind::MethodCall(ref method, _, ref obj) => { + hir::ExprKind::MethodCall(ref method, _, ref obj, _) => { if ident_eq(name, &obj[0]) && method.ident.as_str() == "clone" && match_trait_method(cx, closure_expr, &paths::CLONE_TRAIT) { diff --git a/clippy_lints/src/map_unit_fn.rs b/clippy_lints/src/map_unit_fn.rs index fecd91c7814dc..8f4b674c04f49 100644 --- a/clippy_lints/src/map_unit_fn.rs +++ b/clippy_lints/src/map_unit_fn.rs @@ -125,7 +125,7 @@ fn reduce_unit_expression<'a>(cx: &LateContext<'_, '_>, expr: &'a hir::Expr<'_>) } match expr.kind { - hir::ExprKind::Call(_, _) | hir::ExprKind::MethodCall(_, _, _) => { + hir::ExprKind::Call(_, _) | hir::ExprKind::MethodCall(_, _, _, _) => { // Calls can't be reduced any more Some(expr.span) }, diff --git a/clippy_lints/src/methods/mod.rs b/clippy_lints/src/methods/mod.rs index 214cf0c130f21..f25a9782813bb 100644 --- a/clippy_lints/src/methods/mod.rs +++ b/clippy_lints/src/methods/mod.rs @@ -1429,7 +1429,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Methods { } match expr.kind { - hir::ExprKind::MethodCall(ref method_call, ref method_span, ref args) => { + hir::ExprKind::MethodCall(ref method_call, ref method_span, ref args, _) => { lint_or_fun_call(cx, expr, *method_span, &method_call.ident.as_str(), args); lint_expect_fun_call(cx, expr, *method_span, &method_call.ident.as_str(), args); @@ -1677,7 +1677,7 @@ fn lint_or_fun_call<'a, 'tcx>( or_has_args: bool, span: Span, ) { - if let hir::ExprKind::MethodCall(ref path, _, ref args) = &arg.kind { + if let hir::ExprKind::MethodCall(ref path, _, ref args, _) = &arg.kind { if path.ident.as_str() == "len" { let ty = walk_ptrs_ty(cx.tables.expr_ty(&args[0])); @@ -1751,7 +1751,7 @@ fn lint_or_fun_call<'a, 'tcx>( ); } }, - hir::ExprKind::MethodCall(_, span, ref or_args) => check_general_case( + hir::ExprKind::MethodCall(_, span, ref or_args, _) => check_general_case( cx, name, method_span, @@ -1782,7 +1782,7 @@ fn lint_expect_fun_call( loop { arg_root = match &arg_root.kind { hir::ExprKind::AddrOf(hir::BorrowKind::Ref, _, expr) => expr, - hir::ExprKind::MethodCall(method_name, _, call_args) => { + hir::ExprKind::MethodCall(method_name, _, call_args, _) => { if call_args.len() == 1 && (method_name.ident.name == sym!(as_str) || method_name.ident.name == sym!(as_ref)) && { @@ -2002,7 +2002,7 @@ fn lint_clone_on_copy(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, arg: &hir: // &*x is a nop, &x.clone() is not hir::ExprKind::AddrOf(..) => return, // (*x).func() is useless, x.clone().func() can work in case func borrows mutably - hir::ExprKind::MethodCall(_, _, parent_args) if expr.hir_id == parent_args[0].hir_id => return, + hir::ExprKind::MethodCall(_, _, parent_args, _) if expr.hir_id == parent_args[0].hir_id => return, _ => {}, }, @@ -2478,7 +2478,7 @@ fn derefs_to_slice<'a, 'tcx>( } } - if let hir::ExprKind::MethodCall(ref path, _, ref args) = expr.kind { + if let hir::ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind { if path.ident.name == sym!(iter) && may_slice(cx, cx.tables.expr_ty(&args[0])) { Some(&args[0]) } else { @@ -3182,7 +3182,7 @@ fn lint_asref(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, call_name: &str, a // allow the `as_ref` or `as_mut` if it is followed by another method call if_chain! { if let Some(parent) = get_parent_expr(cx, expr); - if let hir::ExprKind::MethodCall(_, ref span, _) = parent.kind; + if let hir::ExprKind::MethodCall(_, ref span, _, _) = parent.kind; if span != &expr.span; then { return; @@ -3310,7 +3310,7 @@ fn lint_option_as_ref_deref<'a, 'tcx>( let closure_expr = remove_blocks(&closure_body.value); match &closure_expr.kind { - hir::ExprKind::MethodCall(_, _, args) => { + hir::ExprKind::MethodCall(_, _, args, _) => { if_chain! { if args.len() == 1; if let hir::ExprKind::Path(qpath) = &args[0].kind; diff --git a/clippy_lints/src/misc.rs b/clippy_lints/src/misc.rs index f513161bbbc52..a0947608e6077 100644 --- a/clippy_lints/src/misc.rs +++ b/clippy_lints/src/misc.rs @@ -545,7 +545,7 @@ fn is_signum(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { } if_chain! { - if let ExprKind::MethodCall(ref method_name, _, ref expressions) = expr.kind; + if let ExprKind::MethodCall(ref method_name, _, ref expressions, _) = expr.kind; if sym!(signum) == method_name.ident.name; // Check that the receiver of the signum() is a float (expressions[0] is the receiver of // the method call) @@ -572,7 +572,7 @@ fn is_array(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { fn check_to_owned(cx: &LateContext<'_, '_>, expr: &Expr<'_>, other: &Expr<'_>) { let (arg_ty, snip) = match expr.kind { - ExprKind::MethodCall(.., ref args) if args.len() == 1 => { + ExprKind::MethodCall(.., ref args, _) if args.len() == 1 => { if match_trait_method(cx, expr, &paths::TO_STRING) || match_trait_method(cx, expr, &paths::TO_OWNED) { (cx.tables.expr_ty_adjusted(&args[0]), snippet(cx, args[0].span, "..")) } else { diff --git a/clippy_lints/src/mut_reference.rs b/clippy_lints/src/mut_reference.rs index 58a8e1a1064ae..7fcf15f8acbe8 100644 --- a/clippy_lints/src/mut_reference.rs +++ b/clippy_lints/src/mut_reference.rs @@ -42,7 +42,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnnecessaryMutPassed { ); } }, - ExprKind::MethodCall(ref path, _, ref arguments) => { + ExprKind::MethodCall(ref path, _, ref arguments, _) => { let def_id = cx.tables.type_dependent_def_id(e.hir_id).unwrap(); let substs = cx.tables.node_substs(e.hir_id); let method_type = cx.tcx.type_of(def_id).subst(cx.tcx, substs); diff --git a/clippy_lints/src/open_options.rs b/clippy_lints/src/open_options.rs index 9d3b67988dbb5..2d4629b683f05 100644 --- a/clippy_lints/src/open_options.rs +++ b/clippy_lints/src/open_options.rs @@ -29,7 +29,7 @@ declare_lint_pass!(OpenOptions => [NONSENSICAL_OPEN_OPTIONS]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for OpenOptions { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr<'_>) { - if let ExprKind::MethodCall(ref path, _, ref arguments) = e.kind { + if let ExprKind::MethodCall(ref path, _, ref arguments, _) = e.kind { let obj_ty = walk_ptrs_ty(cx.tables.expr_ty(&arguments[0])); if path.ident.name == sym!(open) && match_type(cx, obj_ty, &paths::OPEN_OPTIONS) { let mut options = Vec::new(); @@ -57,7 +57,7 @@ enum OpenOption { } fn get_open_options(cx: &LateContext<'_, '_>, argument: &Expr<'_>, options: &mut Vec<(OpenOption, Argument)>) { - if let ExprKind::MethodCall(ref path, _, ref arguments) = argument.kind { + if let ExprKind::MethodCall(ref path, _, ref arguments, _) = argument.kind { let obj_ty = walk_ptrs_ty(cx.tables.expr_ty(&arguments[0])); // Only proceed if this is a call on some object of type std::fs::OpenOptions diff --git a/clippy_lints/src/option_env_unwrap.rs b/clippy_lints/src/option_env_unwrap.rs index 66dfa20edb5e7..fd653044a1bcb 100644 --- a/clippy_lints/src/option_env_unwrap.rs +++ b/clippy_lints/src/option_env_unwrap.rs @@ -35,7 +35,7 @@ declare_lint_pass!(OptionEnvUnwrap => [OPTION_ENV_UNWRAP]); impl EarlyLintPass for OptionEnvUnwrap { fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) { if_chain! { - if let ExprKind::MethodCall(path_segment, args) = &expr.kind; + if let ExprKind::MethodCall(path_segment, args, _) = &expr.kind; let method_name = path_segment.ident.as_str(); if method_name == "expect" || method_name == "unwrap"; if let ExprKind::Call(caller, _) = &args[0].kind; diff --git a/clippy_lints/src/path_buf_push_overwrite.rs b/clippy_lints/src/path_buf_push_overwrite.rs index bdbaf2695c8ef..88ad1e0914f25 100644 --- a/clippy_lints/src/path_buf_push_overwrite.rs +++ b/clippy_lints/src/path_buf_push_overwrite.rs @@ -43,7 +43,7 @@ declare_lint_pass!(PathBufPushOverwrite => [PATH_BUF_PUSH_OVERWRITE]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for PathBufPushOverwrite { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) { if_chain! { - if let ExprKind::MethodCall(ref path, _, ref args) = expr.kind; + if let ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind; if path.ident.name == sym!(push); if args.len() == 2; if match_type(cx, walk_ptrs_ty(cx.tables.expr_ty(&args[0])), &paths::PATH_BUF); diff --git a/clippy_lints/src/precedence.rs b/clippy_lints/src/precedence.rs index cc783baa68723..7dce23dd22306 100644 --- a/clippy_lints/src/precedence.rs +++ b/clippy_lints/src/precedence.rs @@ -103,7 +103,7 @@ impl EarlyLintPass for Precedence { } if let ExprKind::Unary(UnOp::Neg, ref rhs) = expr.kind { - if let ExprKind::MethodCall(ref path_segment, ref args) = rhs.kind { + if let ExprKind::MethodCall(ref path_segment, ref args, _) = rhs.kind { let path_segment_str = path_segment.ident.name.as_str(); if let Some(slf) = args.first() { if let ExprKind::Lit(ref lit) = slf.kind { diff --git a/clippy_lints/src/ptr_offset_with_cast.rs b/clippy_lints/src/ptr_offset_with_cast.rs index ffc59d43750e0..d23d7e59b73fc 100644 --- a/clippy_lints/src/ptr_offset_with_cast.rs +++ b/clippy_lints/src/ptr_offset_with_cast.rs @@ -90,7 +90,7 @@ fn expr_as_ptr_offset_call<'a, 'tcx>( cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>, ) -> Option<(&'tcx Expr<'tcx>, &'tcx Expr<'tcx>, Method)> { - if let ExprKind::MethodCall(ref path_segment, _, ref args) = expr.kind { + if let ExprKind::MethodCall(ref path_segment, _, ref args, _) = expr.kind { if is_expr_ty_raw_ptr(cx, &args[0]) { if path_segment.ident.name == sym!(offset) { return Some((&args[0], &args[1], Method::Offset)); diff --git a/clippy_lints/src/question_mark.rs b/clippy_lints/src/question_mark.rs index e4361b00fb4c2..3591972fe082f 100644 --- a/clippy_lints/src/question_mark.rs +++ b/clippy_lints/src/question_mark.rs @@ -50,7 +50,7 @@ impl QuestionMark { fn check_is_none_and_early_return_none(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { if_chain! { if let Some((if_expr, body, else_)) = higher::if_block(&expr); - if let ExprKind::MethodCall(segment, _, args) = &if_expr.kind; + if let ExprKind::MethodCall(segment, _, args, _) = &if_expr.kind; if segment.ident.name == sym!(is_none); if Self::expression_returns_none(cx, body); if let Some(subject) = args.get(0); diff --git a/clippy_lints/src/ranges.rs b/clippy_lints/src/ranges.rs index 52e540d4e00db..fcd02a196e7bf 100644 --- a/clippy_lints/src/ranges.rs +++ b/clippy_lints/src/ranges.rs @@ -129,20 +129,20 @@ declare_lint_pass!(Ranges => [ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Ranges { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) { - if let ExprKind::MethodCall(ref path, _, ref args) = expr.kind { + if let ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind { let name = path.ident.as_str(); if name == "zip" && args.len() == 2 { let iter = &args[0].kind; let zip_arg = &args[1]; if_chain! { // `.iter()` call - if let ExprKind::MethodCall(ref iter_path, _, ref iter_args ) = *iter; + if let ExprKind::MethodCall(ref iter_path, _, ref iter_args , _) = *iter; if iter_path.ident.name == sym!(iter); // range expression in `.zip()` call: `0..x.len()` if let Some(higher::Range { start: Some(start), end: Some(end), .. }) = higher::range(cx, zip_arg); if is_integer_const(cx, start, 0); // `.len()` call - if let ExprKind::MethodCall(ref len_path, _, ref len_args) = end.kind; + if let ExprKind::MethodCall(ref len_path, _, ref len_args, _) = end.kind; if len_path.ident.name == sym!(len) && len_args.len() == 1; // `.iter()` and `.len()` called on same `Path` if let ExprKind::Path(QPath::Resolved(_, ref iter_path)) = iter_args[0].kind; diff --git a/clippy_lints/src/redundant_pattern_matching.rs b/clippy_lints/src/redundant_pattern_matching.rs index 7ee298e9833f2..f16b916441ae8 100644 --- a/clippy_lints/src/redundant_pattern_matching.rs +++ b/clippy_lints/src/redundant_pattern_matching.rs @@ -89,7 +89,7 @@ fn find_sugg_for_if_let<'a, 'tcx>( // check that `while_let_on_iterator` lint does not trigger if_chain! { if keyword == "while"; - if let ExprKind::MethodCall(method_path, _, _) = op.kind; + if let ExprKind::MethodCall(method_path, _, _, _) = op.kind; if method_path.ident.name == sym!(next); if match_trait_method(cx, op, &paths::ITERATOR); then { diff --git a/clippy_lints/src/slow_vector_initialization.rs b/clippy_lints/src/slow_vector_initialization.rs index a7c4f2c2291f1..44c9cc19cfb4e 100644 --- a/clippy_lints/src/slow_vector_initialization.rs +++ b/clippy_lints/src/slow_vector_initialization.rs @@ -207,7 +207,7 @@ impl<'a, 'tcx> VectorInitializationVisitor<'a, 'tcx> { fn search_slow_extend_filling(&mut self, expr: &'tcx Expr<'_>) { if_chain! { if self.initialization_found; - if let ExprKind::MethodCall(ref path, _, ref args) = expr.kind; + if let ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind; if let ExprKind::Path(ref qpath_subj) = args[0].kind; if match_qpath(&qpath_subj, &[&*self.vec_alloc.variable_name.as_str()]); if path.ident.name == sym!(extend); @@ -224,7 +224,7 @@ impl<'a, 'tcx> VectorInitializationVisitor<'a, 'tcx> { fn search_slow_resize_filling(&mut self, expr: &'tcx Expr<'_>) { if_chain! { if self.initialization_found; - if let ExprKind::MethodCall(ref path, _, ref args) = expr.kind; + if let ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind; if let ExprKind::Path(ref qpath_subj) = args[0].kind; if match_qpath(&qpath_subj, &[&*self.vec_alloc.variable_name.as_str()]); if path.ident.name == sym!(resize); @@ -246,7 +246,7 @@ impl<'a, 'tcx> VectorInitializationVisitor<'a, 'tcx> { /// Returns `true` if give expression is `repeat(0).take(...)` fn is_repeat_take(&self, expr: &Expr<'_>) -> bool { if_chain! { - if let ExprKind::MethodCall(ref take_path, _, ref take_args) = expr.kind; + if let ExprKind::MethodCall(ref take_path, _, ref take_args, _) = expr.kind; if take_path.ident.name == sym!(take); // Check that take is applied to `repeat(0)` diff --git a/clippy_lints/src/strings.rs b/clippy_lints/src/strings.rs index f84566ef707a8..d8e4bff3d702a 100644 --- a/clippy_lints/src/strings.rs +++ b/clippy_lints/src/strings.rs @@ -164,7 +164,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for StringLitAsBytes { use rustc_ast::ast::LitKind; if_chain! { - if let ExprKind::MethodCall(path, _, args) = &e.kind; + if let ExprKind::MethodCall(path, _, args, _) = &e.kind; if path.ident.name == sym!(as_bytes); if let ExprKind::Lit(lit) = &args[0].kind; if let LitKind::Str(lit_content, _) = &lit.node; diff --git a/clippy_lints/src/to_digit_is_some.rs b/clippy_lints/src/to_digit_is_some.rs index c6302ca03d918..4f132c6db76fa 100644 --- a/clippy_lints/src/to_digit_is_some.rs +++ b/clippy_lints/src/to_digit_is_some.rs @@ -34,12 +34,12 @@ declare_lint_pass!(ToDigitIsSome => [TO_DIGIT_IS_SOME]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ToDigitIsSome { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx hir::Expr<'_>) { if_chain! { - if let hir::ExprKind::MethodCall(is_some_path, _, is_some_args) = &expr.kind; + if let hir::ExprKind::MethodCall(is_some_path, _, is_some_args, _) = &expr.kind; if is_some_path.ident.name.as_str() == "is_some"; if let [to_digit_expr] = &**is_some_args; then { let match_result = match &to_digit_expr.kind { - hir::ExprKind::MethodCall(to_digits_path, _, to_digit_args) => { + hir::ExprKind::MethodCall(to_digits_path, _, to_digit_args, _) => { if_chain! { if let [char_arg, radix_arg] = &**to_digit_args; if to_digits_path.ident.name.as_str() == "to_digit"; diff --git a/clippy_lints/src/types.rs b/clippy_lints/src/types.rs index bc5fe44b30f8f..57d5b27df5741 100644 --- a/clippy_lints/src/types.rs +++ b/clippy_lints/src/types.rs @@ -778,7 +778,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnitArg { } match expr.kind { - ExprKind::Call(_, args) | ExprKind::MethodCall(_, _, args) => { + ExprKind::Call(_, args) | ExprKind::MethodCall(_, _, args, _) => { let args_to_recover = args .iter() .filter(|arg| { @@ -1262,14 +1262,14 @@ fn check_loss_of_sign(cx: &LateContext<'_, '_>, expr: &Expr<'_>, op: &Expr<'_>, } // don't lint for the result of methods that always return non-negative values - if let ExprKind::MethodCall(ref path, _, _) = op.kind { + if let ExprKind::MethodCall(ref path, _, _, _) = op.kind { let mut method_name = path.ident.name.as_str(); let whitelisted_methods = ["abs", "checked_abs", "rem_euclid", "checked_rem_euclid"]; if_chain! { if method_name == "unwrap"; if let Some(arglist) = method_chain_args(op, &["unwrap"]); - if let ExprKind::MethodCall(ref inner_path, _, _) = &arglist[0][0].kind; + if let ExprKind::MethodCall(ref inner_path, _, _, _) = &arglist[0][0].kind; then { method_name = inner_path.ident.name.as_str(); } diff --git a/clippy_lints/src/unused_io_amount.rs b/clippy_lints/src/unused_io_amount.rs index b85134e3d7a9a..5f4b5fd9dd91c 100644 --- a/clippy_lints/src/unused_io_amount.rs +++ b/clippy_lints/src/unused_io_amount.rs @@ -52,7 +52,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedIoAmount { } }, - hir::ExprKind::MethodCall(ref path, _, ref args) => match &*path.ident.as_str() { + hir::ExprKind::MethodCall(ref path, _, ref args, _) => match &*path.ident.as_str() { "expect" | "unwrap" | "unwrap_or" | "unwrap_or_else" => { check_method_call(cx, &args[0], expr); }, @@ -65,7 +65,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedIoAmount { } fn check_method_call(cx: &LateContext<'_, '_>, call: &hir::Expr<'_>, expr: &hir::Expr<'_>) { - if let hir::ExprKind::MethodCall(ref path, _, _) = call.kind { + if let hir::ExprKind::MethodCall(ref path, _, _, _) = call.kind { let symbol = &*path.ident.as_str(); let read_trait = match_trait_method(cx, call, &paths::IO_READ); let write_trait = match_trait_method(cx, call, &paths::IO_WRITE); diff --git a/clippy_lints/src/unwrap.rs b/clippy_lints/src/unwrap.rs index 036dd16a224af..a6c7b5d405cda 100644 --- a/clippy_lints/src/unwrap.rs +++ b/clippy_lints/src/unwrap.rs @@ -112,7 +112,7 @@ fn collect_unwrap_info<'a, 'tcx>( return collect_unwrap_info(cx, expr, branch, !invert); } else { if_chain! { - if let ExprKind::MethodCall(method_name, _, args) = &expr.kind; + if let ExprKind::MethodCall(method_name, _, args, _) = &expr.kind; if let ExprKind::Path(QPath::Resolved(None, path)) = &args[0].kind; let ty = cx.tables.expr_ty(&args[0]); let name = method_name.ident.as_str(); @@ -166,7 +166,7 @@ impl<'a, 'tcx> Visitor<'tcx> for UnwrappableVariablesVisitor<'a, 'tcx> { } else { // find `unwrap[_err]()` calls: if_chain! { - if let ExprKind::MethodCall(ref method_name, _, ref args) = expr.kind; + if let ExprKind::MethodCall(ref method_name, _, ref args, _) = expr.kind; if let ExprKind::Path(QPath::Resolved(None, ref path)) = args[0].kind; if [sym!(unwrap), sym!(unwrap_err)].contains(&method_name.ident.name); let call_to_unwrap = method_name.ident.name == sym!(unwrap); diff --git a/clippy_lints/src/useless_conversion.rs b/clippy_lints/src/useless_conversion.rs index 141035a980ade..78d249482d53d 100644 --- a/clippy_lints/src/useless_conversion.rs +++ b/clippy_lints/src/useless_conversion.rs @@ -61,7 +61,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UselessConversion { } }, - ExprKind::MethodCall(ref name, .., ref args) => { + ExprKind::MethodCall(ref name, .., ref args, _) => { if match_trait_method(cx, e, &paths::INTO) && &*name.ident.as_str() == "into" { let a = cx.tables.expr_ty(e); let b = cx.tables.expr_ty(&args[0]); diff --git a/clippy_lints/src/utils/author.rs b/clippy_lints/src/utils/author.rs index bbcf396eef7d6..8b58bbb5e6575 100644 --- a/clippy_lints/src/utils/author.rs +++ b/clippy_lints/src/utils/author.rs @@ -250,8 +250,8 @@ impl<'tcx> Visitor<'tcx> for PrintVisitor { self.visit_expr(arg); } }, - ExprKind::MethodCall(ref _method_name, ref _generics, ref _args) => { - println!("MethodCall(ref method_name, ref generics, ref args) = {};", current); + ExprKind::MethodCall(ref _method_name, ref _generics, ref _args, ref _fn_span) => { + println!("MethodCall(ref method_name, ref generics, ref args, ref fn_span) = {};", current); println!(" // unimplemented: `ExprKind::MethodCall` is not further destructured at the moment"); }, ExprKind::Tup(ref elements) => { diff --git a/clippy_lints/src/utils/hir_utils.rs b/clippy_lints/src/utils/hir_utils.rs index f8d197c15e8d6..473a730dad500 100644 --- a/clippy_lints/src/utils/hir_utils.rs +++ b/clippy_lints/src/utils/hir_utils.rs @@ -132,7 +132,7 @@ impl<'a, 'tcx> SpanlessEq<'a, 'tcx> { && self.eq_pat(&l.pat, &r.pat) }) }, - (&ExprKind::MethodCall(l_path, _, l_args), &ExprKind::MethodCall(r_path, _, r_args)) => { + (&ExprKind::MethodCall(l_path, _, l_args, _), &ExprKind::MethodCall(r_path, _, r_args, _)) => { !self.ignore_fn && self.eq_path_segment(l_path, r_path) && self.eq_exprs(l_args, r_args) }, (&ExprKind::Repeat(ref le, ref ll_id), &ExprKind::Repeat(ref re, ref rl_id)) => { @@ -542,7 +542,7 @@ impl<'a, 'tcx> SpanlessHash<'a, 'tcx> { s.hash(&mut self.s); }, - ExprKind::MethodCall(ref path, ref _tys, args) => { + ExprKind::MethodCall(ref path, ref _tys, args, ref _fn_span) => { self.hash_name(path.ident.name); self.hash_exprs(args); }, diff --git a/clippy_lints/src/utils/inspector.rs b/clippy_lints/src/utils/inspector.rs index 9b672b9ec225b..649b166e98eec 100644 --- a/clippy_lints/src/utils/inspector.rs +++ b/clippy_lints/src/utils/inspector.rs @@ -167,7 +167,7 @@ fn print_expr(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, indent: usize) { print_expr(cx, arg, indent + 1); } }, - hir::ExprKind::MethodCall(ref path, _, args) => { + hir::ExprKind::MethodCall(ref path, _, args, _) => { println!("{}MethodCall", ind); println!("{}method name: {}", ind, path.ident.name); for arg in args { diff --git a/clippy_lints/src/utils/internal_lints.rs b/clippy_lints/src/utils/internal_lints.rs index 8e1b047f6f80a..89e2bcdd7935d 100644 --- a/clippy_lints/src/utils/internal_lints.rs +++ b/clippy_lints/src/utils/internal_lints.rs @@ -402,7 +402,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for CompilerLintFunctions { } if_chain! { - if let ExprKind::MethodCall(ref path, _, ref args) = expr.kind; + if let ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind; let fn_name = path.ident; if let Some(sugg) = self.map.get(&*fn_name.as_str()); let ty = walk_ptrs_ty(cx.tables.expr_ty(&args[0])); @@ -491,7 +491,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for CollapsibleCalls { let stmts = &block.stmts; if stmts.len() == 1 && block.expr.is_none(); if let StmtKind::Semi(only_expr) = &stmts[0].kind; - if let ExprKind::MethodCall(ref ps, _, ref span_call_args) = &only_expr.kind; + if let ExprKind::MethodCall(ref ps, _, ref span_call_args, _) = &only_expr.kind; let and_then_snippets = get_and_then_snippets(cx, and_then_args); let mut sle = SpanlessEq::new(cx).ignore_fn(); then { diff --git a/clippy_lints/src/utils/mod.rs b/clippy_lints/src/utils/mod.rs index 7b59917c2bbfc..60ab19e71f5e4 100644 --- a/clippy_lints/src/utils/mod.rs +++ b/clippy_lints/src/utils/mod.rs @@ -379,7 +379,7 @@ pub fn method_calls<'tcx>( let mut current = expr; for _ in 0..max_depth { - if let ExprKind::MethodCall(path, span, args) = ¤t.kind { + if let ExprKind::MethodCall(path, span, args, _) = ¤t.kind { if args.iter().any(|e| e.span.from_expansion()) { break; } @@ -406,7 +406,7 @@ pub fn method_chain_args<'a>(expr: &'a Expr<'_>, methods: &[&str]) -> Option first - if let ExprKind::MethodCall(ref path, _, ref args) = current.kind { + if let ExprKind::MethodCall(ref path, _, ref args, _) = current.kind { if path.ident.name.as_str() == *method_name { if args.iter().any(|e| e.span.from_expansion()) { return None; @@ -1324,7 +1324,7 @@ pub fn is_must_use_func_call(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool None } }, - ExprKind::MethodCall(_, _, _) => cx.tables.type_dependent_def_id(expr.hir_id), + ExprKind::MethodCall(_, _, _, _) => cx.tables.type_dependent_def_id(expr.hir_id), _ => None, }; diff --git a/clippy_lints/src/utils/ptr.rs b/clippy_lints/src/utils/ptr.rs index fb6bd5e815859..ee336ecc58d95 100644 --- a/clippy_lints/src/utils/ptr.rs +++ b/clippy_lints/src/utils/ptr.rs @@ -58,7 +58,7 @@ impl<'a, 'tcx> Visitor<'tcx> for PtrCloneVisitor<'a, 'tcx> { if self.abort { return; } - if let ExprKind::MethodCall(ref seg, _, ref args) = expr.kind { + if let ExprKind::MethodCall(ref seg, _, ref args, _) = expr.kind { if args.len() == 1 && match_var(&args[0], self.name) { if seg.ident.name.as_str() == "capacity" { self.abort = true; diff --git a/clippy_lints/src/verbose_file_reads.rs b/clippy_lints/src/verbose_file_reads.rs index 7247518e19b9d..6d420d491c50f 100644 --- a/clippy_lints/src/verbose_file_reads.rs +++ b/clippy_lints/src/verbose_file_reads.rs @@ -59,7 +59,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for VerboseFileReads { fn is_file_read_to_end<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'tcx>) -> bool { if_chain! { - if let ExprKind::MethodCall(method_name, _, exprs) = expr.kind; + if let ExprKind::MethodCall(method_name, _, exprs, _) = expr.kind; if method_name.ident.as_str() == "read_to_end"; if let ExprKind::Path(QPath::Resolved(None, _)) = &exprs[0].kind; let ty = cx.tables.expr_ty(&exprs[0]); @@ -73,7 +73,7 @@ fn is_file_read_to_end<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'t fn is_file_read_to_string<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'tcx>) -> bool { if_chain! { - if let ExprKind::MethodCall(method_name, _, exprs) = expr.kind; + if let ExprKind::MethodCall(method_name, _, exprs, _) = expr.kind; if method_name.ident.as_str() == "read_to_string"; if let ExprKind::Path(QPath::Resolved(None, _)) = &exprs[0].kind; let ty = cx.tables.expr_ty(&exprs[0]); From e2e2a0fa832679b16df7d6f5d066c745e2687856 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Tue, 9 Jun 2020 23:45:32 -0400 Subject: [PATCH 025/142] Clippy fixes --- clippy_lints/src/unnecessary_sort_by.rs | 6 +++--- clippy_lints/src/utils/ast_utils.rs | 2 +- clippy_lints/src/vec_resize_to_zero.rs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/clippy_lints/src/unnecessary_sort_by.rs b/clippy_lints/src/unnecessary_sort_by.rs index 33d8331c2923c..e94eebb88e497 100644 --- a/clippy_lints/src/unnecessary_sort_by.rs +++ b/clippy_lints/src/unnecessary_sort_by.rs @@ -95,7 +95,7 @@ fn mirrored_exprs( // The two exprs are method calls. // Check to see that the function is the same and the arguments are mirrored // This is enough because the receiver of the method is listed in the arguments - (ExprKind::MethodCall(left_segment, _, left_args), ExprKind::MethodCall(right_segment, _, right_args)) => { + (ExprKind::MethodCall(left_segment, _, left_args, _), ExprKind::MethodCall(right_segment, _, right_args, _)) => { left_segment.ident == right_segment.ident && left_args .iter() @@ -170,7 +170,7 @@ fn mirrored_exprs( fn detect_lint(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> Option { if_chain! { - if let ExprKind::MethodCall(name_ident, _, args) = &expr.kind; + if let ExprKind::MethodCall(name_ident, _, args, _) = &expr.kind; if let name = name_ident.ident.name.to_ident_string(); if name == "sort_by" || name == "sort_unstable_by"; if let [vec, Expr { kind: ExprKind::Closure(_, _, closure_body_id, _, _), .. }] = args; @@ -180,7 +180,7 @@ fn detect_lint(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> Option Param { pat: Pat { kind: PatKind::Binding(_, _, left_ident, _), .. }, ..}, Param { pat: Pat { kind: PatKind::Binding(_, _, right_ident, _), .. }, .. } ] = &closure_body.params; - if let ExprKind::MethodCall(method_path, _, [ref left_expr, ref right_expr]) = &closure_body.value.kind; + if let ExprKind::MethodCall(method_path, _, [ref left_expr, ref right_expr], _) = &closure_body.value.kind; if method_path.ident.name.to_ident_string() == "cmp"; then { let (closure_body, closure_arg, reverse) = if mirrored_exprs( diff --git a/clippy_lints/src/utils/ast_utils.rs b/clippy_lints/src/utils/ast_utils.rs index dcf09da198e2f..e60e2a81e070b 100755 --- a/clippy_lints/src/utils/ast_utils.rs +++ b/clippy_lints/src/utils/ast_utils.rs @@ -120,7 +120,7 @@ pub fn eq_expr(l: &Expr, r: &Expr) -> bool { (Array(l), Array(r)) | (Tup(l), Tup(r)) => over(l, r, |l, r| eq_expr(l, r)), (Repeat(le, ls), Repeat(re, rs)) => eq_expr(le, re) && eq_expr(&ls.value, &rs.value), (Call(lc, la), Call(rc, ra)) => eq_expr(lc, rc) && over(la, ra, |l, r| eq_expr(l, r)), - (MethodCall(lc, la), MethodCall(rc, ra)) => eq_path_seg(lc, rc) && over(la, ra, |l, r| eq_expr(l, r)), + (MethodCall(lc, la, _), MethodCall(rc, ra, _)) => eq_path_seg(lc, rc) && over(la, ra, |l, r| eq_expr(l, r)), (Binary(lo, ll, lr), Binary(ro, rl, rr)) => lo.node == ro.node && eq_expr(ll, rl) && eq_expr(lr, rr), (Unary(lo, l), Unary(ro, r)) => mem::discriminant(lo) == mem::discriminant(ro) && eq_expr(l, r), (Lit(l), Lit(r)) => l.kind == r.kind, diff --git a/clippy_lints/src/vec_resize_to_zero.rs b/clippy_lints/src/vec_resize_to_zero.rs index 86cbfa8203d54..55758efa32e67 100644 --- a/clippy_lints/src/vec_resize_to_zero.rs +++ b/clippy_lints/src/vec_resize_to_zero.rs @@ -31,7 +31,7 @@ declare_lint_pass!(VecResizeToZero => [VEC_RESIZE_TO_ZERO]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for VecResizeToZero { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) { if_chain! { - if let hir::ExprKind::MethodCall(path_segment, _, ref args) = expr.kind; + if let hir::ExprKind::MethodCall(path_segment, _, ref args, _) = expr.kind; if let Some(method_def_id) = cx.tables.type_dependent_def_id(expr.hir_id); if match_def_path(cx, method_def_id, &paths::VEC_RESIZE) && args.len() == 3; if let ExprKind::Lit(Spanned { node: LitKind::Int(0, _), .. }) = args[1].kind; From 56f25e3e62dbdd8f84a9152bbfb73a35055363dd Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Wed, 10 Jun 2020 19:29:11 -0700 Subject: [PATCH 026/142] Downgrade unnested_or_patterns to pedantic --- clippy_lints/src/lib.rs | 3 +-- clippy_lints/src/unnested_or_patterns.rs | 2 +- src/lintlist/mod.rs | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index 021fbe932d895..19e1b00050a67 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -1187,6 +1187,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(&types::OPTION_OPTION), LintId::of(&unicode::NON_ASCII_LITERAL), LintId::of(&unicode::UNICODE_NOT_NFC), + LintId::of(&unnested_or_patterns::UNNESTED_OR_PATTERNS), LintId::of(&unused_self::UNUSED_SELF), LintId::of(&wildcard_imports::ENUM_GLOB_USE), LintId::of(&wildcard_imports::WILDCARD_IMPORTS), @@ -1440,7 +1441,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(&unnamed_address::FN_ADDRESS_COMPARISONS), LintId::of(&unnamed_address::VTABLE_ADDRESS_COMPARISONS), LintId::of(&unnecessary_sort_by::UNNECESSARY_SORT_BY), - LintId::of(&unnested_or_patterns::UNNESTED_OR_PATTERNS), LintId::of(&unsafe_removed_from_name::UNSAFE_REMOVED_FROM_NAME), LintId::of(&unused_io_amount::UNUSED_IO_AMOUNT), LintId::of(&unwrap::PANICKING_UNWRAP), @@ -1624,7 +1624,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: LintId::of(&types::UNNECESSARY_CAST), LintId::of(&types::VEC_BOX), LintId::of(&unnecessary_sort_by::UNNECESSARY_SORT_BY), - LintId::of(&unnested_or_patterns::UNNESTED_OR_PATTERNS), LintId::of(&unwrap::UNNECESSARY_UNWRAP), LintId::of(&useless_conversion::USELESS_CONVERSION), LintId::of(&zero_div_zero::ZERO_DIVIDED_BY_ZERO), diff --git a/clippy_lints/src/unnested_or_patterns.rs b/clippy_lints/src/unnested_or_patterns.rs index 8c281126c32bf..4d3682263f14f 100644 --- a/clippy_lints/src/unnested_or_patterns.rs +++ b/clippy_lints/src/unnested_or_patterns.rs @@ -45,7 +45,7 @@ declare_clippy_lint! { /// } /// ``` pub UNNESTED_OR_PATTERNS, - complexity, + pedantic, "unnested or-patterns, e.g., `Foo(Bar) | Foo(Baz) instead of `Foo(Bar | Baz)`" } diff --git a/src/lintlist/mod.rs b/src/lintlist/mod.rs index cac3cc6bdb316..edceb75518008 100644 --- a/src/lintlist/mod.rs +++ b/src/lintlist/mod.rs @@ -2329,7 +2329,7 @@ pub static ref ALL_LINTS: Vec = vec![ }, Lint { name: "unnested_or_patterns", - group: "complexity", + group: "pedantic", desc: "unnested or-patterns, e.g., `Foo(Bar) | Foo(Baz) instead of `Foo(Bar | Baz)`", deprecation: None, module: "unnested_or_patterns", From 840786a93976d5885bfe6c7878cecc99e4a56432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Kr=C3=BCger?= Date: Mon, 1 Jun 2020 00:22:29 +0200 Subject: [PATCH 027/142] clippy-driver: pass all args after "--rustc" to rustc. --- src/driver.rs | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/driver.rs b/src/driver.rs index 4453ae5ce4414..1956effa827b3 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -297,12 +297,6 @@ pub fn main() { exit(rustc_driver::catch_with_exit_code(move || { let mut orig_args: Vec = env::args().collect(); - if orig_args.iter().any(|a| a == "--version" || a == "-V") { - let version_info = rustc_tools_util::get_version_info!(); - println!("{}", version_info); - exit(0); - } - // Get the sysroot, looking from most specific to this invocation to the least: // - command line // - runtime environment @@ -348,6 +342,29 @@ pub fn main() { .map(|pb| pb.to_string_lossy().to_string()) .expect("need to specify SYSROOT env var during clippy compilation, or use rustup or multirust"); + // make "clippy-driver --rustc" work like a subcommand that passes further args to "rustc" + // for example `clippy-driver --rustc --version` will print the rustc version that clippy-driver + // uses + if let Some(pos) = orig_args.iter().position(|arg| arg == "--rustc") { + orig_args.remove(pos); + orig_args[0] = "rustc".to_string(); + + // if we call "rustc", we need to pass --sysroot here as well + let mut args: Vec = orig_args.clone(); + if !have_sys_root_arg { + args.extend(vec!["--sysroot".into(), sys_root]); + }; + + println!("args: {:?}", args); + return rustc_driver::run_compiler(&args, &mut DefaultCallbacks, None, None); + } + + if orig_args.iter().any(|a| a == "--version" || a == "-V") { + let version_info = rustc_tools_util::get_version_info!(); + println!("{}", version_info); + exit(0); + } + // Setting RUSTC_WRAPPER causes Cargo to pass 'rustc' as the first argument. // We're invoking the compiler programmatically, so we ignore this/ let wrapper_mode = orig_args.get(1).map(Path::new).and_then(Path::file_stem) == Some("rustc".as_ref()); From 88ab10400b81338782c729e4193e47cd3ef1cab6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Kr=C3=BCger?= Date: Tue, 2 Jun 2020 14:50:44 +0200 Subject: [PATCH 028/142] add test and remove debug print --- .github/driver.sh | 5 +++++ src/driver.rs | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/driver.sh b/.github/driver.sh index a2e87f5eb3745..c797bdb14db87 100644 --- a/.github/driver.sh +++ b/.github/driver.sh @@ -26,4 +26,9 @@ unset CARGO_MANIFEST_DIR sed -e "s,tests/ui,\$DIR," -e "/= help/d" cstring.stderr > normalized.stderr diff normalized.stderr tests/ui/cstring.stderr + +# make sure "clippy-driver --rustc --arg" and "rustc --arg" behave the same +SYSROOT=`rustc --print sysroot` +diff <(LD_LIBRARY_PATH=${SYSROOT}/lib ./target/debug/clippy-driver --rustc --version --verbose) <(rustc --version --verbose) + # TODO: CLIPPY_CONF_DIR / CARGO_MANIFEST_DIR diff --git a/src/driver.rs b/src/driver.rs index 1956effa827b3..5ef8d3cf80977 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -355,7 +355,6 @@ pub fn main() { args.extend(vec!["--sysroot".into(), sys_root]); }; - println!("args: {:?}", args); return rustc_driver::run_compiler(&args, &mut DefaultCallbacks, None, None); } From f1d5cd5d13bbd59c21e70e2e728c3db9829cf816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Kr=C3=BCger?= Date: Sun, 7 Jun 2020 16:27:41 +0200 Subject: [PATCH 029/142] add test for compiler output when compiling with rustc/clippy-driver --- .github/driver.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/driver.sh b/.github/driver.sh index c797bdb14db87..f8139f36369c9 100644 --- a/.github/driver.sh +++ b/.github/driver.sh @@ -31,4 +31,9 @@ diff normalized.stderr tests/ui/cstring.stderr SYSROOT=`rustc --print sysroot` diff <(LD_LIBRARY_PATH=${SYSROOT}/lib ./target/debug/clippy-driver --rustc --version --verbose) <(rustc --version --verbose) +# we can't run 2 rustcs on the same file at the same time +CLIPPY=`LD_LIBRARY_PATH=${SYSROOT}/lib ./target/debug/clippy-driver tests/driver/main.rs` +RUSTC=`rustc tests/driver/main.rs` +diff <($CLIPPY) <($RUSTC) + # TODO: CLIPPY_CONF_DIR / CARGO_MANIFEST_DIR From 7a62380fc8f8ca39bc49b8f67a4d4929911cb036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Kr=C3=BCger?= Date: Tue, 9 Jun 2020 13:18:00 +0200 Subject: [PATCH 030/142] clippy-driver: fix test and add --rustc to --help output --- .github/driver.sh | 6 ++++-- src/driver.rs | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/driver.sh b/.github/driver.sh index f8139f36369c9..2c17c4203ae5c 100644 --- a/.github/driver.sh +++ b/.github/driver.sh @@ -31,9 +31,11 @@ diff normalized.stderr tests/ui/cstring.stderr SYSROOT=`rustc --print sysroot` diff <(LD_LIBRARY_PATH=${SYSROOT}/lib ./target/debug/clippy-driver --rustc --version --verbose) <(rustc --version --verbose) + +echo "fn main() {}" > target/driver_test.rs # we can't run 2 rustcs on the same file at the same time -CLIPPY=`LD_LIBRARY_PATH=${SYSROOT}/lib ./target/debug/clippy-driver tests/driver/main.rs` -RUSTC=`rustc tests/driver/main.rs` +CLIPPY=`LD_LIBRARY_PATH=${SYSROOT}/lib ./target/debug/clippy-driver ./target/driver_test.rs --rustc` +RUSTC=`rustc ./target/driver_test.rs` diff <($CLIPPY) <($RUSTC) # TODO: CLIPPY_CONF_DIR / CARGO_MANIFEST_DIR diff --git a/src/driver.rs b/src/driver.rs index 5ef8d3cf80977..6faa5e9fe661f 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -207,6 +207,7 @@ Usage: Common options: -h, --help Print this message + --rustc Pass all args to rustc -V, --version Print version info and exit Other options are the same as `cargo check`. From 857ea16feb6a3891555d032a0ff7d5d7c0e33b32 Mon Sep 17 00:00:00 2001 From: Matthew Jasper Date: Sun, 10 May 2020 12:15:51 +0100 Subject: [PATCH 031/142] Remove associated opaque types They're unused now. --- clippy_lints/src/lifetimes.rs | 2 +- clippy_lints/src/manual_async_fn.rs | 2 +- clippy_lints/src/utils/hir_utils.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clippy_lints/src/lifetimes.rs b/clippy_lints/src/lifetimes.rs index d80ad47ab2468..318d0b69d57b7 100644 --- a/clippy_lints/src/lifetimes.rs +++ b/clippy_lints/src/lifetimes.rs @@ -379,7 +379,7 @@ impl<'a, 'tcx> Visitor<'tcx> for RefVisitor<'a, 'tcx> { TyKind::Path(ref path) => { self.collect_anonymous_lifetimes(path, ty); }, - TyKind::Def(item, _) => { + TyKind::OpaqueDef(item, _) => { let map = self.cx.tcx.hir(); if let ItemKind::OpaqueTy(ref exist_ty) = map.expect_item(item.id).kind { for bound in exist_ty.bounds { diff --git a/clippy_lints/src/manual_async_fn.rs b/clippy_lints/src/manual_async_fn.rs index cb72a24058234..03ab274d9ca9c 100644 --- a/clippy_lints/src/manual_async_fn.rs +++ b/clippy_lints/src/manual_async_fn.rs @@ -99,7 +99,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ManualAsyncFn { fn future_trait_ref<'tcx>(cx: &LateContext<'_, 'tcx>, ty: &'tcx Ty<'tcx>) -> Option<&'tcx TraitRef<'tcx>> { if_chain! { - if let TyKind::Def(item_id, _) = ty.kind; + if let TyKind::OpaqueDef(item_id, _) = ty.kind; let item = cx.tcx.hir().item(item_id.id); if let ItemKind::OpaqueTy(opaque) = &item.kind; if opaque.bounds.len() == 1; diff --git a/clippy_lints/src/utils/hir_utils.rs b/clippy_lints/src/utils/hir_utils.rs index f8d197c15e8d6..0096543c1fbca 100644 --- a/clippy_lints/src/utils/hir_utils.rs +++ b/clippy_lints/src/utils/hir_utils.rs @@ -710,7 +710,7 @@ impl<'a, 'tcx> SpanlessHash<'a, 'tcx> { segment.ident.name.hash(&mut self.s); }, }, - TyKind::Def(_, arg_list) => { + TyKind::OpaqueDef(_, arg_list) => { for arg in *arg_list { match arg { GenericArg::Lifetime(ref l) => self.hash_lifetime(l), From af9b09235c674aaa2562c6fc0be18370eb8200bd Mon Sep 17 00:00:00 2001 From: Matthew Jasper Date: Sun, 10 May 2020 15:05:06 +0100 Subject: [PATCH 032/142] Remove ImplItemKind::OpaqueTy from clippy --- clippy_lints/src/missing_doc.rs | 1 - clippy_lints/src/missing_inline.rs | 2 +- clippy_lints/src/utils/inspector.rs | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/clippy_lints/src/missing_doc.rs b/clippy_lints/src/missing_doc.rs index 2eefb6bbaf424..0fd1e87f9e415 100644 --- a/clippy_lints/src/missing_doc.rs +++ b/clippy_lints/src/missing_doc.rs @@ -187,7 +187,6 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDoc { hir::ImplItemKind::Const(..) => "an associated constant", hir::ImplItemKind::Fn(..) => "a method", hir::ImplItemKind::TyAlias(_) => "an associated type", - hir::ImplItemKind::OpaqueTy(_) => "an existential type", }; self.check_missing_docs_attrs(cx, &impl_item.attrs, impl_item.span, desc); } diff --git a/clippy_lints/src/missing_inline.rs b/clippy_lints/src/missing_inline.rs index 3ad3d5aee4d4a..1802470b1841e 100644 --- a/clippy_lints/src/missing_inline.rs +++ b/clippy_lints/src/missing_inline.rs @@ -142,7 +142,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingInline { let desc = match impl_item.kind { hir::ImplItemKind::Fn(..) => "a method", - hir::ImplItemKind::Const(..) | hir::ImplItemKind::TyAlias(_) | hir::ImplItemKind::OpaqueTy(_) => return, + hir::ImplItemKind::Const(..) | hir::ImplItemKind::TyAlias(_) => return, }; let def_id = cx.tcx.hir().local_def_id(impl_item.hir_id); diff --git a/clippy_lints/src/utils/inspector.rs b/clippy_lints/src/utils/inspector.rs index 9b672b9ec225b..9a4689631cca0 100644 --- a/clippy_lints/src/utils/inspector.rs +++ b/clippy_lints/src/utils/inspector.rs @@ -63,7 +63,6 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for DeepCodeInspector { }, hir::ImplItemKind::Fn(..) => println!("method"), hir::ImplItemKind::TyAlias(_) => println!("associated type"), - hir::ImplItemKind::OpaqueTy(_) => println!("existential type"), } } // fn check_trait_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx From b21ef2b365ef4f5c973327f3f6064b8be42d1dae Mon Sep 17 00:00:00 2001 From: Eduardo Broto Date: Sat, 13 Jun 2020 00:52:32 +0200 Subject: [PATCH 033/142] Fix ICE in consts::binop --- clippy_lints/src/consts.rs | 2 +- tests/ui/crashes/ice-5389.rs | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 tests/ui/crashes/ice-5389.rs diff --git a/clippy_lints/src/consts.rs b/clippy_lints/src/consts.rs index 81ddc8c0067c7..e3c6908b76b18 100644 --- a/clippy_lints/src/consts.rs +++ b/clippy_lints/src/consts.rs @@ -396,7 +396,7 @@ impl<'c, 'cc> ConstEvalLateContext<'c, 'cc> { let l = self.expr(left)?; let r = self.expr(right); match (l, r) { - (Constant::Int(l), Some(Constant::Int(r))) => match self.tables.expr_ty(left).kind { + (Constant::Int(l), Some(Constant::Int(r))) => match self.tables.expr_ty_opt(left)?.kind { ty::Int(ity) => { let l = sext(self.lcx.tcx, l, ity); let r = sext(self.lcx.tcx, r, ity); diff --git a/tests/ui/crashes/ice-5389.rs b/tests/ui/crashes/ice-5389.rs new file mode 100644 index 0000000000000..de262199004b0 --- /dev/null +++ b/tests/ui/crashes/ice-5389.rs @@ -0,0 +1,13 @@ +#![allow(clippy::explicit_counter_loop)] + +fn main() { + let v = vec![1, 2, 3]; + let mut i = 0; + let max_storage_size = [0; 128 * 1024]; + for item in &v { + bar(i, *item); + i += 1; + } +} + +fn bar(_: usize, _: u32) {} From 994a83962237558b67aa0a6d4459a32073c543dd Mon Sep 17 00:00:00 2001 From: Lzu Tao Date: Sat, 13 Jun 2020 01:27:14 +0000 Subject: [PATCH 034/142] Stabilize Option::zip --- clippy_lints/src/checked_conversions.rs | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/clippy_lints/src/checked_conversions.rs b/clippy_lints/src/checked_conversions.rs index e845ef99c7cc0..88145015ba8bd 100644 --- a/clippy_lints/src/checked_conversions.rs +++ b/clippy_lints/src/checked_conversions.rs @@ -88,7 +88,7 @@ fn double_check<'a>(cx: &LateContext<'_, '_>, left: &'a Expr<'_>, right: &'a Exp let upper = check_upper_bound(l); let lower = check_lower_bound(r); - transpose(upper, lower).and_then(|(l, r)| l.combine(r, cx)) + upper.zip(lower).and_then(|(l, r)| l.combine(r, cx)) }; upper_lower(left, right).or_else(|| upper_lower(right, left)) @@ -131,7 +131,10 @@ impl<'a> Conversion<'a> { /// Checks if the to-type is the same (if there is a type constraint) fn has_compatible_to_type(&self, other: &Self) -> bool { - transpose(self.to_type.as_ref(), other.to_type.as_ref()).map_or(true, |(l, r)| l == r) + match (self.to_type, other.to_type) { + (Some(l), Some(r)) => l == r, + _ => true, + } } /// Try to construct a new conversion if the conversion type is valid @@ -322,14 +325,6 @@ fn int_ty_to_sym<'tcx>(path: &QPath<'_>) -> Option<&'tcx str> { } } -/// (Option, Option) -> Option<(T, U)> -fn transpose(lhs: Option, rhs: Option) -> Option<(T, U)> { - match (lhs, rhs) { - (Some(l), Some(r)) => Some((l, r)), - _ => None, - } -} - /// Will return the expressions as if they were expr1 <= expr2 fn normalize_le_ge<'a>(op: &BinOp, left: &'a Expr<'a>, right: &'a Expr<'a>) -> Option<(&'a Expr<'a>, &'a Expr<'a>)> { match op.node { From dee794f4503dda6a10891b49a7cb2f8bb92e001b Mon Sep 17 00:00:00 2001 From: Bastian Kauschke Date: Sat, 13 Jun 2020 12:42:58 +0200 Subject: [PATCH 035/142] typo --- clippy_lints/src/new_without_default.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clippy_lints/src/new_without_default.rs b/clippy_lints/src/new_without_default.rs index dd236535c18ad..42200385932b0 100644 --- a/clippy_lints/src/new_without_default.rs +++ b/clippy_lints/src/new_without_default.rs @@ -33,7 +33,7 @@ declare_clippy_lint! { /// } /// ``` /// - /// To fix the lint, and a `Default` implementation that delegates to `new`: + /// To fix the lint, add a `Default` implementation that delegates to `new`: /// /// ```ignore /// struct Foo(Bar); From f663a21c8f51db58ff73e2e0d9852d03e8916a5e Mon Sep 17 00:00:00 2001 From: Iain Brandram-Adams Date: Sun, 14 Jun 2020 01:24:36 +1200 Subject: [PATCH 036/142] Remove `bar` from blacklisted names --- clippy_lints/src/utils/conf.rs | 2 +- tests/ui/blacklisted_name.rs | 23 +++++++++++++---------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/clippy_lints/src/utils/conf.rs b/clippy_lints/src/utils/conf.rs index 9e8e0ff30ec6b..418c4ded544c0 100644 --- a/clippy_lints/src/utils/conf.rs +++ b/clippy_lints/src/utils/conf.rs @@ -107,7 +107,7 @@ macro_rules! define_Conf { pub use self::helpers::Conf; define_Conf! { /// Lint: BLACKLISTED_NAME. The list of blacklisted names to lint about - (blacklisted_names, "blacklisted_names": Vec, ["foo", "bar", "baz", "quux"].iter().map(ToString::to_string).collect()), + (blacklisted_names, "blacklisted_names": Vec, ["foo", "baz", "quux"].iter().map(ToString::to_string).collect()), /// Lint: COGNITIVE_COMPLEXITY. The maximum cognitive complexity a function can have (cognitive_complexity_threshold, "cognitive_complexity_threshold": u64, 25), /// DEPRECATED LINT: CYCLOMATIC_COMPLEXITY. Use the Cognitive Complexity lint instead. diff --git a/tests/ui/blacklisted_name.rs b/tests/ui/blacklisted_name.rs index ca9d8d16b787d..3d87eb0618157 100644 --- a/tests/ui/blacklisted_name.rs +++ b/tests/ui/blacklisted_name.rs @@ -12,29 +12,32 @@ fn test(foo: ()) {} fn main() { let foo = 42; - let bar = 42; let baz = 42; + let quux = 42; + // Unlike these others, `bar` is considered an acceptable name to use. + // See https://github.com/rust-lang/rust-clippy/issues/5225. - let barb = 42; - let barbaric = 42; + let food = 42; + let foodstuffs = 42; + let bazaar = 42; match (42, Some(1337), Some(0)) { - (foo, Some(bar), baz @ Some(_)) => (), + (foo, Some(baz), quux @ Some(_)) => (), _ => (), } } fn issue_1647(mut foo: u8) { - let mut bar = 0; - if let Some(mut baz) = Some(42) {} + let mut baz = 0; + if let Some(mut quux) = Some(42) {} } fn issue_1647_ref() { - let ref bar = 0; - if let Some(ref baz) = Some(42) {} + let ref baz = 0; + if let Some(ref quux) = Some(42) {} } fn issue_1647_ref_mut() { - let ref mut bar = 0; - if let Some(ref mut baz) = Some(42) {} + let ref mut baz = 0; + if let Some(ref mut quux) = Some(42) {} } From c020e45cd3c1f10d1271de8b47cea9e00b73f500 Mon Sep 17 00:00:00 2001 From: Iain Brandram-Adams Date: Sun, 14 Jun 2020 12:40:36 +1200 Subject: [PATCH 037/142] Update stderr to match, and reinforce comments --- tests/ui/blacklisted_name.rs | 4 +- tests/ui/blacklisted_name.stderr | 72 ++++++++++++++++---------------- 2 files changed, 39 insertions(+), 37 deletions(-) diff --git a/tests/ui/blacklisted_name.rs b/tests/ui/blacklisted_name.rs index 3d87eb0618157..cb15bdd2f1b2d 100644 --- a/tests/ui/blacklisted_name.rs +++ b/tests/ui/blacklisted_name.rs @@ -14,8 +14,10 @@ fn main() { let foo = 42; let baz = 42; let quux = 42; - // Unlike these others, `bar` is considered an acceptable name to use. + // Unlike these others, `bar` is actually considered an acceptable name. + // Among many other legitimate uses, bar commonly refers to a period of time in music. // See https://github.com/rust-lang/rust-clippy/issues/5225. + let bar = 42; let food = 42; let foodstuffs = 42; diff --git a/tests/ui/blacklisted_name.stderr b/tests/ui/blacklisted_name.stderr index 44123829fb0f6..70dbdaece8b6b 100644 --- a/tests/ui/blacklisted_name.stderr +++ b/tests/ui/blacklisted_name.stderr @@ -12,77 +12,77 @@ error: use of a blacklisted/placeholder name `foo` LL | let foo = 42; | ^^^ -error: use of a blacklisted/placeholder name `bar` +error: use of a blacklisted/placeholder name `baz` --> $DIR/blacklisted_name.rs:15:9 | -LL | let bar = 42; +LL | let baz = 42; | ^^^ -error: use of a blacklisted/placeholder name `baz` +error: use of a blacklisted/placeholder name `quux` --> $DIR/blacklisted_name.rs:16:9 | -LL | let baz = 42; - | ^^^ +LL | let quux = 42; + | ^^^^ error: use of a blacklisted/placeholder name `foo` - --> $DIR/blacklisted_name.rs:22:10 + --> $DIR/blacklisted_name.rs:27:10 | -LL | (foo, Some(bar), baz @ Some(_)) => (), +LL | (foo, Some(baz), quux @ Some(_)) => (), | ^^^ -error: use of a blacklisted/placeholder name `bar` - --> $DIR/blacklisted_name.rs:22:20 +error: use of a blacklisted/placeholder name `baz` + --> $DIR/blacklisted_name.rs:27:20 | -LL | (foo, Some(bar), baz @ Some(_)) => (), +LL | (foo, Some(baz), quux @ Some(_)) => (), | ^^^ -error: use of a blacklisted/placeholder name `baz` - --> $DIR/blacklisted_name.rs:22:26 +error: use of a blacklisted/placeholder name `quux` + --> $DIR/blacklisted_name.rs:27:26 | -LL | (foo, Some(bar), baz @ Some(_)) => (), - | ^^^ +LL | (foo, Some(baz), quux @ Some(_)) => (), + | ^^^^ error: use of a blacklisted/placeholder name `foo` - --> $DIR/blacklisted_name.rs:27:19 + --> $DIR/blacklisted_name.rs:32:19 | LL | fn issue_1647(mut foo: u8) { | ^^^ -error: use of a blacklisted/placeholder name `bar` - --> $DIR/blacklisted_name.rs:28:13 +error: use of a blacklisted/placeholder name `baz` + --> $DIR/blacklisted_name.rs:33:13 | -LL | let mut bar = 0; +LL | let mut baz = 0; | ^^^ -error: use of a blacklisted/placeholder name `baz` - --> $DIR/blacklisted_name.rs:29:21 +error: use of a blacklisted/placeholder name `quux` + --> $DIR/blacklisted_name.rs:34:21 | -LL | if let Some(mut baz) = Some(42) {} - | ^^^ +LL | if let Some(mut quux) = Some(42) {} + | ^^^^ -error: use of a blacklisted/placeholder name `bar` - --> $DIR/blacklisted_name.rs:33:13 +error: use of a blacklisted/placeholder name `baz` + --> $DIR/blacklisted_name.rs:38:13 | -LL | let ref bar = 0; +LL | let ref baz = 0; | ^^^ -error: use of a blacklisted/placeholder name `baz` - --> $DIR/blacklisted_name.rs:34:21 +error: use of a blacklisted/placeholder name `quux` + --> $DIR/blacklisted_name.rs:39:21 | -LL | if let Some(ref baz) = Some(42) {} - | ^^^ +LL | if let Some(ref quux) = Some(42) {} + | ^^^^ -error: use of a blacklisted/placeholder name `bar` - --> $DIR/blacklisted_name.rs:38:17 +error: use of a blacklisted/placeholder name `baz` + --> $DIR/blacklisted_name.rs:43:17 | -LL | let ref mut bar = 0; +LL | let ref mut baz = 0; | ^^^ -error: use of a blacklisted/placeholder name `baz` - --> $DIR/blacklisted_name.rs:39:25 +error: use of a blacklisted/placeholder name `quux` + --> $DIR/blacklisted_name.rs:44:25 | -LL | if let Some(ref mut baz) = Some(42) {} - | ^^^ +LL | if let Some(ref mut quux) = Some(42) {} + | ^^^^ error: aborting due to 14 previous errors From 454ed47acf462c847956464ac3811546b733bd5b Mon Sep 17 00:00:00 2001 From: Iain Brandram-Adams Date: Sun, 14 Jun 2020 12:46:56 +1200 Subject: [PATCH 038/142] Update comment in conf.rs --- clippy_lints/src/utils/conf.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clippy_lints/src/utils/conf.rs b/clippy_lints/src/utils/conf.rs index 418c4ded544c0..c41befbf147b8 100644 --- a/clippy_lints/src/utils/conf.rs +++ b/clippy_lints/src/utils/conf.rs @@ -106,7 +106,7 @@ macro_rules! define_Conf { pub use self::helpers::Conf; define_Conf! { - /// Lint: BLACKLISTED_NAME. The list of blacklisted names to lint about + /// Lint: BLACKLISTED_NAME. The list of blacklisted names to lint about. NB: `bar` is not here since it has legitimate uses (blacklisted_names, "blacklisted_names": Vec, ["foo", "baz", "quux"].iter().map(ToString::to_string).collect()), /// Lint: COGNITIVE_COMPLEXITY. The maximum cognitive complexity a function can have (cognitive_complexity_threshold, "cognitive_complexity_threshold": u64, 25), From 8a6f42a9707bbad1dad3f1511f793cd07c723bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Sun, 14 Jun 2020 11:07:44 +0200 Subject: [PATCH 039/142] Fix typo in wildcard_imports --- clippy_lints/src/wildcard_imports.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clippy_lints/src/wildcard_imports.rs b/clippy_lints/src/wildcard_imports.rs index b637253bd0264..79f7705e281e5 100644 --- a/clippy_lints/src/wildcard_imports.rs +++ b/clippy_lints/src/wildcard_imports.rs @@ -36,7 +36,7 @@ declare_clippy_lint! { declare_clippy_lint! { /// **What it does:** Checks for wildcard imports `use _::*`. /// - /// **Why is this bad?** wildcard imports can polute the namespace. This is especially bad if + /// **Why is this bad?** wildcard imports can pollute the namespace. This is especially bad if /// you try to import something through a wildcard, that already has been imported by name from /// a different source: /// From 8c1ee063bb67b20ac17603d0f0025b48b958cc08 Mon Sep 17 00:00:00 2001 From: Ericko Samudera Date: Mon, 8 Jun 2020 00:44:14 +0700 Subject: [PATCH 040/142] mem_replace_with_uninit: suggest std::ptr::read --- clippy_lints/src/mem_replace.rs | 82 ++++++++++++++++++++++----------- tests/ui/repl_uninit.rs | 6 +++ tests/ui/repl_uninit.stderr | 19 ++++---- 3 files changed, 71 insertions(+), 36 deletions(-) diff --git a/clippy_lints/src/mem_replace.rs b/clippy_lints/src/mem_replace.rs index ab6865bf0f3b7..e2672e02b36da 100644 --- a/clippy_lints/src/mem_replace.rs +++ b/clippy_lints/src/mem_replace.rs @@ -135,33 +135,59 @@ fn check_replace_option_with_none(cx: &LateContext<'_, '_>, src: &Expr<'_>, dest } } -fn check_replace_with_uninit(cx: &LateContext<'_, '_>, src: &Expr<'_>, expr_span: Span) { - if let ExprKind::Call(ref repl_func, ref repl_args) = src.kind { - if_chain! { - if repl_args.is_empty(); - if let ExprKind::Path(ref repl_func_qpath) = repl_func.kind; - if let Some(repl_def_id) = cx.tables.qpath_res(repl_func_qpath, repl_func.hir_id).opt_def_id(); - then { - if cx.tcx.is_diagnostic_item(sym::mem_uninitialized, repl_def_id) { - span_lint_and_help( - cx, - MEM_REPLACE_WITH_UNINIT, - expr_span, - "replacing with `mem::uninitialized()`", - None, - "consider using the `take_mut` crate instead", - ); - } else if cx.tcx.is_diagnostic_item(sym::mem_zeroed, repl_def_id) && - !cx.tables.expr_ty(src).is_primitive() { - span_lint_and_help( - cx, - MEM_REPLACE_WITH_UNINIT, - expr_span, - "replacing with `mem::zeroed()`", - None, - "consider using a default value or the `take_mut` crate instead", - ); - } +fn check_replace_with_uninit(cx: &LateContext<'_, '_>, src: &Expr<'_>, dest: &Expr<'_>, expr_span: Span) { + if_chain! { + // check if replacement is mem::MaybeUninit::uninit().assume_init() + if let Some(method_def_id) = cx.tables.type_dependent_def_id(src.hir_id); + if cx.tcx.is_diagnostic_item(sym::assume_init, method_def_id); + then { + let mut applicability = Applicability::MachineApplicable; + span_lint_and_sugg( + cx, + MEM_REPLACE_WITH_UNINIT, + expr_span, + "replacing with `mem::MaybeUninit::uninit().assume_init()`", + "consider using", + format!( + "std::ptr::read({})", + snippet_with_applicability(cx, dest.span, "", &mut applicability) + ), + applicability, + ); + return; + } + } + + if_chain! { + if let ExprKind::Call(ref repl_func, ref repl_args) = src.kind; + if repl_args.is_empty(); + if let ExprKind::Path(ref repl_func_qpath) = repl_func.kind; + if let Some(repl_def_id) = cx.tables.qpath_res(repl_func_qpath, repl_func.hir_id).opt_def_id(); + then { + if cx.tcx.is_diagnostic_item(sym::mem_uninitialized, repl_def_id) { + let mut applicability = Applicability::MachineApplicable; + span_lint_and_sugg( + cx, + MEM_REPLACE_WITH_UNINIT, + expr_span, + "replacing with `mem::uninitialized()`", + "consider using", + format!( + "std::ptr::read({})", + snippet_with_applicability(cx, dest.span, "", &mut applicability) + ), + applicability, + ); + } else if cx.tcx.is_diagnostic_item(sym::mem_zeroed, repl_def_id) && + !cx.tables.expr_ty(src).is_primitive() { + span_lint_and_help( + cx, + MEM_REPLACE_WITH_UNINIT, + expr_span, + "replacing with `mem::zeroed()`", + None, + "consider using a default value or the `take_mut` crate instead", + ); } } } @@ -209,7 +235,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MemReplace { if let [dest, src] = &**func_args; then { check_replace_option_with_none(cx, src, dest, expr.span); - check_replace_with_uninit(cx, src, expr.span); + check_replace_with_uninit(cx, src, dest, expr.span); check_replace_with_default(cx, src, dest, expr.span); } } diff --git a/tests/ui/repl_uninit.rs b/tests/ui/repl_uninit.rs index 346972b7bb4e0..ad5b8e4857d17 100644 --- a/tests/ui/repl_uninit.rs +++ b/tests/ui/repl_uninit.rs @@ -17,6 +17,12 @@ fn main() { std::mem::forget(mem::replace(&mut v, new_v)); } + unsafe { + let taken_v = mem::replace(&mut v, mem::MaybeUninit::uninit().assume_init()); + let new_v = might_panic(taken_v); + std::mem::forget(mem::replace(&mut v, new_v)); + } + unsafe { let taken_v = mem::replace(&mut v, mem::zeroed()); let new_v = might_panic(taken_v); diff --git a/tests/ui/repl_uninit.stderr b/tests/ui/repl_uninit.stderr index c1f55d7601e5c..09468eeaea4bf 100644 --- a/tests/ui/repl_uninit.stderr +++ b/tests/ui/repl_uninit.stderr @@ -2,26 +2,29 @@ error: replacing with `mem::uninitialized()` --> $DIR/repl_uninit.rs:15:23 | LL | let taken_v = mem::replace(&mut v, mem::uninitialized()); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `std::ptr::read(&mut v)` | = note: `-D clippy::mem-replace-with-uninit` implied by `-D warnings` - = help: consider using the `take_mut` crate instead -error: replacing with `mem::zeroed()` +error: replacing with `mem::MaybeUninit::uninit().assume_init()` --> $DIR/repl_uninit.rs:21:23 | +LL | let taken_v = mem::replace(&mut v, mem::MaybeUninit::uninit().assume_init()); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `std::ptr::read(&mut v)` + +error: replacing with `mem::zeroed()` + --> $DIR/repl_uninit.rs:27:23 + | LL | let taken_v = mem::replace(&mut v, mem::zeroed()); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = help: consider using a default value or the `take_mut` crate instead error: replacing with `mem::uninitialized()` - --> $DIR/repl_uninit.rs:33:28 + --> $DIR/repl_uninit.rs:39:28 | LL | let taken_u = unsafe { mem::replace(uref, mem::uninitialized()) }; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = help: consider using the `take_mut` crate instead + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `std::ptr::read(uref)` -error: aborting due to 3 previous errors +error: aborting due to 4 previous errors From a7743e9084f9ccd7c966f98a14fa667c694d66ab Mon Sep 17 00:00:00 2001 From: Eduardo Broto Date: Wed, 17 Jun 2020 00:32:47 +0200 Subject: [PATCH 041/142] redundant_pattern_matching: avoid non-const fn in const context --- .../src/redundant_pattern_matching.rs | 80 ++++++++++++++----- tests/ui/redundant_pattern_matching.fixed | 42 ++++++++++ tests/ui/redundant_pattern_matching.rs | 42 ++++++++++ tests/ui/redundant_pattern_matching.stderr | 56 ++++++------- ...undant_pattern_matching_const_result.fixed | 46 +++++++++++ ...redundant_pattern_matching_const_result.rs | 52 ++++++++++++ ...ndant_pattern_matching_const_result.stderr | 46 +++++++++++ 7 files changed, 318 insertions(+), 46 deletions(-) create mode 100644 tests/ui/redundant_pattern_matching_const_result.fixed create mode 100644 tests/ui/redundant_pattern_matching_const_result.rs create mode 100644 tests/ui/redundant_pattern_matching_const_result.stderr diff --git a/clippy_lints/src/redundant_pattern_matching.rs b/clippy_lints/src/redundant_pattern_matching.rs index 7ee298e9833f2..b95b12c4eb522 100644 --- a/clippy_lints/src/redundant_pattern_matching.rs +++ b/clippy_lints/src/redundant_pattern_matching.rs @@ -1,10 +1,13 @@ -use crate::utils::{match_qpath, match_trait_method, paths, snippet, span_lint_and_then}; +use crate::utils::{in_constant, match_qpath, match_trait_method, paths, snippet, span_lint_and_then}; use if_chain::if_chain; use rustc_ast::ast::LitKind; use rustc_errors::Applicability; -use rustc_hir::{Arm, Expr, ExprKind, MatchSource, PatKind, QPath}; +use rustc_hir::{Arm, Expr, ExprKind, HirId, MatchSource, PatKind, QPath}; use rustc_lint::{LateContext, LateLintPass}; +use rustc_middle::ty; +use rustc_mir::const_eval::is_const_fn; use rustc_session::{declare_lint_pass, declare_tool_lint}; +use rustc_span::source_map::Symbol; declare_clippy_lint! { /// **What it does:** Lint for redundant pattern matching over `Result` or @@ -64,26 +67,37 @@ fn find_sugg_for_if_let<'a, 'tcx>( arms: &[Arm<'_>], keyword: &'static str, ) { + fn find_suggestion(cx: &LateContext<'_, '_>, hir_id: HirId, path: &QPath<'_>) -> Option<&'static str> { + if match_qpath(path, &paths::RESULT_OK) && can_suggest(cx, hir_id, sym!(result_type), "is_ok") { + return Some("is_ok()"); + } + if match_qpath(path, &paths::RESULT_ERR) && can_suggest(cx, hir_id, sym!(result_type), "is_err") { + return Some("is_err()"); + } + if match_qpath(path, &paths::OPTION_SOME) && can_suggest(cx, hir_id, sym!(option_type), "is_some") { + return Some("is_some()"); + } + if match_qpath(path, &paths::OPTION_NONE) && can_suggest(cx, hir_id, sym!(option_type), "is_none") { + return Some("is_none()"); + } + None + } + + let hir_id = expr.hir_id; let good_method = match arms[0].pat.kind { PatKind::TupleStruct(ref path, ref patterns, _) if patterns.len() == 1 => { if let PatKind::Wild = patterns[0].kind { - if match_qpath(path, &paths::RESULT_OK) { - "is_ok()" - } else if match_qpath(path, &paths::RESULT_ERR) { - "is_err()" - } else if match_qpath(path, &paths::OPTION_SOME) { - "is_some()" - } else { - return; - } + find_suggestion(cx, hir_id, path) } else { - return; + None } }, - - PatKind::Path(ref path) if match_qpath(path, &paths::OPTION_NONE) => "is_none()", - - _ => return, + PatKind::Path(ref path) => find_suggestion(cx, hir_id, path), + _ => None, + }; + let good_method = match good_method { + Some(method) => method, + None => return, }; // check that `while_let_on_iterator` lint does not trigger @@ -128,6 +142,7 @@ fn find_sugg_for_match<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_ if arms.len() == 2 { let node_pair = (&arms[0].pat.kind, &arms[1].pat.kind); + let hir_id = expr.hir_id; let found_good_method = match node_pair { ( PatKind::TupleStruct(ref path_left, ref patterns_left, _), @@ -142,6 +157,8 @@ fn find_sugg_for_match<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_ &paths::RESULT_ERR, "is_ok()", "is_err()", + || can_suggest(cx, hir_id, sym!(result_type), "is_ok"), + || can_suggest(cx, hir_id, sym!(result_type), "is_err"), ) } else { None @@ -160,6 +177,8 @@ fn find_sugg_for_match<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_ &paths::OPTION_NONE, "is_some()", "is_none()", + || can_suggest(cx, hir_id, sym!(option_type), "is_some"), + || can_suggest(cx, hir_id, sym!(option_type), "is_none"), ) } else { None @@ -188,6 +207,7 @@ fn find_sugg_for_match<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_ } } +#[allow(clippy::too_many_arguments)] fn find_good_method_for_match<'a>( arms: &[Arm<'_>], path_left: &QPath<'_>, @@ -196,6 +216,8 @@ fn find_good_method_for_match<'a>( expected_right: &[&str], should_be_left: &'a str, should_be_right: &'a str, + can_suggest_left: impl Fn() -> bool, + can_suggest_right: impl Fn() -> bool, ) -> Option<&'a str> { let body_node_pair = if match_qpath(path_left, expected_left) && match_qpath(path_right, expected_right) { (&(*arms[0].body).kind, &(*arms[1].body).kind) @@ -207,10 +229,32 @@ fn find_good_method_for_match<'a>( match body_node_pair { (ExprKind::Lit(ref lit_left), ExprKind::Lit(ref lit_right)) => match (&lit_left.node, &lit_right.node) { - (LitKind::Bool(true), LitKind::Bool(false)) => Some(should_be_left), - (LitKind::Bool(false), LitKind::Bool(true)) => Some(should_be_right), + (LitKind::Bool(true), LitKind::Bool(false)) if can_suggest_left() => Some(should_be_left), + (LitKind::Bool(false), LitKind::Bool(true)) if can_suggest_right() => Some(should_be_right), _ => None, }, _ => None, } } + +fn can_suggest(cx: &LateContext<'_, '_>, hir_id: HirId, diag_item: Symbol, name: &str) -> bool { + if !in_constant(cx, hir_id) { + return true; + } + + // Avoid suggesting calls to non-`const fn`s in const contexts, see #5697. + cx.tcx + .get_diagnostic_item(diag_item) + .and_then(|def_id| { + cx.tcx.inherent_impls(def_id).iter().find_map(|imp| { + cx.tcx + .associated_items(*imp) + .in_definition_order() + .find_map(|item| match item.kind { + ty::AssocKind::Fn if item.ident.name.as_str() == name => Some(item.def_id), + _ => None, + }) + }) + }) + .map_or(false, |def_id| is_const_fn(cx.tcx, def_id)) +} diff --git a/tests/ui/redundant_pattern_matching.fixed b/tests/ui/redundant_pattern_matching.fixed index fc8cb0e747c73..6ba5cfb1d7177 100644 --- a/tests/ui/redundant_pattern_matching.fixed +++ b/tests/ui/redundant_pattern_matching.fixed @@ -1,5 +1,7 @@ // run-rustfix +#![feature(const_if_match)] +#![feature(const_loop)] #![warn(clippy::all)] #![warn(clippy::redundant_pattern_matching)] #![allow(clippy::unit_arg, unused_must_use, clippy::needless_bool, deprecated)] @@ -67,6 +69,7 @@ fn main() { takes_bool(x); issue5504(); + issue5697(); let _ = if gen_opt().is_some() { 1 @@ -117,3 +120,42 @@ fn issue5504() { if m!().is_some() {} while m!().is_some() {} } + +// None of these should be linted because none of the suggested methods +// are `const fn` without toggling a feature. +const fn issue5697() { + if let Ok(_) = Ok::(42) {} + + if let Err(_) = Err::(42) {} + + if let Some(_) = Some(42) {} + + if let None = None::<()> {} + + while let Ok(_) = Ok::(10) {} + + while let Err(_) = Ok::(10) {} + + while let Some(_) = Some(42) {} + + while let None = None::<()> {} + + match Ok::(42) { + Ok(_) => true, + Err(_) => false, + }; + + match Err::(42) { + Ok(_) => false, + Err(_) => true, + }; + match Some(42) { + Some(_) => true, + None => false, + }; + + match None::<()> { + Some(_) => false, + None => true, + }; +} diff --git a/tests/ui/redundant_pattern_matching.rs b/tests/ui/redundant_pattern_matching.rs index 51912dade0356..17de66f9ad0eb 100644 --- a/tests/ui/redundant_pattern_matching.rs +++ b/tests/ui/redundant_pattern_matching.rs @@ -1,5 +1,7 @@ // run-rustfix +#![feature(const_if_match)] +#![feature(const_loop)] #![warn(clippy::all)] #![warn(clippy::redundant_pattern_matching)] #![allow(clippy::unit_arg, unused_must_use, clippy::needless_bool, deprecated)] @@ -88,6 +90,7 @@ fn main() { takes_bool(x); issue5504(); + issue5697(); let _ = if let Some(_) = gen_opt() { 1 @@ -138,3 +141,42 @@ fn issue5504() { if let Some(_) = m!() {} while let Some(_) = m!() {} } + +// None of these should be linted because none of the suggested methods +// are `const fn` without toggling a feature. +const fn issue5697() { + if let Ok(_) = Ok::(42) {} + + if let Err(_) = Err::(42) {} + + if let Some(_) = Some(42) {} + + if let None = None::<()> {} + + while let Ok(_) = Ok::(10) {} + + while let Err(_) = Ok::(10) {} + + while let Some(_) = Some(42) {} + + while let None = None::<()> {} + + match Ok::(42) { + Ok(_) => true, + Err(_) => false, + }; + + match Err::(42) { + Ok(_) => false, + Err(_) => true, + }; + match Some(42) { + Some(_) => true, + None => false, + }; + + match None::<()> { + Some(_) => false, + None => true, + }; +} diff --git a/tests/ui/redundant_pattern_matching.stderr b/tests/ui/redundant_pattern_matching.stderr index b58deb7954efe..1b9a4b40a2f02 100644 --- a/tests/ui/redundant_pattern_matching.stderr +++ b/tests/ui/redundant_pattern_matching.stderr @@ -1,5 +1,5 @@ error: redundant pattern matching, consider using `is_ok()` - --> $DIR/redundant_pattern_matching.rs:8:12 + --> $DIR/redundant_pattern_matching.rs:10:12 | LL | if let Ok(_) = Ok::(42) {} | -------^^^^^--------------------- help: try this: `if Ok::(42).is_ok()` @@ -7,67 +7,67 @@ LL | if let Ok(_) = Ok::(42) {} = note: `-D clippy::redundant-pattern-matching` implied by `-D warnings` error: redundant pattern matching, consider using `is_err()` - --> $DIR/redundant_pattern_matching.rs:10:12 + --> $DIR/redundant_pattern_matching.rs:12:12 | LL | if let Err(_) = Err::(42) {} | -------^^^^^^---------------------- help: try this: `if Err::(42).is_err()` error: redundant pattern matching, consider using `is_none()` - --> $DIR/redundant_pattern_matching.rs:12:12 + --> $DIR/redundant_pattern_matching.rs:14:12 | LL | if let None = None::<()> {} | -------^^^^------------- help: try this: `if None::<()>.is_none()` error: redundant pattern matching, consider using `is_some()` - --> $DIR/redundant_pattern_matching.rs:14:12 + --> $DIR/redundant_pattern_matching.rs:16:12 | LL | if let Some(_) = Some(42) {} | -------^^^^^^^----------- help: try this: `if Some(42).is_some()` error: redundant pattern matching, consider using `is_some()` - --> $DIR/redundant_pattern_matching.rs:16:12 + --> $DIR/redundant_pattern_matching.rs:18:12 | LL | if let Some(_) = Some(42) { | -------^^^^^^^----------- help: try this: `if Some(42).is_some()` error: redundant pattern matching, consider using `is_some()` - --> $DIR/redundant_pattern_matching.rs:22:15 + --> $DIR/redundant_pattern_matching.rs:24:15 | LL | while let Some(_) = Some(42) {} | ----------^^^^^^^----------- help: try this: `while Some(42).is_some()` error: redundant pattern matching, consider using `is_none()` - --> $DIR/redundant_pattern_matching.rs:24:15 + --> $DIR/redundant_pattern_matching.rs:26:15 | LL | while let None = Some(42) {} | ----------^^^^----------- help: try this: `while Some(42).is_none()` error: redundant pattern matching, consider using `is_none()` - --> $DIR/redundant_pattern_matching.rs:26:15 + --> $DIR/redundant_pattern_matching.rs:28:15 | LL | while let None = None::<()> {} | ----------^^^^------------- help: try this: `while None::<()>.is_none()` error: redundant pattern matching, consider using `is_ok()` - --> $DIR/redundant_pattern_matching.rs:28:15 + --> $DIR/redundant_pattern_matching.rs:30:15 | LL | while let Ok(_) = Ok::(10) {} | ----------^^^^^--------------------- help: try this: `while Ok::(10).is_ok()` error: redundant pattern matching, consider using `is_err()` - --> $DIR/redundant_pattern_matching.rs:30:15 + --> $DIR/redundant_pattern_matching.rs:32:15 | LL | while let Err(_) = Ok::(10) {} | ----------^^^^^^--------------------- help: try this: `while Ok::(10).is_err()` error: redundant pattern matching, consider using `is_some()` - --> $DIR/redundant_pattern_matching.rs:33:15 + --> $DIR/redundant_pattern_matching.rs:35:15 | LL | while let Some(_) = v.pop() { | ----------^^^^^^^---------- help: try this: `while v.pop().is_some()` error: redundant pattern matching, consider using `is_ok()` - --> $DIR/redundant_pattern_matching.rs:49:5 + --> $DIR/redundant_pattern_matching.rs:51:5 | LL | / match Ok::(42) { LL | | Ok(_) => true, @@ -76,7 +76,7 @@ LL | | }; | |_____^ help: try this: `Ok::(42).is_ok()` error: redundant pattern matching, consider using `is_err()` - --> $DIR/redundant_pattern_matching.rs:54:5 + --> $DIR/redundant_pattern_matching.rs:56:5 | LL | / match Ok::(42) { LL | | Ok(_) => false, @@ -85,7 +85,7 @@ LL | | }; | |_____^ help: try this: `Ok::(42).is_err()` error: redundant pattern matching, consider using `is_err()` - --> $DIR/redundant_pattern_matching.rs:59:5 + --> $DIR/redundant_pattern_matching.rs:61:5 | LL | / match Err::(42) { LL | | Ok(_) => false, @@ -94,7 +94,7 @@ LL | | }; | |_____^ help: try this: `Err::(42).is_err()` error: redundant pattern matching, consider using `is_ok()` - --> $DIR/redundant_pattern_matching.rs:64:5 + --> $DIR/redundant_pattern_matching.rs:66:5 | LL | / match Err::(42) { LL | | Ok(_) => true, @@ -103,7 +103,7 @@ LL | | }; | |_____^ help: try this: `Err::(42).is_ok()` error: redundant pattern matching, consider using `is_some()` - --> $DIR/redundant_pattern_matching.rs:69:5 + --> $DIR/redundant_pattern_matching.rs:71:5 | LL | / match Some(42) { LL | | Some(_) => true, @@ -112,7 +112,7 @@ LL | | }; | |_____^ help: try this: `Some(42).is_some()` error: redundant pattern matching, consider using `is_none()` - --> $DIR/redundant_pattern_matching.rs:74:5 + --> $DIR/redundant_pattern_matching.rs:76:5 | LL | / match None::<()> { LL | | Some(_) => false, @@ -121,7 +121,7 @@ LL | | }; | |_____^ help: try this: `None::<()>.is_none()` error: redundant pattern matching, consider using `is_none()` - --> $DIR/redundant_pattern_matching.rs:79:13 + --> $DIR/redundant_pattern_matching.rs:81:13 | LL | let _ = match None::<()> { | _____________^ @@ -131,61 +131,61 @@ LL | | }; | |_____^ help: try this: `None::<()>.is_none()` error: redundant pattern matching, consider using `is_ok()` - --> $DIR/redundant_pattern_matching.rs:84:20 + --> $DIR/redundant_pattern_matching.rs:86:20 | LL | let _ = if let Ok(_) = Ok::(4) { true } else { false }; | -------^^^^^--------------------- help: try this: `if Ok::(4).is_ok()` error: redundant pattern matching, consider using `is_some()` - --> $DIR/redundant_pattern_matching.rs:87:20 + --> $DIR/redundant_pattern_matching.rs:89:20 | LL | let x = if let Some(_) = opt { true } else { false }; | -------^^^^^^^------ help: try this: `if opt.is_some()` error: redundant pattern matching, consider using `is_some()` - --> $DIR/redundant_pattern_matching.rs:92:20 + --> $DIR/redundant_pattern_matching.rs:95:20 | LL | let _ = if let Some(_) = gen_opt() { | -------^^^^^^^------------ help: try this: `if gen_opt().is_some()` error: redundant pattern matching, consider using `is_none()` - --> $DIR/redundant_pattern_matching.rs:94:19 + --> $DIR/redundant_pattern_matching.rs:97:19 | LL | } else if let None = gen_opt() { | -------^^^^------------ help: try this: `if gen_opt().is_none()` error: redundant pattern matching, consider using `is_ok()` - --> $DIR/redundant_pattern_matching.rs:96:19 + --> $DIR/redundant_pattern_matching.rs:99:19 | LL | } else if let Ok(_) = gen_res() { | -------^^^^^------------ help: try this: `if gen_res().is_ok()` error: redundant pattern matching, consider using `is_err()` - --> $DIR/redundant_pattern_matching.rs:98:19 + --> $DIR/redundant_pattern_matching.rs:101:19 | LL | } else if let Err(_) = gen_res() { | -------^^^^^^------------ help: try this: `if gen_res().is_err()` error: redundant pattern matching, consider using `is_some()` - --> $DIR/redundant_pattern_matching.rs:131:19 + --> $DIR/redundant_pattern_matching.rs:134:19 | LL | while let Some(_) = r#try!(result_opt()) {} | ----------^^^^^^^----------------------- help: try this: `while r#try!(result_opt()).is_some()` error: redundant pattern matching, consider using `is_some()` - --> $DIR/redundant_pattern_matching.rs:132:16 + --> $DIR/redundant_pattern_matching.rs:135:16 | LL | if let Some(_) = r#try!(result_opt()) {} | -------^^^^^^^----------------------- help: try this: `if r#try!(result_opt()).is_some()` error: redundant pattern matching, consider using `is_some()` - --> $DIR/redundant_pattern_matching.rs:138:12 + --> $DIR/redundant_pattern_matching.rs:141:12 | LL | if let Some(_) = m!() {} | -------^^^^^^^------- help: try this: `if m!().is_some()` error: redundant pattern matching, consider using `is_some()` - --> $DIR/redundant_pattern_matching.rs:139:15 + --> $DIR/redundant_pattern_matching.rs:142:15 | LL | while let Some(_) = m!() {} | ----------^^^^^^^------- help: try this: `while m!().is_some()` diff --git a/tests/ui/redundant_pattern_matching_const_result.fixed b/tests/ui/redundant_pattern_matching_const_result.fixed new file mode 100644 index 0000000000000..c8bc5458067d3 --- /dev/null +++ b/tests/ui/redundant_pattern_matching_const_result.fixed @@ -0,0 +1,46 @@ +// run-rustfix + +#![feature(const_if_match)] +#![feature(const_loop)] +#![feature(const_result)] +#![warn(clippy::redundant_pattern_matching)] +#![allow(unused)] + +// Test that results are linted with the feature enabled. + +const fn issue_5697() { + if Ok::(42).is_ok() {} + + if Err::(42).is_err() {} + + while Ok::(10).is_ok() {} + + while Ok::(10).is_err() {} + + Ok::(42).is_ok(); + + Err::(42).is_err(); + + // These should not be linted until `const_option` is implemented. + // See https://github.com/rust-lang/rust/issues/67441 + + if let Some(_) = Some(42) {} + + if let None = None::<()> {} + + while let Some(_) = Some(42) {} + + while let None = None::<()> {} + + match Some(42) { + Some(_) => true, + None => false, + }; + + match None::<()> { + Some(_) => false, + None => true, + }; +} + +fn main() {} diff --git a/tests/ui/redundant_pattern_matching_const_result.rs b/tests/ui/redundant_pattern_matching_const_result.rs new file mode 100644 index 0000000000000..75f37ec15c622 --- /dev/null +++ b/tests/ui/redundant_pattern_matching_const_result.rs @@ -0,0 +1,52 @@ +// run-rustfix + +#![feature(const_if_match)] +#![feature(const_loop)] +#![feature(const_result)] +#![warn(clippy::redundant_pattern_matching)] +#![allow(unused)] + +// Test that results are linted with the feature enabled. + +const fn issue_5697() { + if let Ok(_) = Ok::(42) {} + + if let Err(_) = Err::(42) {} + + while let Ok(_) = Ok::(10) {} + + while let Err(_) = Ok::(10) {} + + match Ok::(42) { + Ok(_) => true, + Err(_) => false, + }; + + match Err::(42) { + Ok(_) => false, + Err(_) => true, + }; + + // These should not be linted until `const_option` is implemented. + // See https://github.com/rust-lang/rust/issues/67441 + + if let Some(_) = Some(42) {} + + if let None = None::<()> {} + + while let Some(_) = Some(42) {} + + while let None = None::<()> {} + + match Some(42) { + Some(_) => true, + None => false, + }; + + match None::<()> { + Some(_) => false, + None => true, + }; +} + +fn main() {} diff --git a/tests/ui/redundant_pattern_matching_const_result.stderr b/tests/ui/redundant_pattern_matching_const_result.stderr new file mode 100644 index 0000000000000..c32292f0eee8b --- /dev/null +++ b/tests/ui/redundant_pattern_matching_const_result.stderr @@ -0,0 +1,46 @@ +error: redundant pattern matching, consider using `is_ok()` + --> $DIR/redundant_pattern_matching_const_result.rs:12:12 + | +LL | if let Ok(_) = Ok::(42) {} + | -------^^^^^--------------------- help: try this: `if Ok::(42).is_ok()` + | + = note: `-D clippy::redundant-pattern-matching` implied by `-D warnings` + +error: redundant pattern matching, consider using `is_err()` + --> $DIR/redundant_pattern_matching_const_result.rs:14:12 + | +LL | if let Err(_) = Err::(42) {} + | -------^^^^^^---------------------- help: try this: `if Err::(42).is_err()` + +error: redundant pattern matching, consider using `is_ok()` + --> $DIR/redundant_pattern_matching_const_result.rs:16:15 + | +LL | while let Ok(_) = Ok::(10) {} + | ----------^^^^^--------------------- help: try this: `while Ok::(10).is_ok()` + +error: redundant pattern matching, consider using `is_err()` + --> $DIR/redundant_pattern_matching_const_result.rs:18:15 + | +LL | while let Err(_) = Ok::(10) {} + | ----------^^^^^^--------------------- help: try this: `while Ok::(10).is_err()` + +error: redundant pattern matching, consider using `is_ok()` + --> $DIR/redundant_pattern_matching_const_result.rs:20:5 + | +LL | / match Ok::(42) { +LL | | Ok(_) => true, +LL | | Err(_) => false, +LL | | }; + | |_____^ help: try this: `Ok::(42).is_ok()` + +error: redundant pattern matching, consider using `is_err()` + --> $DIR/redundant_pattern_matching_const_result.rs:25:5 + | +LL | / match Err::(42) { +LL | | Ok(_) => false, +LL | | Err(_) => true, +LL | | }; + | |_____^ help: try this: `Err::(42).is_err()` + +error: aborting due to 6 previous errors + From f3a40f5eb1cedebd374ebcd52341dfec60f3ea10 Mon Sep 17 00:00:00 2001 From: sozysozbot Date: Thu, 18 Jun 2020 06:50:04 +0900 Subject: [PATCH 042/142] Fix typo extending it's lifetime -> extending its lifetime --- clippy_lints/src/let_underscore.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clippy_lints/src/let_underscore.rs b/clippy_lints/src/let_underscore.rs index 710dec8d33fc9..acd628bbaca59 100644 --- a/clippy_lints/src/let_underscore.rs +++ b/clippy_lints/src/let_underscore.rs @@ -35,7 +35,7 @@ declare_clippy_lint! { /// **What it does:** Checks for `let _ = sync_lock` /// /// **Why is this bad?** This statement immediately drops the lock instead of - /// extending it's lifetime to the end of the scope, which is often not intended. + /// extending its lifetime to the end of the scope, which is often not intended. /// To extend lock lifetime to the end of the scope, use an underscore-prefixed /// name instead (i.e. _lock). If you want to explicitly drop the lock, /// `std::mem::drop` conveys your intention better and is less error-prone. From b7f23968cc44763b4d2c357ca0f45d33e56d2a2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Thu, 18 Jun 2020 14:01:25 -0700 Subject: [PATCH 043/142] Perform obligation deduplication to avoid buggy `ExistentialMismatch` Fix #59326. --- src/librustc_middle/ty/relate.rs | 16 +++++++++++++--- src/test/ui/issues/issue-59326.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 src/test/ui/issues/issue-59326.rs diff --git a/src/librustc_middle/ty/relate.rs b/src/librustc_middle/ty/relate.rs index cddd7081ca375..94f9e262865eb 100644 --- a/src/librustc_middle/ty/relate.rs +++ b/src/librustc_middle/ty/relate.rs @@ -617,12 +617,22 @@ impl<'tcx> Relate<'tcx> for &'tcx ty::List> { a: &Self, b: &Self, ) -> RelateResult<'tcx, Self> { - if a.len() != b.len() { + let tcx = relation.tcx(); + + // FIXME: this is wasteful, but want to do a perf run to see how slow it is. + // We need to perform this deduplication as we sometimes generate duplicate projections + // in `a`. + let mut a_v: Vec<_> = a.into_iter().collect(); + let mut b_v: Vec<_> = b.into_iter().collect(); + a_v.sort_by(|a, b| a.stable_cmp(tcx, b)); + a_v.dedup(); + b_v.sort_by(|a, b| a.stable_cmp(tcx, b)); + b_v.dedup(); + if a_v.len() != b_v.len() { return Err(TypeError::ExistentialMismatch(expected_found(relation, a, b))); } - let tcx = relation.tcx(); - let v = a.iter().zip(b.iter()).map(|(ep_a, ep_b)| { + let v = a_v.into_iter().zip(b_v.into_iter()).map(|(ep_a, ep_b)| { use crate::ty::ExistentialPredicate::*; match (ep_a, ep_b) { (Trait(ref a), Trait(ref b)) => Ok(Trait(relation.relate(a, b)?)), diff --git a/src/test/ui/issues/issue-59326.rs b/src/test/ui/issues/issue-59326.rs new file mode 100644 index 0000000000000..c0e8837749eb4 --- /dev/null +++ b/src/test/ui/issues/issue-59326.rs @@ -0,0 +1,26 @@ +// check-pass +trait Service { + type S; +} + +trait Framing { + type F; +} + +impl Framing for () { + type F = (); +} + +trait HttpService: Service {} + +type BoxService = Box>; + +fn build_server BoxService>(_: F) {} + +fn make_server() -> Box> { + unimplemented!() +} + +fn main() { + build_server(|| make_server()) +} From 922ff8e485fc6d95286fcf860e05742dc8797223 Mon Sep 17 00:00:00 2001 From: Aman Arora Date: Wed, 17 Jun 2020 18:13:05 -0400 Subject: [PATCH 044/142] Refactor hir::Place For the following code ```rust let c = || bar(foo.x, foo.x) ``` We generate two different `hir::Place`s for both `foo.x`. Handling this adds overhead for analysis we need to do for RFC 2229. We also want to store type information at each Projection to support analysis as part of the RFC. This resembles what we have for `mir::Place` This commit modifies the Place as follows: - Rename to `PlaceWithHirId`, where there `hir_id` is that of the expressioin. - Move any other information that describes the access out to another struct now called `Place`. - Removed `Span`, it can be accessed using the [hir API](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/hir/map/struct.Map.html#method.span) - Modify `Projection` to be a strucutre of its own, that currently only contains the `ProjectionKind`. Adding type information to projections wil be completed as part of https://github.com/rust-lang/project-rfc-2229/issues/5 Closes https://github.com/rust-lang/project-rfc-2229/issues/3 Co-authored-by: Aman Arora Co-authored-by: Roxane Fruytier --- clippy_lints/src/escape.rs | 20 +++++++------- clippy_lints/src/loops.rs | 32 ++++++++++++---------- clippy_lints/src/needless_pass_by_value.rs | 10 +++---- clippy_lints/src/utils/usage.rs | 12 ++++---- 4 files changed, 38 insertions(+), 36 deletions(-) diff --git a/clippy_lints/src/escape.rs b/clippy_lints/src/escape.rs index 7227683aa5ac2..59af475af175e 100644 --- a/clippy_lints/src/escape.rs +++ b/clippy_lints/src/escape.rs @@ -6,7 +6,7 @@ use rustc_middle::ty::{self, Ty}; use rustc_session::{declare_tool_lint, impl_lint_pass}; use rustc_span::source_map::Span; use rustc_target::abi::LayoutOf; -use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, Place, PlaceBase}; +use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceWithHirId, PlaceBase}; use crate::utils::span_lint; @@ -112,9 +112,9 @@ fn is_argument(map: rustc_middle::hir::map::Map<'_>, id: HirId) -> bool { } impl<'a, 'tcx> Delegate<'tcx> for EscapeDelegate<'a, 'tcx> { - fn consume(&mut self, cmt: &Place<'tcx>, mode: ConsumeMode) { - if cmt.projections.is_empty() { - if let PlaceBase::Local(lid) = cmt.base { + fn consume(&mut self, cmt: &PlaceWithHirId<'tcx>, mode: ConsumeMode) { + if cmt.place.projections.is_empty() { + if let PlaceBase::Local(lid) = cmt.place.base { if let ConsumeMode::Move = mode { // moved out or in. clearly can't be localized self.set.remove(&lid); @@ -132,16 +132,16 @@ impl<'a, 'tcx> Delegate<'tcx> for EscapeDelegate<'a, 'tcx> { } } - fn borrow(&mut self, cmt: &Place<'tcx>, _: ty::BorrowKind) { - if cmt.projections.is_empty() { - if let PlaceBase::Local(lid) = cmt.base { + fn borrow(&mut self, cmt: &PlaceWithHirId<'tcx>, _: ty::BorrowKind) { + if cmt.place.projections.is_empty() { + if let PlaceBase::Local(lid) = cmt.place.base { self.set.remove(&lid); } } } - fn mutate(&mut self, cmt: &Place<'tcx>) { - if cmt.projections.is_empty() { + fn mutate(&mut self, cmt: &PlaceWithHirId<'tcx>) { + if cmt.place.projections.is_empty() { let map = &self.cx.tcx.hir(); if is_argument(*map, cmt.hir_id) { // Skip closure arguments @@ -150,7 +150,7 @@ impl<'a, 'tcx> Delegate<'tcx> for EscapeDelegate<'a, 'tcx> { return; } - if is_non_trait_box(cmt.ty) && !self.is_large_box(cmt.ty) { + if is_non_trait_box(cmt.place.ty) && !self.is_large_box(cmt.place.ty) { self.set.insert(cmt.hir_id); } return; diff --git a/clippy_lints/src/loops.rs b/clippy_lints/src/loops.rs index 771bc8d055825..83093ec51bd90 100644 --- a/clippy_lints/src/loops.rs +++ b/clippy_lints/src/loops.rs @@ -28,7 +28,7 @@ use rustc_middle::ty::{self, Ty, TyS}; use rustc_session::{declare_lint_pass, declare_tool_lint}; use rustc_span::source_map::Span; use rustc_span::symbol::Symbol; -use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, Place, PlaceBase}; +use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceWithHirId, PlaceBase}; use std::iter::{once, Iterator}; use std::mem; @@ -1489,42 +1489,43 @@ fn check_for_loop_over_map_kv<'a, 'tcx>( } } -struct MutatePairDelegate { +struct MutatePairDelegate<'a, 'tcx> { + cx: &'a LateContext<'a, 'tcx>, hir_id_low: Option, hir_id_high: Option, span_low: Option, span_high: Option, } -impl<'tcx> Delegate<'tcx> for MutatePairDelegate { - fn consume(&mut self, _: &Place<'tcx>, _: ConsumeMode) {} +impl<'a, 'tcx> Delegate<'tcx> for MutatePairDelegate<'a, 'tcx> { + fn consume(&mut self, _: &PlaceWithHirId<'tcx>, _: ConsumeMode) {} - fn borrow(&mut self, cmt: &Place<'tcx>, bk: ty::BorrowKind) { + fn borrow(&mut self, cmt: &PlaceWithHirId<'tcx>, bk: ty::BorrowKind) { if let ty::BorrowKind::MutBorrow = bk { - if let PlaceBase::Local(id) = cmt.base { + if let PlaceBase::Local(id) = cmt.place.base { if Some(id) == self.hir_id_low { - self.span_low = Some(cmt.span) + self.span_low = Some(self.cx.tcx.hir().span(cmt.hir_id)) } if Some(id) == self.hir_id_high { - self.span_high = Some(cmt.span) + self.span_high = Some(self.cx.tcx.hir().span(cmt.hir_id)) } } } } - fn mutate(&mut self, cmt: &Place<'tcx>) { - if let PlaceBase::Local(id) = cmt.base { + fn mutate(&mut self, cmt: &PlaceWithHirId<'tcx>) { + if let PlaceBase::Local(id) = cmt.place.base { if Some(id) == self.hir_id_low { - self.span_low = Some(cmt.span) + self.span_low = Some(self.cx.tcx.hir().span(cmt.hir_id)) } if Some(id) == self.hir_id_high { - self.span_high = Some(cmt.span) + self.span_high = Some(self.cx.tcx.hir().span(cmt.hir_id)) } } } } -impl<'tcx> MutatePairDelegate { +impl<'a, 'tcx> MutatePairDelegate<'a, 'tcx> { fn mutation_span(&self) -> (Option, Option) { (self.span_low, self.span_high) } @@ -1579,12 +1580,13 @@ fn check_for_mutability(cx: &LateContext<'_, '_>, bound: &Expr<'_>) -> Option, +fn check_for_mutation<'a, 'tcx> ( + cx: &LateContext<'a, 'tcx>, body: &Expr<'_>, bound_ids: &[Option], ) -> (Option, Option) { let mut delegate = MutatePairDelegate { + cx: cx, hir_id_low: bound_ids[0], hir_id_high: bound_ids[1], span_low: None, diff --git a/clippy_lints/src/needless_pass_by_value.rs b/clippy_lints/src/needless_pass_by_value.rs index 218b0d27f7486..ca87deac9891c 100644 --- a/clippy_lints/src/needless_pass_by_value.rs +++ b/clippy_lints/src/needless_pass_by_value.rs @@ -326,21 +326,21 @@ struct MovedVariablesCtxt { } impl MovedVariablesCtxt { - fn move_common(&mut self, cmt: &euv::Place<'_>) { - if let euv::PlaceBase::Local(vid) = cmt.base { + fn move_common(&mut self, cmt: &euv::PlaceWithHirId<'_>) { + if let euv::PlaceBase::Local(vid) = cmt.place.base { self.moved_vars.insert(vid); } } } impl<'tcx> euv::Delegate<'tcx> for MovedVariablesCtxt { - fn consume(&mut self, cmt: &euv::Place<'tcx>, mode: euv::ConsumeMode) { + fn consume(&mut self, cmt: &euv::PlaceWithHirId<'tcx>, mode: euv::ConsumeMode) { if let euv::ConsumeMode::Move = mode { self.move_common(cmt); } } - fn borrow(&mut self, _: &euv::Place<'tcx>, _: ty::BorrowKind) {} + fn borrow(&mut self, _: &euv::PlaceWithHirId<'tcx>, _: ty::BorrowKind) {} - fn mutate(&mut self, _: &euv::Place<'tcx>) {} + fn mutate(&mut self, _: &euv::PlaceWithHirId<'tcx>) {} } diff --git a/clippy_lints/src/utils/usage.rs b/clippy_lints/src/utils/usage.rs index 904d948ad29ed..6a7a1f1ceaaef 100644 --- a/clippy_lints/src/utils/usage.rs +++ b/clippy_lints/src/utils/usage.rs @@ -8,7 +8,7 @@ use rustc_lint::LateContext; use rustc_middle::hir::map::Map; use rustc_middle::ty; use rustc_span::symbol::{Ident, Symbol}; -use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, Place, PlaceBase}; +use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceWithHirId, PlaceBase}; /// Returns a set of mutated local variable IDs, or `None` if mutations could not be determined. pub fn mutated_variables<'a, 'tcx>(expr: &'tcx Expr<'_>, cx: &'a LateContext<'a, 'tcx>) -> Option> { @@ -46,8 +46,8 @@ struct MutVarsDelegate { impl<'tcx> MutVarsDelegate { #[allow(clippy::similar_names)] - fn update(&mut self, cat: &Place<'tcx>) { - match cat.base { + fn update(&mut self, cat: &PlaceWithHirId<'tcx>) { + match cat.place.base { PlaceBase::Local(id) => { self.used_mutably.insert(id); }, @@ -63,15 +63,15 @@ impl<'tcx> MutVarsDelegate { } impl<'tcx> Delegate<'tcx> for MutVarsDelegate { - fn consume(&mut self, _: &Place<'tcx>, _: ConsumeMode) {} + fn consume(&mut self, _: &PlaceWithHirId<'tcx>, _: ConsumeMode) {} - fn borrow(&mut self, cmt: &Place<'tcx>, bk: ty::BorrowKind) { + fn borrow(&mut self, cmt: &PlaceWithHirId<'tcx>, bk: ty::BorrowKind) { if let ty::BorrowKind::MutBorrow = bk { self.update(&cmt) } } - fn mutate(&mut self, cmt: &Place<'tcx>) { + fn mutate(&mut self, cmt: &PlaceWithHirId<'tcx>) { self.update(&cmt) } } From 8a816cad27e288070f0f4a64cdf833440440d553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Fri, 19 Jun 2020 15:02:12 +0200 Subject: [PATCH 045/142] Cleanup MinGW LLVM linkage workaround --- src/librustc_llvm/build.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/librustc_llvm/build.rs b/src/librustc_llvm/build.rs index ada48bc147e47..d25f8bd1b8c58 100644 --- a/src/librustc_llvm/build.rs +++ b/src/librustc_llvm/build.rs @@ -293,11 +293,9 @@ fn main() { } } - // LLVM requires symbols from this library, but apparently they're not printed - // during llvm-config? + // Libstdc++ depends on pthread which Rust doesn't link on MinGW + // since nothing else requires it. if target.contains("windows-gnu") { - println!("cargo:rustc-link-lib=static-nobundle=gcc_s"); println!("cargo:rustc-link-lib=static-nobundle=pthread"); - println!("cargo:rustc-link-lib=dylib=uuid"); } } From 56e115a2627ba8bdd2e66c759457af96b2b0286a Mon Sep 17 00:00:00 2001 From: luxx4x Date: Fri, 19 Jun 2020 16:36:23 -0400 Subject: [PATCH 046/142] Allow dynamic linking for iOS/tvOS targets. --- src/librustc_target/spec/apple_sdk_base.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/librustc_target/spec/apple_sdk_base.rs b/src/librustc_target/spec/apple_sdk_base.rs index b07c2aef1caca..0d0a0da9d1c4c 100644 --- a/src/librustc_target/spec/apple_sdk_base.rs +++ b/src/librustc_target/spec/apple_sdk_base.rs @@ -141,7 +141,6 @@ pub fn opts(arch: Arch, os: AppleOS) -> Result { let pre_link_args = build_pre_link_args(arch, os)?; Ok(TargetOptions { cpu: target_cpu(arch), - dynamic_linking: false, executables: true, pre_link_args, link_env_remove: link_env_remove(arch), From f66bcc5459d4a720b31eaeac3149f19799118d72 Mon Sep 17 00:00:00 2001 From: Ivan Tham Date: Sat, 20 Jun 2020 11:07:22 +0800 Subject: [PATCH 047/142] Add liballoc impl SpecFromElem for i8 Speedup vec![1_i8; N] for non-zero element. Before test do_bench_from_elem_i8 ... bench: 130 ns/iter (+/- 7) = 61 MB/s test do_bench_from_elem_u8 ... bench: 121 ns/iter (+/- 4) = 66 MB/s After test do_bench_from_elem_i8 ... bench: 123 ns/iter (+/- 7) = 65 MB/s test do_bench_from_elem_u8 ... bench: 121 ns/iter (+/- 5) = 66 MB/s No speed difference if element is already zero. #[bench] fn do_bench_from_elem_i8(b: &mut Bencher) { b.bytes = 8 as u64; b.iter(|| { let dst = ve::vec![10_i8; 100]; assert_eq!(dst.len(), 100); assert!(dst.iter().all(|x| *x == 10)); }) } As suggested by @cuviper https://rust-lang.zulipchat.com/#narrow/stream/219381-t-libs/topic/SpecForElem.20for.20other.20integers --- src/liballoc/vec.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs index f16cac05ea039..b4a8597656ecb 100644 --- a/src/liballoc/vec.rs +++ b/src/liballoc/vec.rs @@ -1803,6 +1803,21 @@ impl SpecFromElem for T { } } +impl SpecFromElem for i8 { + #[inline] + fn from_elem(elem: i8, n: usize) -> Vec { + if elem == 0 { + return Vec { buf: RawVec::with_capacity_zeroed(n), len: n }; + } + unsafe { + let mut v = Vec::with_capacity(n); + ptr::write_bytes(v.as_mut_ptr(), elem as u8, n); + v.set_len(n); + v + } + } +} + impl SpecFromElem for u8 { #[inline] fn from_elem(elem: u8, n: usize) -> Vec { @@ -1847,7 +1862,6 @@ macro_rules! impl_is_zero { }; } -impl_is_zero!(i8, |x| x == 0); impl_is_zero!(i16, |x| x == 0); impl_is_zero!(i32, |x| x == 0); impl_is_zero!(i64, |x| x == 0); From 1b47e8fa998f6d76d536594955336fe0327f894e Mon Sep 17 00:00:00 2001 From: Tshepang Lekhonkhobe Date: Sat, 20 Jun 2020 10:56:47 +0200 Subject: [PATCH 048/142] examples should be of type bool --- config.toml.example | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.toml.example b/config.toml.example index bc6760334170b..a918feb278f62 100644 --- a/config.toml.example +++ b/config.toml.example @@ -313,11 +313,11 @@ # Whether or not debug assertions are enabled for the compiler and standard # library. -#debug-assertions = debug +#debug-assertions = false # Whether or not debug assertions are enabled for the standard library. # Overrides the `debug-assertions` option, if defined. -#debug-assertions-std = debug-assertions +#debug-assertions-std = false # Debuginfo level for most of Rust code, corresponds to the `-C debuginfo=N` option of `rustc`. # `0` - no debug info From 16e741c8e941f887a5db02ebd60d9a69624fbc0b Mon Sep 17 00:00:00 2001 From: Tshepang Lekhonkhobe Date: Sat, 20 Jun 2020 13:22:13 +0200 Subject: [PATCH 049/142] explain the logic a bit --- config.toml.example | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/config.toml.example b/config.toml.example index a918feb278f62..e214bf048980d 100644 --- a/config.toml.example +++ b/config.toml.example @@ -313,10 +313,12 @@ # Whether or not debug assertions are enabled for the compiler and standard # library. +# Defaults to rust.debug value. #debug-assertions = false # Whether or not debug assertions are enabled for the standard library. # Overrides the `debug-assertions` option, if defined. +# Defaults to rust.debug value. #debug-assertions-std = false # Debuginfo level for most of Rust code, corresponds to the `-C debuginfo=N` option of `rustc`. @@ -326,16 +328,21 @@ # Can be overridden for specific subsets of Rust code (rustc, std or tools). # Debuginfo for tests run with compiletest is not controlled by this option # and needs to be enabled separately with `debuginfo-level-tests`. -#debuginfo-level = if debug { 2 } else { 0 } +# +# If debug is true, this defaults to 2. +#debuginfo-level = 0 # Debuginfo level for the compiler. -#debuginfo-level-rustc = debuginfo-level +# Defaults to rust.debuginfo-level value. +#debuginfo-level-rustc = 0 # Debuginfo level for the standard library. -#debuginfo-level-std = debuginfo-level +# Defaults to rust.debuginfo-level value. +#debuginfo-level-std = 0 # Debuginfo level for the tools. -#debuginfo-level-tools = debuginfo-level +# Defaults to rust.debuginfo-level value. +#debuginfo-level-tools = 0 # Debuginfo level for the test suites run with compiletest. # FIXME(#61117): Some tests fail when this option is enabled. From b92602ba692b03cc2f959f1927b4f909eb5e3fcc Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 21 Jun 2020 11:20:48 +0200 Subject: [PATCH 050/142] Make is_freeze and is_copy_modulo_regions take TyCtxtAt --- clippy_lints/src/functions.rs | 2 +- clippy_lints/src/let_if_seq.rs | 3 +-- clippy_lints/src/mut_key.rs | 2 +- clippy_lints/src/non_copy_const.rs | 2 +- clippy_lints/src/question_mark.rs | 2 +- clippy_lints/src/utils/mod.rs | 2 +- 6 files changed, 6 insertions(+), 7 deletions(-) diff --git a/clippy_lints/src/functions.rs b/clippy_lints/src/functions.rs index 991d129e8f0d6..1f9bd7a691b52 100644 --- a/clippy_lints/src/functions.rs +++ b/clippy_lints/src/functions.rs @@ -513,7 +513,7 @@ fn is_mutable_ty<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, ty: Ty<'tcx>, span: Span, // primitive types are never mutable ty::Bool | ty::Char | ty::Int(_) | ty::Uint(_) | ty::Float(_) | ty::Str => false, ty::Adt(ref adt, ref substs) => { - tys.insert(adt.did) && !ty.is_freeze(cx.tcx, cx.param_env, span) + tys.insert(adt.did) && !ty.is_freeze(cx.tcx.at(span), cx.param_env) || KNOWN_WRAPPER_TYS.iter().any(|path| match_def_path(cx, adt.did, path)) && substs.types().any(|ty| is_mutable_ty(cx, ty, span, tys)) }, diff --git a/clippy_lints/src/let_if_seq.rs b/clippy_lints/src/let_if_seq.rs index d7bf8a1476817..e097f40f87e47 100644 --- a/clippy_lints/src/let_if_seq.rs +++ b/clippy_lints/src/let_if_seq.rs @@ -74,9 +74,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for LetIfSeq { let span = stmt.span.to(if_.span); let has_interior_mutability = !cx.tables.node_type(canonical_id).is_freeze( - cx.tcx, + cx.tcx.at(span), cx.param_env, - span ); if has_interior_mutability { return; } diff --git a/clippy_lints/src/mut_key.rs b/clippy_lints/src/mut_key.rs index 0b9b7e1b8cc1b..93569a04f7a3a 100644 --- a/clippy_lints/src/mut_key.rs +++ b/clippy_lints/src/mut_key.rs @@ -118,7 +118,7 @@ fn is_mutable_type<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, ty: Ty<'tcx>, span: Spa size.try_eval_usize(cx.tcx, cx.param_env).map_or(true, |u| u != 0) && is_mutable_type(cx, inner_ty, span) }, Tuple(..) => ty.tuple_fields().any(|ty| is_mutable_type(cx, ty, span)), - Adt(..) => cx.tcx.layout_of(cx.param_env.and(ty)).is_ok() && !ty.is_freeze(cx.tcx, cx.param_env, span), + Adt(..) => cx.tcx.layout_of(cx.param_env.and(ty)).is_ok() && !ty.is_freeze(cx.tcx.at(span), cx.param_env), _ => false, } } diff --git a/clippy_lints/src/non_copy_const.rs b/clippy_lints/src/non_copy_const.rs index bb257e5a542d9..230dfd2ebf566 100644 --- a/clippy_lints/src/non_copy_const.rs +++ b/clippy_lints/src/non_copy_const.rs @@ -110,7 +110,7 @@ impl Source { } fn verify_ty_bound<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, ty: Ty<'tcx>, source: Source) { - if ty.is_freeze(cx.tcx, cx.param_env, DUMMY_SP) || is_copy(cx, ty) { + if ty.is_freeze(cx.tcx.at(DUMMY_SP), cx.param_env) || is_copy(cx, ty) { // An `UnsafeCell` is `!Copy`, and an `UnsafeCell` is also the only type which // is `!Freeze`, thus if our type is `Copy` we can be sure it must be `Freeze` // as well. diff --git a/clippy_lints/src/question_mark.rs b/clippy_lints/src/question_mark.rs index 3591972fe082f..d8a73f8054bca 100644 --- a/clippy_lints/src/question_mark.rs +++ b/clippy_lints/src/question_mark.rs @@ -137,7 +137,7 @@ impl QuestionMark { fn moves_by_default(cx: &LateContext<'_, '_>, expression: &Expr<'_>) -> bool { let expr_ty = cx.tables.expr_ty(expression); - !expr_ty.is_copy_modulo_regions(cx.tcx, cx.param_env, expression.span) + !expr_ty.is_copy_modulo_regions(cx.tcx.at(expression.span), cx.param_env) } fn is_option(cx: &LateContext<'_, '_>, expression: &Expr<'_>) -> bool { diff --git a/clippy_lints/src/utils/mod.rs b/clippy_lints/src/utils/mod.rs index 60ab19e71f5e4..6d4c6c6ce1cea 100644 --- a/clippy_lints/src/utils/mod.rs +++ b/clippy_lints/src/utils/mod.rs @@ -891,7 +891,7 @@ pub fn type_is_unsafe_function<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, ty: Ty<'tcx } pub fn is_copy<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, ty: Ty<'tcx>) -> bool { - ty.is_copy_modulo_regions(cx.tcx, cx.param_env, DUMMY_SP) + ty.is_copy_modulo_regions(cx.tcx.at(DUMMY_SP), cx.param_env) } /// Checks if an expression is constructing a tuple-like enum variant or struct From 7cac20995eb2ed411dfea26a5391f12134877b11 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 21 Jun 2020 12:21:38 +0200 Subject: [PATCH 051/142] add missing doc links --- src/libcore/mem/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libcore/mem/mod.rs b/src/libcore/mem/mod.rs index 066bb8b3dc787..2f70515fce357 100644 --- a/src/libcore/mem/mod.rs +++ b/src/libcore/mem/mod.rs @@ -364,6 +364,7 @@ pub fn size_of_val(val: &T) -> usize { /// [slice]: ../../std/primitive.slice.html /// [trait object]: ../../book/ch17-02-trait-objects.html /// [extern type]: ../../unstable-book/language-features/extern-types.html +/// [`size_of_val`]: ../../core/mem/fn.size_of_val.html /// /// # Examples /// @@ -498,6 +499,7 @@ pub fn align_of_val(val: &T) -> usize { /// [slice]: ../../std/primitive.slice.html /// [trait object]: ../../book/ch17-02-trait-objects.html /// [extern type]: ../../unstable-book/language-features/extern-types.html +/// [`align_of_val`]: ../../core/mem/fn.align_of_val.html /// /// # Examples /// From 55d207a44fef01848fe7224869c97bc786bfd89c Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 21 Jun 2020 12:23:37 +0200 Subject: [PATCH 052/142] tweak wording --- src/libcore/mem/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libcore/mem/mod.rs b/src/libcore/mem/mod.rs index 2f70515fce357..70159402b6278 100644 --- a/src/libcore/mem/mod.rs +++ b/src/libcore/mem/mod.rs @@ -358,7 +358,7 @@ pub fn size_of_val(val: &T) -> usize { /// - an (unstable) [extern type], then this function is always safe to /// call, but may panic or otherwise return the wrong value, as the /// extern type's layout is not known. This is the same behavior as -/// [`size_of_val`] on a reference to an extern type tail. +/// [`size_of_val`] on a reference to a type with extern type tail. /// - otherwise, it is conservatively not allowed to call this function. /// /// [slice]: ../../std/primitive.slice.html @@ -493,7 +493,7 @@ pub fn align_of_val(val: &T) -> usize { /// - an (unstable) [extern type], then this function is always safe to /// call, but may panic or otherwise return the wrong value, as the /// extern type's layout is not known. This is the same behavior as -/// [`align_of_val`] on a reference to an extern type tail. +/// [`align_of_val`] on a reference to a type with extern type tail. /// - otherwise, it is conservatively not allowed to call this function. /// /// [slice]: ../../std/primitive.slice.html From cb8c94c523d7ff407f9520a6555ea829c1232a50 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 21 Jun 2020 21:01:28 +0200 Subject: [PATCH 053/142] improve grammar Co-authored-by: Bastian Kauschke --- src/libcore/mem/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libcore/mem/mod.rs b/src/libcore/mem/mod.rs index 70159402b6278..157dd5bc3cc89 100644 --- a/src/libcore/mem/mod.rs +++ b/src/libcore/mem/mod.rs @@ -358,7 +358,7 @@ pub fn size_of_val(val: &T) -> usize { /// - an (unstable) [extern type], then this function is always safe to /// call, but may panic or otherwise return the wrong value, as the /// extern type's layout is not known. This is the same behavior as -/// [`size_of_val`] on a reference to a type with extern type tail. +/// [`size_of_val`] on a reference to a type with an extern type tail. /// - otherwise, it is conservatively not allowed to call this function. /// /// [slice]: ../../std/primitive.slice.html @@ -493,7 +493,7 @@ pub fn align_of_val(val: &T) -> usize { /// - an (unstable) [extern type], then this function is always safe to /// call, but may panic or otherwise return the wrong value, as the /// extern type's layout is not known. This is the same behavior as -/// [`align_of_val`] on a reference to a type with extern type tail. +/// [`align_of_val`] on a reference to a type with an extern type tail. /// - otherwise, it is conservatively not allowed to call this function. /// /// [slice]: ../../std/primitive.slice.html From 8d0e8820659fdf8473f7ff8f2fe0d234d16965d7 Mon Sep 17 00:00:00 2001 From: Amanieu d'Antras Date: Sun, 21 Jun 2020 15:34:18 +0100 Subject: [PATCH 054/142] Fix handling of reserved registers for ARM inline asm --- src/librustc_ast_lowering/expr.rs | 1 + src/librustc_codegen_llvm/llvm_util.rs | 4 +++ src/librustc_target/asm/arm.rs | 40 +++++++++++++++++++++++--- src/librustc_target/asm/mod.rs | 35 +++++++++++++--------- src/librustc_target/asm/riscv.rs | 2 ++ src/librustc_target/asm/x86.rs | 3 ++ 6 files changed, 67 insertions(+), 18 deletions(-) diff --git a/src/librustc_ast_lowering/expr.rs b/src/librustc_ast_lowering/expr.rs index e59cacfffc926..23e0da4cf32a0 100644 --- a/src/librustc_ast_lowering/expr.rs +++ b/src/librustc_ast_lowering/expr.rs @@ -1004,6 +1004,7 @@ impl<'hir> LoweringContext<'_, 'hir> { asm::InlineAsmReg::parse( sess.asm_arch?, |feature| sess.target_features.contains(&Symbol::intern(feature)), + &sess.target.target, s, ) .map_err(|e| { diff --git a/src/librustc_codegen_llvm/llvm_util.rs b/src/librustc_codegen_llvm/llvm_util.rs index 67a2251e8593e..80278bb9f53d8 100644 --- a/src/librustc_codegen_llvm/llvm_util.rs +++ b/src/librustc_codegen_llvm/llvm_util.rs @@ -156,6 +156,10 @@ const ARM_WHITELIST: &[(&str, Option)] = &[ ("vfp2", Some(sym::arm_target_feature)), ("vfp3", Some(sym::arm_target_feature)), ("vfp4", Some(sym::arm_target_feature)), + // This is needed for inline assembly, but shouldn't be stabilized as-is + // since it should be enabled per-function using #[instruction_set], not + // #[target_feature]. + ("thumb-mode", Some(sym::arm_target_feature)), ]; const AARCH64_WHITELIST: &[(&str, Option)] = &[ diff --git a/src/librustc_target/asm/arm.rs b/src/librustc_target/asm/arm.rs index 1798b2a094975..85a136b94aa79 100644 --- a/src/librustc_target/asm/arm.rs +++ b/src/librustc_target/asm/arm.rs @@ -1,4 +1,5 @@ use super::{InlineAsmArch, InlineAsmType}; +use crate::spec::Target; use rustc_macros::HashStable_Generic; use std::fmt; @@ -58,6 +59,37 @@ impl ArmInlineAsmRegClass { } } +// This uses the same logic as useR7AsFramePointer in LLVM +fn frame_pointer_is_r7(mut has_feature: impl FnMut(&str) -> bool, target: &Target) -> bool { + target.options.is_like_osx || (!target.options.is_like_windows && has_feature("thumb-mode")) +} + +fn frame_pointer_r11( + _arch: InlineAsmArch, + has_feature: impl FnMut(&str) -> bool, + target: &Target, + _allocating: bool, +) -> Result<(), &'static str> { + if !frame_pointer_is_r7(has_feature, target) { + Err("the frame pointer (r11) cannot be used as an operand for inline asm") + } else { + Ok(()) + } +} + +fn frame_pointer_r7( + _arch: InlineAsmArch, + has_feature: impl FnMut(&str) -> bool, + target: &Target, + _allocating: bool, +) -> Result<(), &'static str> { + if frame_pointer_is_r7(has_feature, target) { + Err("the frame pointer (r7) cannot be used as an operand for inline asm") + } else { + Ok(()) + } +} + def_regs! { Arm ArmInlineAsmReg ArmInlineAsmRegClass { r0: reg, reg_thumb = ["r0", "a1"], @@ -66,11 +98,11 @@ def_regs! { r3: reg, reg_thumb = ["r3", "a4"], r4: reg, reg_thumb = ["r4", "v1"], r5: reg, reg_thumb = ["r5", "v2"], - r6: reg, reg_thumb = ["r6", "v3"], - r7: reg, reg_thumb = ["r7", "v4"], + r7: reg, reg_thumb = ["r7", "v4"] % frame_pointer_r7, r8: reg = ["r8", "v5"], r9: reg = ["r9", "v6", "rfp"], r10: reg = ["r10", "sl"], + r11: reg = ["r11", "fp"] % frame_pointer_r11, r12: reg = ["r12", "ip"], r14: reg = ["r14", "lr"], s0: sreg, sreg_low16 = ["s0"], @@ -153,8 +185,8 @@ def_regs! { q13: qreg = ["q13"], q14: qreg = ["q14"], q15: qreg = ["q15"], - #error = ["r11", "fp"] => - "the frame pointer cannot be used as an operand for inline asm", + #error = ["r6", "v3"] => + "r6 is used internally by LLVM and cannot be used as an operand for inline asm", #error = ["r13", "sp"] => "the stack pointer cannot be used as an operand for inline asm", #error = ["r15", "pc"] => diff --git a/src/librustc_target/asm/mod.rs b/src/librustc_target/asm/mod.rs index 834d7c6d381a3..ccec17817d37d 100644 --- a/src/librustc_target/asm/mod.rs +++ b/src/librustc_target/asm/mod.rs @@ -1,4 +1,5 @@ use crate::abi::Size; +use crate::spec::Target; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_macros::HashStable_Generic; use rustc_span::Symbol; @@ -83,12 +84,13 @@ macro_rules! def_regs { pub fn parse( _arch: super::InlineAsmArch, mut _has_feature: impl FnMut(&str) -> bool, + _target: &crate::spec::Target, name: &str, ) -> Result { match name { $( $($alias)|* | $reg_name => { - $($filter(_arch, &mut _has_feature, false)?;)? + $($filter(_arch, &mut _has_feature, _target, false)?;)? Ok(Self::$reg) } )* @@ -103,6 +105,7 @@ macro_rules! def_regs { pub(super) fn fill_reg_map( _arch: super::InlineAsmArch, mut _has_feature: impl FnMut(&str) -> bool, + _target: &crate::spec::Target, _map: &mut rustc_data_structures::fx::FxHashMap< super::InlineAsmRegClass, rustc_data_structures::fx::FxHashSet, @@ -111,7 +114,7 @@ macro_rules! def_regs { #[allow(unused_imports)] use super::{InlineAsmReg, InlineAsmRegClass}; $( - if $($filter(_arch, &mut _has_feature, true).is_ok() &&)? true { + if $($filter(_arch, &mut _has_feature, _target, true).is_ok() &&)? true { if let Some(set) = _map.get_mut(&InlineAsmRegClass::$arch($arch_regclass::$class)) { set.insert(InlineAsmReg::$arch($arch_reg::$reg)); } @@ -234,6 +237,7 @@ impl InlineAsmReg { pub fn parse( arch: InlineAsmArch, has_feature: impl FnMut(&str) -> bool, + target: &Target, name: Symbol, ) -> Result { // FIXME: use direct symbol comparison for register names @@ -241,20 +245,22 @@ impl InlineAsmReg { let name = name.as_str(); Ok(match arch { InlineAsmArch::X86 | InlineAsmArch::X86_64 => { - Self::X86(X86InlineAsmReg::parse(arch, has_feature, &name)?) + Self::X86(X86InlineAsmReg::parse(arch, has_feature, target, &name)?) + } + InlineAsmArch::Arm => { + Self::Arm(ArmInlineAsmReg::parse(arch, has_feature, target, &name)?) } - InlineAsmArch::Arm => Self::Arm(ArmInlineAsmReg::parse(arch, has_feature, &name)?), InlineAsmArch::AArch64 => { - Self::AArch64(AArch64InlineAsmReg::parse(arch, has_feature, &name)?) + Self::AArch64(AArch64InlineAsmReg::parse(arch, has_feature, target, &name)?) } InlineAsmArch::RiscV32 | InlineAsmArch::RiscV64 => { - Self::RiscV(RiscVInlineAsmReg::parse(arch, has_feature, &name)?) + Self::RiscV(RiscVInlineAsmReg::parse(arch, has_feature, target, &name)?) } InlineAsmArch::Nvptx64 => { - Self::Nvptx(NvptxInlineAsmReg::parse(arch, has_feature, &name)?) + Self::Nvptx(NvptxInlineAsmReg::parse(arch, has_feature, target, &name)?) } InlineAsmArch::Hexagon => { - Self::Hexagon(HexagonInlineAsmReg::parse(arch, has_feature, &name)?) + Self::Hexagon(HexagonInlineAsmReg::parse(arch, has_feature, target, &name)?) } }) } @@ -536,36 +542,37 @@ impl fmt::Display for InlineAsmType { pub fn allocatable_registers( arch: InlineAsmArch, has_feature: impl FnMut(&str) -> bool, + target: &crate::spec::Target, ) -> FxHashMap> { match arch { InlineAsmArch::X86 | InlineAsmArch::X86_64 => { let mut map = x86::regclass_map(); - x86::fill_reg_map(arch, has_feature, &mut map); + x86::fill_reg_map(arch, has_feature, target, &mut map); map } InlineAsmArch::Arm => { let mut map = arm::regclass_map(); - arm::fill_reg_map(arch, has_feature, &mut map); + arm::fill_reg_map(arch, has_feature, target, &mut map); map } InlineAsmArch::AArch64 => { let mut map = aarch64::regclass_map(); - aarch64::fill_reg_map(arch, has_feature, &mut map); + aarch64::fill_reg_map(arch, has_feature, target, &mut map); map } InlineAsmArch::RiscV32 | InlineAsmArch::RiscV64 => { let mut map = riscv::regclass_map(); - riscv::fill_reg_map(arch, has_feature, &mut map); + riscv::fill_reg_map(arch, has_feature, target, &mut map); map } InlineAsmArch::Nvptx64 => { let mut map = nvptx::regclass_map(); - nvptx::fill_reg_map(arch, has_feature, &mut map); + nvptx::fill_reg_map(arch, has_feature, target, &mut map); map } InlineAsmArch::Hexagon => { let mut map = hexagon::regclass_map(); - hexagon::fill_reg_map(arch, has_feature, &mut map); + hexagon::fill_reg_map(arch, has_feature, target, &mut map); map } } diff --git a/src/librustc_target/asm/riscv.rs b/src/librustc_target/asm/riscv.rs index 3ff542247ff02..ced7483b00571 100644 --- a/src/librustc_target/asm/riscv.rs +++ b/src/librustc_target/asm/riscv.rs @@ -1,4 +1,5 @@ use super::{InlineAsmArch, InlineAsmType}; +use crate::spec::Target; use rustc_macros::HashStable_Generic; use std::fmt; @@ -50,6 +51,7 @@ impl RiscVInlineAsmRegClass { fn not_e( _arch: InlineAsmArch, mut has_feature: impl FnMut(&str) -> bool, + _target: &Target, _allocating: bool, ) -> Result<(), &'static str> { if has_feature("e") { diff --git a/src/librustc_target/asm/x86.rs b/src/librustc_target/asm/x86.rs index ed51b526414d1..0f62c19e1a3cd 100644 --- a/src/librustc_target/asm/x86.rs +++ b/src/librustc_target/asm/x86.rs @@ -1,4 +1,5 @@ use super::{InlineAsmArch, InlineAsmType}; +use crate::spec::Target; use rustc_macros::HashStable_Generic; use std::fmt; @@ -131,6 +132,7 @@ impl X86InlineAsmRegClass { fn x86_64_only( arch: InlineAsmArch, _has_feature: impl FnMut(&str) -> bool, + _target: &Target, _allocating: bool, ) -> Result<(), &'static str> { match arch { @@ -143,6 +145,7 @@ fn x86_64_only( fn high_byte( arch: InlineAsmArch, _has_feature: impl FnMut(&str) -> bool, + _target: &Target, allocating: bool, ) -> Result<(), &'static str> { match arch { From a98868dc9f1d8654b615015144c9ff7310ba6e19 Mon Sep 17 00:00:00 2001 From: Amanieu d'Antras Date: Sun, 21 Jun 2020 18:43:01 +0100 Subject: [PATCH 055/142] Update asm! documentation --- src/doc/unstable-book/src/library-features/asm.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/doc/unstable-book/src/library-features/asm.md b/src/doc/unstable-book/src/library-features/asm.md index a941bc9348f2c..c4c985dd134ba 100644 --- a/src/doc/unstable-book/src/library-features/asm.md +++ b/src/doc/unstable-book/src/library-features/asm.md @@ -474,7 +474,7 @@ Here is the list of currently supported register classes: | AArch64 | `reg` | `x[0-28]`, `x30` | `r` | | AArch64 | `vreg` | `v[0-31]` | `w` | | AArch64 | `vreg_low16` | `v[0-15]` | `x` | -| ARM | `reg` | `r[0-r10]`, `r12`, `r14` | `r` | +| ARM | `reg` | `r[0-5]` `r7`\*, `r[8-10]`, `r11`\*, `r12`, `r14` | `r` | | ARM (Thumb) | `reg_thumb` | `r[0-r7]` | `l` | | ARM (ARM) | `reg_thumb` | `r[0-r10]`, `r12`, `r14` | `l` | | ARM | `sreg` | `s[0-31]` | `t` | @@ -497,6 +497,8 @@ Here is the list of currently supported register classes: > Note #2: On x86-64 the high byte registers (e.g. `ah`) are only available when used as an explicit register. Specifying the `reg_byte` register class for an operand will always allocate a low byte register. > > Note #3: NVPTX doesn't have a fixed register set, so named registers are not supported. +> +> Note #4: On ARM the frame pointer is either `r7` or `r11` depending on the platform. Additional register classes may be added in the future based on demand (e.g. MMX, x87, etc). @@ -591,7 +593,9 @@ Some registers cannot be used for input or output operands: | Architecture | Unsupported register | Reason | | ------------ | -------------------- | ------ | | All | `sp` | The stack pointer must be restored to its original value at the end of an asm code block. | -| All | `bp` (x86), `r11` (ARM), `x29` (AArch64), `x8` (RISC-V), `fr` (Hexagon) | The frame pointer cannot be used as an input or output. | +| All | `bp` (x86), `x29` (AArch64), `x8` (RISC-V), `fr` (Hexagon) | The frame pointer cannot be used as an input or output. | +| ARM | `r7` or `r11` | On ARM the frame pointer can be either `r7` or `r11` depending on the target. The frame pointer cannot be used as an input or output. | +| ARM | `r6` | `r6` is used internally by LLVM as a base pointer and therefore cannot be used as an input or output. | | x86 | `k0` | This is a constant zero register which can't be modified. | | x86 | `ip` | This is the program counter, not a real register. | | x86 | `mm[0-7]` | MMX registers are not currently supported (but may be in the future). | From 314e621198942a6dfd5db8beea27065f0ee69aa3 Mon Sep 17 00:00:00 2001 From: Ivan Tham Date: Mon, 22 Jun 2020 20:52:02 +0800 Subject: [PATCH 056/142] Liballoc minor hash import tweak --- src/liballoc/vec.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs index 95c3b3b186161..e9d2aa1716219 100644 --- a/src/liballoc/vec.rs +++ b/src/liballoc/vec.rs @@ -62,7 +62,7 @@ use core::array::LengthAtMost32; use core::cmp::{self, Ordering}; use core::fmt; -use core::hash::{self, Hash}; +use core::hash::{Hash, Hasher}; use core::intrinsics::{arith_offset, assume}; use core::iter::{FromIterator, FusedIterator, TrustedLen}; use core::marker::PhantomData; @@ -1945,7 +1945,7 @@ impl Clone for Vec { #[stable(feature = "rust1", since = "1.0.0")] impl Hash for Vec { #[inline] - fn hash(&self, state: &mut H) { + fn hash(&self, state: &mut H) { Hash::hash(&**self, state) } } From 9766a93163cfb1447e4e7c4f9a516c77257b54be Mon Sep 17 00:00:00 2001 From: Alexis Bourget Date: Mon, 22 Jun 2020 15:36:09 +0200 Subject: [PATCH 057/142] Document the mod keyword --- src/libstd/keyword_docs.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/libstd/keyword_docs.rs b/src/libstd/keyword_docs.rs index a4996d9eee810..c966d8d34e999 100644 --- a/src/libstd/keyword_docs.rs +++ b/src/libstd/keyword_docs.rs @@ -913,10 +913,28 @@ mod match_keyword {} // /// Organize code into [modules]. /// -/// The documentation for this keyword is [not yet complete]. Pull requests welcome! +/// Use `mod` to create new [modules] to encapsulate code, including other +/// modules: /// +/// ``` +/// mod foo { +/// mod bar { +/// type MyType = (u8, u8); +/// fn baz() {} +/// } +/// } +/// ``` +/// +/// Like [`struct`]s and [`enum`]s, a module and its content are private by +/// default, unaccessible to code outside of the module. +/// +/// To learn more about allowing access, see the documentation for the [`pub`] +/// keyword. +/// +/// [`enum`]: keyword.enum.html +/// [`pub`]: keyword.pub.html +/// [`struct`]: keyword.struct.html /// [modules]: ../reference/items/modules.html -/// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 mod mod_keyword {} #[doc(keyword = "move")] From 3c46e36d39cc0f833075e59936cf96a60f6348e4 Mon Sep 17 00:00:00 2001 From: Alexis Bourget Date: Mon, 22 Jun 2020 16:27:23 +0200 Subject: [PATCH 058/142] Document the mut keyword --- src/libstd/keyword_docs.rs | 45 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/libstd/keyword_docs.rs b/src/libstd/keyword_docs.rs index a4996d9eee810..7d54f9ed2d20f 100644 --- a/src/libstd/keyword_docs.rs +++ b/src/libstd/keyword_docs.rs @@ -967,9 +967,50 @@ mod move_keyword {} // /// A mutable binding, reference, or pointer. /// -/// The documentation for this keyword is [not yet complete]. Pull requests welcome! +/// `mut` can be used in several situations. The first is mutable bindings, +/// which can be used anywhere you can bind a value to a variable name. Some +/// examples: /// -/// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 +/// ``` +/// // A mutable binding in the parameter list of a function. +/// fn foo(mut x: u8, y: u8) -> u8 { +/// x += y; +/// x +/// } +/// +/// // A mutable binding for a variable. +/// let mut a = 5; +/// a = 6; +/// +/// assert_eq!(foo(3, 4), 7); +/// assert_eq!(a, 6); +/// ``` +/// +/// The second is references. They can be created from `mut` bindings and must +/// be unique: no other binding can have a mutable reference, nor a simple +/// reference. +/// +/// ``` +/// // Taking a mutable reference. +/// fn push_two(v: &mut Vec) { +/// v.push(2); +/// } +/// +/// // You cannot take a mutable reference to a non-mutable variable. +/// let mut v = vec![0, 1]; +/// // Passing a mutable reference. +/// push_two(&mut v); +/// +/// assert_eq!(v, vec![0, 1, 2]); +/// ``` +/// +/// Mutable pointers work much like mutable references, with the added +/// possibility of being nul. The syntax is `*mut Type`. +/// +/// You can find more information on mutable references and pointers in the +/// [Reference]. +/// +/// [Reference]: ../reference/types/pointer.html#mutable-references-mut mod mut_keyword {} #[doc(keyword = "pub")] From e84552e5dcb5b21de1528d7c42406a4b9ae9afe9 Mon Sep 17 00:00:00 2001 From: Tshepang Lekhonkhobe Date: Mon, 22 Jun 2020 17:07:42 +0200 Subject: [PATCH 059/142] be more consistent with "defaults" placement --- config.toml.example | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/config.toml.example b/config.toml.example index e214bf048980d..9ffaac0bbd002 100644 --- a/config.toml.example +++ b/config.toml.example @@ -173,9 +173,7 @@ # Python interpreter to use for various tasks throughout the build, notably # rustdoc tests, the lldb python interpreter, and some dist bits and pieces. -# -# Defaults to the Python interpreter used to execute x.py. -#python = "python" +#python = "python" # defaults to the Python interpreter used to execute x.py # Force Cargo to check that Cargo.lock describes the precise dependency # set that all the Cargo.toml files create, instead of updating it. @@ -313,13 +311,11 @@ # Whether or not debug assertions are enabled for the compiler and standard # library. -# Defaults to rust.debug value. -#debug-assertions = false +#debug-assertions = false # defaults to rust.debug value # Whether or not debug assertions are enabled for the standard library. # Overrides the `debug-assertions` option, if defined. -# Defaults to rust.debug value. -#debug-assertions-std = false +#debug-assertions-std = false # defaults to rust.debug value # Debuginfo level for most of Rust code, corresponds to the `-C debuginfo=N` option of `rustc`. # `0` - no debug info @@ -328,21 +324,16 @@ # Can be overridden for specific subsets of Rust code (rustc, std or tools). # Debuginfo for tests run with compiletest is not controlled by this option # and needs to be enabled separately with `debuginfo-level-tests`. -# -# If debug is true, this defaults to 2. -#debuginfo-level = 0 +#debuginfo-level = 0 # defaults to 2 if debug is true # Debuginfo level for the compiler. -# Defaults to rust.debuginfo-level value. -#debuginfo-level-rustc = 0 +#debuginfo-level-rustc = 0 # defaults to rust.debuginfo-level value # Debuginfo level for the standard library. -# Defaults to rust.debuginfo-level value. -#debuginfo-level-std = 0 +#debuginfo-level-std = 0 # defaults to rust.debuginfo-level value # Debuginfo level for the tools. -# Defaults to rust.debuginfo-level value. -#debuginfo-level-tools = 0 +#debuginfo-level-tools = 0 # defaults to rust.debuginfo-level value # Debuginfo level for the test suites run with compiletest. # FIXME(#61117): Some tests fail when this option is enabled. From ef24faf130b35964cce159bd130631b6e90ed0ea Mon Sep 17 00:00:00 2001 From: Charles Lew Date: Sun, 10 May 2020 09:10:15 +0800 Subject: [PATCH 060/142] Refactor non_ascii_idents lints, exclude ascii pair for confusable_idents lint. --- src/librustc_lint/non_ascii_idents.rs | 235 ++++++++---------- src/librustc_session/parse.rs | 3 +- .../lint-confusable-idents.rs | 10 +- .../lint-confusable-idents.stderr | 8 +- .../lint-non-ascii-idents.rs | 4 +- .../lint-non-ascii-idents.stderr | 8 +- .../lint-uncommon-codepoints.rs | 4 +- .../lint-uncommon-codepoints.stderr | 8 +- src/test/ui/parser/issue-62524.rs | 2 + src/test/ui/parser/issue-62524.stderr | 6 +- 10 files changed, 131 insertions(+), 157 deletions(-) diff --git a/src/librustc_lint/non_ascii_idents.rs b/src/librustc_lint/non_ascii_idents.rs index 064b0255397ce..90bd7ad4acf71 100644 --- a/src/librustc_lint/non_ascii_idents.rs +++ b/src/librustc_lint/non_ascii_idents.rs @@ -1,9 +1,7 @@ use crate::{EarlyContext, EarlyLintPass, LintContext}; use rustc_ast::ast; use rustc_data_structures::fx::FxHashMap; -use rustc_span::symbol::{Ident, SymbolStr}; -use std::hash::{Hash, Hasher}; -use std::ops::Deref; +use rustc_span::symbol::SymbolStr; declare_lint! { pub NON_ASCII_IDENTS, @@ -19,158 +17,133 @@ declare_lint! { crate_level_only } -// FIXME: Change this to warn. declare_lint! { pub CONFUSABLE_IDENTS, - Allow, + Warn, "detects visually confusable pairs between identifiers", crate_level_only } declare_lint_pass!(NonAsciiIdents => [NON_ASCII_IDENTS, UNCOMMON_CODEPOINTS, CONFUSABLE_IDENTS]); -enum CowBoxSymStr { - Interned(SymbolStr), - Owned(Box), -} - -impl Deref for CowBoxSymStr { - type Target = str; - - fn deref(&self) -> &str { - match self { - CowBoxSymStr::Interned(interned) => interned, - CowBoxSymStr::Owned(ref owned) => owned, - } - } -} - -impl Hash for CowBoxSymStr { - #[inline] - fn hash(&self, state: &mut H) { - Hash::hash(&**self, state) - } -} - -impl PartialEq for CowBoxSymStr { - #[inline] - fn eq(&self, other: &CowBoxSymStr) -> bool { - PartialEq::eq(&**self, &**other) - } -} - -impl Eq for CowBoxSymStr {} - -fn calc_skeleton(symbol_str: SymbolStr, buffer: &'_ mut String) -> CowBoxSymStr { - use std::mem::swap; - use unicode_security::confusable_detection::skeleton; - buffer.clear(); - buffer.extend(skeleton(&symbol_str)); - if symbol_str == *buffer { - CowBoxSymStr::Interned(symbol_str) - } else { - let mut owned = String::new(); - swap(buffer, &mut owned); - CowBoxSymStr::Owned(owned.into_boxed_str()) - } -} - -fn is_in_ascii_confusable_closure(c: char) -> bool { - // FIXME: move this table to `unicode_security` crate. - // data here corresponds to Unicode 13. - const ASCII_CONFUSABLE_CLOSURE: &[(u64, u64)] = &[(0x00, 0x7f), (0xba, 0xba), (0x2080, 0x2080)]; - let c = c as u64; - for &(range_start, range_end) in ASCII_CONFUSABLE_CLOSURE { - if c >= range_start && c <= range_end { - return true; - } - } - false -} - -fn is_in_ascii_confusable_closure_relevant_list(c: char) -> bool { - // FIXME: move this table to `unicode_security` crate. - // data here corresponds to Unicode 13. - const ASCII_CONFUSABLE_CLOSURE_RELEVANT_LIST: &[u64] = &[ - 0x22, 0x25, 0x27, 0x2f, 0x30, 0x31, 0x49, 0x4f, 0x60, 0x6c, 0x6d, 0x6e, 0x72, 0x7c, 0xba, - 0x2080, - ]; - let c = c as u64; - for &item in ASCII_CONFUSABLE_CLOSURE_RELEVANT_LIST { - if c == item { - return true; - } - } - false -} - impl EarlyLintPass for NonAsciiIdents { fn check_crate(&mut self, cx: &EarlyContext<'_>, _: &ast::Crate) { use rustc_session::lint::Level; - if cx.builder.lint_level(CONFUSABLE_IDENTS).0 == Level::Allow { + use rustc_span::Span; + use unicode_security::GeneralSecurityProfile; + use utils::CowBoxSymStr; + + let check_non_ascii_idents = cx.builder.lint_level(NON_ASCII_IDENTS).0 != Level::Allow; + let check_uncommon_codepoints = + cx.builder.lint_level(UNCOMMON_CODEPOINTS).0 != Level::Allow; + let check_confusable_idents = cx.builder.lint_level(CONFUSABLE_IDENTS).0 != Level::Allow; + + if !check_non_ascii_idents && !check_uncommon_codepoints && !check_confusable_idents { return; } + + let mut has_non_ascii_idents = false; let symbols = cx.sess.parse_sess.symbol_gallery.symbols.lock(); - let mut symbol_strs_and_spans = Vec::with_capacity(symbols.len()); - let mut in_fast_path = true; - for (symbol, sp) in symbols.iter() { - // fast path + for (symbol, &sp) in symbols.iter() { let symbol_str = symbol.as_str(); - if !symbol_str.chars().all(is_in_ascii_confusable_closure) { - // fallback to slow path. - symbol_strs_and_spans.clear(); - in_fast_path = false; - break; + if symbol_str.is_ascii() { + continue; } - if symbol_str.chars().any(is_in_ascii_confusable_closure_relevant_list) { - symbol_strs_and_spans.push((symbol_str, *sp)); + has_non_ascii_idents = true; + cx.struct_span_lint(NON_ASCII_IDENTS, sp, |lint| { + lint.build("identifier contains non-ASCII characters").emit() + }); + if check_uncommon_codepoints + && !symbol_str.chars().all(GeneralSecurityProfile::identifier_allowed) + { + cx.struct_span_lint(UNCOMMON_CODEPOINTS, sp, |lint| { + lint.build("identifier contains uncommon Unicode codepoints").emit() + }) } } - if !in_fast_path { - // slow path - for (symbol, sp) in symbols.iter() { + + if has_non_ascii_idents && check_confusable_idents { + let mut skeleton_map: FxHashMap = + FxHashMap::with_capacity_and_hasher(symbols.len(), Default::default()); + let mut str_buf = String::new(); + for (symbol, &sp) in symbols.iter() { + fn calc_skeleton(symbol_str: &SymbolStr, buffer: &mut String) -> CowBoxSymStr { + use std::mem::replace; + use unicode_security::confusable_detection::skeleton; + buffer.clear(); + buffer.extend(skeleton(symbol_str)); + if *symbol_str == *buffer { + CowBoxSymStr::Interned(symbol_str.clone()) + } else { + let owned = replace(buffer, String::new()); + CowBoxSymStr::Owned(owned.into_boxed_str()) + } + } let symbol_str = symbol.as_str(); - symbol_strs_and_spans.push((symbol_str, *sp)); + let is_ascii = symbol_str.is_ascii(); + let skeleton = calc_skeleton(&symbol_str, &mut str_buf); + skeleton_map + .entry(skeleton) + .and_modify(|(existing_symbolstr, existing_span, existing_is_ascii)| { + if !*existing_is_ascii || !is_ascii { + cx.struct_span_lint(CONFUSABLE_IDENTS, sp, |lint| { + lint.build(&format!( + "identifier pair considered confusable between `{}` and `{}`", + existing_symbolstr, symbol_str + )) + .span_label( + *existing_span, + "this is where the previous identifier occurred", + ) + .emit(); + }); + } + if *existing_is_ascii && !is_ascii { + *existing_symbolstr = symbol_str.clone(); + *existing_span = sp; + *existing_is_ascii = is_ascii; + } + }) + .or_insert((symbol_str, sp, is_ascii)); } } - drop(symbols); - symbol_strs_and_spans.sort_by_key(|x| x.0.clone()); - let mut skeleton_map = - FxHashMap::with_capacity_and_hasher(symbol_strs_and_spans.len(), Default::default()); - let mut str_buf = String::new(); - for (symbol_str, sp) in symbol_strs_and_spans { - let skeleton = calc_skeleton(symbol_str.clone(), &mut str_buf); - skeleton_map - .entry(skeleton) - .and_modify(|(existing_symbolstr, existing_span)| { - cx.struct_span_lint(CONFUSABLE_IDENTS, sp, |lint| { - lint.build(&format!( - "identifier pair considered confusable between `{}` and `{}`", - existing_symbolstr, symbol_str - )) - .span_label( - *existing_span, - "this is where the previous identifier occurred", - ) - .emit(); - }); - }) - .or_insert((symbol_str, sp)); + } +} + +mod utils { + use rustc_span::symbol::SymbolStr; + use std::hash::{Hash, Hasher}; + use std::ops::Deref; + + pub(super) enum CowBoxSymStr { + Interned(SymbolStr), + Owned(Box), + } + + impl Deref for CowBoxSymStr { + type Target = str; + + fn deref(&self) -> &str { + match self { + CowBoxSymStr::Interned(interned) => interned, + CowBoxSymStr::Owned(ref owned) => owned, + } } } - fn check_ident(&mut self, cx: &EarlyContext<'_>, ident: Ident) { - use unicode_security::GeneralSecurityProfile; - let name_str = ident.name.as_str(); - if name_str.is_ascii() { - return; + + impl Hash for CowBoxSymStr { + #[inline] + fn hash(&self, state: &mut H) { + Hash::hash(&**self, state) } - cx.struct_span_lint(NON_ASCII_IDENTS, ident.span, |lint| { - lint.build("identifier contains non-ASCII characters").emit() - }); - if !name_str.chars().all(GeneralSecurityProfile::identifier_allowed) { - cx.struct_span_lint(UNCOMMON_CODEPOINTS, ident.span, |lint| { - lint.build("identifier contains uncommon Unicode codepoints").emit() - }) + } + + impl PartialEq for CowBoxSymStr { + #[inline] + fn eq(&self, other: &CowBoxSymStr) -> bool { + PartialEq::eq(&**self, &**other) } } + + impl Eq for CowBoxSymStr {} } diff --git a/src/librustc_session/parse.rs b/src/librustc_session/parse.rs index ddbc95fb1b0b8..f4e5da4d54f46 100644 --- a/src/librustc_session/parse.rs +++ b/src/librustc_session/parse.rs @@ -13,6 +13,7 @@ use rustc_span::hygiene::ExpnId; use rustc_span::source_map::{FilePathMapping, SourceMap}; use rustc_span::{MultiSpan, Span, Symbol}; +use std::collections::BTreeMap; use std::path::PathBuf; use std::str; @@ -63,7 +64,7 @@ impl GatedSpans { #[derive(Default)] pub struct SymbolGallery { /// All symbols occurred and their first occurrance span. - pub symbols: Lock>, + pub symbols: Lock>, } impl SymbolGallery { diff --git a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-confusable-idents.rs b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-confusable-idents.rs index 12093837d2630..e15ed2e70b896 100644 --- a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-confusable-idents.rs +++ b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-confusable-idents.rs @@ -2,8 +2,14 @@ #![deny(confusable_idents)] #![allow(uncommon_codepoints, non_upper_case_globals)] -const s: usize = 42; //~ ERROR identifier pair considered confusable +const s: usize = 42; fn main() { - let s = "rust"; + let s = "rust"; //~ ERROR identifier pair considered confusable + not_affected(); +} + +fn not_affected() { + let s1 = 1; + let sl = 'l'; } diff --git a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-confusable-idents.stderr b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-confusable-idents.stderr index 40ee18acb3cd4..218f94f7b5829 100644 --- a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-confusable-idents.stderr +++ b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-confusable-idents.stderr @@ -1,11 +1,11 @@ -error: identifier pair considered confusable between `s` and `s` - --> $DIR/lint-confusable-idents.rs:5:7 +error: identifier pair considered confusable between `s` and `s` + --> $DIR/lint-confusable-idents.rs:8:9 | LL | const s: usize = 42; - | ^^ + | -- this is where the previous identifier occurred ... LL | let s = "rust"; - | - this is where the previous identifier occurred + | ^ | note: the lint level is defined here --> $DIR/lint-confusable-idents.rs:2:9 diff --git a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-non-ascii-idents.rs b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-non-ascii-idents.rs index 057329a0a650c..20d00cf701a15 100644 --- a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-non-ascii-idents.rs +++ b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-non-ascii-idents.rs @@ -7,5 +7,7 @@ fn coöperation() {} //~ ERROR identifier contains non-ASCII characters fn main() { let naïveté = 2; //~ ERROR identifier contains non-ASCII characters - println!("{}", naïveté); //~ ERROR identifier contains non-ASCII characters + + // using the same identifier the second time won't trigger the lint. + println!("{}", naïveté); } diff --git a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-non-ascii-idents.stderr b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-non-ascii-idents.stderr index 6c9f0866c017a..048b6ff5d687f 100644 --- a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-non-ascii-idents.stderr +++ b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-non-ascii-idents.stderr @@ -22,11 +22,5 @@ error: identifier contains non-ASCII characters LL | let naïveté = 2; | ^^^^^^^ -error: identifier contains non-ASCII characters - --> $DIR/lint-non-ascii-idents.rs:10:20 - | -LL | println!("{}", naïveté); - | ^^^^^^^ - -error: aborting due to 4 previous errors +error: aborting due to 3 previous errors diff --git a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.rs b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.rs index 7ac0d035d5bf1..b5e251e047b5a 100644 --- a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.rs +++ b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.rs @@ -7,5 +7,7 @@ fn dijkstra() {} //~ ERROR identifier contains uncommon Unicode codepoints fn main() { let ㇻㇲㇳ = "rust"; //~ ERROR identifier contains uncommon Unicode codepoints - println!("{}", ㇻㇲㇳ); //~ ERROR identifier contains uncommon Unicode codepoints + + // using the same identifier the second time won't trigger the lint. + println!("{}", ㇻㇲㇳ); } diff --git a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.stderr b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.stderr index b270bd1f051c2..05ea3d5de7dbc 100644 --- a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.stderr +++ b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.stderr @@ -22,11 +22,5 @@ error: identifier contains uncommon Unicode codepoints LL | let ㇻㇲㇳ = "rust"; | ^^^^^^ -error: identifier contains uncommon Unicode codepoints - --> $DIR/lint-uncommon-codepoints.rs:10:20 - | -LL | println!("{}", ㇻㇲㇳ); - | ^^^^^^ - -error: aborting due to 4 previous errors +error: aborting due to 3 previous errors diff --git a/src/test/ui/parser/issue-62524.rs b/src/test/ui/parser/issue-62524.rs index 57de4b87b0fe6..5259dfe2e656c 100644 --- a/src/test/ui/parser/issue-62524.rs +++ b/src/test/ui/parser/issue-62524.rs @@ -1,4 +1,6 @@ // ignore-tidy-trailing-newlines // error-pattern: aborting due to 3 previous errors +#![allow(uncommon_codepoints)] + y![ Ϥ, \ No newline at end of file diff --git a/src/test/ui/parser/issue-62524.stderr b/src/test/ui/parser/issue-62524.stderr index 8191c9682cefd..d5e07622b11b9 100644 --- a/src/test/ui/parser/issue-62524.stderr +++ b/src/test/ui/parser/issue-62524.stderr @@ -1,5 +1,5 @@ error: this file contains an unclosed delimiter - --> $DIR/issue-62524.rs:4:3 + --> $DIR/issue-62524.rs:6:3 | LL | y![ | - unclosed delimiter @@ -7,7 +7,7 @@ LL | Ϥ, | ^ error: macros that expand to items must be delimited with braces or followed by a semicolon - --> $DIR/issue-62524.rs:3:3 + --> $DIR/issue-62524.rs:5:3 | LL | y![ | ___^ @@ -24,7 +24,7 @@ LL | Ϥ,; | ^ error: cannot find macro `y` in this scope - --> $DIR/issue-62524.rs:3:1 + --> $DIR/issue-62524.rs:5:1 | LL | y![ | ^ From e11b873c70129eb14a49f7f0853a334f838afcce Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Mon, 22 Jun 2020 13:29:04 -0400 Subject: [PATCH 061/142] Stop using old version of `syn` in `rustc-workspace-hack` None of the tools seem to need syn 0.15.35, so we can just build syn 1.0. This was causing an issue with clippy's `compile-test` program: since multiple versions of `syn` would exist in the build directory, we would non-deterministically pick one based on filesystem iteration order. If the pre-1.0 version of `syn` was picked, a strange build error would occur (see https://github.com/rust-lang/rust/pull/73594#issuecomment-647671463) To prevent this kind of issue from happening again, we now panic if we find multiple versions of a crate in the build directly, instead of silently picking the first version we find. --- tests/compile-test.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/compile-test.rs b/tests/compile-test.rs index f28aedbf0ab8b..368fa6a98c5d6 100644 --- a/tests/compile-test.rs +++ b/tests/compile-test.rs @@ -49,7 +49,9 @@ fn third_party_crates() -> String { if let Some(name) = path.file_name().and_then(OsStr::to_str) { for dep in CRATES { if name.starts_with(&format!("lib{}-", dep)) && name.ends_with(".rlib") { - crates.entry(dep).or_insert(path); + if let Some(old) = crates.insert(dep, path.clone()) { + panic!("Found multiple rlibs for crate `{}`: `{:?}` and `{:?}", dep, old, path); + } break; } } From 2792014ef4e2fdd02945f77cff19adf814f155d7 Mon Sep 17 00:00:00 2001 From: flip1995 Date: Mon, 22 Jun 2020 21:01:49 +0200 Subject: [PATCH 062/142] Make AssocOp Copy --- src/librustc_ast/util/parser.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc_ast/util/parser.rs b/src/librustc_ast/util/parser.rs index d8b44a22f2c92..e5bcc571d4176 100644 --- a/src/librustc_ast/util/parser.rs +++ b/src/librustc_ast/util/parser.rs @@ -5,7 +5,7 @@ use rustc_span::symbol::kw; /// Associative operator with precedence. /// /// This is the enum which specifies operator precedence and fixity to the parser. -#[derive(PartialEq, Debug)] +#[derive(Copy, Clone, PartialEq, Debug)] pub enum AssocOp { /// `+` Add, From b65ea1bef1391a3af9118884952718fc905f8e02 Mon Sep 17 00:00:00 2001 From: Tshepang Lekhonkhobe Date: Tue, 23 Jun 2020 00:29:55 +0200 Subject: [PATCH 063/142] place non-obvious defaults on a separate line See https://github.com/rust-lang/rust/pull/73538#discussion_r443809593 for the motivation --- config.toml.example | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/config.toml.example b/config.toml.example index 9ffaac0bbd002..79b06d5cf9962 100644 --- a/config.toml.example +++ b/config.toml.example @@ -118,18 +118,24 @@ # nightlies are already produced for. The current platform must be able to run # binaries of this build triple and the nightly will be used to bootstrap the # first compiler. -#build = "x86_64-unknown-linux-gnu" # defaults to your host platform +# +# Defaults to host platform +#build = "x86_64-unknown-linux-gnu" # In addition to the build triple, other triples to produce full compiler # toolchains for. Each of these triples will be bootstrapped from the build # triple and then will continue to bootstrap themselves. This platform must # currently be able to run all of the triples provided here. -#host = ["x86_64-unknown-linux-gnu"] # defaults to just the build triple +# +# Defaults to just the build triple +#host = ["x86_64-unknown-linux-gnu"] # In addition to all host triples, other triples to produce the standard library # for. Each host triple will be used to produce a copy of the standard library # for each target triple. -#target = ["x86_64-unknown-linux-gnu"] # defaults to just the build triple +# +# Defaults to just the build triple +#target = ["x86_64-unknown-linux-gnu"] # Use this directory to store build artifacts. # You can use "$ROOT" to indicate the root of the git repository. @@ -173,7 +179,9 @@ # Python interpreter to use for various tasks throughout the build, notably # rustdoc tests, the lldb python interpreter, and some dist bits and pieces. -#python = "python" # defaults to the Python interpreter used to execute x.py +# +# Defaults to the Python interpreter used to execute x.py +#python = "python" # Force Cargo to check that Cargo.lock describes the precise dependency # set that all the Cargo.toml files create, instead of updating it. @@ -311,11 +319,15 @@ # Whether or not debug assertions are enabled for the compiler and standard # library. -#debug-assertions = false # defaults to rust.debug value +# +# Defaults to rust.debug value +#debug-assertions = false # Whether or not debug assertions are enabled for the standard library. # Overrides the `debug-assertions` option, if defined. -#debug-assertions-std = false # defaults to rust.debug value +# +# Defaults to rust.debug value +#debug-assertions-std = false # Debuginfo level for most of Rust code, corresponds to the `-C debuginfo=N` option of `rustc`. # `0` - no debug info @@ -324,16 +336,24 @@ # Can be overridden for specific subsets of Rust code (rustc, std or tools). # Debuginfo for tests run with compiletest is not controlled by this option # and needs to be enabled separately with `debuginfo-level-tests`. -#debuginfo-level = 0 # defaults to 2 if debug is true +# +# Defaults to 2 if debug is true +#debuginfo-level = 0 # Debuginfo level for the compiler. -#debuginfo-level-rustc = 0 # defaults to rust.debuginfo-level value +# +# Defaults to rust.debuginfo-level value +#debuginfo-level-rustc = 0 # Debuginfo level for the standard library. -#debuginfo-level-std = 0 # defaults to rust.debuginfo-level value +# +# Defaults to rust.debuginfo-level value +#debuginfo-level-std = 0 # Debuginfo level for the tools. -#debuginfo-level-tools = 0 # defaults to rust.debuginfo-level value +# +# Defaults to rust.debuginfo-level value +#debuginfo-level-tools = 0 # Debuginfo level for the test suites run with compiletest. # FIXME(#61117): Some tests fail when this option is enabled. From 0a454e5398d017a0b442d56c75ac470e996ae52a Mon Sep 17 00:00:00 2001 From: Gary Guo Date: Mon, 22 Jun 2020 23:37:05 +0100 Subject: [PATCH 064/142] Add UI test for issue 73592 --- .../issue-73592-borrow_mut-through-deref.rs | 58 +++++++++++++++++++ ...ssue-73592-borrow_mut-through-deref.stderr | 24 ++++++++ 2 files changed, 82 insertions(+) create mode 100644 src/test/ui/typeck/issue-73592-borrow_mut-through-deref.rs create mode 100644 src/test/ui/typeck/issue-73592-borrow_mut-through-deref.stderr diff --git a/src/test/ui/typeck/issue-73592-borrow_mut-through-deref.rs b/src/test/ui/typeck/issue-73592-borrow_mut-through-deref.rs new file mode 100644 index 0000000000000..0cf77da559470 --- /dev/null +++ b/src/test/ui/typeck/issue-73592-borrow_mut-through-deref.rs @@ -0,0 +1,58 @@ +// check-pass +// +// rust-lang/rust#73592: borrow_mut through Deref should work. +// +// Before #72280, when we see something like `&mut *rcvr.method()`, we +// incorrectly requires `rcvr` to be type-checked as a mut place. While this +// requirement is usually correct for smart pointers, it is overly restrictive +// for types like `Mutex` or `RefCell` which can produce a guard that +// implements `DerefMut` from `&self`. +// +// Making it more confusing, because we use Deref as the fallback when DerefMut +// is implemented, we won't see an issue when the smart pointer does not +// implement `DerefMut`. It only causes an issue when `rcvr` is obtained via a +// type that implements both `Deref` or `DerefMut`. +// +// This bug is only discovered in #73592 after it is already fixed as a side-effect +// of a refactoring made in #72280. + +#![warn(unused_mut)] + +use std::pin::Pin; +use std::cell::RefCell; + +struct S(RefCell<()>); + +fn test_pin(s: Pin<&S>) { + // This works before #72280. + let _ = &mut *s.0.borrow_mut(); +} + +fn test_pin_mut(s: Pin<&mut S>) { + // This should compile but didn't before #72280. + let _ = &mut *s.0.borrow_mut(); +} + +fn test_vec(s: &Vec>) { + // This should compile but didn't before #72280. + let _ = &mut *s[0].borrow_mut(); +} + +fn test_mut_pin(mut s: Pin<&S>) { + //~^ WARN variable does not need to be mutable + let _ = &mut *s.0.borrow_mut(); +} + +fn test_mut_pin_mut(mut s: Pin<&mut S>) { + //~^ WARN variable does not need to be mutable + let _ = &mut *s.0.borrow_mut(); +} + +fn main() { + let mut s = S(RefCell::new(())); + test_pin(Pin::new(&s)); + test_pin_mut(Pin::new(&mut s)); + test_mut_pin(Pin::new(&s)); + test_mut_pin_mut(Pin::new(&mut s)); + test_vec(&vec![s.0]); +} diff --git a/src/test/ui/typeck/issue-73592-borrow_mut-through-deref.stderr b/src/test/ui/typeck/issue-73592-borrow_mut-through-deref.stderr new file mode 100644 index 0000000000000..51303adc9e533 --- /dev/null +++ b/src/test/ui/typeck/issue-73592-borrow_mut-through-deref.stderr @@ -0,0 +1,24 @@ +warning: variable does not need to be mutable + --> $DIR/issue-73592-borrow_mut-through-deref.rs:41:17 + | +LL | fn test_mut_pin(mut s: Pin<&S>) { + | ----^ + | | + | help: remove this `mut` + | +note: the lint level is defined here + --> $DIR/issue-73592-borrow_mut-through-deref.rs:19:9 + | +LL | #![warn(unused_mut)] + | ^^^^^^^^^^ + +warning: variable does not need to be mutable + --> $DIR/issue-73592-borrow_mut-through-deref.rs:46:21 + | +LL | fn test_mut_pin_mut(mut s: Pin<&mut S>) { + | ----^ + | | + | help: remove this `mut` + +warning: 2 warnings emitted + From 51592f8587bd5dac9cb3f34fbd5896218a814677 Mon Sep 17 00:00:00 2001 From: flip1995 Date: Tue, 23 Jun 2020 02:18:38 +0200 Subject: [PATCH 065/142] Fix sync fallout --- clippy_lints/src/escape.rs | 2 +- clippy_lints/src/len_zero.rs | 3 +- clippy_lints/src/loops.rs | 6 +-- clippy_lints/src/types.rs | 58 +++++-------------------- clippy_lints/src/unnecessary_sort_by.rs | 5 ++- clippy_lints/src/utils/author.rs | 5 ++- clippy_lints/src/utils/usage.rs | 2 +- 7 files changed, 27 insertions(+), 54 deletions(-) diff --git a/clippy_lints/src/escape.rs b/clippy_lints/src/escape.rs index 59af475af175e..77e90eeac4958 100644 --- a/clippy_lints/src/escape.rs +++ b/clippy_lints/src/escape.rs @@ -6,7 +6,7 @@ use rustc_middle::ty::{self, Ty}; use rustc_session::{declare_tool_lint, impl_lint_pass}; use rustc_span::source_map::Span; use rustc_target::abi::LayoutOf; -use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceWithHirId, PlaceBase}; +use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId}; use crate::utils::span_lint; diff --git a/clippy_lints/src/len_zero.rs b/clippy_lints/src/len_zero.rs index 13e85fda8ffeb..7838e8e8ab774 100644 --- a/clippy_lints/src/len_zero.rs +++ b/clippy_lints/src/len_zero.rs @@ -211,7 +211,8 @@ fn check_impl_items(cx: &LateContext<'_, '_>, item: &Item<'_>, impl_items: &[Imp } fn check_cmp(cx: &LateContext<'_, '_>, span: Span, method: &Expr<'_>, lit: &Expr<'_>, op: &str, compare_to: u32) { - if let (&ExprKind::MethodCall(ref method_path, _, ref args, _), &ExprKind::Lit(ref lit)) = (&method.kind, &lit.kind) { + if let (&ExprKind::MethodCall(ref method_path, _, ref args, _), &ExprKind::Lit(ref lit)) = (&method.kind, &lit.kind) + { // check if we are in an is_empty() method if let Some(name) = get_item_name(cx, method) { if name.as_str() == "is_empty" { diff --git a/clippy_lints/src/loops.rs b/clippy_lints/src/loops.rs index 83093ec51bd90..ae1aa66be5cda 100644 --- a/clippy_lints/src/loops.rs +++ b/clippy_lints/src/loops.rs @@ -28,7 +28,7 @@ use rustc_middle::ty::{self, Ty, TyS}; use rustc_session::{declare_lint_pass, declare_tool_lint}; use rustc_span::source_map::Span; use rustc_span::symbol::Symbol; -use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceWithHirId, PlaceBase}; +use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId}; use std::iter::{once, Iterator}; use std::mem; @@ -1580,13 +1580,13 @@ fn check_for_mutability(cx: &LateContext<'_, '_>, bound: &Expr<'_>) -> Option ( +fn check_for_mutation<'a, 'tcx>( cx: &LateContext<'a, 'tcx>, body: &Expr<'_>, bound_ids: &[Option], ) -> (Option, Option) { let mut delegate = MutatePairDelegate { - cx: cx, + cx, hir_id_low: bound_ids[0], hir_id_high: bound_ids[1], span_low: None, diff --git a/clippy_lints/src/types.rs b/clippy_lints/src/types.rs index d59a2f1bae031..98de08f79f3d7 100644 --- a/clippy_lints/src/types.rs +++ b/clippy_lints/src/types.rs @@ -1945,16 +1945,12 @@ fn detect_extreme_expr<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_ let which = match (&ty.kind, cv) { (&ty::Bool, Constant::Bool(false)) | (&ty::Uint(_), Constant::Int(0)) => Minimum, - (&ty::Int(ity), Constant::Int(i)) - if i == unsext(cx.tcx, i128::MIN >> (128 - int_bits(cx.tcx, ity)), ity) => - { + (&ty::Int(ity), Constant::Int(i)) if i == unsext(cx.tcx, i128::MIN >> (128 - int_bits(cx.tcx, ity)), ity) => { Minimum }, (&ty::Bool, Constant::Bool(true)) => Maximum, - (&ty::Int(ity), Constant::Int(i)) - if i == unsext(cx.tcx, i128::MAX >> (128 - int_bits(cx.tcx, ity)), ity) => - { + (&ty::Int(ity), Constant::Int(i)) if i == unsext(cx.tcx, i128::MAX >> (128 - int_bits(cx.tcx, ity)), ity) => { Maximum }, (&ty::Uint(uty), Constant::Int(i)) if clip(cx.tcx, u128::MAX, uty) == i => Maximum, @@ -2083,50 +2079,20 @@ fn numeric_cast_precast_bounds<'a>(cx: &LateContext<'_, '_>, expr: &'a Expr<'_>) } match pre_cast_ty.kind { ty::Int(int_ty) => Some(match int_ty { - IntTy::I8 => ( - FullInt::S(i128::from(i8::MIN)), - FullInt::S(i128::from(i8::MAX)), - ), - IntTy::I16 => ( - FullInt::S(i128::from(i16::MIN)), - FullInt::S(i128::from(i16::MAX)), - ), - IntTy::I32 => ( - FullInt::S(i128::from(i32::MIN)), - FullInt::S(i128::from(i32::MAX)), - ), - IntTy::I64 => ( - FullInt::S(i128::from(i64::MIN)), - FullInt::S(i128::from(i64::MAX)), - ), + IntTy::I8 => (FullInt::S(i128::from(i8::MIN)), FullInt::S(i128::from(i8::MAX))), + IntTy::I16 => (FullInt::S(i128::from(i16::MIN)), FullInt::S(i128::from(i16::MAX))), + IntTy::I32 => (FullInt::S(i128::from(i32::MIN)), FullInt::S(i128::from(i32::MAX))), + IntTy::I64 => (FullInt::S(i128::from(i64::MIN)), FullInt::S(i128::from(i64::MAX))), IntTy::I128 => (FullInt::S(i128::MIN), FullInt::S(i128::MAX)), - IntTy::Isize => ( - FullInt::S(isize::MIN as i128), - FullInt::S(isize::MAX as i128), - ), + IntTy::Isize => (FullInt::S(isize::MIN as i128), FullInt::S(isize::MAX as i128)), }), ty::Uint(uint_ty) => Some(match uint_ty { - UintTy::U8 => ( - FullInt::U(u128::from(u8::MIN)), - FullInt::U(u128::from(u8::MAX)), - ), - UintTy::U16 => ( - FullInt::U(u128::from(u16::MIN)), - FullInt::U(u128::from(u16::MAX)), - ), - UintTy::U32 => ( - FullInt::U(u128::from(u32::MIN)), - FullInt::U(u128::from(u32::MAX)), - ), - UintTy::U64 => ( - FullInt::U(u128::from(u64::MIN)), - FullInt::U(u128::from(u64::MAX)), - ), + UintTy::U8 => (FullInt::U(u128::from(u8::MIN)), FullInt::U(u128::from(u8::MAX))), + UintTy::U16 => (FullInt::U(u128::from(u16::MIN)), FullInt::U(u128::from(u16::MAX))), + UintTy::U32 => (FullInt::U(u128::from(u32::MIN)), FullInt::U(u128::from(u32::MAX))), + UintTy::U64 => (FullInt::U(u128::from(u64::MIN)), FullInt::U(u128::from(u64::MAX))), UintTy::U128 => (FullInt::U(u128::MIN), FullInt::U(u128::MAX)), - UintTy::Usize => ( - FullInt::U(usize::MIN as u128), - FullInt::U(usize::MAX as u128), - ), + UintTy::Usize => (FullInt::U(usize::MIN as u128), FullInt::U(usize::MAX as u128)), }), _ => None, } diff --git a/clippy_lints/src/unnecessary_sort_by.rs b/clippy_lints/src/unnecessary_sort_by.rs index e94eebb88e497..6ac6a12529c86 100644 --- a/clippy_lints/src/unnecessary_sort_by.rs +++ b/clippy_lints/src/unnecessary_sort_by.rs @@ -95,7 +95,10 @@ fn mirrored_exprs( // The two exprs are method calls. // Check to see that the function is the same and the arguments are mirrored // This is enough because the receiver of the method is listed in the arguments - (ExprKind::MethodCall(left_segment, _, left_args, _), ExprKind::MethodCall(right_segment, _, right_args, _)) => { + ( + ExprKind::MethodCall(left_segment, _, left_args, _), + ExprKind::MethodCall(right_segment, _, right_args, _), + ) => { left_segment.ident == right_segment.ident && left_args .iter() diff --git a/clippy_lints/src/utils/author.rs b/clippy_lints/src/utils/author.rs index 8b58bbb5e6575..910b665ccb75e 100644 --- a/clippy_lints/src/utils/author.rs +++ b/clippy_lints/src/utils/author.rs @@ -251,7 +251,10 @@ impl<'tcx> Visitor<'tcx> for PrintVisitor { } }, ExprKind::MethodCall(ref _method_name, ref _generics, ref _args, ref _fn_span) => { - println!("MethodCall(ref method_name, ref generics, ref args, ref fn_span) = {};", current); + println!( + "MethodCall(ref method_name, ref generics, ref args, ref fn_span) = {};", + current + ); println!(" // unimplemented: `ExprKind::MethodCall` is not further destructured at the moment"); }, ExprKind::Tup(ref elements) => { diff --git a/clippy_lints/src/utils/usage.rs b/clippy_lints/src/utils/usage.rs index 6a7a1f1ceaaef..0492878fc272f 100644 --- a/clippy_lints/src/utils/usage.rs +++ b/clippy_lints/src/utils/usage.rs @@ -8,7 +8,7 @@ use rustc_lint::LateContext; use rustc_middle::hir::map::Map; use rustc_middle::ty; use rustc_span::symbol::{Ident, Symbol}; -use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceWithHirId, PlaceBase}; +use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId}; /// Returns a set of mutated local variable IDs, or `None` if mutations could not be determined. pub fn mutated_variables<'a, 'tcx>(expr: &'tcx Expr<'_>, cx: &'a LateContext<'a, 'tcx>) -> Option> { From 9267b4f6120ff137f2ba8649e07ff093c9428340 Mon Sep 17 00:00:00 2001 From: yuqio Date: Tue, 23 Jun 2020 05:01:20 +0200 Subject: [PATCH 066/142] Remove unused crate imports in 2018 edition crates --- src/liballoc/collections/vec_deque/tests.rs | 2 -- src/librustc_ast_pretty/pprust/tests.rs | 1 - src/librustc_data_structures/sync.rs | 1 - src/libstd/os/illumos/fs.rs | 2 -- src/libstd/sys/unix/ext/net.rs | 3 --- src/libstd/sys/vxworks/args.rs | 1 - src/libstd/sys/vxworks/ext/fs.rs | 1 - src/libstd/sys/vxworks/rand.rs | 1 - src/libstd/sys/vxworks/rwlock.rs | 1 - src/libstd/sys/vxworks/time.rs | 2 -- src/libstd/sys/wasi/alloc.rs | 1 - src/tools/build-manifest/src/main.rs | 1 - src/tools/compiletest/src/json.rs | 1 - src/tools/compiletest/src/main.rs | 2 -- src/tools/compiletest/src/read2.rs | 1 - src/tools/compiletest/src/runtest.rs | 1 - 16 files changed, 22 deletions(-) diff --git a/src/liballoc/collections/vec_deque/tests.rs b/src/liballoc/collections/vec_deque/tests.rs index fc2ec7908e823..960af4bfda053 100644 --- a/src/liballoc/collections/vec_deque/tests.rs +++ b/src/liballoc/collections/vec_deque/tests.rs @@ -1,7 +1,5 @@ use super::*; -use test; - #[bench] #[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks fn bench_push_back_100(b: &mut test::Bencher) { diff --git a/src/librustc_ast_pretty/pprust/tests.rs b/src/librustc_ast_pretty/pprust/tests.rs index f51439f89ffbe..f92e40ed6ffab 100644 --- a/src/librustc_ast_pretty/pprust/tests.rs +++ b/src/librustc_ast_pretty/pprust/tests.rs @@ -2,7 +2,6 @@ use super::*; use rustc_ast::ast; use rustc_ast::with_default_globals; -use rustc_span; use rustc_span::source_map::respan; use rustc_span::symbol::Ident; diff --git a/src/librustc_data_structures/sync.rs b/src/librustc_data_structures/sync.rs index 39afb3d82ff5a..53d831749ceb7 100644 --- a/src/librustc_data_structures/sync.rs +++ b/src/librustc_data_structures/sync.rs @@ -358,7 +358,6 @@ cfg_if! { use parking_lot::Mutex as InnerLock; use parking_lot::RwLock as InnerRwLock; - use std; use std::thread; pub use rayon::{join, scope}; diff --git a/src/libstd/os/illumos/fs.rs b/src/libstd/os/illumos/fs.rs index 2abbf1fa9fa16..b668aa2595d67 100644 --- a/src/libstd/os/illumos/fs.rs +++ b/src/libstd/os/illumos/fs.rs @@ -1,7 +1,5 @@ #![stable(feature = "metadata_ext", since = "1.1.0")] -use libc; - use crate::fs::Metadata; use crate::sys_common::AsInner; diff --git a/src/libstd/sys/unix/ext/net.rs b/src/libstd/sys/unix/ext/net.rs index cd24605ec7ab7..ada8eaa1c9745 100644 --- a/src/libstd/sys/unix/ext/net.rs +++ b/src/libstd/sys/unix/ext/net.rs @@ -2,9 +2,6 @@ //! Unix-specific networking functionality -#[cfg(unix)] -use libc; - // FIXME(#43348): Make libc adapt #[doc(cfg(...))] so we don't need these fake definitions here? #[cfg(not(unix))] #[allow(non_camel_case_types)] diff --git a/src/libstd/sys/vxworks/args.rs b/src/libstd/sys/vxworks/args.rs index efd615f404db6..adff6c489bbc9 100644 --- a/src/libstd/sys/vxworks/args.rs +++ b/src/libstd/sys/vxworks/args.rs @@ -56,7 +56,6 @@ mod imp { use crate::ffi::{CStr, OsString}; use crate::marker::PhantomData; use crate::ptr; - use libc; use crate::sys_common::mutex::Mutex; diff --git a/src/libstd/sys/vxworks/ext/fs.rs b/src/libstd/sys/vxworks/ext/fs.rs index 9864a855df738..7cc64658ee1a9 100644 --- a/src/libstd/sys/vxworks/ext/fs.rs +++ b/src/libstd/sys/vxworks/ext/fs.rs @@ -6,7 +6,6 @@ use crate::path::Path; use crate::sys; use crate::sys::platform::fs::MetadataExt as UnixMetadataExt; use crate::sys_common::{AsInner, AsInnerMut, FromInner}; -use libc; /// Unix-specific extensions to [`File`]. /// diff --git a/src/libstd/sys/vxworks/rand.rs b/src/libstd/sys/vxworks/rand.rs index 87ebd2c9593fc..3a1ff5fd3b9c6 100644 --- a/src/libstd/sys/vxworks/rand.rs +++ b/src/libstd/sys/vxworks/rand.rs @@ -13,7 +13,6 @@ pub fn hashmap_random_keys() -> (u64, u64) { mod imp { use crate::io; use core::sync::atomic::{AtomicBool, Ordering::Relaxed}; - use libc; pub fn fill_bytes(v: &mut [u8]) { static RNG_INIT: AtomicBool = AtomicBool::new(false); diff --git a/src/libstd/sys/vxworks/rwlock.rs b/src/libstd/sys/vxworks/rwlock.rs index fd2e1a6e7bcfb..c90304c2b4a6a 100644 --- a/src/libstd/sys/vxworks/rwlock.rs +++ b/src/libstd/sys/vxworks/rwlock.rs @@ -1,6 +1,5 @@ use crate::cell::UnsafeCell; use crate::sync::atomic::{AtomicUsize, Ordering}; -use libc; pub struct RWLock { inner: UnsafeCell, diff --git a/src/libstd/sys/vxworks/time.rs b/src/libstd/sys/vxworks/time.rs index 8ebbf89213f32..8365c9ee9c995 100644 --- a/src/libstd/sys/vxworks/time.rs +++ b/src/libstd/sys/vxworks/time.rs @@ -1,7 +1,6 @@ use crate::cmp::Ordering; use crate::time::Duration; use ::core::hash::{Hash, Hasher}; -use libc; pub use self::inner::{Instant, SystemTime, UNIX_EPOCH}; use crate::convert::TryInto; @@ -104,7 +103,6 @@ mod inner { use crate::fmt; use crate::sys::cvt; use crate::time::Duration; - use libc; use super::Timespec; diff --git a/src/libstd/sys/wasi/alloc.rs b/src/libstd/sys/wasi/alloc.rs index bc61416278401..57187851a14e3 100644 --- a/src/libstd/sys/wasi/alloc.rs +++ b/src/libstd/sys/wasi/alloc.rs @@ -1,7 +1,6 @@ use crate::alloc::{GlobalAlloc, Layout, System}; use crate::ptr; use crate::sys_common::alloc::{realloc_fallback, MIN_ALIGN}; -use libc; #[stable(feature = "alloc_system_type", since = "1.28.0")] unsafe impl GlobalAlloc for System { diff --git a/src/tools/build-manifest/src/main.rs b/src/tools/build-manifest/src/main.rs index 39baa6b8540df..9eb43eb2df43f 100644 --- a/src/tools/build-manifest/src/main.rs +++ b/src/tools/build-manifest/src/main.rs @@ -7,7 +7,6 @@ #![deny(warnings)] use serde::Serialize; -use toml; use std::collections::BTreeMap; use std::collections::HashMap; diff --git a/src/tools/compiletest/src/json.rs b/src/tools/compiletest/src/json.rs index 52d0cbd4bfd7a..6ac7c3b9b474a 100644 --- a/src/tools/compiletest/src/json.rs +++ b/src/tools/compiletest/src/json.rs @@ -4,7 +4,6 @@ use crate::errors::{Error, ErrorKind}; use crate::runtest::ProcRes; use serde::Deserialize; -use serde_json; use std::path::{Path, PathBuf}; use std::str::FromStr; diff --git a/src/tools/compiletest/src/main.rs b/src/tools/compiletest/src/main.rs index c00b0f02c3a90..134ac66b7d15b 100644 --- a/src/tools/compiletest/src/main.rs +++ b/src/tools/compiletest/src/main.rs @@ -9,8 +9,6 @@ extern crate test; use crate::common::{expected_output_path, output_base_dir, output_relative_path, UI_EXTENSIONS}; use crate::common::{CompareMode, Config, Debugger, Mode, PassMode, Pretty, TestPaths}; use crate::util::logv; -use env_logger; -use getopts; use getopts::Options; use log::*; use std::env; diff --git a/src/tools/compiletest/src/read2.rs b/src/tools/compiletest/src/read2.rs index da1d3db49d70e..30a922057eb20 100644 --- a/src/tools/compiletest/src/read2.rs +++ b/src/tools/compiletest/src/read2.rs @@ -25,7 +25,6 @@ mod imp { #[cfg(unix)] mod imp { - use libc; use std::io; use std::io::prelude::*; use std::mem; diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index 95ea4fb078955..dd0c68ecd4965 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -13,7 +13,6 @@ use crate::header::TestProps; use crate::json; use crate::util::get_pointer_width; use crate::util::{logv, PathBufExt}; -use diff; use regex::{Captures, Regex}; use rustfix::{apply_suggestions, get_suggestions_from_json, Filter}; From 7930f9a368c055db249a0378c1533aaedc7b037b Mon Sep 17 00:00:00 2001 From: Ayaz Hafiz Date: Mon, 22 Jun 2020 20:52:44 -0700 Subject: [PATCH 067/142] Change heuristic for determining range literal Currently, rustc uses a heuristic to determine if a range expression is not a literal based on whether the expression looks like a function call or struct initialization. This fails for range literals whose lower/upper bounds are the results of function calls. A possibly-better heuristic is to check if the expression contains `..`, required in range literals. Of course, this is also not perfect; for example, if the range expression is a struct which includes some text with `..` this will fail, but in general I believe it is a better heuristic. A better alternative altogether is to add the `QPath::LangItem` enum variant suggested in #60607. I would be happy to do this as a precursor to this patch if someone is able to provide general suggestions on how usages of `QPath` need to be changed later in the compiler with the `LangItem` variant. Closes #73553 --- src/librustc_hir/hir.rs | 8 +----- .../issue-73553-misinterp-range-literal.rs | 16 +++++++++++ ...issue-73553-misinterp-range-literal.stderr | 27 +++++++++++++++++++ 3 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 src/test/ui/range/issue-73553-misinterp-range-literal.rs create mode 100644 src/test/ui/range/issue-73553-misinterp-range-literal.stderr diff --git a/src/librustc_hir/hir.rs b/src/librustc_hir/hir.rs index 7d1cb7738c35e..f3dfec7ca7215 100644 --- a/src/librustc_hir/hir.rs +++ b/src/librustc_hir/hir.rs @@ -1511,13 +1511,7 @@ pub fn is_range_literal(sm: &SourceMap, expr: &Expr<'_>) -> bool { // Check whether a span corresponding to a range expression is a // range literal, rather than an explicit struct or `new()` call. fn is_lit(sm: &SourceMap, span: &Span) -> bool { - let end_point = sm.end_point(*span); - - if let Ok(end_string) = sm.span_to_snippet(end_point) { - !(end_string.ends_with('}') || end_string.ends_with(')')) - } else { - false - } + sm.span_to_snippet(*span).map(|range_src| range_src.contains("..")).unwrap_or(false) }; match expr.kind { diff --git a/src/test/ui/range/issue-73553-misinterp-range-literal.rs b/src/test/ui/range/issue-73553-misinterp-range-literal.rs new file mode 100644 index 0000000000000..e65dba0a03821 --- /dev/null +++ b/src/test/ui/range/issue-73553-misinterp-range-literal.rs @@ -0,0 +1,16 @@ +type Range = std::ops::Range; + +fn demo(r: &Range) { + println!("{:?}", r); +} + +fn tell(x: usize) -> usize { + x +} + +fn main() { + demo(tell(1)..tell(10)); + //~^ ERROR mismatched types + demo(1..10); + //~^ ERROR mismatched types +} diff --git a/src/test/ui/range/issue-73553-misinterp-range-literal.stderr b/src/test/ui/range/issue-73553-misinterp-range-literal.stderr new file mode 100644 index 0000000000000..5167b87fd27b8 --- /dev/null +++ b/src/test/ui/range/issue-73553-misinterp-range-literal.stderr @@ -0,0 +1,27 @@ +error[E0308]: mismatched types + --> $DIR/issue-73553-misinterp-range-literal.rs:12:10 + | +LL | demo(tell(1)..tell(10)); + | ^^^^^^^^^^^^^^^^^ + | | + | expected reference, found struct `std::ops::Range` + | help: consider borrowing here: `&(tell(1)..tell(10))` + | + = note: expected reference `&std::ops::Range` + found struct `std::ops::Range` + +error[E0308]: mismatched types + --> $DIR/issue-73553-misinterp-range-literal.rs:14:10 + | +LL | demo(1..10); + | ^^^^^ + | | + | expected reference, found struct `std::ops::Range` + | help: consider borrowing here: `&(1..10)` + | + = note: expected reference `&std::ops::Range` + found struct `std::ops::Range<{integer}>` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0308`. From 52c486475774b7416e691323322ef1ea2db790de Mon Sep 17 00:00:00 2001 From: Michael Wright Date: Thu, 11 Jun 2020 20:25:14 +0200 Subject: [PATCH 068/142] Improve end of expression check in for loop lints The code should to check that the current expression _is_ the end expression; not that it's equal to it. The equality check seems very wasteful in terms of performance. --- clippy_lints/src/loops.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clippy_lints/src/loops.rs b/clippy_lints/src/loops.rs index ae1aa66be5cda..3874b040b1320 100644 --- a/clippy_lints/src/loops.rs +++ b/clippy_lints/src/loops.rs @@ -2042,7 +2042,7 @@ impl<'a, 'tcx> Visitor<'tcx> for InitializeVisitor<'a, 'tcx> { if self.state == VarState::DontWarn { return; } - if SpanlessEq::new(self.cx).eq_expr(&expr, self.end_expr) { + if expr.hir_id == self.end_expr.hir_id { self.past_loop = true; return; } From 51c3b42ef33f14cb40aa440d2d432e4c70e028b0 Mon Sep 17 00:00:00 2001 From: Lzu Tao Date: Tue, 23 Jun 2020 14:27:11 +0700 Subject: [PATCH 069/142] Add more specific GitHub issue templates Apply suggestions from code review Co-authored-by: Philipp Krones --- .github/ISSUE_TEMPLATE.md | 8 ---- .github/ISSUE_TEMPLATE/blank_issue.md | 4 ++ .github/ISSUE_TEMPLATE/bug_report.md | 47 ++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 5 +++ .github/ISSUE_TEMPLATE/ice.md | 53 +++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/new_lint.md | 35 ++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 1 + 7 files changed, 145 insertions(+), 8 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/ISSUE_TEMPLATE/blank_issue.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/ice.md create mode 100644 .github/ISSUE_TEMPLATE/new_lint.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 15006a07b44f2..0000000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/.github/ISSUE_TEMPLATE/blank_issue.md b/.github/ISSUE_TEMPLATE/blank_issue.md new file mode 100644 index 0000000000000..9aef3ebe637a1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/blank_issue.md @@ -0,0 +1,4 @@ +--- +name: Blank Issue +about: Create a blank issue. +--- diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000000..d8f0c44148cae --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,47 @@ +--- +name: Bug Report +about: Create a bug report for Clippy +labels: L-bug +--- + + +I tried this code: + +```rust + +``` + +I expected to see this happen: *explanation* + +Instead, this happened: *explanation* + +### Meta + +- `cargo clippy -V`: e.g. clippy 0.0.212 (f455e46 2020-06-20) +- `rustc -Vv`: + ``` + rustc 1.46.0-nightly (f455e46ea 2020-06-20) + binary: rustc + commit-hash: f455e46eae1a227d735091091144601b467e1565 + commit-date: 2020-06-20 + host: x86_64-unknown-linux-gnu + release: 1.46.0-nightly + LLVM version: 10.0 + ``` + + +

    Backtrace +

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

    +
    diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000000..bd7dc0ac95c1f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: Rust Programming Language Forum + url: https://users.rust-lang.org + about: Please ask and answer questions about Rust here. diff --git a/.github/ISSUE_TEMPLATE/ice.md b/.github/ISSUE_TEMPLATE/ice.md new file mode 100644 index 0000000000000..3abe76bf2c497 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/ice.md @@ -0,0 +1,53 @@ +--- +name: Internal Compiler Error +about: Create a report for an internal compiler error in Clippy. +labels: L-bug, L-crash +--- + + +### Code + +```rust + +``` + +### Meta + +- `cargo clippy -V`: e.g. clippy 0.0.212 (f455e46 2020-06-20) +- `rustc -Vv`: + ``` + rustc 1.46.0-nightly (f455e46ea 2020-06-20) + binary: rustc + commit-hash: f455e46eae1a227d735091091144601b467e1565 + commit-date: 2020-06-20 + host: x86_64-unknown-linux-gnu + release: 1.46.0-nightly + LLVM version: 10.0 + ``` + +### Error output + +``` + +``` + + +
    Backtrace +

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

    +
    diff --git a/.github/ISSUE_TEMPLATE/new_lint.md b/.github/ISSUE_TEMPLATE/new_lint.md new file mode 100644 index 0000000000000..70445d7ef2503 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/new_lint.md @@ -0,0 +1,35 @@ +--- +name: New lint suggestion +about: Suggest a new Clippy lint. +labels: L-lint +--- + +### What it does + +*What does this lint do?* + +### Categories (optional) + +- Kind: *See for list of lint kinds* + +*What benefit of this lint over old code?* + +For example: +- Remove bounce checking inserted by ... +- Remove the need to duplicating/storing/typo ... + +### Drawbacks + +None. + +### Example + +```rust + +``` + +Could be written as: + +```rust + +``` diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 97aa220afea54..137a73630940a 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -28,4 +28,5 @@ Delete this line and everything above before opening your PR. --- +*Please keep the line below* changelog: none From bb882d74bd00477395e8d302463148f0a5f8cfe6 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Tue, 23 Jun 2020 17:52:01 +0900 Subject: [PATCH 070/142] Add test for issue-44861 --- src/test/ui/specialization/issue-44861.rs | 40 +++++++++++++++++++ src/test/ui/specialization/issue-44861.stderr | 12 ++++++ 2 files changed, 52 insertions(+) create mode 100644 src/test/ui/specialization/issue-44861.rs create mode 100644 src/test/ui/specialization/issue-44861.stderr diff --git a/src/test/ui/specialization/issue-44861.rs b/src/test/ui/specialization/issue-44861.rs new file mode 100644 index 0000000000000..c37a6273de366 --- /dev/null +++ b/src/test/ui/specialization/issue-44861.rs @@ -0,0 +1,40 @@ +#![crate_type = "lib"] +#![feature(specialization)] +#![feature(unsize, coerce_unsized)] +#![allow(incomplete_features)] + +use std::ops::CoerceUnsized; + +pub struct SmartassPtr(A::Data); + +pub trait Smartass { + type Data; + type Data2: CoerceUnsized<*const [u8]>; +} + +pub trait MaybeObjectSafe {} + +impl MaybeObjectSafe for () {} + +impl Smartass for T { + type Data = ::Data2; + default type Data2 = (); + //~^ ERROR: the trait bound `(): std::ops::CoerceUnsized<*const [u8]>` is not satisfied +} + +impl Smartass for () { + type Data2 = *const [u8; 1]; +} + +impl Smartass for dyn MaybeObjectSafe { + type Data = *const [u8]; + type Data2 = *const [u8; 0]; +} + +impl CoerceUnsized> for SmartassPtr + where ::Data: std::ops::CoerceUnsized<::Data> +{} + +pub fn conv(s: SmartassPtr<()>) -> SmartassPtr { + s +} diff --git a/src/test/ui/specialization/issue-44861.stderr b/src/test/ui/specialization/issue-44861.stderr new file mode 100644 index 0000000000000..b41b17e76a6ab --- /dev/null +++ b/src/test/ui/specialization/issue-44861.stderr @@ -0,0 +1,12 @@ +error[E0277]: the trait bound `(): std::ops::CoerceUnsized<*const [u8]>` is not satisfied + --> $DIR/issue-44861.rs:21:5 + | +LL | type Data2: CoerceUnsized<*const [u8]>; + | --------------------------------------- required by `Smartass::Data2` +... +LL | default type Data2 = (); + | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::ops::CoerceUnsized<*const [u8]>` is not implemented for `()` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. From 43ef554b6ab72c4cc3c56dab8e9b61021c63b3b7 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Tue, 23 Jun 2020 17:52:26 +0900 Subject: [PATCH 071/142] Add test for issue-51506 --- src/test/ui/never_type/issue-51506.rs | 41 +++++++++++++++++++++++ src/test/ui/never_type/issue-51506.stderr | 14 ++++++++ 2 files changed, 55 insertions(+) create mode 100644 src/test/ui/never_type/issue-51506.rs create mode 100644 src/test/ui/never_type/issue-51506.stderr diff --git a/src/test/ui/never_type/issue-51506.rs b/src/test/ui/never_type/issue-51506.rs new file mode 100644 index 0000000000000..d0fe6a0f59a87 --- /dev/null +++ b/src/test/ui/never_type/issue-51506.rs @@ -0,0 +1,41 @@ +#![feature(never_type, specialization)] +#![allow(incomplete_features)] + +use std::iter::{self, Empty}; + +trait Trait { + type Out: Iterator; + + fn f(&self) -> Option; +} + +impl Trait for T { + default type Out = !; //~ ERROR: `!` is not an iterator + + default fn f(&self) -> Option { + None + } +} + +struct X; + +impl Trait for X { + type Out = Empty; + + fn f(&self) -> Option { + Some(iter::empty()) + } +} + +fn f(a: T) { + if let Some(iter) = a.f() { + println!("Some"); + for x in iter { + println!("x = {}", x); + } + } +} + +pub fn main() { + f(10); +} diff --git a/src/test/ui/never_type/issue-51506.stderr b/src/test/ui/never_type/issue-51506.stderr new file mode 100644 index 0000000000000..73865a9b5a02c --- /dev/null +++ b/src/test/ui/never_type/issue-51506.stderr @@ -0,0 +1,14 @@ +error[E0277]: `!` is not an iterator + --> $DIR/issue-51506.rs:13:5 + | +LL | type Out: Iterator; + | ------------------------------- required by `Trait::Out` +... +LL | default type Out = !; + | ^^^^^^^^^^^^^^^^^^^^^ `!` is not an iterator + | + = help: the trait `std::iter::Iterator` is not implemented for `!` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. From e817cd2a6e499eebf9674e558b762fd98581f13a Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Tue, 23 Jun 2020 17:52:42 +0900 Subject: [PATCH 072/142] Add test for issue-59435 --- src/test/ui/specialization/issue-59435.rs | 17 +++++++++++++++++ src/test/ui/specialization/issue-59435.stderr | 12 ++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 src/test/ui/specialization/issue-59435.rs create mode 100644 src/test/ui/specialization/issue-59435.stderr diff --git a/src/test/ui/specialization/issue-59435.rs b/src/test/ui/specialization/issue-59435.rs new file mode 100644 index 0000000000000..47323d3096f3d --- /dev/null +++ b/src/test/ui/specialization/issue-59435.rs @@ -0,0 +1,17 @@ +#![feature(specialization)] +#![allow(incomplete_features)] + +struct MyStruct {} + +trait MyTrait { + type MyType: Default; +} + +impl MyTrait for i32 { + default type MyType = MyStruct; + //~^ ERROR: the trait bound `MyStruct: std::default::Default` is not satisfied +} + +fn main() { + let _x: ::MyType = ::MyType::default(); +} diff --git a/src/test/ui/specialization/issue-59435.stderr b/src/test/ui/specialization/issue-59435.stderr new file mode 100644 index 0000000000000..fd512a539a3ee --- /dev/null +++ b/src/test/ui/specialization/issue-59435.stderr @@ -0,0 +1,12 @@ +error[E0277]: the trait bound `MyStruct: std::default::Default` is not satisfied + --> $DIR/issue-59435.rs:11:5 + | +LL | type MyType: Default; + | --------------------- required by `MyTrait::MyType` +... +LL | default type MyType = MyStruct; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::default::Default` is not implemented for `MyStruct` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. From 814782b4c6bd773d47dfce5614d4bbea935f5d85 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Tue, 23 Jun 2020 17:52:51 +0900 Subject: [PATCH 073/142] Add test for issue-69840 --- src/test/ui/impl-trait/issue-69840.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/test/ui/impl-trait/issue-69840.rs diff --git a/src/test/ui/impl-trait/issue-69840.rs b/src/test/ui/impl-trait/issue-69840.rs new file mode 100644 index 0000000000000..b270f88b6886e --- /dev/null +++ b/src/test/ui/impl-trait/issue-69840.rs @@ -0,0 +1,16 @@ +// check-pass + +#![feature(impl_trait_in_bindings)] +#![allow(incomplete_features)] + +struct A<'a>(&'a ()); + +trait Trait {} + +impl Trait for () {} + +pub fn foo<'a>() { + let _x: impl Trait> = (); +} + +fn main() {} From 404df1cbbfac0126d256f99a12a175d9ce96fd0f Mon Sep 17 00:00:00 2001 From: Dan Aloni Date: Sun, 21 Jun 2020 19:31:49 +0300 Subject: [PATCH 074/142] Add re-exports to use suggestions In the following example, an inaccessible path is suggested via `use foo::bar::X;` whereas an accessible public exported path can be suggested instead. ``` mod foo { mod bar { pub struct X; } pub use self::bar::X; } fn main() { X; } ``` This fixes the issue. --- src/librustc_resolve/diagnostics.rs | 23 +++++++++++++------- src/librustc_resolve/lib.rs | 7 ++++++ src/test/ui/glob-resolve1.rs | 4 ++++ src/test/ui/glob-resolve1.stderr | 5 +++++ src/test/ui/namespace/namespace-mix.stderr | 8 +++---- src/test/ui/resolve/issue-21221-2.stderr | 4 +++- src/test/ui/resolve/privacy-enum-ctor.stderr | 8 +++---- 7 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/librustc_resolve/diagnostics.rs b/src/librustc_resolve/diagnostics.rs index bb88b8191f1ad..ea4a84a9c3bd4 100644 --- a/src/librustc_resolve/diagnostics.rs +++ b/src/librustc_resolve/diagnostics.rs @@ -643,22 +643,24 @@ impl<'a> Resolver<'a> { let not_local_module = crate_name.name != kw::Crate; let mut worklist = vec![(start_module, Vec::::new(), true, not_local_module)]; + let mut worklist_via_import = vec![]; - while let Some((in_module, path_segments, accessible, in_module_is_extern)) = worklist.pop() + while let Some((in_module, path_segments, accessible, in_module_is_extern)) = + match worklist.pop() { + None => worklist_via_import.pop(), + Some(x) => Some(x), + } { // We have to visit module children in deterministic order to avoid // instabilities in reported imports (#43552). in_module.for_each_child(self, |this, ident, ns, name_binding| { - // avoid imports entirely - if name_binding.is_import() && !name_binding.is_extern_crate() { - return; - } - - // avoid non-importable candidates as well + // avoid non-importable candidates if !name_binding.is_importable() { return; } + let via_import = name_binding.is_import() && !name_binding.is_extern_crate(); + let child_accessible = accessible && this.is_accessible_from(name_binding.vis, parent_scope.module); @@ -667,6 +669,10 @@ impl<'a> Resolver<'a> { return; } + if via_import && name_binding.is_possibly_imported_variant() { + return; + } + // collect results based on the filter function // avoid suggesting anything from the same module in which we are resolving if ident.name == lookup_ident.name @@ -724,7 +730,8 @@ impl<'a> Resolver<'a> { let is_extern = in_module_is_extern || name_binding.is_extern_crate(); // add the module to the lookup if seen_modules.insert(module.def_id().unwrap()) { - worklist.push((module, path_segments, child_accessible, is_extern)); + if via_import { &mut worklist_via_import } else { &mut worklist } + .push((module, path_segments, child_accessible, is_extern)); } } } diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 91bd155614178..9aa0be0a71e1f 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -711,6 +711,13 @@ impl<'a> NameBinding<'a> { } } + fn is_possibly_imported_variant(&self) -> bool { + match self.kind { + NameBindingKind::Import { binding, .. } => binding.is_possibly_imported_variant(), + _ => self.is_variant(), + } + } + // We sometimes need to treat variants as `pub` for backwards compatibility. fn pseudo_vis(&self) -> ty::Visibility { if self.is_variant() && self.res().def_id().is_local() { diff --git a/src/test/ui/glob-resolve1.rs b/src/test/ui/glob-resolve1.rs index 63c435cc20641..32660fdb41876 100644 --- a/src/test/ui/glob-resolve1.rs +++ b/src/test/ui/glob-resolve1.rs @@ -29,3 +29,7 @@ fn main() { foo::(); //~ ERROR: cannot find type `C` in this scope foo::(); //~ ERROR: cannot find type `D` in this scope } + +mod other { + pub fn import() {} +} diff --git a/src/test/ui/glob-resolve1.stderr b/src/test/ui/glob-resolve1.stderr index 995da6cc1f975..3c818f3ae48ea 100644 --- a/src/test/ui/glob-resolve1.stderr +++ b/src/test/ui/glob-resolve1.stderr @@ -42,6 +42,11 @@ error[E0425]: cannot find function `import` in this scope | LL | import(); | ^^^^^^ not found in this scope + | +help: consider importing this function + | +LL | use other::import; + | error[E0412]: cannot find type `A` in this scope --> $DIR/glob-resolve1.rs:28:11 diff --git a/src/test/ui/namespace/namespace-mix.stderr b/src/test/ui/namespace/namespace-mix.stderr index c80055f00d7d9..ee730910ee441 100644 --- a/src/test/ui/namespace/namespace-mix.stderr +++ b/src/test/ui/namespace/namespace-mix.stderr @@ -16,7 +16,7 @@ help: consider importing one of these items instead | LL | use m2::S; | -LL | use namespace_mix::xm2::S; +LL | use xm2::S; | error[E0423]: expected value, found type alias `xm1::S` @@ -39,7 +39,7 @@ help: consider importing one of these items instead | LL | use m2::S; | -LL | use namespace_mix::xm2::S; +LL | use xm2::S; | error[E0423]: expected value, found struct variant `m7::V` @@ -61,7 +61,7 @@ help: consider importing one of these items instead | LL | use m8::V; | -LL | use namespace_mix::xm8::V; +LL | use xm8::V; | error[E0423]: expected value, found struct variant `xm7::V` @@ -83,7 +83,7 @@ help: consider importing one of these items instead | LL | use m8::V; | -LL | use namespace_mix::xm8::V; +LL | use xm8::V; | error[E0277]: the trait bound `c::Item: Impossible` is not satisfied diff --git a/src/test/ui/resolve/issue-21221-2.stderr b/src/test/ui/resolve/issue-21221-2.stderr index f9263d2af5026..d4fd7cb1257e0 100644 --- a/src/test/ui/resolve/issue-21221-2.stderr +++ b/src/test/ui/resolve/issue-21221-2.stderr @@ -4,7 +4,9 @@ error[E0405]: cannot find trait `T` in this scope LL | impl T for Foo { } | ^ not found in this scope | -help: consider importing this trait +help: consider importing one of these items + | +LL | use baz::T; | LL | use foo::bar::T; | diff --git a/src/test/ui/resolve/privacy-enum-ctor.stderr b/src/test/ui/resolve/privacy-enum-ctor.stderr index d9b1b9c59558a..16baa6c9b6233 100644 --- a/src/test/ui/resolve/privacy-enum-ctor.stderr +++ b/src/test/ui/resolve/privacy-enum-ctor.stderr @@ -132,7 +132,7 @@ LL | let _: E = m::n::Z; | ^ help: consider importing this enum | -LL | use m::n::Z; +LL | use m::Z; | error[E0423]: expected value, found enum `m::n::Z` @@ -165,7 +165,7 @@ LL | let _: E = m::n::Z::Fn; | ^ help: consider importing this enum | -LL | use m::n::Z; +LL | use m::Z; | error[E0412]: cannot find type `Z` in this scope @@ -183,7 +183,7 @@ LL | let _: E = m::n::Z::Struct; | ^ help: consider importing this enum | -LL | use m::n::Z; +LL | use m::Z; | error[E0423]: expected value, found struct variant `m::n::Z::Struct` @@ -212,7 +212,7 @@ LL | let _: E = m::n::Z::Unit {}; | ^ help: consider importing this enum | -LL | use m::n::Z; +LL | use m::Z; | error[E0603]: enum `Z` is private From ed083cc95987ef37b7ed897f632b4a7a1baaff60 Mon Sep 17 00:00:00 2001 From: flip1995 Date: Sat, 13 Jun 2020 18:22:38 +0200 Subject: [PATCH 075/142] Use lints in Clippy that are enabled in rustc bootstrap --- clippy_lints/src/lib.rs | 17 ++++++++++------- src/driver.rs | 6 +++++- src/main.rs | 2 ++ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index 021fbe932d895..25c1c2d73b6c4 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -1,19 +1,22 @@ // error-pattern:cargo-clippy #![feature(bindings_after_at)] -#![feature(box_syntax)] #![feature(box_patterns)] +#![feature(box_syntax)] +#![feature(concat_idents)] +#![feature(crate_visibility_modifier)] +#![feature(drain_filter)] #![feature(or_patterns)] #![feature(rustc_private)] #![feature(stmt_expr_attributes)] -#![allow(clippy::missing_docs_in_private_items, clippy::must_use_candidate)] #![recursion_limit = "512"] -#![warn(rust_2018_idioms, trivial_casts, trivial_numeric_casts)] -#![deny(rustc::internal)] #![cfg_attr(feature = "deny-warnings", deny(warnings))] -#![feature(crate_visibility_modifier)] -#![feature(concat_idents)] -#![feature(drain_filter)] +#![allow(clippy::missing_docs_in_private_items, clippy::must_use_candidate)] +#![warn(trivial_casts, trivial_numeric_casts)] +// warn on lints, that are included in `rust-lang/rust`s bootstrap +#![warn(rust_2018_idioms, unused_lifetimes)] +// warn on rustc internal lints +#![deny(rustc::internal)] // FIXME: switch to something more ergonomic here, once available. // (Currently there is no way to opt into sysroot crates without `extern crate`.) diff --git a/src/driver.rs b/src/driver.rs index 4453ae5ce4414..10f56fb2070f3 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -1,5 +1,9 @@ -#![cfg_attr(feature = "deny-warnings", deny(warnings))] #![feature(rustc_private)] +#![cfg_attr(feature = "deny-warnings", deny(warnings))] +// warn on lints, that are included in `rust-lang/rust`s bootstrap +#![warn(rust_2018_idioms, unused_lifetimes)] +// warn on rustc internal lints +#![deny(rustc::internal)] // FIXME: switch to something more ergonomic here, once available. // (Currently there is no way to opt into sysroot crates without `extern crate`.) diff --git a/src/main.rs b/src/main.rs index bc43a34ed5d4a..6739a4cf2245e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,6 @@ #![cfg_attr(feature = "deny-warnings", deny(warnings))] +// warn on lints, that are included in `rust-lang/rust`s bootstrap +#![warn(rust_2018_idioms, unused_lifetimes)] use rustc_tools_util::VersionInfo; use std::env; From b886c06c1a52a57890b318cc7304f7384e696ec8 Mon Sep 17 00:00:00 2001 From: flip1995 Date: Sat, 13 Jun 2020 18:22:49 +0200 Subject: [PATCH 076/142] Fix fallout --- clippy_lints/src/loops.rs | 6 +++--- clippy_lints/src/suspicious_trait_impl.rs | 2 +- clippy_lints/src/trivially_copy_pass_by_ref.rs | 2 +- clippy_lints/src/utils/sugg.rs | 4 ++-- src/driver.rs | 6 ++++-- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/clippy_lints/src/loops.rs b/clippy_lints/src/loops.rs index ae1aa66be5cda..9020b47a146fa 100644 --- a/clippy_lints/src/loops.rs +++ b/clippy_lints/src/loops.rs @@ -1497,7 +1497,7 @@ struct MutatePairDelegate<'a, 'tcx> { span_high: Option, } -impl<'a, 'tcx> Delegate<'tcx> for MutatePairDelegate<'a, 'tcx> { +impl<'tcx> Delegate<'tcx> for MutatePairDelegate<'_, 'tcx> { fn consume(&mut self, _: &PlaceWithHirId<'tcx>, _: ConsumeMode) {} fn borrow(&mut self, cmt: &PlaceWithHirId<'tcx>, bk: ty::BorrowKind) { @@ -1525,7 +1525,7 @@ impl<'a, 'tcx> Delegate<'tcx> for MutatePairDelegate<'a, 'tcx> { } } -impl<'a, 'tcx> MutatePairDelegate<'a, 'tcx> { +impl MutatePairDelegate<'_, '_> { fn mutation_span(&self) -> (Option, Option) { (self.span_low, self.span_high) } @@ -2292,7 +2292,7 @@ struct HasBreakOrReturnVisitor { has_break_or_return: bool, } -impl<'a, 'tcx> Visitor<'tcx> for HasBreakOrReturnVisitor { +impl<'tcx> Visitor<'tcx> for HasBreakOrReturnVisitor { type Map = Map<'tcx>; fn visit_expr(&mut self, expr: &'tcx Expr<'_>) { diff --git a/clippy_lints/src/suspicious_trait_impl.rs b/clippy_lints/src/suspicious_trait_impl.rs index a9e6fa329c0f0..cf71c3144a2eb 100644 --- a/clippy_lints/src/suspicious_trait_impl.rs +++ b/clippy_lints/src/suspicious_trait_impl.rs @@ -184,7 +184,7 @@ struct BinaryExprVisitor { in_binary_expr: bool, } -impl<'a, 'tcx> Visitor<'tcx> for BinaryExprVisitor { +impl<'tcx> Visitor<'tcx> for BinaryExprVisitor { type Map = Map<'tcx>; fn visit_expr(&mut self, expr: &'tcx hir::Expr<'_>) { diff --git a/clippy_lints/src/trivially_copy_pass_by_ref.rs b/clippy_lints/src/trivially_copy_pass_by_ref.rs index 8e0cb94317aff..146ac4b09d5a4 100644 --- a/clippy_lints/src/trivially_copy_pass_by_ref.rs +++ b/clippy_lints/src/trivially_copy_pass_by_ref.rs @@ -58,7 +58,7 @@ pub struct TriviallyCopyPassByRef { limit: u64, } -impl<'a, 'tcx> TriviallyCopyPassByRef { +impl<'tcx> TriviallyCopyPassByRef { pub fn new(limit: Option, target: &SessionConfig) -> Self { let limit = limit.unwrap_or_else(|| { let bit_width = u64::from(target.ptr_width); diff --git a/clippy_lints/src/utils/sugg.rs b/clippy_lints/src/utils/sugg.rs index 73758b7eeb7eb..e919b1522d89a 100644 --- a/clippy_lints/src/utils/sugg.rs +++ b/clippy_lints/src/utils/sugg.rs @@ -509,7 +509,7 @@ fn indentation(cx: &T, span: Span) -> Option { } /// Convenience extension trait for `DiagnosticBuilder`. -pub trait DiagnosticBuilderExt<'a, T: LintContext> { +pub trait DiagnosticBuilderExt { /// Suggests to add an attribute to an item. /// /// Correctly handles indentation of the attribute and item. @@ -556,7 +556,7 @@ pub trait DiagnosticBuilderExt<'a, T: LintContext> { fn suggest_remove_item(&mut self, cx: &T, item: Span, msg: &str, applicability: Applicability); } -impl<'a, 'b, 'c, T: LintContext> DiagnosticBuilderExt<'c, T> for rustc_errors::DiagnosticBuilder<'b> { +impl DiagnosticBuilderExt for rustc_errors::DiagnosticBuilder<'_> { fn suggest_item_with_attr( &mut self, cx: &T, diff --git a/src/driver.rs b/src/driver.rs index 10f56fb2070f3..3d12436e9af8e 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -8,6 +8,8 @@ // FIXME: switch to something more ergonomic here, once available. // (Currently there is no way to opt into sysroot crates without `extern crate`.) #[allow(unused_extern_crates)] +extern crate rustc_data_structures; +#[allow(unused_extern_crates)] extern crate rustc_driver; #[allow(unused_extern_crates)] extern crate rustc_errors; @@ -97,7 +99,7 @@ impl rustc_driver::Callbacks for ClippyCallbacks { #[allow(clippy::find_map, clippy::filter_map)] fn describe_lints() { use lintlist::{Level, Lint, ALL_LINTS, LINT_LEVELS}; - use std::collections::HashSet; + use rustc_data_structures::fx::FxHashSet; println!( " @@ -141,7 +143,7 @@ Available lint options: let scoped = |x: &str| format!("clippy::{}", x); - let lint_groups: HashSet<_> = lints.iter().map(|lint| lint.group).collect(); + let lint_groups: FxHashSet<_> = lints.iter().map(|lint| lint.group).collect(); println!("Lint checks provided by clippy:\n"); println!(" {} {:7.7} meaning", padded("name"), "default"); From 7374185b36d8dee6c91970a4c016d714a6e1bd39 Mon Sep 17 00:00:00 2001 From: Lzu Tao Date: Tue, 23 Jun 2020 20:59:35 +0700 Subject: [PATCH 077/142] Remove unused allowed unused attributes --- clippy_lints/src/lib.rs | 32 +++----------------------------- src/driver.rs | 5 ----- 2 files changed, 3 insertions(+), 34 deletions(-) diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index 19ad7d92c2b37..501220f28e5db 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -20,47 +20,25 @@ // FIXME: switch to something more ergonomic here, once available. // (Currently there is no way to opt into sysroot crates without `extern crate`.) -#[allow(unused_extern_crates)] extern crate rustc_ast; -#[allow(unused_extern_crates)] extern crate rustc_ast_pretty; -#[allow(unused_extern_crates)] extern crate rustc_attr; -#[allow(unused_extern_crates)] extern crate rustc_data_structures; -#[allow(unused_extern_crates)] -extern crate rustc_driver; -#[allow(unused_extern_crates)] extern crate rustc_errors; -#[allow(unused_extern_crates)] extern crate rustc_hir; -#[allow(unused_extern_crates)] extern crate rustc_hir_pretty; -#[allow(unused_extern_crates)] extern crate rustc_index; -#[allow(unused_extern_crates)] extern crate rustc_infer; -#[allow(unused_extern_crates)] extern crate rustc_lexer; -#[allow(unused_extern_crates)] extern crate rustc_lint; -#[allow(unused_extern_crates)] extern crate rustc_middle; -#[allow(unused_extern_crates)] extern crate rustc_mir; -#[allow(unused_extern_crates)] extern crate rustc_parse; -#[allow(unused_extern_crates)] extern crate rustc_parse_format; -#[allow(unused_extern_crates)] extern crate rustc_session; -#[allow(unused_extern_crates)] extern crate rustc_span; -#[allow(unused_extern_crates)] extern crate rustc_target; -#[allow(unused_extern_crates)] extern crate rustc_trait_selection; -#[allow(unused_extern_crates)] extern crate rustc_typeck; use rustc_data_structures::fx::FxHashSet; @@ -85,14 +63,10 @@ use rustc_session::Session; /// # Example /// /// ``` -/// # #![feature(rustc_private)] -/// # #[allow(unused_extern_crates)] -/// # extern crate rustc_middle; -/// # #[allow(unused_extern_crates)] -/// # extern crate rustc_session; -/// # #[macro_use] -/// # use clippy_lints::declare_clippy_lint; +/// #![feature(rustc_private)] +/// extern crate rustc_session; /// use rustc_session::declare_tool_lint; +/// use clippy_lints::declare_clippy_lint; /// /// declare_clippy_lint! { /// /// **What it does:** Checks for ... (describe what the lint matches). diff --git a/src/driver.rs b/src/driver.rs index 3fca66a5792cc..decd3a79cce18 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -7,15 +7,10 @@ // FIXME: switch to something more ergonomic here, once available. // (Currently there is no way to opt into sysroot crates without `extern crate`.) -#[allow(unused_extern_crates)] extern crate rustc_data_structures; -#[allow(unused_extern_crates)] extern crate rustc_driver; -#[allow(unused_extern_crates)] extern crate rustc_errors; -#[allow(unused_extern_crates)] extern crate rustc_interface; -#[allow(unused_extern_crates)] extern crate rustc_middle; use rustc_interface::interface; From 86f6c0e0861f4d223d00280107cd0b31b6ebb85b Mon Sep 17 00:00:00 2001 From: Ayaz Hafiz Date: Sun, 21 Jun 2020 15:49:56 -0700 Subject: [PATCH 078/142] Record span of `const` kw in GenericParamKind Context: this is needed to fix https://github.com/rust-lang/rustfmt/issues/4263, which currently records the span of a const generic param incorrectly because the location of the `const` kw is not known. I am not sure how to add tests for this; any guidance in how to do so would be appreciated :slightly_smiling_face: --- src/librustc_ast/ast.rs | 2 ++ src/librustc_ast/mut_visit.rs | 2 +- src/librustc_ast_lowering/lib.rs | 2 +- src/librustc_ast_passes/ast_validation.rs | 6 +++--- src/librustc_ast_pretty/pprust.rs | 2 +- src/librustc_builtin_macros/deriving/mod.rs | 2 +- src/librustc_parse/parser/generics.rs | 6 +++--- src/librustc_resolve/late.rs | 6 +++--- src/tools/clippy/clippy_lints/src/utils/ast_utils.rs | 2 +- 9 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/librustc_ast/ast.rs b/src/librustc_ast/ast.rs index d3e3546cf31e4..bec7706bce799 100644 --- a/src/librustc_ast/ast.rs +++ b/src/librustc_ast/ast.rs @@ -335,6 +335,8 @@ pub enum GenericParamKind { }, Const { ty: P, + /// Span of the `const` keyword. + kw_span: Span, }, } diff --git a/src/librustc_ast/mut_visit.rs b/src/librustc_ast/mut_visit.rs index 2ffef9d48c181..54f81ef106fe1 100644 --- a/src/librustc_ast/mut_visit.rs +++ b/src/librustc_ast/mut_visit.rs @@ -762,7 +762,7 @@ pub fn noop_flat_map_generic_param( GenericParamKind::Type { default } => { visit_opt(default, |default| vis.visit_ty(default)); } - GenericParamKind::Const { ty } => { + GenericParamKind::Const { ty, kw_span: _ } => { vis.visit_ty(ty); } } diff --git a/src/librustc_ast_lowering/lib.rs b/src/librustc_ast_lowering/lib.rs index 1f8c68f75e943..3d1091d2fc46f 100644 --- a/src/librustc_ast_lowering/lib.rs +++ b/src/librustc_ast_lowering/lib.rs @@ -2126,7 +2126,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { (hir::ParamName::Plain(param.ident), kind) } - GenericParamKind::Const { ref ty } => { + GenericParamKind::Const { ref ty, kw_span: _ } => { let ty = self .with_anonymous_lifetime_mode(AnonymousLifetimeMode::ReportError, |this| { this.lower_ty(&ty, ImplTraitContext::disallowed()) diff --git a/src/librustc_ast_passes/ast_validation.rs b/src/librustc_ast_passes/ast_validation.rs index 8eb125e444053..975881d9a0ac0 100644 --- a/src/librustc_ast_passes/ast_validation.rs +++ b/src/librustc_ast_passes/ast_validation.rs @@ -1135,9 +1135,9 @@ impl<'a> Visitor<'a> for AstValidator<'a> { generics.params.iter().map(|param| { let ident = Some(param.ident.to_string()); let (kind, ident) = match ¶m.kind { - GenericParamKind::Lifetime { .. } => (ParamKindOrd::Lifetime, ident), - GenericParamKind::Type { .. } => (ParamKindOrd::Type, ident), - GenericParamKind::Const { ref ty } => { + GenericParamKind::Lifetime => (ParamKindOrd::Lifetime, ident), + GenericParamKind::Type { default: _ } => (ParamKindOrd::Type, ident), + GenericParamKind::Const { ref ty, kw_span: _ } => { let ty = pprust::ty_to_string(ty); (ParamKindOrd::Const, Some(format!("const {}: {}", param.ident, ty))) } diff --git a/src/librustc_ast_pretty/pprust.rs b/src/librustc_ast_pretty/pprust.rs index b1abc08aa67b0..ecbb3af5fb906 100644 --- a/src/librustc_ast_pretty/pprust.rs +++ b/src/librustc_ast_pretty/pprust.rs @@ -2578,7 +2578,7 @@ impl<'a> State<'a> { s.print_type(default) } } - ast::GenericParamKind::Const { ref ty } => { + ast::GenericParamKind::Const { ref ty, kw_span: _ } => { s.word_space("const"); s.print_ident(param.ident); s.s.space(); diff --git a/src/librustc_builtin_macros/deriving/mod.rs b/src/librustc_builtin_macros/deriving/mod.rs index 9660cade38241..dc21be3b296aa 100644 --- a/src/librustc_builtin_macros/deriving/mod.rs +++ b/src/librustc_builtin_macros/deriving/mod.rs @@ -123,7 +123,7 @@ fn inject_impl_of_structural_trait( *default = None; ast::GenericArg::Type(cx.ty_ident(span, param.ident)) } - ast::GenericParamKind::Const { ty: _ } => { + ast::GenericParamKind::Const { ty: _, kw_span: _ } => { ast::GenericArg::Const(cx.const_ident(span, param.ident)) } }) diff --git a/src/librustc_parse/parser/generics.rs b/src/librustc_parse/parser/generics.rs index 04b64d93c70dd..47794746126da 100644 --- a/src/librustc_parse/parser/generics.rs +++ b/src/librustc_parse/parser/generics.rs @@ -47,21 +47,21 @@ impl<'a> Parser<'a> { } fn parse_const_param(&mut self, preceding_attrs: Vec) -> PResult<'a, GenericParam> { - let lo = self.token.span; + let const_span = self.token.span; self.expect_keyword(kw::Const)?; let ident = self.parse_ident()?; self.expect(&token::Colon)?; let ty = self.parse_ty()?; - self.sess.gated_spans.gate(sym::const_generics, lo.to(self.prev_token.span)); + self.sess.gated_spans.gate(sym::const_generics, const_span.to(self.prev_token.span)); Ok(GenericParam { ident, id: ast::DUMMY_NODE_ID, attrs: preceding_attrs.into(), bounds: Vec::new(), - kind: GenericParamKind::Const { ty }, + kind: GenericParamKind::Const { ty, kw_span: const_span }, is_placeholder: false, }) } diff --git a/src/librustc_resolve/late.rs b/src/librustc_resolve/late.rs index 7166fef2d1395..3092614e83b5f 100644 --- a/src/librustc_resolve/late.rs +++ b/src/librustc_resolve/late.rs @@ -534,8 +534,8 @@ impl<'a, 'ast> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast> { for param in &generics.params { match param.kind { - GenericParamKind::Lifetime { .. } => self.visit_generic_param(param), - GenericParamKind::Type { ref default, .. } => { + GenericParamKind::Lifetime => self.visit_generic_param(param), + GenericParamKind::Type { ref default } => { for bound in ¶m.bounds { self.visit_param_bound(bound); } @@ -549,7 +549,7 @@ impl<'a, 'ast> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast> { // Allow all following defaults to refer to this type parameter. default_ban_rib.bindings.remove(&Ident::with_dummy_span(param.ident.name)); } - GenericParamKind::Const { ref ty } => { + GenericParamKind::Const { ref ty, kw_span: _ } => { for bound in ¶m.bounds { self.visit_param_bound(bound); } diff --git a/src/tools/clippy/clippy_lints/src/utils/ast_utils.rs b/src/tools/clippy/clippy_lints/src/utils/ast_utils.rs index e60e2a81e070b..e19a79dd8dad1 100755 --- a/src/tools/clippy/clippy_lints/src/utils/ast_utils.rs +++ b/src/tools/clippy/clippy_lints/src/utils/ast_utils.rs @@ -476,7 +476,7 @@ pub fn eq_generic_param(l: &GenericParam, r: &GenericParam) -> bool { && match (&l.kind, &r.kind) { (Lifetime, Lifetime) => true, (Type { default: l }, Type { default: r }) => both(l, r, |l, r| eq_ty(l, r)), - (Const { ty: l }, Const { ty: r }) => eq_ty(l, r), + (Const { ty: l, kw_span: _ }, Const { ty: r, kw_span: _ }) => eq_ty(l, r), _ => false, } && over(&l.attrs, &r.attrs, |l, r| eq_attr(l, r)) From f37c157f2ca1b56d17389cacb4287aebc44edc45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikodem=20Rabuli=C5=84ski?= Date: Tue, 23 Jun 2020 20:06:44 +0200 Subject: [PATCH 079/142] Update map.rs --- src/liballoc/collections/btree/map.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/liballoc/collections/btree/map.rs b/src/liballoc/collections/btree/map.rs index 2fcc8cc98737d..88a8aa19b5718 100644 --- a/src/liballoc/collections/btree/map.rs +++ b/src/liballoc/collections/btree/map.rs @@ -488,7 +488,7 @@ struct MergeIter> { } impl BTreeMap { - /// Makes a new empty BTreeMap with a reasonable choice for B. + /// Makes a new empty BTreeMap. /// /// # Examples /// From 037e930df7983577a2093732de0bd2c1252a4e37 Mon Sep 17 00:00:00 2001 From: Dan Aloni Date: Tue, 23 Jun 2020 22:25:23 +0300 Subject: [PATCH 080/142] Review fixes --- src/librustc_resolve/diagnostics.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/librustc_resolve/diagnostics.rs b/src/librustc_resolve/diagnostics.rs index ea4a84a9c3bd4..268974384a8d3 100644 --- a/src/librustc_resolve/diagnostics.rs +++ b/src/librustc_resolve/diagnostics.rs @@ -659,8 +659,6 @@ impl<'a> Resolver<'a> { return; } - let via_import = name_binding.is_import() && !name_binding.is_extern_crate(); - let child_accessible = accessible && this.is_accessible_from(name_binding.vis, parent_scope.module); @@ -669,6 +667,13 @@ impl<'a> Resolver<'a> { return; } + let via_import = name_binding.is_import() && !name_binding.is_extern_crate(); + + // There is an assumption elsewhere that paths of variants are in the enum's + // declaration and not imported. With this assumption, the variant component is + // chopped and the rest of the path is assumed to be the enum's own path. For + // errors where a variant is used as the type instead of the enum, this causes + // funny looking invalid suggestions, i.e `foo` instead of `foo::MyEnum`. if via_import && name_binding.is_possibly_imported_variant() { return; } From 9bb414faffbb5e31ecc41edb78e0047b0b8b1221 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Tue, 23 Jun 2020 16:25:01 -0700 Subject: [PATCH 081/142] Fix ptr doc warnings. --- src/libcore/ptr/const_ptr.rs | 2 -- src/libcore/ptr/mut_ptr.rs | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/libcore/ptr/const_ptr.rs b/src/libcore/ptr/const_ptr.rs index 395b3879cfd0c..64a506a6377f2 100644 --- a/src/libcore/ptr/const_ptr.rs +++ b/src/libcore/ptr/const_ptr.rs @@ -316,7 +316,6 @@ impl *const T { /// differently have not been explored. This method should not be used to introduce such /// differences, and it should also not be stabilized before we have a better understanding /// of this issue. - /// ``` #[unstable(feature = "const_raw_ptr_comparison", issue = "53020")] #[rustc_const_unstable(feature = "const_raw_ptr_comparison", issue = "53020")] #[inline] @@ -349,7 +348,6 @@ impl *const T { /// differently have not been explored. This method should not be used to introduce such /// differences, and it should also not be stabilized before we have a better understanding /// of this issue. - /// ``` #[unstable(feature = "const_raw_ptr_comparison", issue = "53020")] #[rustc_const_unstable(feature = "const_raw_ptr_comparison", issue = "53020")] #[inline] diff --git a/src/libcore/ptr/mut_ptr.rs b/src/libcore/ptr/mut_ptr.rs index b86ef5b13b353..6b5cd9fdb854d 100644 --- a/src/libcore/ptr/mut_ptr.rs +++ b/src/libcore/ptr/mut_ptr.rs @@ -294,7 +294,6 @@ impl *mut T { /// differently have not been explored. This method should not be used to introduce such /// differences, and it should also not be stabilized before we have a better understanding /// of this issue. - /// ``` #[unstable(feature = "const_raw_ptr_comparison", issue = "53020")] #[rustc_const_unstable(feature = "const_raw_ptr_comparison", issue = "53020")] #[inline] @@ -327,7 +326,6 @@ impl *mut T { /// differently have not been explored. This method should not be used to introduce such /// differences, and it should also not be stabilized before we have a better understanding /// of this issue. - /// ``` #[unstable(feature = "const_raw_ptr_comparison", issue = "53020")] #[rustc_const_unstable(feature = "const_raw_ptr_comparison", issue = "53020")] #[inline] From 5aab1a9a88dd30d622a5303f26d9ad213c551473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Tue, 23 Jun 2020 17:32:06 -0700 Subject: [PATCH 082/142] Tweak binop errors * Suggest potentially missing binop trait bound (fix #73416) * Use structured suggestion for dereference in binop --- src/librustc_typeck/check/op.rs | 135 +++++++++++++----- src/test/ui/binary-op-on-double-ref.fixed | 9 ++ src/test/ui/binary-op-on-double-ref.rs | 1 + src/test/ui/binary-op-on-double-ref.stderr | 7 +- src/test/ui/issues/issue-35668.stderr | 6 + src/test/ui/issues/issue-5239-1.stderr | 2 +- .../missing-trait-bound-for-op.fixed | 13 ++ .../suggestions/missing-trait-bound-for-op.rs | 13 ++ .../missing-trait-bound-for-op.stderr | 17 +++ .../trait-resolution-in-overloaded-op.stderr | 6 + 10 files changed, 169 insertions(+), 40 deletions(-) create mode 100644 src/test/ui/binary-op-on-double-ref.fixed create mode 100644 src/test/ui/suggestions/missing-trait-bound-for-op.fixed create mode 100644 src/test/ui/suggestions/missing-trait-bound-for-op.rs create mode 100644 src/test/ui/suggestions/missing-trait-bound-for-op.stderr diff --git a/src/librustc_typeck/check/op.rs b/src/librustc_typeck/check/op.rs index fe50870911647..7acf884318573 100644 --- a/src/librustc_typeck/check/op.rs +++ b/src/librustc_typeck/check/op.rs @@ -9,7 +9,9 @@ use rustc_middle::ty::adjustment::{ Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability, }; use rustc_middle::ty::TyKind::{Adt, Array, Char, FnDef, Never, Ref, Str, Tuple, Uint}; -use rustc_middle::ty::{self, suggest_constraining_type_param, Ty, TyCtxt, TypeFoldable}; +use rustc_middle::ty::{ + self, suggest_constraining_type_param, Ty, TyCtxt, TypeFoldable, TypeVisitor, +}; use rustc_span::symbol::Ident; use rustc_span::Span; use rustc_trait_selection::infer::InferCtxtExt; @@ -254,6 +256,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { if !lhs_ty.references_error() && !rhs_ty.references_error() { let source_map = self.tcx.sess.source_map(); + let note = |err: &mut DiagnosticBuilder<'_>, missing_trait| { + err.note(&format!( + "the trait `{}` is not implemented for `{}`", + missing_trait, lhs_ty + )); + }; match is_assign { IsAssign::Yes => { let mut err = struct_span_err!( @@ -286,10 +294,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { rty.peel_refs(), lstring, ); - err.span_suggestion( - lhs_expr.span, + err.span_suggestion_verbose( + lhs_expr.span.shrink_to_lo(), msg, - format!("*{}", lstring), + "*".to_string(), rustc_errors::Applicability::MachineApplicable, ); suggested_deref = true; @@ -310,6 +318,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { _ => None, }; if let Some(missing_trait) = missing_trait { + let mut visitor = TypeParamVisitor(vec![]); + visitor.visit_ty(lhs_ty); + + let mut sugg = false; if op.node == hir::BinOpKind::Add && self.check_str_addition( lhs_expr, rhs_expr, lhs_ty, rhs_ty, &mut err, true, op, @@ -318,18 +330,33 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // This has nothing here because it means we did string // concatenation (e.g., "Hello " += "World!"). This means // we don't want the note in the else clause to be emitted - } else if let ty::Param(p) = lhs_ty.kind { - suggest_constraining_param( - self.tcx, - self.body_id, - &mut err, - lhs_ty, - rhs_ty, - missing_trait, - p, - false, - ); - } else if !suggested_deref { + sugg = true; + } else if let [ty] = &visitor.0[..] { + if let ty::Param(p) = ty.kind { + // FIXME: This *guesses* that constraining the type param + // will make the operation available, but this is only true + // when the corresponding trait has a blanked + // implementation, like the following: + // `impl<'a> PartialEq for &'a [T] where T: PartialEq {}` + // The correct thing to do would be to verify this + // projection would hold. + if *ty != lhs_ty { + note(&mut err, missing_trait); + } + suggest_constraining_param( + self.tcx, + self.body_id, + &mut err, + ty, + rhs_ty, + missing_trait, + p, + false, + ); + sugg = true; + } + } + if !sugg && !suggested_deref { suggest_impl_missing(&mut err, lhs_ty, &missing_trait); } } @@ -458,18 +485,27 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { .is_ok() } { if let Ok(lstring) = source_map.span_to_snippet(lhs_expr.span) { - err.help(&format!( - "`{}` can be used on '{}', you can \ - dereference `{2}`: `*{2}`", - op.node.as_str(), - rty.peel_refs(), - lstring - )); + err.span_suggestion_verbose( + lhs_expr.span.shrink_to_lo(), + &format!( + "`{}` can be used on `{}`, you can dereference \ + `{}`", + op.node.as_str(), + rty.peel_refs(), + lstring, + ), + "*".to_string(), + Applicability::MachineApplicable, + ); suggested_deref = true; } } } if let Some(missing_trait) = missing_trait { + let mut visitor = TypeParamVisitor(vec![]); + visitor.visit_ty(lhs_ty); + + let mut sugg = false; if op.node == hir::BinOpKind::Add && self.check_str_addition( lhs_expr, rhs_expr, lhs_ty, rhs_ty, &mut err, false, op, @@ -478,18 +514,33 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // This has nothing here because it means we did string // concatenation (e.g., "Hello " + "World!"). This means // we don't want the note in the else clause to be emitted - } else if let ty::Param(p) = lhs_ty.kind { - suggest_constraining_param( - self.tcx, - self.body_id, - &mut err, - lhs_ty, - rhs_ty, - missing_trait, - p, - use_output, - ); - } else if !suggested_deref && !involves_fn { + sugg = true; + } else if let [ty] = &visitor.0[..] { + if let ty::Param(p) = ty.kind { + // FIXME: This *guesses* that constraining the type param + // will make the operation available, but this is only true + // when the corresponding trait has a blanked + // implementation, like the following: + // `impl<'a> PartialEq for &'a [T] where T: PartialEq {}` + // The correct thing to do would be to verify this + // projection would hold. + if *ty != lhs_ty { + note(&mut err, missing_trait); + } + suggest_constraining_param( + self.tcx, + self.body_id, + &mut err, + ty, + rhs_ty, + missing_trait, + p, + use_output, + ); + sugg = true; + } + } + if !sugg && !suggested_deref && !involves_fn { suggest_impl_missing(&mut err, lhs_ty, &missing_trait); } } @@ -928,8 +979,7 @@ fn suggest_impl_missing(err: &mut DiagnosticBuilder<'_>, ty: Ty<'_>, missing_tra if let Adt(def, _) = ty.peel_refs().kind { if def.did.is_local() { err.note(&format!( - "an implementation of `{}` might \ - be missing for `{}`", + "an implementation of `{}` might be missing for `{}`", missing_trait, ty )); } @@ -975,3 +1025,14 @@ fn suggest_constraining_param( err.span_label(span, msg); } } + +struct TypeParamVisitor<'tcx>(Vec>); + +impl<'tcx> TypeVisitor<'tcx> for TypeParamVisitor<'tcx> { + fn visit_ty(&mut self, ty: Ty<'tcx>) -> bool { + if let ty::Param(_) = ty.kind { + self.0.push(ty); + } + ty.super_visit_with(self) + } +} diff --git a/src/test/ui/binary-op-on-double-ref.fixed b/src/test/ui/binary-op-on-double-ref.fixed new file mode 100644 index 0000000000000..de9dc19af29be --- /dev/null +++ b/src/test/ui/binary-op-on-double-ref.fixed @@ -0,0 +1,9 @@ +// run-rustfix +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}` + }); + println!("{:?}", vr); +} diff --git a/src/test/ui/binary-op-on-double-ref.rs b/src/test/ui/binary-op-on-double-ref.rs index 67e01b9327db1..2616c560cbefb 100644 --- a/src/test/ui/binary-op-on-double-ref.rs +++ b/src/test/ui/binary-op-on-double-ref.rs @@ -1,3 +1,4 @@ +// run-rustfix fn main() { let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9]; let vr = v.iter().filter(|x| { diff --git a/src/test/ui/binary-op-on-double-ref.stderr b/src/test/ui/binary-op-on-double-ref.stderr index 6c405333ec681..02b0488488c55 100644 --- a/src/test/ui/binary-op-on-double-ref.stderr +++ b/src/test/ui/binary-op-on-double-ref.stderr @@ -1,12 +1,15 @@ error[E0369]: cannot mod `&&{integer}` by `{integer}` - --> $DIR/binary-op-on-double-ref.rs:4:11 + --> $DIR/binary-op-on-double-ref.rs:5:11 | LL | x % 2 == 0 | - ^ - {integer} | | | &&{integer} | - = help: `%` can be used on '{integer}', you can dereference `x`: `*x` +help: `%` can be used on `{integer}`, you can dereference `x` + | +LL | *x % 2 == 0 + | ^ error: aborting due to previous error diff --git a/src/test/ui/issues/issue-35668.stderr b/src/test/ui/issues/issue-35668.stderr index 98e8e6366b99b..c8f1f88a4708e 100644 --- a/src/test/ui/issues/issue-35668.stderr +++ b/src/test/ui/issues/issue-35668.stderr @@ -5,6 +5,12 @@ LL | a.iter().map(|a| a*a) | -^- &T | | | &T + | + = note: the trait `std::ops::Mul` is not implemented for `&T` +help: consider restricting type parameter `T` + | +LL | fn func<'a, T: std::ops::Mul>(a: &'a [T]) -> impl Iterator { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/issues/issue-5239-1.stderr b/src/test/ui/issues/issue-5239-1.stderr index f4f0f17d00199..d0c71e73463c1 100644 --- a/src/test/ui/issues/issue-5239-1.stderr +++ b/src/test/ui/issues/issue-5239-1.stderr @@ -9,7 +9,7 @@ LL | let x = |ref x: isize| { x += 1; }; help: `+=` can be used on 'isize', you can dereference `x` | LL | let x = |ref x: isize| { *x += 1; }; - | ^^ + | ^ error: aborting due to previous error diff --git a/src/test/ui/suggestions/missing-trait-bound-for-op.fixed b/src/test/ui/suggestions/missing-trait-bound-for-op.fixed new file mode 100644 index 0000000000000..02886bb845cf7 --- /dev/null +++ b/src/test/ui/suggestions/missing-trait-bound-for-op.fixed @@ -0,0 +1,13 @@ +// run-rustfix + +pub fn strip_prefix<'a, T: std::cmp::PartialEq>(s: &'a [T], prefix: &[T]) -> Option<&'a [T]> { + let n = prefix.len(); + if n <= s.len() { + let (head, tail) = s.split_at(n); + if head == prefix { //~ ERROR binary operation `==` cannot be applied to type `&[T]` + return Some(tail); + } + } + None +} +fn main() {} diff --git a/src/test/ui/suggestions/missing-trait-bound-for-op.rs b/src/test/ui/suggestions/missing-trait-bound-for-op.rs new file mode 100644 index 0000000000000..aa4ef467360d9 --- /dev/null +++ b/src/test/ui/suggestions/missing-trait-bound-for-op.rs @@ -0,0 +1,13 @@ +// run-rustfix + +pub fn strip_prefix<'a, T>(s: &'a [T], prefix: &[T]) -> Option<&'a [T]> { + let n = prefix.len(); + if n <= s.len() { + let (head, tail) = s.split_at(n); + if head == prefix { //~ ERROR binary operation `==` cannot be applied to type `&[T]` + return Some(tail); + } + } + None +} +fn main() {} diff --git a/src/test/ui/suggestions/missing-trait-bound-for-op.stderr b/src/test/ui/suggestions/missing-trait-bound-for-op.stderr new file mode 100644 index 0000000000000..dab4e575be1fa --- /dev/null +++ b/src/test/ui/suggestions/missing-trait-bound-for-op.stderr @@ -0,0 +1,17 @@ +error[E0369]: binary operation `==` cannot be applied to type `&[T]` + --> $DIR/missing-trait-bound-for-op.rs:7:17 + | +LL | if head == prefix { + | ---- ^^ ------ &[T] + | | + | &[T] + | + = note: the trait `std::cmp::PartialEq` is not implemented for `&[T]` +help: consider restricting type parameter `T` + | +LL | pub fn strip_prefix<'a, T: std::cmp::PartialEq>(s: &'a [T], prefix: &[T]) -> Option<&'a [T]> { + | ^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0369`. diff --git a/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr b/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr index 29216f36f5f31..1c424ce7da669 100644 --- a/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr +++ b/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr @@ -5,6 +5,12 @@ LL | a * b | - ^ - f64 | | | &T + | + = note: the trait `std::ops::Mul` is not implemented for `&T` +help: consider further restricting this bound + | +LL | fn foo + std::ops::Mul>(a: &T, b: f64) -> f64 { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error From e02dafcaaaf4c9f32e549f643721b7e43ab86516 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Tue, 23 Jun 2020 17:56:33 -0700 Subject: [PATCH 083/142] Update books --- src/doc/book | 2 +- src/doc/embedded-book | 2 +- src/doc/reference | 2 +- src/doc/rust-by-example | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/doc/book b/src/doc/book index 30cd9dfe71c44..4e7c00bece154 160000 --- a/src/doc/book +++ b/src/doc/book @@ -1 +1 @@ -Subproject commit 30cd9dfe71c446de63826bb4472627af45acc9db +Subproject commit 4e7c00bece1544d409312ec93467beb62b5bd0cb diff --git a/src/doc/embedded-book b/src/doc/embedded-book index 5555a97f04ad7..616962ad0dd80 160000 --- a/src/doc/embedded-book +++ b/src/doc/embedded-book @@ -1 +1 @@ -Subproject commit 5555a97f04ad7974ac6fb8fb47c267c4274adf4a +Subproject commit 616962ad0dd80f34d8b802da038d0aed9dd691bb diff --git a/src/doc/reference b/src/doc/reference index 5d40ba5c2515c..04d5d5d7ba624 160000 --- a/src/doc/reference +++ b/src/doc/reference @@ -1 +1 @@ -Subproject commit 5d40ba5c2515caffa7790cda621239dc21ef5a72 +Subproject commit 04d5d5d7ba624b6f5016298451f3a63d557f3260 diff --git a/src/doc/rust-by-example b/src/doc/rust-by-example index 7aa82129aa23e..6f94ccb48da6f 160000 --- a/src/doc/rust-by-example +++ b/src/doc/rust-by-example @@ -1 +1 @@ -Subproject commit 7aa82129aa23e7e181efbeb8da03a2a897ef6afc +Subproject commit 6f94ccb48da6fa4ed0031290f21411cf789f7d5e From b23baa78dc96cd12a70556de6bc472af3ef2e302 Mon Sep 17 00:00:00 2001 From: Tshepang Lekhonkhobe Date: Wed, 24 Jun 2020 04:47:20 +0200 Subject: [PATCH 084/142] fix See https://github.com/rust-lang/rust/pull/73538/commits/b65ea1bef1391a3af9118884952718fc905f8e02#r444376289 --- config.toml.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.toml.example b/config.toml.example index 79b06d5cf9962..c0be7dded17bc 100644 --- a/config.toml.example +++ b/config.toml.example @@ -326,7 +326,7 @@ # Whether or not debug assertions are enabled for the standard library. # Overrides the `debug-assertions` option, if defined. # -# Defaults to rust.debug value +# Defaults to rust.debug-assertions value #debug-assertions-std = false # Debuginfo level for most of Rust code, corresponds to the `-C debuginfo=N` option of `rustc`. From 7b9b58061480b9481ab8cb328dcebfeab6817b44 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Tue, 23 Jun 2020 19:59:10 -0700 Subject: [PATCH 085/142] Update cargo --- src/tools/cargo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/cargo b/src/tools/cargo index 089cbb80b73ba..c26576f9adddd 160000 --- a/src/tools/cargo +++ b/src/tools/cargo @@ -1 +1 @@ -Subproject commit 089cbb80b73ba242efdcf5430e89f63fa3b5328d +Subproject commit c26576f9adddd254b3dd63aecba176434290a9f6 From ecb8b9f9f768a3245e8ae723005d5c408bf2067a Mon Sep 17 00:00:00 2001 From: Jack Huey Date: Wed, 27 May 2020 01:05:09 -0400 Subject: [PATCH 086/142] Update Chalk --- Cargo.lock | 49 ++++- src/librustc_middle/Cargo.toml | 2 +- src/librustc_middle/traits/chalk.rs | 2 + .../traits/chalk_fulfill.rs | 15 +- src/librustc_traits/Cargo.toml | 4 +- src/librustc_traits/chalk/db.rs | 180 ++++++++++++++---- src/librustc_traits/chalk/lowering.rs | 42 ++-- src/librustc_traits/chalk/mod.rs | 1 + src/test/ui/chalkify/closure.rs | 39 ++++ src/test/ui/chalkify/closure.stderr | 18 ++ src/test/ui/chalkify/impl_wf.rs | 7 +- src/test/ui/chalkify/impl_wf.stderr | 15 +- src/test/ui/chalkify/inherent_impl.rs | 17 +- .../recursive_where_clause_on_type.rs | 11 +- .../recursive_where_clause_on_type.stderr | 16 +- 15 files changed, 311 insertions(+), 107 deletions(-) create mode 100644 src/test/ui/chalkify/closure.rs create mode 100644 src/test/ui/chalkify/closure.stderr diff --git a/Cargo.lock b/Cargo.lock index b54566e7176b0..e0d092ec76a78 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -434,9 +434,9 @@ dependencies = [ [[package]] name = "chalk-derive" -version = "0.11.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9bd01eab87277d973183a1d2e56bace1c11f8242c52c20636fb7dddf343ac9" +checksum = "d463e01905d607e181de72e8608721d3269f29176c9a14ce037011316ae7131d" dependencies = [ "proc-macro2 1.0.3", "quote 1.0.2", @@ -446,20 +446,21 @@ dependencies = [ [[package]] name = "chalk-engine" -version = "0.11.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c7a637c3d17ed555aef16e16952a5d1e127bd55178cc30be22afeb92da90c7d" +checksum = "efaf428f5398d36284f79690cf988762b7c091249f50a6c11db613a46c057000" dependencies = [ "chalk-derive", "chalk-ir", "rustc-hash", + "tracing", ] [[package]] name = "chalk-ir" -version = "0.11.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595e5735ded16c3f3dc348f7b15bbb2521a0080b1863cac38ad5271589944670" +checksum = "fd3fdc1e9f68498ffe80f4a23b0b95f1ca6fb21d5a4c9b0c085fab3ca712bdbe" dependencies = [ "chalk-derive", "lazy_static", @@ -467,9 +468,9 @@ dependencies = [ [[package]] name = "chalk-solve" -version = "0.11.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d9d938139db425867a30cc0cfec0269406d8238d0571d829041eaa7a8455d11" +checksum = "5b9fd4102807b7ebe8fb034fa0f488c5656e1966d3261b558b81a08d519cdb29" dependencies = [ "chalk-derive", "chalk-engine", @@ -478,6 +479,7 @@ dependencies = [ "itertools 0.9.0", "petgraph", "rustc-hash", + "tracing", ] [[package]] @@ -5332,6 +5334,37 @@ dependencies = [ "syn 0.15.35", ] +[[package]] +name = "tracing" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a41f40ed0e162c911ac6fcb53ecdc8134c46905fdbbae8c50add462a538b495f" +dependencies = [ + "cfg-if", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99bbad0de3fd923c9c3232ead88510b783e5a4d16a6154adffa3d53308de984c" +dependencies = [ + "proc-macro2 1.0.3", + "quote 1.0.2", + "syn 1.0.11", +] + +[[package]] +name = "tracing-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa83a9a47081cd522c09c81b31aec2c9273424976f922ad61c053b58350b715" +dependencies = [ + "lazy_static", +] + [[package]] name = "try-lock" version = "0.2.2" diff --git a/src/librustc_middle/Cargo.toml b/src/librustc_middle/Cargo.toml index 21d0b102a4a66..02d82c6793386 100644 --- a/src/librustc_middle/Cargo.toml +++ b/src/librustc_middle/Cargo.toml @@ -30,7 +30,7 @@ rustc_serialize = { path = "../librustc_serialize" } rustc_ast = { path = "../librustc_ast" } rustc_span = { path = "../librustc_span" } byteorder = { version = "1.3" } -chalk-ir = "0.11.0" +chalk-ir = "0.14.0" smallvec = { version = "1.0", features = ["union", "may_dangle"] } measureme = "0.7.1" rustc_session = { path = "../librustc_session" } diff --git a/src/librustc_middle/traits/chalk.rs b/src/librustc_middle/traits/chalk.rs index a49a0045812b0..405af8cb2406c 100644 --- a/src/librustc_middle/traits/chalk.rs +++ b/src/librustc_middle/traits/chalk.rs @@ -10,6 +10,7 @@ use rustc_middle::ty::fold::{TypeFoldable, TypeFolder, TypeVisitor}; use rustc_middle::ty::{self, AdtDef, Ty, TyCtxt}; use rustc_hir::def_id::DefId; +use rustc_target::spec::abi::Abi; use smallvec::SmallVec; @@ -77,6 +78,7 @@ impl<'tcx> chalk_ir::interner::Interner for RustInterner<'tcx> { type DefId = DefId; type InternedAdtId = &'tcx AdtDef; type Identifier = (); + type FnAbi = Abi; fn debug_program_clause_implication( pci: &chalk_ir::ProgramClauseImplication, diff --git a/src/librustc_trait_selection/traits/chalk_fulfill.rs b/src/librustc_trait_selection/traits/chalk_fulfill.rs index cbbff82d35f73..2ade489275262 100644 --- a/src/librustc_trait_selection/traits/chalk_fulfill.rs +++ b/src/librustc_trait_selection/traits/chalk_fulfill.rs @@ -7,17 +7,17 @@ use crate::traits::{ ChalkEnvironmentAndGoal, ChalkEnvironmentClause, FulfillmentError, FulfillmentErrorCode, ObligationCause, PredicateObligation, SelectionError, TraitEngine, }; -use rustc_data_structures::fx::FxHashSet; +use rustc_data_structures::fx::FxIndexSet; use rustc_hir::def_id::DefId; use rustc_middle::ty::{self, Ty, TyCtxt}; pub struct FulfillmentContext<'tcx> { - obligations: FxHashSet>, + obligations: FxIndexSet>, } impl FulfillmentContext<'tcx> { crate fn new() -> Self { - FulfillmentContext { obligations: FxHashSet::default() } + FulfillmentContext { obligations: FxIndexSet::default() } } } @@ -79,7 +79,7 @@ fn environment<'tcx>( }; // FIXME(eddyb) isn't the unordered nature of this a hazard? - let mut inputs = FxHashSet::default(); + let mut inputs = FxIndexSet::default(); match node_kind { // In a trait impl, we assume that the header trait ref and all its @@ -140,7 +140,8 @@ fn in_environment( None if obligation.param_env.caller_bounds.is_empty() => ty::List::empty(), // FIXME(chalk): this is hit in ui/where-clauses/where-clause-constraints-are-local-for-trait-impl // and ui/generics/generic-static-methods - _ => bug!("non-empty `ParamEnv` with no def-id"), + //_ => bug!("non-empty `ParamEnv` with no def-id"), + _ => ty::List::empty(), }; ChalkEnvironmentAndGoal { environment, goal: obligation.predicate } @@ -195,7 +196,7 @@ impl TraitEngine<'tcx> for FulfillmentContext<'tcx> { infcx: &InferCtxt<'_, 'tcx>, ) -> Result<(), Vec>> { let mut errors = Vec::new(); - let mut next_round = FxHashSet::default(); + let mut next_round = FxIndexSet::default(); let mut making_progress; loop { @@ -203,7 +204,7 @@ impl TraitEngine<'tcx> for FulfillmentContext<'tcx> { // We iterate over all obligations, and record if we are able // to unambiguously prove at least one obligation. - for obligation in self.obligations.drain() { + for obligation in self.obligations.drain(..) { let goal_in_environment = in_environment(infcx, &obligation); let mut orig_values = OriginalQueryValues::default(); let canonical_goal = diff --git a/src/librustc_traits/Cargo.toml b/src/librustc_traits/Cargo.toml index 8def98a9603d8..079b9b10fd090 100644 --- a/src/librustc_traits/Cargo.toml +++ b/src/librustc_traits/Cargo.toml @@ -16,8 +16,8 @@ rustc_hir = { path = "../librustc_hir" } rustc_index = { path = "../librustc_index" } rustc_ast = { path = "../librustc_ast" } rustc_span = { path = "../librustc_span" } -chalk-ir = "0.11.0" -chalk-solve = "0.11.0" +chalk-ir = "0.14.0" +chalk-solve = "0.14.0" smallvec = { version = "1.0", features = ["union", "may_dangle"] } rustc_infer = { path = "../librustc_infer" } rustc_trait_selection = { path = "../librustc_trait_selection" } diff --git a/src/librustc_traits/chalk/db.rs b/src/librustc_traits/chalk/db.rs index 235497d374098..715e5299a37bd 100644 --- a/src/librustc_traits/chalk/db.rs +++ b/src/librustc_traits/chalk/db.rs @@ -8,7 +8,7 @@ use rustc_middle::traits::ChalkRustInterner as RustInterner; use rustc_middle::ty::subst::{InternalSubsts, Subst, SubstsRef}; -use rustc_middle::ty::{self, AssocItemContainer, AssocKind, Binder, TyCtxt}; +use rustc_middle::ty::{self, AssocItemContainer, AssocKind, TyCtxt}; use rustc_hir::def_id::DefId; @@ -85,14 +85,29 @@ impl<'tcx> chalk_solve::RustIrDatabase> for RustIrDatabase<'t .iter() .map(|(wc, _)| wc.subst(self.tcx, &bound_vars)) .filter_map(|wc| LowerInto::>>>::lower_into(wc, &self.interner)).collect(); + let associated_ty_ids: Vec<_> = self + .tcx + .associated_items(def_id) + .in_definition_order() + .filter(|i| i.kind == AssocKind::Type) + .map(|i| chalk_ir::AssocTypeId(i.def_id)) + .collect(); let well_known = if self.tcx.lang_items().sized_trait().map(|t| def_id == t).unwrap_or(false) { - Some(chalk_solve::rust_ir::WellKnownTrait::SizedTrait) + Some(chalk_solve::rust_ir::WellKnownTrait::Sized) } else if self.tcx.lang_items().copy_trait().map(|t| def_id == t).unwrap_or(false) { - Some(chalk_solve::rust_ir::WellKnownTrait::CopyTrait) + Some(chalk_solve::rust_ir::WellKnownTrait::Copy) } else if self.tcx.lang_items().clone_trait().map(|t| def_id == t).unwrap_or(false) { - Some(chalk_solve::rust_ir::WellKnownTrait::CloneTrait) + Some(chalk_solve::rust_ir::WellKnownTrait::Clone) + } else if self.tcx.lang_items().drop_trait().map(|t| def_id == t).unwrap_or(false) { + Some(chalk_solve::rust_ir::WellKnownTrait::Drop) + } else if self.tcx.lang_items().fn_trait().map(|t| def_id == t).unwrap_or(false) { + Some(chalk_solve::rust_ir::WellKnownTrait::Fn) + } else if self.tcx.lang_items().fn_once_trait().map(|t| def_id == t).unwrap_or(false) { + Some(chalk_solve::rust_ir::WellKnownTrait::FnOnce) + } else if self.tcx.lang_items().fn_mut_trait().map(|t| def_id == t).unwrap_or(false) { + Some(chalk_solve::rust_ir::WellKnownTrait::FnMut) } else { None }; @@ -110,7 +125,7 @@ impl<'tcx> chalk_solve::RustIrDatabase> for RustIrDatabase<'t non_enumerable: true, coinductive: false, }, - associated_ty_ids: vec![], + associated_ty_ids, well_known, }) } @@ -156,6 +171,7 @@ impl<'tcx> chalk_solve::RustIrDatabase> for RustIrDatabase<'t flags: chalk_solve::rust_ir::AdtFlags { upstream: !adt_def.did.is_local(), fundamental: adt_def.is_fundamental(), + phantom_data: adt_def.is_phantom_data(), }, }); return struct_datum; @@ -176,28 +192,32 @@ impl<'tcx> chalk_solve::RustIrDatabase> for RustIrDatabase<'t .filter_map(|wc| LowerInto::>>>::lower_into(wc, &self.interner)).collect(); let sig = self.tcx.fn_sig(def_id); - // FIXME(chalk): collect into an intermediate SmallVec here since - // we need `TypeFoldable` for `no_bound_vars` - let argument_types: Binder> = - sig.map_bound(|i| i.inputs().iter().copied().collect()); - let argument_types = argument_types - .no_bound_vars() - .expect("FIXME(chalk): late-bound fn parameters not supported in chalk") + let inputs_and_output = sig.inputs_and_output(); + let (inputs_and_output, iobinders, _) = crate::chalk::lowering::collect_bound_vars( + &self.interner, + self.tcx, + &inputs_and_output, + ); + + let argument_types = inputs_and_output[..inputs_and_output.len() - 1] .iter() .map(|t| t.subst(self.tcx, &bound_vars).lower_into(&self.interner)) .collect(); - let return_type = sig - .output() - .no_bound_vars() - .expect("FIXME(chalk): late-bound fn parameters not supported in chalk") + let return_type = inputs_and_output[inputs_and_output.len() - 1] .subst(self.tcx, &bound_vars) .lower_into(&self.interner); - let bound = - chalk_solve::rust_ir::FnDefDatumBound { argument_types, where_clauses, return_type }; + let bound = chalk_solve::rust_ir::FnDefDatumBound { + inputs_and_output: chalk_ir::Binders::new( + iobinders, + chalk_solve::rust_ir::FnDefInputsAndOutputDatum { argument_types, return_type }, + ), + where_clauses, + }; Arc::new(chalk_solve::rust_ir::FnDefDatum { id: fn_def_id, + abi: sig.abi(), binders: chalk_ir::Binders::new(binders, bound), }) } @@ -326,9 +346,16 @@ impl<'tcx> chalk_solve::RustIrDatabase> for RustIrDatabase<'t &self, opaque_ty_id: chalk_ir::OpaqueTyId>, ) -> Arc>> { - // FIXME(chalk): actually lower opaque ty + let bound_vars = bound_vars_for_item(self.tcx, opaque_ty_id.0); + let binders = binders_for(&self.interner, bound_vars); + let predicates = self.tcx.predicates_defined_on(opaque_ty_id.0).predicates; + let where_clauses: Vec<_> = predicates + .iter() + .map(|(wc, _)| wc.subst(self.tcx, &bound_vars)) + .filter_map(|wc| LowerInto::>>>::lower_into(wc, &self.interner)).collect(); + let value = chalk_solve::rust_ir::OpaqueTyDatumBound { - bounds: chalk_ir::Binders::new(chalk_ir::VariableKinds::new(&self.interner), vec![]), + bounds: chalk_ir::Binders::new(binders, where_clauses), }; Arc::new(chalk_solve::rust_ir::OpaqueTyDatum { opaque_ty_id, @@ -346,7 +373,7 @@ impl<'tcx> chalk_solve::RustIrDatabase> for RustIrDatabase<'t ) -> Option { use chalk_ir::TyData::*; match well_known { - chalk_solve::rust_ir::WellKnownTrait::SizedTrait => match ty { + chalk_solve::rust_ir::WellKnownTrait::Sized => match ty { Apply(apply) => match apply.name { chalk_ir::TypeName::Adt(chalk_ir::AdtId(adt_def)) => match adt_def.adt_kind() { ty::AdtKind::Struct | ty::AdtKind::Union => None, @@ -364,8 +391,8 @@ impl<'tcx> chalk_solve::RustIrDatabase> for RustIrDatabase<'t | InferenceVar(_, _) | BoundVar(_) => None, }, - chalk_solve::rust_ir::WellKnownTrait::CopyTrait - | chalk_solve::rust_ir::WellKnownTrait::CloneTrait => match ty { + chalk_solve::rust_ir::WellKnownTrait::Copy + | chalk_solve::rust_ir::WellKnownTrait::Clone => match ty { Apply(apply) => match apply.name { chalk_ir::TypeName::Adt(chalk_ir::AdtId(adt_def)) => match adt_def.adt_kind() { ty::AdtKind::Struct | ty::AdtKind::Union => None, @@ -383,7 +410,11 @@ impl<'tcx> chalk_solve::RustIrDatabase> for RustIrDatabase<'t | InferenceVar(_, _) | BoundVar(_) => None, }, - chalk_solve::rust_ir::WellKnownTrait::DropTrait => None, + chalk_solve::rust_ir::WellKnownTrait::Drop => None, + chalk_solve::rust_ir::WellKnownTrait::Fn => None, + chalk_solve::rust_ir::WellKnownTrait::FnMut => None, + chalk_solve::rust_ir::WellKnownTrait::FnOnce => None, + chalk_solve::rust_ir::WellKnownTrait::Unsize => None, } } @@ -399,17 +430,17 @@ impl<'tcx> chalk_solve::RustIrDatabase> for RustIrDatabase<'t well_known_trait: chalk_solve::rust_ir::WellKnownTrait, ) -> Option>> { use chalk_solve::rust_ir::WellKnownTrait::*; - let t = match well_known_trait { - SizedTrait => { - self.tcx.lang_items().sized_trait().map(|t| chalk_ir::TraitId(t)).unwrap() - } - CopyTrait => self.tcx.lang_items().copy_trait().map(|t| chalk_ir::TraitId(t)).unwrap(), - CloneTrait => { - self.tcx.lang_items().clone_trait().map(|t| chalk_ir::TraitId(t)).unwrap() - } - DropTrait => self.tcx.lang_items().drop_trait().map(|t| chalk_ir::TraitId(t)).unwrap(), + let def_id = match well_known_trait { + Sized => self.tcx.lang_items().sized_trait(), + Copy => self.tcx.lang_items().copy_trait(), + Clone => self.tcx.lang_items().clone_trait(), + Drop => self.tcx.lang_items().drop_trait(), + Fn => self.tcx.lang_items().fn_trait(), + FnMut => self.tcx.lang_items().fn_mut_trait(), + FnOnce => self.tcx.lang_items().fn_once_trait(), + Unsize => self.tcx.lang_items().unsize_trait(), }; - Some(t) + def_id.map(|t| chalk_ir::TraitId(t)) } fn is_object_safe(&self, trait_id: chalk_ir::TraitId>) -> bool { @@ -423,6 +454,87 @@ impl<'tcx> chalk_solve::RustIrDatabase> for RustIrDatabase<'t // FIXME(chalk): actually get hidden ty self.tcx.mk_ty(ty::Tuple(self.tcx.intern_substs(&[]))).lower_into(&self.interner) } + + fn closure_kind( + &self, + _closure_id: chalk_ir::ClosureId>, + substs: &chalk_ir::Substitution>, + ) -> chalk_solve::rust_ir::ClosureKind { + let kind = &substs.parameters(&self.interner)[substs.len(&self.interner) - 3]; + match kind.assert_ty_ref(&self.interner).data(&self.interner) { + chalk_ir::TyData::Apply(apply) => match apply.name { + chalk_ir::TypeName::Scalar(scalar) => match scalar { + chalk_ir::Scalar::Int(int_ty) => match int_ty { + chalk_ir::IntTy::I8 => chalk_solve::rust_ir::ClosureKind::Fn, + chalk_ir::IntTy::I16 => chalk_solve::rust_ir::ClosureKind::FnMut, + chalk_ir::IntTy::I32 => chalk_solve::rust_ir::ClosureKind::FnOnce, + _ => bug!("bad closure kind"), + }, + _ => bug!("bad closure kind"), + }, + _ => bug!("bad closure kind"), + }, + _ => bug!("bad closure kind"), + } + } + + fn closure_inputs_and_output( + &self, + _closure_id: chalk_ir::ClosureId>, + substs: &chalk_ir::Substitution>, + ) -> chalk_ir::Binders>> + { + let sig = &substs.parameters(&self.interner)[substs.len(&self.interner) - 2]; + match sig.assert_ty_ref(&self.interner).data(&self.interner) { + chalk_ir::TyData::Function(f) => { + let substitution = f.substitution.parameters(&self.interner); + let return_type = + substitution.last().unwrap().assert_ty_ref(&self.interner).clone(); + // Closure arguments are tupled + let argument_tuple = substitution[0].assert_ty_ref(&self.interner); + let argument_types = match argument_tuple.data(&self.interner) { + chalk_ir::TyData::Apply(apply) => match apply.name { + chalk_ir::TypeName::Tuple(_) => apply + .substitution + .iter(&self.interner) + .map(|arg| arg.assert_ty_ref(&self.interner)) + .cloned() + .collect(), + _ => bug!("Expecting closure FnSig args to be tupled."), + }, + _ => bug!("Expecting closure FnSig args to be tupled."), + }; + + chalk_ir::Binders::new( + chalk_ir::VariableKinds::from( + &self.interner, + (0..f.num_binders).map(|_| chalk_ir::VariableKind::Lifetime), + ), + chalk_solve::rust_ir::FnDefInputsAndOutputDatum { argument_types, return_type }, + ) + } + _ => panic!("Invalid sig."), + } + } + + fn closure_upvars( + &self, + _closure_id: chalk_ir::ClosureId>, + substs: &chalk_ir::Substitution>, + ) -> chalk_ir::Binders>> { + let inputs_and_output = self.closure_inputs_and_output(_closure_id, substs); + let tuple = substs.parameters(&self.interner).last().unwrap().assert_ty_ref(&self.interner); + inputs_and_output.map_ref(|_| tuple.clone()) + } + + fn closure_fn_substitution( + &self, + _closure_id: chalk_ir::ClosureId>, + substs: &chalk_ir::Substitution>, + ) -> chalk_ir::Substitution> { + let substitution = &substs.parameters(&self.interner)[0..substs.len(&self.interner) - 3]; + chalk_ir::Substitution::from(&self.interner, substitution) + } } /// Creates a `InternalSubsts` that maps each generic parameter to a higher-ranked diff --git a/src/librustc_traits/chalk/lowering.rs b/src/librustc_traits/chalk/lowering.rs index 5546a8db53395..e09359b8b3fc1 100644 --- a/src/librustc_traits/chalk/lowering.rs +++ b/src/librustc_traits/chalk/lowering.rs @@ -43,6 +43,8 @@ use rustc_span::def_id::DefId; use std::collections::btree_map::{BTreeMap, Entry}; +use chalk_ir::fold::shift::Shift; + /// Essentially an `Into` with a `&RustInterner` parameter crate trait LowerInto<'tcx, T> { /// Lower a rustc construct (e.g., `ty::TraitPredicate`) to a chalk type, consuming `self`. @@ -82,7 +84,7 @@ impl<'tcx> LowerInto<'tcx, chalk_ir::InEnvironment LowerInto<'tcx, chalk_ir::InEnvironment LowerInto<'tcx, chalk_ir::InEnvironment LowerInto<'tcx, chalk_ir::InEnvironment Some( - chalk_ir::ProgramClauseData::Implies(chalk_ir::ProgramClauseImplication { - consequence: chalk_ir::DomainGoal::FromEnv(chalk_ir::FromEnv::Ty( - ty.lower_into(interner), - )), - conditions: chalk_ir::Goals::new(interner), - priority: chalk_ir::ClausePriority::High, - }) + chalk_ir::ProgramClauseData(chalk_ir::Binders::new( + chalk_ir::VariableKinds::new(interner), + chalk_ir::ProgramClauseImplication { + consequence: chalk_ir::DomainGoal::FromEnv(chalk_ir::FromEnv::Ty( + ty.lower_into(interner).shifted_in(interner), + )), + conditions: chalk_ir::Goals::new(interner), + priority: chalk_ir::ClausePriority::High, + }, + )) .intern(interner), ), }); @@ -416,12 +421,15 @@ impl<'tcx> LowerInto<'tcx, chalk_ir::Ty>> for Ty<'tcx> { }) .intern(interner) } - // FIXME(chalk): add region - Dynamic(predicates, _region) => { - TyData::Dyn(chalk_ir::DynTy { bounds: predicates.lower_into(interner) }) - .intern(interner) - } - Closure(_def_id, _) => unimplemented!(), + Dynamic(predicates, region) => TyData::Dyn(chalk_ir::DynTy { + bounds: predicates.lower_into(interner), + lifetime: region.lower_into(interner), + }) + .intern(interner), + Closure(def_id, substs) => apply( + chalk_ir::TypeName::Closure(chalk_ir::ClosureId(def_id)), + substs.lower_into(interner), + ), Generator(_def_id, _substs, _) => unimplemented!(), GeneratorWitness(_) => unimplemented!(), Never => apply(chalk_ir::TypeName::Never, empty()), @@ -624,7 +632,7 @@ crate fn collect_bound_vars<'a, 'tcx, T: TypeFoldable<'tcx>>( } (0..parameters.len()).for_each(|i| { - parameters.get(&(i as u32)).expect("Skipped bound var index."); + parameters.get(&(i as u32)).expect(&format!("Skipped bound var index `{:?}`.", i)); }); let binders = chalk_ir::VariableKinds::from(interner, parameters.into_iter().map(|(_, v)| v)); diff --git a/src/librustc_traits/chalk/mod.rs b/src/librustc_traits/chalk/mod.rs index 6f657be0908b4..52ec0f2409dce 100644 --- a/src/librustc_traits/chalk/mod.rs +++ b/src/librustc_traits/chalk/mod.rs @@ -133,6 +133,7 @@ crate fn evaluate_goal<'tcx>( }, chalk_ir::TypeName::Array => unimplemented!(), chalk_ir::TypeName::FnDef(_) => unimplemented!(), + chalk_ir::TypeName::Closure(_) => unimplemented!(), chalk_ir::TypeName::Never => unimplemented!(), chalk_ir::TypeName::Tuple(_size) => unimplemented!(), chalk_ir::TypeName::Slice => unimplemented!(), diff --git a/src/test/ui/chalkify/closure.rs b/src/test/ui/chalkify/closure.rs new file mode 100644 index 0000000000000..81114d491d78e --- /dev/null +++ b/src/test/ui/chalkify/closure.rs @@ -0,0 +1,39 @@ +// check-fail +// compile-flags: -Z chalk + +fn main() -> () { + let t = || {}; + t(); + + let mut a = 0; + let mut b = move || { + a = 1; + }; + b(); + + let mut c = b; + + c(); + b(); + + let mut a = 0; + let mut b = || { + a = 1; + }; + b(); + + let mut c = b; + + c(); + b(); //~ ERROR + + // FIXME(chalk): this doesn't quite work + /* + let b = |c| { + c + }; + + let a = &32; + b(a); + */ +} diff --git a/src/test/ui/chalkify/closure.stderr b/src/test/ui/chalkify/closure.stderr new file mode 100644 index 0000000000000..d5a48a7dc6f95 --- /dev/null +++ b/src/test/ui/chalkify/closure.stderr @@ -0,0 +1,18 @@ +error[E0382]: borrow of moved value: `b` + --> $DIR/closure.rs:28:5 + | +LL | let mut c = b; + | - value moved here +... +LL | b(); + | ^ value borrowed here after move + | +note: closure cannot be moved more than once as it is not `Copy` due to moving the variable `a` out of its environment + --> $DIR/closure.rs:21:9 + | +LL | a = 1; + | ^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0382`. diff --git a/src/test/ui/chalkify/impl_wf.rs b/src/test/ui/chalkify/impl_wf.rs index fdc94f69bf21a..465eb10241ea2 100644 --- a/src/test/ui/chalkify/impl_wf.rs +++ b/src/test/ui/chalkify/impl_wf.rs @@ -23,15 +23,10 @@ impl Bar for Option { type Item = Option; } -// FIXME(chalk): the ordering of these two errors differs between CI and local -// We need to figure out why its non-deterministic -/* impl Bar for f32 { -//^ ERROR the trait bound `f32: Foo` is not satisfied type Item = f32; - //^ ERROR the trait bound `f32: Foo` is not satisfied + //~^ ERROR the trait bound `f32: Foo` is not satisfied } -*/ trait Baz where U: Foo { } diff --git a/src/test/ui/chalkify/impl_wf.stderr b/src/test/ui/chalkify/impl_wf.stderr index 5293bbaecd389..e5d7615e43e31 100644 --- a/src/test/ui/chalkify/impl_wf.stderr +++ b/src/test/ui/chalkify/impl_wf.stderr @@ -11,7 +11,18 @@ LL | impl Foo for str { } = note: to learn more, visit error[E0277]: the trait bound `f32: Foo` is not satisfied - --> $DIR/impl_wf.rs:40:6 + --> $DIR/impl_wf.rs:27:17 + | +LL | trait Bar { + | --- required by a bound in this +LL | type Item: Foo; + | --- required by this bound in `Bar` +... +LL | type Item = f32; + | ^^^ the trait `Foo` is not implemented for `f32` + +error[E0277]: the trait bound `f32: Foo` is not satisfied + --> $DIR/impl_wf.rs:35:6 | LL | trait Baz where U: Foo { } | --- required by this bound in `Baz` @@ -19,6 +30,6 @@ LL | trait Baz where U: Foo { } LL | impl Baz for f32 { } | ^^^^^^^^ the trait `Foo` is not implemented for `f32` -error: aborting due to 2 previous errors +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/chalkify/inherent_impl.rs b/src/test/ui/chalkify/inherent_impl.rs index 9dd9eb320ddd3..a2730219fbe2a 100644 --- a/src/test/ui/chalkify/inherent_impl.rs +++ b/src/test/ui/chalkify/inherent_impl.rs @@ -1,7 +1,5 @@ // run-pass // compile-flags: -Z chalk -// FIXME(chalk): remove when uncommented -#![allow(dead_code, unused_variables)] trait Foo { } @@ -11,8 +9,6 @@ struct S { x: T, } -// FIXME(chalk): need late-bound regions on FnDefs -/* fn only_foo(_x: &T) { } impl S { @@ -21,7 +17,6 @@ impl S { only_foo(&self.x) } } -*/ trait Bar { } impl Bar for u32 { } @@ -31,16 +26,10 @@ fn only_bar() { } impl S { // Test that the environment of `dummy_bar` adds up with the environment // of the inherent impl. - // FIXME(chalk): need late-bound regions on FnDefs - /* fn dummy_bar(&self) { only_foo(&self.x); only_bar::(); } - */ - fn dummy_bar() { - only_bar::(); - } } fn main() { @@ -48,10 +37,6 @@ fn main() { x: 5, }; - // FIXME(chalk): need late-bound regions on FnDefs - /* - s.dummy_foo(); s.dummy_bar::(); - */ - S::::dummy_bar::(); + s.dummy_foo(); } diff --git a/src/test/ui/chalkify/recursive_where_clause_on_type.rs b/src/test/ui/chalkify/recursive_where_clause_on_type.rs index 6ee13f5e7a104..87324a5f79bdd 100644 --- a/src/test/ui/chalkify/recursive_where_clause_on_type.rs +++ b/src/test/ui/chalkify/recursive_where_clause_on_type.rs @@ -1,5 +1,5 @@ // FIXME(chalk): should fail, see comments -// check-pass +// check-fail // compile-flags: -Z chalk #![feature(trivial_bounds)] @@ -10,7 +10,6 @@ trait Bar { trait Foo: Bar { } struct S where S: Foo; -//~^ WARN Trait bound S: Foo does not depend on any type or lifetime parameters impl Foo for S { } @@ -26,10 +25,6 @@ fn foo() { fn main() { // For some reason, the error is duplicated... - // FIXME(chalk): this order of this duplicate error seems non-determistic - // and causes test to fail - /* - foo::() // ERROR the type `S` is not well-formed (chalk) - //^ ERROR the type `S` is not well-formed (chalk) - */ + foo::() //~ ERROR the type `S` is not well-formed (chalk) + //~^ ERROR the type `S` is not well-formed (chalk) } diff --git a/src/test/ui/chalkify/recursive_where_clause_on_type.stderr b/src/test/ui/chalkify/recursive_where_clause_on_type.stderr index a5b7ef7fdb2e3..fddd58959278e 100644 --- a/src/test/ui/chalkify/recursive_where_clause_on_type.stderr +++ b/src/test/ui/chalkify/recursive_where_clause_on_type.stderr @@ -1,10 +1,14 @@ -warning: Trait bound S: Foo does not depend on any type or lifetime parameters - --> $DIR/recursive_where_clause_on_type.rs:12:19 +error: the type `S` is not well-formed (chalk) + --> $DIR/recursive_where_clause_on_type.rs:28:11 | -LL | struct S where S: Foo; - | ^^^ +LL | foo::() + | ^ + +error: the type `S` is not well-formed (chalk) + --> $DIR/recursive_where_clause_on_type.rs:28:5 | - = note: `#[warn(trivial_bounds)]` on by default +LL | foo::() + | ^^^^^^^^ -warning: 1 warning emitted +error: aborting due to 2 previous errors From d8ea10c95fb5cf1674666fe4eae10ed761e2bfaa Mon Sep 17 00:00:00 2001 From: Alexis Bourget Date: Wed, 24 Jun 2020 09:23:55 +0200 Subject: [PATCH 087/142] Document the return keyword Apply suggestions from code review Co-authored-by: Josh Triplett --- src/libstd/keyword_docs.rs | 50 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/libstd/keyword_docs.rs b/src/libstd/keyword_docs.rs index a4996d9eee810..b2658529e57cf 100644 --- a/src/libstd/keyword_docs.rs +++ b/src/libstd/keyword_docs.rs @@ -1000,9 +1000,55 @@ mod ref_keyword {} // /// Return a value from a function. /// -/// The documentation for this keyword is [not yet complete]. Pull requests welcome! +/// A `return` marks the end of an execution path in a function: /// -/// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 +/// ``` +/// fn foo() -> i32 { +/// return 3; +/// } +/// assert_eq!(foo(), 3); +/// ``` +/// +/// `return` is not needed when the returned value is the last expression in the +/// function. In this case the `;` is omitted: +/// +/// ``` +/// fn foo() -> i32 { +/// 3 +/// } +/// assert_eq!(foo(), 3); +/// ``` +/// +/// `return` returns from the function immediately (an "early return"): +/// +/// ```no_run +/// use std::fs::File; +/// use std::io::{Error, ErrorKind, Read, Result}; +/// +/// fn main() -> Result<()> { +/// let mut file = match File::open("foo.txt") { +/// Ok(f) => f, +/// Err(e) => return Err(e), +/// }; +/// +/// let mut contents = String::new(); +/// let size = match file.read_to_string(&mut contents) { +/// Ok(s) => s, +/// Err(e) => return Err(e), +/// }; +/// +/// if contents.contains("impossible!") { +/// return Err(Error::new(ErrorKind::Other, "oh no!")); +/// } +/// +/// if size > 9000 { +/// return Err(Error::new(ErrorKind::Other, "over 9000!")); +/// } +/// +/// assert_eq!(contents, "Hello, world!"); +/// Ok(()) +/// } +/// ``` mod return_keyword {} #[doc(keyword = "self")] From f3b1582bb926a7005ba77bfaa44b1ed59a587509 Mon Sep 17 00:00:00 2001 From: Adrian Cruceru Date: Tue, 23 Jun 2020 19:18:34 +0200 Subject: [PATCH 088/142] Update libunwind build process for x86_64-fortanix-unknown-sgx target --- src/bootstrap/compile.rs | 20 ----------- src/ci/docker/dist-various-2/Dockerfile | 2 -- ...d-x86_64-fortanix-unknown-sgx-toolchain.sh | 35 ------------------ .../spec/x86_64_fortanix_unknown_sgx.rs | 6 ++-- src/libstd/sys/sgx/abi/entry.S | 14 +++++--- src/libunwind/build.rs | 36 +++++++++++++++++++ 6 files changed, 49 insertions(+), 64 deletions(-) diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index afcf0dcac7e55..5fb489cb9ac5a 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -131,28 +131,8 @@ fn copy_third_party_objects( compiler: &Compiler, target: Interned, ) -> Vec<(PathBuf, DependencyType)> { - let libdir = builder.sysroot_libdir(*compiler, target); let mut target_deps = vec![]; - // Copies libunwind.a compiled to be linked with x86_64-fortanix-unknown-sgx. - // - // This target needs to be linked to Fortanix's port of llvm's libunwind. - // libunwind requires support for rwlock and printing to stderr, - // which is provided by std for this target. - if target == "x86_64-fortanix-unknown-sgx" { - let src_path_env = "X86_FORTANIX_SGX_LIBS"; - let src = - env::var(src_path_env).unwrap_or_else(|_| panic!("{} not found in env", src_path_env)); - copy_and_stamp( - builder, - &*libdir, - Path::new(&src), - "libunwind.a", - &mut target_deps, - DependencyType::Target, - ); - } - if builder.config.sanitizers && compiler.stage != 0 { // The sanitizers are only copied in stage1 or above, // to avoid creating dependency on LLVM. diff --git a/src/ci/docker/dist-various-2/Dockerfile b/src/ci/docker/dist-various-2/Dockerfile index 43f5581f996ea..b495d8c2daeb1 100644 --- a/src/ci/docker/dist-various-2/Dockerfile +++ b/src/ci/docker/dist-various-2/Dockerfile @@ -105,8 +105,6 @@ ENV TARGETS=$TARGETS,nvptx64-nvidia-cuda ENV TARGETS=$TARGETS,armv7-unknown-linux-gnueabi ENV TARGETS=$TARGETS,armv7-unknown-linux-musleabi -ENV X86_FORTANIX_SGX_LIBS="/x86_64-fortanix-unknown-sgx/lib/" - # As per https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1300211 # we need asm in the search path for gcc-7 (for gnux32) but not in the search path of the # cross compilers. diff --git a/src/ci/docker/dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh b/src/ci/docker/dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh index 4294b1ef93dd8..46a0ca7290999 100755 --- a/src/ci/docker/dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh +++ b/src/ci/docker/dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh @@ -24,39 +24,4 @@ install_prereq() { clang-11 } -build_unwind() { - set -x - dir_name="${target}_temp" - rm -rf ${dir_name} - mkdir -p ${dir_name} - pushd ${dir_name} - - # Clone Fortanix's fork of llvm-project which has a port of libunwind - fetch_github_commit_archive "$repo_name" "$url" - cd "${repo_name}/libunwind" - - # Build libunwind - mkdir -p build - cd build - target_CC="CC_${target//-/_}" - target_CXX="CXX_${target//-/_}" - target_CFLAGS="CFLAGS_${target//-/_}" - target_CXXFLAGS="CXXFLAGS_${target//-/_}" - cmake -DCMAKE_BUILD_TYPE="RELEASE" -DRUST_SGX=1 -G "Unix Makefiles" \ - -DCMAKE_C_COMPILER="${!target_CC}" -DCMAKE_CXX_COMPILER="${!target_CXX}" \ - -DCMAKE_C_FLAGS="${!target_CFLAGS}" -DCMAKE_CXX_FLAGS="${!target_CXXFLAGS}" \ - -DCMAKE_C_COMPILER_TARGET=$target -DCMAKE_CXX_COMPILER_TARGET=$target \ - -DLLVM_ENABLE_WARNINGS=1 -DLIBUNWIND_ENABLE_WERROR=1 -DLIBUNWIND_ENABLE_PEDANTIC=0 \ - -DLLVM_PATH=../../llvm/ ../ - make unwind_static - install -D "lib/libunwind.a" "/${target}/lib/libunwind.a" - - popd - rm -rf ${dir_name} - - { set +x; } 2>/dev/null -} - -set -x hide_output install_prereq -build_unwind diff --git a/src/librustc_target/spec/x86_64_fortanix_unknown_sgx.rs b/src/librustc_target/spec/x86_64_fortanix_unknown_sgx.rs index 81974769cafb8..d01545619c8fa 100644 --- a/src/librustc_target/spec/x86_64_fortanix_unknown_sgx.rs +++ b/src/librustc_target/spec/x86_64_fortanix_unknown_sgx.rs @@ -48,8 +48,10 @@ pub fn target() -> Result { "ENCLAVE_SIZE", "CFGDATA_BASE", "DEBUG", - "EH_FRM_HDR_BASE", - "EH_FRM_HDR_SIZE", + "EH_FRM_HDR_OFFSET", + "EH_FRM_HDR_LEN", + "EH_FRM_OFFSET", + "EH_FRM_LEN", "TEXT_BASE", "TEXT_SIZE", ]; diff --git a/src/libstd/sys/sgx/abi/entry.S b/src/libstd/sys/sgx/abi/entry.S index fc6ce5770338e..f61bcf06f0815 100644 --- a/src/libstd/sys/sgx/abi/entry.S +++ b/src/libstd/sys/sgx/abi/entry.S @@ -11,7 +11,7 @@ IMAGE_BASE: .long 1 /* type = NT_VERSION */ 0: .asciz "toolchain-version" /* name */ 1: .align 4 -2: .long 0 /* desc - toolchain version number, 32-bit LE */ +2: .long 1 /* desc - toolchain version number, 32-bit LE */ 3: .align 4 .section .rodata @@ -60,10 +60,14 @@ IMAGE_BASE: globvar TEXT_BASE 8 /* The size in bytes of enclacve text section */ globvar TEXT_SIZE 8 - /* The base address (relative to enclave start) of the enclave EH_FRM_HDR section */ - globvar EH_FRM_HDR_BASE 8 - /* The size in bytes of enclacve EH_FRM_HDR section */ - globvar EH_FRM_HDR_SIZE 8 + /* The base address (relative to enclave start) of the enclave .eh_frame_hdr section */ + globvar EH_FRM_HDR_OFFSET 8 + /* The size in bytes of enclave .eh_frame_hdr section */ + globvar EH_FRM_HDR_LEN 8 + /* The base address (relative to enclave start) of the enclave .eh_frame section */ + globvar EH_FRM_OFFSET 8 + /* The size in bytes of enclacve .eh_frame section */ + globvar EH_FRM_LEN 8 .org .Lxsave_clear+512 .Lxsave_header: diff --git a/src/libunwind/build.rs b/src/libunwind/build.rs index f6f16f686e557..31d235cf679db 100644 --- a/src/libunwind/build.rs +++ b/src/libunwind/build.rs @@ -9,6 +9,8 @@ fn main() { { // Build the unwinding from libunwind C/C++ source code. llvm_libunwind::compile(); + } else if target.contains("x86_64-fortanix-unknown-sgx") { + llvm_libunwind::compile(); } else if target.contains("linux") { if target.contains("musl") { // linking for musl is handled in lib.rs @@ -55,6 +57,7 @@ mod llvm_libunwind { /// Compile the libunwind C/C++ source code. pub fn compile() { + let target = env::var("TARGET").expect("TARGET was not set"); let target_env = env::var("CARGO_CFG_TARGET_ENV").unwrap(); let target_vendor = env::var("CARGO_CFG_TARGET_VENDOR").unwrap(); let target_endian_little = env::var("CARGO_CFG_TARGET_ENDIAN").unwrap() != "big"; @@ -75,6 +78,35 @@ mod llvm_libunwind { cfg.flag("/EHsc"); cfg.define("_CRT_SECURE_NO_WARNINGS", None); cfg.define("_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS", None); + } else if target.contains("x86_64-fortanix-unknown-sgx") { + cfg.cpp(false); + + cfg.static_flag(true); + cfg.opt_level(3); + + cfg.flag("-nostdinc++"); + cfg.flag("-fno-exceptions"); + cfg.flag("-fno-rtti"); + cfg.flag("-fstrict-aliasing"); + cfg.flag("-funwind-tables"); + cfg.flag("-fvisibility=hidden"); + cfg.flag("-fno-stack-protector"); + cfg.flag("-ffreestanding"); + cfg.flag("-fexceptions"); + + // easiest way to undefine since no API available in cc::Build to undefine + cfg.flag("-U_FORTIFY_SOURCE"); + cfg.define("_FORTIFY_SOURCE", "0"); + + cfg.flag_if_supported("-fvisibility-global-new-delete-hidden"); + + cfg.define("_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS", None); + cfg.define("RUST_SGX", "1"); + cfg.define("__NO_STRING_INLINES", None); + cfg.define("__NO_MATH_INLINES", None); + cfg.define("_LIBUNWIND_IS_BAREMETAL", None); + cfg.define("__LIBUNWIND_IS_NATIVE_ONLY", None); + cfg.define("NDEBUG", None); } else { cfg.flag("-std=c99"); cfg.flag("-std=c++11"); @@ -103,6 +135,10 @@ mod llvm_libunwind { unwind_sources.push("Unwind_AppleExtras.cpp"); } + if target.contains("x86_64-fortanix-unknown-sgx") { + unwind_sources.push("UnwindRustSgx.c"); + } + let root = Path::new("../llvm-project/libunwind"); cfg.include(root.join("include")); for src in unwind_sources { From 14ea7a777f924995256a05da55133d265ed169be Mon Sep 17 00:00:00 2001 From: David Wood Date: Thu, 28 May 2020 15:57:09 +0100 Subject: [PATCH 089/142] lints: add `improper_ctypes_definitions` This commit adds a new lint - `improper_ctypes_definitions` - which functions identically to `improper_ctypes`, but on `extern "C" fn` definitions (as opposed to `improper_ctypes`'s `extern "C" {}` declarations). Signed-off-by: David Wood --- src/liballoc/boxed.rs | 2 + src/libpanic_abort/lib.rs | 1 + src/libpanic_unwind/lib.rs | 1 + src/librustc_lint/lib.rs | 3 +- src/librustc_lint/types.rs | 107 ++++++-- src/librustc_llvm/lib.rs | 1 + src/libstd/sys/sgx/abi/mod.rs | 1 + src/test/ui/abi/abi-sysv64-register-usage.rs | 1 + src/test/ui/align-with-extern-c-fn.rs | 1 + src/test/ui/issues/issue-16441.rs | 1 + src/test/ui/issues/issue-26997.rs | 1 + src/test/ui/issues/issue-28600.rs | 1 + src/test/ui/issues/issue-38763.rs | 1 + src/test/ui/issues/issue-51907.rs | 2 + src/test/ui/lint/lint-ctypes-fn.rs | 186 ++++++++++++++ src/test/ui/lint/lint-ctypes-fn.stderr | 247 +++++++++++++++++++ src/test/ui/mir/mir_cast_fn_ret.rs | 2 + src/test/ui/mir/mir_codegen_calls.rs | 1 + 18 files changed, 533 insertions(+), 27 deletions(-) create mode 100644 src/test/ui/lint/lint-ctypes-fn.rs create mode 100644 src/test/ui/lint/lint-ctypes-fn.stderr diff --git a/src/liballoc/boxed.rs b/src/liballoc/boxed.rs index d10cbf1afab30..f1b560b9b9685 100644 --- a/src/liballoc/boxed.rs +++ b/src/liballoc/boxed.rs @@ -92,11 +92,13 @@ //! pub struct Foo; //! //! #[no_mangle] +//! #[allow(improper_ctypes_definitions)] //! pub extern "C" fn foo_new() -> Box { //! Box::new(Foo) //! } //! //! #[no_mangle] +//! #[allow(improper_ctypes_definitions)] //! pub extern "C" fn foo_delete(_: Option>) {} //! ``` //! diff --git a/src/libpanic_abort/lib.rs b/src/libpanic_abort/lib.rs index fd3e11858cef6..27056d5f934fd 100644 --- a/src/libpanic_abort/lib.rs +++ b/src/libpanic_abort/lib.rs @@ -21,6 +21,7 @@ use core::any::Any; #[rustc_std_internal_symbol] +#[cfg_attr(not(bootstrap), allow(improper_ctypes_definitions))] pub unsafe extern "C" fn __rust_panic_cleanup(_: *mut u8) -> *mut (dyn Any + Send + 'static) { unreachable!() } diff --git a/src/libpanic_unwind/lib.rs b/src/libpanic_unwind/lib.rs index f791fe82a27e7..f361354da2ac2 100644 --- a/src/libpanic_unwind/lib.rs +++ b/src/libpanic_unwind/lib.rs @@ -81,6 +81,7 @@ extern "C" { mod dwarf; #[rustc_std_internal_symbol] +#[cfg_attr(not(bootstrap), allow(improper_ctypes_definitions))] pub unsafe extern "C" fn __rust_panic_cleanup(payload: *mut u8) -> *mut (dyn Any + Send + 'static) { Box::into_raw(imp::cleanup(payload)) } diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs index ca2ca3145abc8..b39abe7b411bb 100644 --- a/src/librustc_lint/lib.rs +++ b/src/librustc_lint/lib.rs @@ -167,7 +167,8 @@ macro_rules! late_lint_mod_passes { $args, [ HardwiredLints: HardwiredLints, - ImproperCTypes: ImproperCTypes, + ImproperCTypesDeclarations: ImproperCTypesDeclarations, + ImproperCTypesDefinitions: ImproperCTypesDefinitions, VariantSizeDifferences: VariantSizeDifferences, BoxPointers: BoxPointers, PathStatements: PathStatements, diff --git a/src/librustc_lint/types.rs b/src/librustc_lint/types.rs index a19c9a3557996..4c8b79308ed94 100644 --- a/src/librustc_lint/types.rs +++ b/src/librustc_lint/types.rs @@ -498,10 +498,24 @@ declare_lint! { "proper use of libc types in foreign modules" } -declare_lint_pass!(ImproperCTypes => [IMPROPER_CTYPES]); +declare_lint_pass!(ImproperCTypesDeclarations => [IMPROPER_CTYPES]); + +declare_lint! { + IMPROPER_CTYPES_DEFINITIONS, + Warn, + "proper use of libc types in foreign item definitions" +} + +declare_lint_pass!(ImproperCTypesDefinitions => [IMPROPER_CTYPES_DEFINITIONS]); + +enum ImproperCTypesMode { + Declarations, + Definitions, +} struct ImproperCTypesVisitor<'a, 'tcx> { cx: &'a LateContext<'a, 'tcx>, + mode: ImproperCTypesMode, } enum FfiResult<'tcx> { @@ -811,20 +825,16 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { ty::Array(inner_ty, _) => self.check_type_for_ffi(cache, inner_ty), ty::FnPtr(sig) => { - match sig.abi() { - Abi::Rust | Abi::RustIntrinsic | Abi::PlatformIntrinsic | Abi::RustCall => { - return FfiUnsafe { - ty, - reason: "this function pointer has Rust-specific calling convention" + if self.is_internal_abi(sig.abi()) { + return FfiUnsafe { + ty, + reason: "this function pointer has Rust-specific calling convention".into(), + help: Some( + "consider using an `extern fn(...) -> ...` \ + function pointer instead" .into(), - help: Some( - "consider using an `extern fn(...) -> ...` \ - function pointer instead" - .into(), - ), - }; - } - _ => {} + ), + }; } let sig = cx.erase_late_bound_regions(&sig); @@ -857,15 +867,17 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { FfiUnsafe { ty, reason: "opaque types have no C equivalent".into(), help: None } } - ty::Param(..) - | ty::Infer(..) + // `extern "C" fn` functions can have type parameters, which may or may not be FFI-safe, + // so they are currently ignored for the purposes of this lint. + ty::Param(..) | ty::Projection(..) => FfiSafe, + + ty::Infer(..) | ty::Bound(..) | ty::Error(_) | ty::Closure(..) | ty::Generator(..) | ty::GeneratorWitness(..) | ty::Placeholder(..) - | ty::Projection(..) | ty::FnDef(..) => bug!("unexpected type in foreign function: {:?}", ty), } } @@ -877,9 +889,20 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { note: &str, help: Option<&str>, ) { - self.cx.struct_span_lint(IMPROPER_CTYPES, sp, |lint| { - let mut diag = - lint.build(&format!("`extern` block uses type `{}`, which is not FFI-safe", ty)); + let lint = match self.mode { + ImproperCTypesMode::Declarations => IMPROPER_CTYPES, + ImproperCTypesMode::Definitions => IMPROPER_CTYPES_DEFINITIONS, + }; + + self.cx.struct_span_lint(lint, sp, |lint| { + let item_description = match self.mode { + ImproperCTypesMode::Declarations => "block", + ImproperCTypesMode::Definitions => "fn", + }; + let mut diag = lint.build(&format!( + "`extern` {} uses type `{}`, which is not FFI-safe", + item_description, ty + )); diag.span_label(sp, "not FFI-safe"); if let Some(help) = help { diag.help(help); @@ -947,7 +970,7 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { // it is only OK to use this function because extern fns cannot have // any generic types right now: - let ty = self.cx.tcx.normalize_erasing_regions(ParamEnv::reveal_all(), ty); + let ty = self.cx.tcx.normalize_erasing_regions(self.cx.param_env, ty); // C doesn't really support passing arrays by value - the only way to pass an array by value // is through a struct. So, first test that the top level isn't an array, and then @@ -997,15 +1020,22 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { let ty = self.cx.tcx.type_of(def_id); self.check_type_for_ffi_and_report_errors(span, ty, true, false); } + + fn is_internal_abi(&self, abi: Abi) -> bool { + if let Abi::Rust | Abi::RustCall | Abi::RustIntrinsic | Abi::PlatformIntrinsic = abi { + true + } else { + false + } + } } -impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ImproperCTypes { +impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ImproperCTypesDeclarations { fn check_foreign_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::ForeignItem<'_>) { - let mut vis = ImproperCTypesVisitor { cx }; + let mut vis = ImproperCTypesVisitor { cx, mode: ImproperCTypesMode::Declarations }; let abi = cx.tcx.hir().get_foreign_abi(it.hir_id); - if let Abi::Rust | Abi::RustCall | Abi::RustIntrinsic | Abi::PlatformIntrinsic = abi { - // Don't worry about types in internal ABIs. - } else { + + if !vis.is_internal_abi(abi) { match it.kind { hir::ForeignItemKind::Fn(ref decl, _, _) => { vis.check_foreign_fn(it.hir_id, decl); @@ -1019,6 +1049,31 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ImproperCTypes { } } +impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ImproperCTypesDefinitions { + fn check_fn( + &mut self, + cx: &LateContext<'a, 'tcx>, + kind: hir::intravisit::FnKind<'tcx>, + decl: &'tcx hir::FnDecl<'_>, + _: &'tcx hir::Body<'_>, + _: Span, + hir_id: hir::HirId, + ) { + use hir::intravisit::FnKind; + + let abi = match kind { + FnKind::ItemFn(_, _, header, ..) => header.abi, + FnKind::Method(_, sig, ..) => sig.header.abi, + _ => return, + }; + + let mut vis = ImproperCTypesVisitor { cx, mode: ImproperCTypesMode::Definitions }; + if !vis.is_internal_abi(abi) { + vis.check_foreign_fn(hir_id, decl); + } + } +} + declare_lint_pass!(VariantSizeDifferences => [VARIANT_SIZE_DIFFERENCES]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for VariantSizeDifferences { diff --git a/src/librustc_llvm/lib.rs b/src/librustc_llvm/lib.rs index 79e1a6cc5dcdb..f54ed9b92029e 100644 --- a/src/librustc_llvm/lib.rs +++ b/src/librustc_llvm/lib.rs @@ -15,6 +15,7 @@ pub struct RustString { /// Appending to a Rust string -- used by RawRustStringOstream. #[no_mangle] +#[cfg_attr(not(bootstrap), allow(improper_ctypes_definitions))] pub unsafe extern "C" fn LLVMRustStringWriteImpl( sr: &RustString, ptr: *const c_char, diff --git a/src/libstd/sys/sgx/abi/mod.rs b/src/libstd/sys/sgx/abi/mod.rs index 87e7a5da2b7a9..5ef26d4cc4dc6 100644 --- a/src/libstd/sys/sgx/abi/mod.rs +++ b/src/libstd/sys/sgx/abi/mod.rs @@ -56,6 +56,7 @@ unsafe extern "C" fn tcs_init(secondary: bool) { // able to specify this #[cfg(not(test))] #[no_mangle] +#[allow(improper_ctypes_definitions)] extern "C" fn entry(p1: u64, p2: u64, p3: u64, secondary: bool, p4: u64, p5: u64) -> (u64, u64) { // FIXME: how to support TLS in library mode? let tls = Box::new(tls::Tls::new()); diff --git a/src/test/ui/abi/abi-sysv64-register-usage.rs b/src/test/ui/abi/abi-sysv64-register-usage.rs index fcdff59ffa984..32864dba4587e 100644 --- a/src/test/ui/abi/abi-sysv64-register-usage.rs +++ b/src/test/ui/abi/abi-sysv64-register-usage.rs @@ -38,6 +38,7 @@ pub struct LargeStruct(i64, i64, i64, i64, i64, i64, i64, i64); #[cfg(target_arch = "x86_64")] #[inline(never)] +#[allow(improper_ctypes_definitions)] pub extern "sysv64" fn large_struct_by_val(mut foo: LargeStruct) -> LargeStruct { foo.0 *= 1; foo.1 *= 2; diff --git a/src/test/ui/align-with-extern-c-fn.rs b/src/test/ui/align-with-extern-c-fn.rs index 09abe4fbf7e09..f77f40998de01 100644 --- a/src/test/ui/align-with-extern-c-fn.rs +++ b/src/test/ui/align-with-extern-c-fn.rs @@ -10,6 +10,7 @@ #[repr(align(16))] pub struct A(i64); +#[allow(improper_ctypes_definitions)] pub extern "C" fn foo(x: A) {} fn main() { diff --git a/src/test/ui/issues/issue-16441.rs b/src/test/ui/issues/issue-16441.rs index bae3813f9da95..bafa204e06b25 100644 --- a/src/test/ui/issues/issue-16441.rs +++ b/src/test/ui/issues/issue-16441.rs @@ -5,6 +5,7 @@ struct Empty; // This used to cause an ICE +#[allow(improper_ctypes_definitions)] extern "C" fn ice(_a: Empty) {} fn main() { diff --git a/src/test/ui/issues/issue-26997.rs b/src/test/ui/issues/issue-26997.rs index f6d349a38f523..fcabd1d84557c 100644 --- a/src/test/ui/issues/issue-26997.rs +++ b/src/test/ui/issues/issue-26997.rs @@ -6,6 +6,7 @@ pub struct Foo { } impl Foo { + #[allow(improper_ctypes_definitions)] pub extern fn foo_new() -> Foo { Foo { x: 21, y: 33 } } diff --git a/src/test/ui/issues/issue-28600.rs b/src/test/ui/issues/issue-28600.rs index 3bbe4ae29bdd6..297519b9a79e2 100644 --- a/src/test/ui/issues/issue-28600.rs +++ b/src/test/ui/issues/issue-28600.rs @@ -6,6 +6,7 @@ struct Test; impl Test { #[allow(dead_code)] #[allow(unused_variables)] + #[allow(improper_ctypes_definitions)] pub extern fn test(val: &str) { } diff --git a/src/test/ui/issues/issue-38763.rs b/src/test/ui/issues/issue-38763.rs index 6e6de09225f57..a966cf217e165 100644 --- a/src/test/ui/issues/issue-38763.rs +++ b/src/test/ui/issues/issue-38763.rs @@ -5,6 +5,7 @@ pub struct Foo(i128); #[no_mangle] +#[allow(improper_ctypes_definitions)] pub extern "C" fn foo(x: Foo) -> Foo { x } fn main() { diff --git a/src/test/ui/issues/issue-51907.rs b/src/test/ui/issues/issue-51907.rs index 3691fe1911774..52d26d0954af8 100644 --- a/src/test/ui/issues/issue-51907.rs +++ b/src/test/ui/issues/issue-51907.rs @@ -6,7 +6,9 @@ trait Foo { struct Bar; impl Foo for Bar { + #[allow(improper_ctypes_definitions)] extern fn borrow(&self) {} + #[allow(improper_ctypes_definitions)] extern fn take(self: Box) {} } diff --git a/src/test/ui/lint/lint-ctypes-fn.rs b/src/test/ui/lint/lint-ctypes-fn.rs new file mode 100644 index 0000000000000..c9c95e714849d --- /dev/null +++ b/src/test/ui/lint/lint-ctypes-fn.rs @@ -0,0 +1,186 @@ +#![feature(rustc_private)] + +#![allow(private_in_public)] +#![deny(improper_ctypes_definitions)] + +extern crate libc; + +use std::default::Default; +use std::marker::PhantomData; + +trait Mirror { type It: ?Sized; } + +impl Mirror for T { type It = Self; } + +#[repr(C)] +pub struct StructWithProjection(*mut ::It); + +#[repr(C)] +pub struct StructWithProjectionAndLifetime<'a>( + &'a mut as Mirror>::It +); + +pub type I32Pair = (i32, i32); + +#[repr(C)] +pub struct ZeroSize; + +pub type RustFn = fn(); + +pub type RustBadRet = extern fn() -> Box; + +pub type CVoidRet = (); + +pub struct Foo; + +#[repr(transparent)] +pub struct TransparentI128(i128); + +#[repr(transparent)] +pub struct TransparentStr(&'static str); + +#[repr(transparent)] +pub struct TransparentBadFn(RustBadRet); + +#[repr(transparent)] +pub struct TransparentInt(u32); + +#[repr(transparent)] +pub struct TransparentRef<'a>(&'a TransparentInt); + +#[repr(transparent)] +pub struct TransparentLifetime<'a>(*const u8, PhantomData<&'a ()>); + +#[repr(transparent)] +pub struct TransparentUnit(f32, PhantomData); + +#[repr(transparent)] +pub struct TransparentCustomZst(i32, ZeroSize); + +#[repr(C)] +pub struct ZeroSizeWithPhantomData(PhantomData); + +pub extern "C" fn ptr_type1(size: *const Foo) { } +//~^ ERROR: uses type `Foo` + +pub extern "C" fn ptr_type2(size: *const Foo) { } +//~^ ERROR: uses type `Foo` + +pub extern "C" fn slice_type(p: &[u32]) { } +//~^ ERROR: uses type `[u32]` + +pub extern "C" fn str_type(p: &str) { } +//~^ ERROR: uses type `str` + +pub extern "C" fn box_type(p: Box) { } +//~^ ERROR uses type `std::boxed::Box` + +pub extern "C" fn char_type(p: char) { } +//~^ ERROR uses type `char` + +pub extern "C" fn i128_type(p: i128) { } +//~^ ERROR uses type `i128` + +pub extern "C" fn u128_type(p: u128) { } +//~^ ERROR uses type `u128` + +pub extern "C" fn tuple_type(p: (i32, i32)) { } +//~^ ERROR uses type `(i32, i32)` + +pub extern "C" fn tuple_type2(p: I32Pair) { } +//~^ ERROR uses type `(i32, i32)` + +pub extern "C" fn zero_size(p: ZeroSize) { } +//~^ ERROR uses type `ZeroSize` + +pub extern "C" fn zero_size_phantom(p: ZeroSizeWithPhantomData) { } +//~^ ERROR uses type `ZeroSizeWithPhantomData` + +pub extern "C" fn zero_size_phantom_toplevel() -> PhantomData { +//~^ ERROR uses type `std::marker::PhantomData` + Default::default() +} + +pub extern "C" fn fn_type(p: RustFn) { } +//~^ ERROR uses type `fn()` + +pub extern "C" fn fn_type2(p: fn()) { } +//~^ ERROR uses type `fn()` + +pub extern "C" fn fn_contained(p: RustBadRet) { } +//~^ ERROR: uses type `std::boxed::Box` + +pub extern "C" fn transparent_i128(p: TransparentI128) { } +//~^ ERROR: uses type `i128` + +pub extern "C" fn transparent_str(p: TransparentStr) { } +//~^ ERROR: uses type `str` + +pub extern "C" fn transparent_fn(p: TransparentBadFn) { } +//~^ ERROR: uses type `std::boxed::Box` + +pub extern "C" fn good3(fptr: Option) { } + +pub extern "C" fn good4(aptr: &[u8; 4 as usize]) { } + +pub extern "C" fn good5(s: StructWithProjection) { } + +pub extern "C" fn good6(s: StructWithProjectionAndLifetime) { } + +pub extern "C" fn good7(fptr: extern fn() -> ()) { } + +pub extern "C" fn good8(fptr: extern fn() -> !) { } + +pub extern "C" fn good9() -> () { } + +pub extern "C" fn good10() -> CVoidRet { } + +pub extern "C" fn good11(size: isize) { } + +pub extern "C" fn good12(size: usize) { } + +pub extern "C" fn good13(n: TransparentInt) { } + +pub extern "C" fn good14(p: TransparentRef) { } + +pub extern "C" fn good15(p: TransparentLifetime) { } + +pub extern "C" fn good16(p: TransparentUnit) { } + +pub extern "C" fn good17(p: TransparentCustomZst) { } + +#[allow(improper_ctypes_definitions)] +pub extern "C" fn good18(_: &String) { } + +#[cfg(not(target_arch = "wasm32"))] +pub extern "C" fn good1(size: *const libc::c_int) { } + +#[cfg(not(target_arch = "wasm32"))] +pub extern "C" fn good2(size: *const libc::c_uint) { } + +pub extern "C" fn unused_generic1(size: *const Foo) { } +//~^ ERROR: uses type `Foo` + +pub extern "C" fn unused_generic2() -> PhantomData { +//~^ ERROR uses type `std::marker::PhantomData` + Default::default() +} + +pub extern "C" fn used_generic1(x: T) { } + +pub extern "C" fn used_generic2(x: T, size: *const Foo) { } +//~^ ERROR: uses type `Foo` + +pub extern "C" fn used_generic3() -> T { + Default::default() +} + +pub extern "C" fn used_generic4(x: Vec) { } +//~^ ERROR: uses type `std::vec::Vec` + +pub extern "C" fn used_generic5() -> Vec { +//~^ ERROR: uses type `std::vec::Vec` + Default::default() +} + +fn main() {} diff --git a/src/test/ui/lint/lint-ctypes-fn.stderr b/src/test/ui/lint/lint-ctypes-fn.stderr new file mode 100644 index 0000000000000..3ba16b622cb59 --- /dev/null +++ b/src/test/ui/lint/lint-ctypes-fn.stderr @@ -0,0 +1,247 @@ +error: `extern` fn uses type `Foo`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:63:35 + | +LL | pub extern "C" fn ptr_type1(size: *const Foo) { } + | ^^^^^^^^^^ not FFI-safe + | +note: the lint level is defined here + --> $DIR/lint-ctypes-fn.rs:4:9 + | +LL | #![deny(improper_ctypes_definitions)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct + = note: this struct has unspecified layout +note: the type is defined here + --> $DIR/lint-ctypes-fn.rs:34:1 + | +LL | pub struct Foo; + | ^^^^^^^^^^^^^^^ + +error: `extern` fn uses type `Foo`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:66:35 + | +LL | pub extern "C" fn ptr_type2(size: *const Foo) { } + | ^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct + = note: this struct has unspecified layout +note: the type is defined here + --> $DIR/lint-ctypes-fn.rs:34:1 + | +LL | pub struct Foo; + | ^^^^^^^^^^^^^^^ + +error: `extern` fn uses type `[u32]`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:69:33 + | +LL | pub extern "C" fn slice_type(p: &[u32]) { } + | ^^^^^^ not FFI-safe + | + = help: consider using a raw pointer instead + = note: slices have no C equivalent + +error: `extern` fn uses type `str`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:72:31 + | +LL | pub extern "C" fn str_type(p: &str) { } + | ^^^^ not FFI-safe + | + = help: consider using `*const u8` and a length instead + = note: string slices have no C equivalent + +error: `extern` fn uses type `std::boxed::Box`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:75:31 + | +LL | pub extern "C" fn box_type(p: Box) { } + | ^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct + = note: this struct has unspecified layout + +error: `extern` fn uses type `char`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:78:32 + | +LL | pub extern "C" fn char_type(p: char) { } + | ^^^^ not FFI-safe + | + = help: consider using `u32` or `libc::wchar_t` instead + = note: the `char` type has no C equivalent + +error: `extern` fn uses type `i128`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:81:32 + | +LL | pub extern "C" fn i128_type(p: i128) { } + | ^^^^ not FFI-safe + | + = note: 128-bit integers don't currently have a known stable ABI + +error: `extern` fn uses type `u128`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:84:32 + | +LL | pub extern "C" fn u128_type(p: u128) { } + | ^^^^ not FFI-safe + | + = note: 128-bit integers don't currently have a known stable ABI + +error: `extern` fn uses type `(i32, i32)`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:87:33 + | +LL | pub extern "C" fn tuple_type(p: (i32, i32)) { } + | ^^^^^^^^^^ not FFI-safe + | + = help: consider using a struct instead + = note: tuples have unspecified layout + +error: `extern` fn uses type `(i32, i32)`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:90:34 + | +LL | pub extern "C" fn tuple_type2(p: I32Pair) { } + | ^^^^^^^ not FFI-safe + | + = help: consider using a struct instead + = note: tuples have unspecified layout + +error: `extern` fn uses type `ZeroSize`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:93:32 + | +LL | pub extern "C" fn zero_size(p: ZeroSize) { } + | ^^^^^^^^ not FFI-safe + | + = help: consider adding a member to this struct + = note: this struct has no fields +note: the type is defined here + --> $DIR/lint-ctypes-fn.rs:26:1 + | +LL | pub struct ZeroSize; + | ^^^^^^^^^^^^^^^^^^^^ + +error: `extern` fn uses type `ZeroSizeWithPhantomData`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:96:40 + | +LL | pub extern "C" fn zero_size_phantom(p: ZeroSizeWithPhantomData) { } + | ^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = note: composed only of `PhantomData` +note: the type is defined here + --> $DIR/lint-ctypes-fn.rs:61:1 + | +LL | pub struct ZeroSizeWithPhantomData(PhantomData); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: `extern` fn uses type `std::marker::PhantomData`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:99:51 + | +LL | pub extern "C" fn zero_size_phantom_toplevel() -> PhantomData { + | ^^^^^^^^^^^^^^^^^ not FFI-safe + | + = note: composed only of `PhantomData` + +error: `extern` fn uses type `fn()`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:104:30 + | +LL | pub extern "C" fn fn_type(p: RustFn) { } + | ^^^^^^ not FFI-safe + | + = help: consider using an `extern fn(...) -> ...` function pointer instead + = note: this function pointer has Rust-specific calling convention + +error: `extern` fn uses type `fn()`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:107:31 + | +LL | pub extern "C" fn fn_type2(p: fn()) { } + | ^^^^ not FFI-safe + | + = help: consider using an `extern fn(...) -> ...` function pointer instead + = note: this function pointer has Rust-specific calling convention + +error: `extern` fn uses type `std::boxed::Box`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:110:35 + | +LL | pub extern "C" fn fn_contained(p: RustBadRet) { } + | ^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct + = note: this struct has unspecified layout + +error: `extern` fn uses type `i128`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:113:39 + | +LL | pub extern "C" fn transparent_i128(p: TransparentI128) { } + | ^^^^^^^^^^^^^^^ not FFI-safe + | + = note: 128-bit integers don't currently have a known stable ABI + +error: `extern` fn uses type `str`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:116:38 + | +LL | pub extern "C" fn transparent_str(p: TransparentStr) { } + | ^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider using `*const u8` and a length instead + = note: string slices have no C equivalent + +error: `extern` fn uses type `std::boxed::Box`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:119:37 + | +LL | pub extern "C" fn transparent_fn(p: TransparentBadFn) { } + | ^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct + = note: this struct has unspecified layout + +error: `extern` fn uses type `Foo`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:161:44 + | +LL | pub extern "C" fn unused_generic1(size: *const Foo) { } + | ^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct + = note: this struct has unspecified layout +note: the type is defined here + --> $DIR/lint-ctypes-fn.rs:34:1 + | +LL | pub struct Foo; + | ^^^^^^^^^^^^^^^ + +error: `extern` fn uses type `std::marker::PhantomData`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:164:43 + | +LL | pub extern "C" fn unused_generic2() -> PhantomData { + | ^^^^^^^^^^^^^^^^^ not FFI-safe + | + = note: composed only of `PhantomData` + +error: `extern` fn uses type `Foo`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:171:48 + | +LL | pub extern "C" fn used_generic2(x: T, size: *const Foo) { } + | ^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct + = note: this struct has unspecified layout +note: the type is defined here + --> $DIR/lint-ctypes-fn.rs:34:1 + | +LL | pub struct Foo; + | ^^^^^^^^^^^^^^^ + +error: `extern` fn uses type `std::vec::Vec`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:178:39 + | +LL | pub extern "C" fn used_generic4(x: Vec) { } + | ^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct + = note: this struct has unspecified layout + +error: `extern` fn uses type `std::vec::Vec`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:181:41 + | +LL | pub extern "C" fn used_generic5() -> Vec { + | ^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct + = note: this struct has unspecified layout + +error: aborting due to 24 previous errors + diff --git a/src/test/ui/mir/mir_cast_fn_ret.rs b/src/test/ui/mir/mir_cast_fn_ret.rs index 69fd64c1c092c..4574dbd8529aa 100644 --- a/src/test/ui/mir/mir_cast_fn_ret.rs +++ b/src/test/ui/mir/mir_cast_fn_ret.rs @@ -1,8 +1,10 @@ // run-pass +#[allow(improper_ctypes_definitions)] pub extern "C" fn tuple2() -> (u16, u8) { (1, 2) } +#[allow(improper_ctypes_definitions)] pub extern "C" fn tuple3() -> (u8, u8, u8) { (1, 2, 3) } diff --git a/src/test/ui/mir/mir_codegen_calls.rs b/src/test/ui/mir/mir_codegen_calls.rs index fc0db03e3a968..d93a25c8ef4d3 100644 --- a/src/test/ui/mir/mir_codegen_calls.rs +++ b/src/test/ui/mir/mir_codegen_calls.rs @@ -74,6 +74,7 @@ fn test8() -> isize { Two::two() } +#[allow(improper_ctypes_definitions)] extern fn simple_extern(x: u32, y: (u32, u32)) -> u32 { x + y.0 * y.1 } From 5c8634805cbaed6010e15a15f15e840bd019079a Mon Sep 17 00:00:00 2001 From: David Wood Date: Thu, 28 May 2020 17:11:39 +0100 Subject: [PATCH 090/142] improper_ctypes: allow pointers to sized types This commit changes the improper ctypes lint (when operating on definitions) to consider raw pointers or references to sized types as FFI-safe. Signed-off-by: David Wood --- src/librustc_lint/types.rs | 11 ++- src/test/ui/lint/lint-ctypes-fn.rs | 4 - src/test/ui/lint/lint-ctypes-fn.stderr | 104 ++++++------------------- 3 files changed, 34 insertions(+), 85 deletions(-) diff --git a/src/librustc_lint/types.rs b/src/librustc_lint/types.rs index 4c8b79308ed94..cce6a40c23a2b 100644 --- a/src/librustc_lint/types.rs +++ b/src/librustc_lint/types.rs @@ -14,7 +14,7 @@ use rustc_middle::ty::subst::SubstsRef; use rustc_middle::ty::{self, AdtKind, ParamEnv, Ty, TyCtxt, TypeFoldable}; use rustc_span::source_map; use rustc_span::symbol::sym; -use rustc_span::Span; +use rustc_span::{Span, DUMMY_SP}; use rustc_target::abi::{Integer, LayoutOf, TagEncoding, VariantIdx, Variants}; use rustc_target::spec::abi::Abi; @@ -818,6 +818,15 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { help: Some("consider using a struct instead".into()), }, + ty::RawPtr(ty::TypeAndMut { ty, .. }) | ty::Ref(_, ty, _) + if { + matches!(self.mode, ImproperCTypesMode::Definitions) + && ty.is_sized(self.cx.tcx.at(DUMMY_SP), self.cx.param_env) + } => + { + FfiSafe + } + ty::RawPtr(ty::TypeAndMut { ty, .. }) | ty::Ref(_, ty, _) => { self.check_type_for_ffi(cache, ty) } diff --git a/src/test/ui/lint/lint-ctypes-fn.rs b/src/test/ui/lint/lint-ctypes-fn.rs index c9c95e714849d..67dd7abcf79ef 100644 --- a/src/test/ui/lint/lint-ctypes-fn.rs +++ b/src/test/ui/lint/lint-ctypes-fn.rs @@ -61,10 +61,8 @@ pub struct TransparentCustomZst(i32, ZeroSize); pub struct ZeroSizeWithPhantomData(PhantomData); pub extern "C" fn ptr_type1(size: *const Foo) { } -//~^ ERROR: uses type `Foo` pub extern "C" fn ptr_type2(size: *const Foo) { } -//~^ ERROR: uses type `Foo` pub extern "C" fn slice_type(p: &[u32]) { } //~^ ERROR: uses type `[u32]` @@ -159,7 +157,6 @@ pub extern "C" fn good1(size: *const libc::c_int) { } pub extern "C" fn good2(size: *const libc::c_uint) { } pub extern "C" fn unused_generic1(size: *const Foo) { } -//~^ ERROR: uses type `Foo` pub extern "C" fn unused_generic2() -> PhantomData { //~^ ERROR uses type `std::marker::PhantomData` @@ -169,7 +166,6 @@ pub extern "C" fn unused_generic2() -> PhantomData { pub extern "C" fn used_generic1(x: T) { } pub extern "C" fn used_generic2(x: T, size: *const Foo) { } -//~^ ERROR: uses type `Foo` pub extern "C" fn used_generic3() -> T { Default::default() diff --git a/src/test/ui/lint/lint-ctypes-fn.stderr b/src/test/ui/lint/lint-ctypes-fn.stderr index 3ba16b622cb59..66cf195327890 100644 --- a/src/test/ui/lint/lint-ctypes-fn.stderr +++ b/src/test/ui/lint/lint-ctypes-fn.stderr @@ -1,47 +1,19 @@ -error: `extern` fn uses type `Foo`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:63:35 +error: `extern` fn uses type `[u32]`, which is not FFI-safe + --> $DIR/lint-ctypes-fn.rs:67:33 | -LL | pub extern "C" fn ptr_type1(size: *const Foo) { } - | ^^^^^^^^^^ not FFI-safe +LL | pub extern "C" fn slice_type(p: &[u32]) { } + | ^^^^^^ not FFI-safe | note: the lint level is defined here --> $DIR/lint-ctypes-fn.rs:4:9 | LL | #![deny(improper_ctypes_definitions)] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct - = note: this struct has unspecified layout -note: the type is defined here - --> $DIR/lint-ctypes-fn.rs:34:1 - | -LL | pub struct Foo; - | ^^^^^^^^^^^^^^^ - -error: `extern` fn uses type `Foo`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:66:35 - | -LL | pub extern "C" fn ptr_type2(size: *const Foo) { } - | ^^^^^^^^^^ not FFI-safe - | - = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct - = note: this struct has unspecified layout -note: the type is defined here - --> $DIR/lint-ctypes-fn.rs:34:1 - | -LL | pub struct Foo; - | ^^^^^^^^^^^^^^^ - -error: `extern` fn uses type `[u32]`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:69:33 - | -LL | pub extern "C" fn slice_type(p: &[u32]) { } - | ^^^^^^ not FFI-safe - | = help: consider using a raw pointer instead = note: slices have no C equivalent error: `extern` fn uses type `str`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:72:31 + --> $DIR/lint-ctypes-fn.rs:70:31 | LL | pub extern "C" fn str_type(p: &str) { } | ^^^^ not FFI-safe @@ -50,7 +22,7 @@ LL | pub extern "C" fn str_type(p: &str) { } = note: string slices have no C equivalent error: `extern` fn uses type `std::boxed::Box`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:75:31 + --> $DIR/lint-ctypes-fn.rs:73:31 | LL | pub extern "C" fn box_type(p: Box) { } | ^^^^^^^^ not FFI-safe @@ -59,7 +31,7 @@ LL | pub extern "C" fn box_type(p: Box) { } = note: this struct has unspecified layout error: `extern` fn uses type `char`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:78:32 + --> $DIR/lint-ctypes-fn.rs:76:32 | LL | pub extern "C" fn char_type(p: char) { } | ^^^^ not FFI-safe @@ -68,7 +40,7 @@ LL | pub extern "C" fn char_type(p: char) { } = note: the `char` type has no C equivalent error: `extern` fn uses type `i128`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:81:32 + --> $DIR/lint-ctypes-fn.rs:79:32 | LL | pub extern "C" fn i128_type(p: i128) { } | ^^^^ not FFI-safe @@ -76,7 +48,7 @@ LL | pub extern "C" fn i128_type(p: i128) { } = note: 128-bit integers don't currently have a known stable ABI error: `extern` fn uses type `u128`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:84:32 + --> $DIR/lint-ctypes-fn.rs:82:32 | LL | pub extern "C" fn u128_type(p: u128) { } | ^^^^ not FFI-safe @@ -84,7 +56,7 @@ LL | pub extern "C" fn u128_type(p: u128) { } = note: 128-bit integers don't currently have a known stable ABI error: `extern` fn uses type `(i32, i32)`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:87:33 + --> $DIR/lint-ctypes-fn.rs:85:33 | LL | pub extern "C" fn tuple_type(p: (i32, i32)) { } | ^^^^^^^^^^ not FFI-safe @@ -93,7 +65,7 @@ LL | pub extern "C" fn tuple_type(p: (i32, i32)) { } = note: tuples have unspecified layout error: `extern` fn uses type `(i32, i32)`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:90:34 + --> $DIR/lint-ctypes-fn.rs:88:34 | LL | pub extern "C" fn tuple_type2(p: I32Pair) { } | ^^^^^^^ not FFI-safe @@ -102,7 +74,7 @@ LL | pub extern "C" fn tuple_type2(p: I32Pair) { } = note: tuples have unspecified layout error: `extern` fn uses type `ZeroSize`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:93:32 + --> $DIR/lint-ctypes-fn.rs:91:32 | LL | pub extern "C" fn zero_size(p: ZeroSize) { } | ^^^^^^^^ not FFI-safe @@ -116,7 +88,7 @@ LL | pub struct ZeroSize; | ^^^^^^^^^^^^^^^^^^^^ error: `extern` fn uses type `ZeroSizeWithPhantomData`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:96:40 + --> $DIR/lint-ctypes-fn.rs:94:40 | LL | pub extern "C" fn zero_size_phantom(p: ZeroSizeWithPhantomData) { } | ^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe @@ -129,7 +101,7 @@ LL | pub struct ZeroSizeWithPhantomData(PhantomData); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: `extern` fn uses type `std::marker::PhantomData`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:99:51 + --> $DIR/lint-ctypes-fn.rs:97:51 | LL | pub extern "C" fn zero_size_phantom_toplevel() -> PhantomData { | ^^^^^^^^^^^^^^^^^ not FFI-safe @@ -137,7 +109,7 @@ LL | pub extern "C" fn zero_size_phantom_toplevel() -> PhantomData { = note: composed only of `PhantomData` error: `extern` fn uses type `fn()`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:104:30 + --> $DIR/lint-ctypes-fn.rs:102:30 | LL | pub extern "C" fn fn_type(p: RustFn) { } | ^^^^^^ not FFI-safe @@ -146,7 +118,7 @@ LL | pub extern "C" fn fn_type(p: RustFn) { } = note: this function pointer has Rust-specific calling convention error: `extern` fn uses type `fn()`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:107:31 + --> $DIR/lint-ctypes-fn.rs:105:31 | LL | pub extern "C" fn fn_type2(p: fn()) { } | ^^^^ not FFI-safe @@ -155,7 +127,7 @@ LL | pub extern "C" fn fn_type2(p: fn()) { } = note: this function pointer has Rust-specific calling convention error: `extern` fn uses type `std::boxed::Box`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:110:35 + --> $DIR/lint-ctypes-fn.rs:108:35 | LL | pub extern "C" fn fn_contained(p: RustBadRet) { } | ^^^^^^^^^^ not FFI-safe @@ -164,7 +136,7 @@ LL | pub extern "C" fn fn_contained(p: RustBadRet) { } = note: this struct has unspecified layout error: `extern` fn uses type `i128`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:113:39 + --> $DIR/lint-ctypes-fn.rs:111:39 | LL | pub extern "C" fn transparent_i128(p: TransparentI128) { } | ^^^^^^^^^^^^^^^ not FFI-safe @@ -172,7 +144,7 @@ LL | pub extern "C" fn transparent_i128(p: TransparentI128) { } = note: 128-bit integers don't currently have a known stable ABI error: `extern` fn uses type `str`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:116:38 + --> $DIR/lint-ctypes-fn.rs:114:38 | LL | pub extern "C" fn transparent_str(p: TransparentStr) { } | ^^^^^^^^^^^^^^ not FFI-safe @@ -181,7 +153,7 @@ LL | pub extern "C" fn transparent_str(p: TransparentStr) { } = note: string slices have no C equivalent error: `extern` fn uses type `std::boxed::Box`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:119:37 + --> $DIR/lint-ctypes-fn.rs:117:37 | LL | pub extern "C" fn transparent_fn(p: TransparentBadFn) { } | ^^^^^^^^^^^^^^^^ not FFI-safe @@ -189,44 +161,16 @@ LL | pub extern "C" fn transparent_fn(p: TransparentBadFn) { } = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct = note: this struct has unspecified layout -error: `extern` fn uses type `Foo`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:161:44 - | -LL | pub extern "C" fn unused_generic1(size: *const Foo) { } - | ^^^^^^^^^^ not FFI-safe - | - = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct - = note: this struct has unspecified layout -note: the type is defined here - --> $DIR/lint-ctypes-fn.rs:34:1 - | -LL | pub struct Foo; - | ^^^^^^^^^^^^^^^ - error: `extern` fn uses type `std::marker::PhantomData`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:164:43 + --> $DIR/lint-ctypes-fn.rs:161:43 | LL | pub extern "C" fn unused_generic2() -> PhantomData { | ^^^^^^^^^^^^^^^^^ not FFI-safe | = note: composed only of `PhantomData` -error: `extern` fn uses type `Foo`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:171:48 - | -LL | pub extern "C" fn used_generic2(x: T, size: *const Foo) { } - | ^^^^^^^^^^ not FFI-safe - | - = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct - = note: this struct has unspecified layout -note: the type is defined here - --> $DIR/lint-ctypes-fn.rs:34:1 - | -LL | pub struct Foo; - | ^^^^^^^^^^^^^^^ - error: `extern` fn uses type `std::vec::Vec`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:178:39 + --> $DIR/lint-ctypes-fn.rs:174:39 | LL | pub extern "C" fn used_generic4(x: Vec) { } | ^^^^^^ not FFI-safe @@ -235,7 +179,7 @@ LL | pub extern "C" fn used_generic4(x: Vec) { } = note: this struct has unspecified layout error: `extern` fn uses type `std::vec::Vec`, which is not FFI-safe - --> $DIR/lint-ctypes-fn.rs:181:41 + --> $DIR/lint-ctypes-fn.rs:177:41 | LL | pub extern "C" fn used_generic5() -> Vec { | ^^^^^^ not FFI-safe @@ -243,5 +187,5 @@ LL | pub extern "C" fn used_generic5() -> Vec { = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct = note: this struct has unspecified layout -error: aborting due to 24 previous errors +error: aborting due to 20 previous errors From 4504648090a9b8cae909424826dc4190f23df044 Mon Sep 17 00:00:00 2001 From: David Wood Date: Sun, 21 Jun 2020 20:30:41 +0100 Subject: [PATCH 091/142] improper_ctypes: only allow params in defns mode This commit adjusts the behaviour introduced in a previous commit so that generic parameters and projections are only allowed in the definitions mode - and are otherwise a bug. Generic parameters in declarations are prohibited earlier in the compiler, so if that branch were reached, it would be a bug. Signed-off-by: David Wood --- src/librustc_lint/types.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/librustc_lint/types.rs b/src/librustc_lint/types.rs index cce6a40c23a2b..cfafb86fbedb1 100644 --- a/src/librustc_lint/types.rs +++ b/src/librustc_lint/types.rs @@ -878,9 +878,15 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { // `extern "C" fn` functions can have type parameters, which may or may not be FFI-safe, // so they are currently ignored for the purposes of this lint. - ty::Param(..) | ty::Projection(..) => FfiSafe, + ty::Param(..) | ty::Projection(..) + if matches!(self.mode, ImproperCTypesMode::Definitions) => + { + FfiSafe + } - ty::Infer(..) + ty::Param(..) + | ty::Projection(..) + | ty::Infer(..) | ty::Bound(..) | ty::Error(_) | ty::Closure(..) From 65becefd4ac378c9c6aa0e7becb7eaa1fc12b84f Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Wed, 24 Jun 2020 13:19:06 +0200 Subject: [PATCH 092/142] Clean up E0701 explanation --- src/librustc_error_codes/error_codes/E0701.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc_error_codes/error_codes/E0701.md b/src/librustc_error_codes/error_codes/E0701.md index 87f416ada1803..4965e64310591 100644 --- a/src/librustc_error_codes/error_codes/E0701.md +++ b/src/librustc_error_codes/error_codes/E0701.md @@ -1,7 +1,7 @@ This error indicates that a `#[non_exhaustive]` attribute was incorrectly placed on something other than a struct or enum. -Examples of erroneous code: +Erroneous code example: ```compile_fail,E0701 #[non_exhaustive] From 03661630c92365572bc5bbe51677f1190bab2131 Mon Sep 17 00:00:00 2001 From: Alexis Bourget Date: Wed, 24 Jun 2020 13:52:57 +0200 Subject: [PATCH 093/142] Document the self keyword --- src/libstd/keyword_docs.rs | 88 +++++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 2 deletions(-) diff --git a/src/libstd/keyword_docs.rs b/src/libstd/keyword_docs.rs index a4996d9eee810..6d98c4d01c040 100644 --- a/src/libstd/keyword_docs.rs +++ b/src/libstd/keyword_docs.rs @@ -1009,9 +1009,93 @@ mod return_keyword {} // /// The receiver of a method, or the current module. /// -/// The documentation for this keyword is [not yet complete]. Pull requests welcome! +/// `self` is used in two situations: referencing the current module and marking +/// the receiver of a method. /// -/// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 +/// In paths, `self` can be used to refer to the current module, either in a +/// [`use`] statement or in a path to access an element: +/// +/// ``` +/// # #![allow(unused_imports)] +/// use std::io::{self, Read}; +/// ``` +/// +/// Is functionally the same as: +/// +/// ``` +/// # #![allow(unused_imports)] +/// use std::io; +/// use std::io::Read; +/// ``` +/// +/// Using `self` to access an element in the current module: +/// +/// ``` +/// # #![allow(dead_code)] +/// # fn main() {} +/// fn foo() {} +/// fn bar() { +/// self::foo() +/// } +/// ``` +/// +/// `self` as the current receiver for a method allows to omit the parameter +/// type most of the time. With the exception of this particularity, `self` is +/// used much like any other parameter: +/// +/// ``` +/// struct Foo(i32); +/// +/// impl Foo { +/// // No `self`. +/// fn new() -> Self { +/// Self(0) +/// } +/// +/// // Consuming `self`. +/// fn consume(self) -> Self { +/// Self(self.0 + 1) +/// } +/// +/// // Borrowing `self`. +/// fn borrow(&self) -> &i32 { +/// &self.0 +/// } +/// +/// // Borrowing `self` mutably. +/// fn borrow_mut(&mut self) -> &mut i32 { +/// &mut self.0 +/// } +/// } +/// +/// // This method must be called with a `Type::` prefix. +/// let foo = Foo::new(); +/// assert_eq!(foo.0, 0); +/// +/// // Those two calls produces the same result. +/// let foo = Foo::consume(foo); +/// assert_eq!(foo.0, 1); +/// let foo = foo.consume(); +/// assert_eq!(foo.0, 2); +/// +/// // Borrowing is handled automatically with the second syntax. +/// let borrow_1 = Foo::borrow(&foo); +/// let borrow_2 = foo.borrow(); +/// assert_eq!(borrow_1, borrow_2); +/// +/// // Borrowing mutably is handled automatically too with the second syntax. +/// let mut foo = Foo::new(); +/// *Foo::borrow_mut(&mut foo) += 1; +/// assert_eq!(foo.0, 1); +/// *foo.borrow_mut() += 1; +/// assert_eq!(foo.0, 2); +/// ``` +/// +/// Note that this automatic conversion when calling `foo.method()` is not +/// limited to the examples above. See the [Reference] for more information. +/// +/// [`use`]: keyword.use.html +/// [Reference]: ../reference/items/associated-items.html#methods mod self_keyword {} #[doc(keyword = "Self")] From f44b8b96aa30d03c8e4de56a13f656a422910dec Mon Sep 17 00:00:00 2001 From: Alexis Bourget Date: Wed, 24 Jun 2020 14:52:18 +0200 Subject: [PATCH 094/142] Document the Self keyword --- src/libstd/keyword_docs.rs | 59 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/src/libstd/keyword_docs.rs b/src/libstd/keyword_docs.rs index a4996d9eee810..74b7837593489 100644 --- a/src/libstd/keyword_docs.rs +++ b/src/libstd/keyword_docs.rs @@ -1019,11 +1019,66 @@ mod self_keyword {} /// The implementing type within a [`trait`] or [`impl`] block, or the current type within a type /// definition. /// -/// The documentation for this keyword is [not yet complete]. Pull requests welcome! +/// Within a type definition: +/// +/// ``` +/// # #![allow(dead_code)] +/// struct Node { +/// elem: i32, +/// // `Self` is a `Node` here. +/// next: Option>, +/// } +/// ``` +/// +/// In an [`impl`] block: +/// +/// ``` +/// struct Foo(i32); +/// +/// impl Foo { +/// fn new() -> Self { +/// Self(0) +/// } +/// } +/// +/// assert_eq!(Foo::new().0, Foo(0).0); +/// ``` +/// +/// Generic parameters are implicit with `Self`: +/// +/// ``` +/// # #![allow(dead_code)] +/// struct Wrap { +/// elem: T, +/// } +/// +/// impl Wrap { +/// fn new(elem: T) -> Self { +/// Self { elem } +/// } +/// } +/// ``` +/// +/// In a [`trait`] definition and related [`impl`] block: +/// +/// ``` +/// trait Example { +/// fn example() -> Self; +/// } +/// +/// struct Foo(i32); +/// +/// impl Example for Foo { +/// fn example() -> Self { +/// Self(42) +/// } +/// } +/// +/// assert_eq!(Foo::example().0, Foo(42).0); +/// ``` /// /// [`impl`]: keyword.impl.html /// [`trait`]: keyword.trait.html -/// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 mod self_upper_keyword {} #[doc(keyword = "static")] From 78baf421aa31ccd04243ee6b6e804999f835f880 Mon Sep 17 00:00:00 2001 From: LeSeulArtichaut Date: Wed, 24 Jun 2020 15:33:08 +0200 Subject: [PATCH 095/142] Add procedure for prioritization notifications on Zulip --- triagebot.toml | 76 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 7 deletions(-) diff --git a/triagebot.toml b/triagebot.toml index 5361a618d4e85..a939a3e8106e2 100644 --- a/triagebot.toml +++ b/triagebot.toml @@ -78,42 +78,104 @@ exclude_labels = [ [notify-zulip."I-prioritize"] zulip_stream = 227806 # #t-compiler/wg-prioritization topic = "I-prioritize #{number} {title}" -message_on_add = "@*WG-prioritization* issue #{number} has been requested for prioritization." +message_on_add = """\ +@*WG-prioritization* issue #{number} has been requested for prioritization. + +# [Procedure](https://hackmd.io/WJ0G17DHTHGgv0OW9I2PxA?view#Unprioritized-I-prioritize) +- Priority? +- Regression? +- Notify people/groups? +- Needs `I-nominated`? +""" message_on_remove = "Issue #{number}'s prioritization request has been removed." [notify-zulip."I-nominated"] required_labels = ["T-compiler"] zulip_stream = 227806 # #t-compiler/wg-prioritization topic = "I-prioritize #{number} {title}" -message_on_add = "@*WG-prioritization* #{number} has been nominated for discussion in `T-compiler` meeting." +message_on_add = """\ +#{number} has been nominated for discussion in `T-compiler` meeting. + +# [Procedure](https://hackmd.io/WJ0G17DHTHGgv0OW9I2PxA?view#I-nominated) +- Already discussed? +- Worth the meeting time? +- Add agenda entry: + - Why nominated? + - Assignee? + - Issue? PR? What's the status? + - Summary and important details? +""" message_on_remove = "#{number}'s nomination has been removed." [notify-zulip."beta-nominated"] zulip_stream = 227806 # #t-compiler/wg-prioritization topic = "Backport #{number} {title}" -message_on_add = "@*WG-prioritization* PR #{number} has been requested for beta backport." +message_on_add = """\ +PR #{number} has been requested for beta backport. + +# [Procedure](https://hackmd.io/WJ0G17DHTHGgv0OW9I2PxA?view#StableBeta-nominations) +Prepare agenda entry: +- Why nominated? +- Author, assignee? +- Important details? +""" message_on_remove = "PR #{number}'s beta backport request has been removed." [notify-zulip."stable-nominated"] zulip_stream = 227806 # #t-compiler/wg-prioritization topic = "Backport #{number} {title}" -message_on_add = "@*WG-prioritization* PR #{number} has been requested for stable backport." +message_on_add = """\ +PR #{number} has been requested for stable backport. + +# [Procedure](https://hackmd.io/WJ0G17DHTHGgv0OW9I2PxA?view#StableBeta-nominations) +Prepare agenda entry: +- Why nominated? +- Author, assignee? +- Important details? +""" message_on_remove = "PR #{number}'s stable backport request has been removed." [notify-zulip."S-waiting-on-team"] required_labels = ["T-compiler"] zulip_stream = 227806 # #t-compiler/wg-prioritization topic = "S-waiting-on-team #{number} {title}" -message_on_add = "@*WG-prioritization* PR #{number} is waiting on `T-compiler`." +message_on_add = """\ +PR #{number} is waiting on `T-compiler`. + +# [Procedure](https://hackmd.io/WJ0G17DHTHGgv0OW9I2PxA?view#PR%E2%80%99s-waiting-on-team) +- Prepare agenda entry: + - What is it waiting for? + - Important details? +- Could be resolved quickly? Tag `I-nominated`. +""" message_on_remove = "PR #{number}'s is no longer waiting on `T-compiler`." [notify-zulip."P-critical"] zulip_stream = 227806 # #t-compiler/wg-prioritization topic = "P-critical #{number} {title}" -message_on_add = "@*WG-prioritization* issue #{number} has been assigned `P-critical`." +message_on_add = """\ +Issue #{number} has been assigned `P-critical`. + +# [Procedure](https://hackmd.io/WJ0G17DHTHGgv0OW9I2PxA?view#P-critical-and-Unassigned-P-high-regressions) +- Notify people/groups? +- Assign if possible? +- Add to agenda: + - Assignee? + - Summary and important details? +- Other actions to move forward? +""" [notify-zulip."P-high"] required_labels = ["regression-from-stable-to-[bn]*"] # only nightly and beta regressions zulip_stream = 227806 # #t-compiler/wg-prioritization topic = "P-high regression #{number} {title}" -message_on_add = "@*WG-prioritization* issue #{number} has been assigned `P-high` and is a regression." +message_on_add = """\ +Issue #{number} has been assigned `P-high` and is a regression. + +# [Procedure](https://hackmd.io/WJ0G17DHTHGgv0OW9I2PxA?view#P-critical-and-Unassigned-P-high-regressions) +Is issue assigned? If not: +- Try to find an assignee? +- Otherwise add to agenda: + - Mark as unassigned. + - Summary and important details? +""" From d36d351afcb439144621159d8642892cde26eff6 Mon Sep 17 00:00:00 2001 From: Nathan Corbyn Date: Tue, 23 Jun 2020 16:46:24 +0100 Subject: [PATCH 096/142] Implement intrinsic --- src/libcore/intrinsics.rs | 15 ++++++++ src/libcore/lib.rs | 1 + src/libcore/mem/mod.rs | 27 +++++++++++++ src/librustc_codegen_llvm/intrinsic.rs | 2 +- src/librustc_mir/interpret/intrinsics.rs | 14 ++++++- src/librustc_span/symbol.rs | 1 + src/librustc_typeck/check/intrinsic.rs | 6 ++- src/test/ui/consts/const-variant-count.rs | 46 +++++++++++++++++++++++ 8 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 src/test/ui/consts/const-variant-count.rs diff --git a/src/libcore/intrinsics.rs b/src/libcore/intrinsics.rs index 50e321f9c7158..4074087e1e67f 100644 --- a/src/libcore/intrinsics.rs +++ b/src/libcore/intrinsics.rs @@ -1917,6 +1917,15 @@ extern "rust-intrinsic" { #[rustc_const_unstable(feature = "const_discriminant", issue = "69821")] pub fn discriminant_value(v: &T) -> ::Discriminant; + /// Returns the number of variants of the type `T` cast to a `usize`; + /// if `T` has no variants, returns 0. Uninhabited variants will be counted. + /// + /// The to-be-stabilized version of this intrinsic is + /// [`std::mem::variant_count`](../../std/mem/fn.variant_count.html) + #[rustc_const_unstable(feature = "variant_count", issue = "73662")] + #[cfg(not(bootstrap))] + pub fn variant_count() -> usize; + /// Rust's "try catch" construct which invokes the function pointer `try_fn` /// with the data pointer `data`. /// @@ -1960,6 +1969,12 @@ extern "rust-intrinsic" { pub fn ptr_guaranteed_ne(ptr: *const T, other: *const T) -> bool; } +#[rustc_const_unstable(feature = "variant_count", issue = "73662")] +#[cfg(bootstrap)] +pub const fn variant_count() -> usize { + 0 +} + // Some functions are defined here because they accidentally got made // available in this module on stable. See . // (`transmute` also falls into this category, but it cannot be wrapped due to the diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index 4eb2fdbd07868..2b26e5303a89c 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -124,6 +124,7 @@ #![feature(unsized_locals)] #![feature(untagged_unions)] #![feature(unwind_attributes)] +#![feature(variant_count)] #![feature(doc_alias)] #![feature(mmx_target_feature)] #![feature(tbm_target_feature)] diff --git a/src/libcore/mem/mod.rs b/src/libcore/mem/mod.rs index 066bb8b3dc787..d041571f26079 100644 --- a/src/libcore/mem/mod.rs +++ b/src/libcore/mem/mod.rs @@ -999,3 +999,30 @@ impl fmt::Debug for Discriminant { pub const fn discriminant(v: &T) -> Discriminant { Discriminant(intrinsics::discriminant_value(v)) } + +/// Returns the number of variants in the enum type `T`. +/// +/// If `T` is not an enum, calling this function will not result in undefined behavior, but the +/// return value is unspecified. Equally, if `T` is an enum with more variants than `usize::MAX` +/// the return value is unspecified. Uninhabited variants will be counted. +/// +/// # Examples +/// +/// ``` +/// use std::mem; +/// +/// enum Void {} +/// enum Foo { A(&'static str), B(i32), C(i32) } +/// +/// assert_eq!(mem::variant_count::(), 0); +/// assert_eq!(mem::variant_count::(), 3); +/// +/// assert_eq!(mem::variant_count::>(), 2); +/// assert_eq!(mem::variant_count::>(), 2); +/// ``` +#[inline(always)] +#[unstable(feature = "variant_count", issue = "73662")] +#[rustc_const_unstable(feature = "variant_count", issue = "73662")] +pub const fn variant_count() -> usize { + intrinsics::variant_count::() +} diff --git a/src/librustc_codegen_llvm/intrinsic.rs b/src/librustc_codegen_llvm/intrinsic.rs index 0a8525f06fa3d..e43c814a6125e 100644 --- a/src/librustc_codegen_llvm/intrinsic.rs +++ b/src/librustc_codegen_llvm/intrinsic.rs @@ -213,7 +213,7 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> { } } "size_of" | "pref_align_of" | "min_align_of" | "needs_drop" | "type_id" - | "type_name" => { + | "type_name" | "variant_count" => { let value = self .tcx .const_eval_instance(ty::ParamEnv::reveal_all(), instance, None) diff --git a/src/librustc_mir/interpret/intrinsics.rs b/src/librustc_mir/interpret/intrinsics.rs index 6ac1e6be03674..88ba28dab82e1 100644 --- a/src/librustc_mir/interpret/intrinsics.rs +++ b/src/librustc_mir/interpret/intrinsics.rs @@ -69,6 +69,13 @@ crate fn eval_nullary_intrinsic<'tcx>( ConstValue::from_machine_usize(n, &tcx) } sym::type_id => ConstValue::from_u64(tcx.type_id_hash(tp_ty)), + sym::variant_count => { + if let ty::Adt(ref adt, _) = tp_ty.kind { + ConstValue::from_machine_usize(adt.variants.len() as u64, &tcx) + } else { + ConstValue::from_machine_usize(0u64, &tcx) + } + } other => bug!("`{}` is not a zero arg intrinsic", other), }) } @@ -109,10 +116,13 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { | sym::needs_drop | sym::size_of | sym::type_id - | sym::type_name => { + | sym::type_name + | sym::variant_count => { let gid = GlobalId { instance, promoted: None }; let ty = match intrinsic_name { - sym::min_align_of | sym::pref_align_of | sym::size_of => self.tcx.types.usize, + sym::min_align_of | sym::pref_align_of | sym::size_of | sym::variant_count => { + self.tcx.types.usize + } sym::needs_drop => self.tcx.types.bool, sym::type_id => self.tcx.types.u64, sym::type_name => self.tcx.mk_static_str(), diff --git a/src/librustc_span/symbol.rs b/src/librustc_span/symbol.rs index 06d1f36622b94..07b05d37ed303 100644 --- a/src/librustc_span/symbol.rs +++ b/src/librustc_span/symbol.rs @@ -830,6 +830,7 @@ symbols! { v1, val, var, + variant_count, vec, Vec, version, diff --git a/src/librustc_typeck/check/intrinsic.rs b/src/librustc_typeck/check/intrinsic.rs index ef6c7c14404a7..1c0b22ca7370b 100644 --- a/src/librustc_typeck/check/intrinsic.rs +++ b/src/librustc_typeck/check/intrinsic.rs @@ -75,7 +75,7 @@ pub fn intrinsic_operation_unsafety(intrinsic: &str) -> hir::Unsafety { | "saturating_sub" | "rotate_left" | "rotate_right" | "ctpop" | "ctlz" | "cttz" | "bswap" | "bitreverse" | "discriminant_value" | "type_id" | "likely" | "unlikely" | "ptr_guaranteed_eq" | "ptr_guaranteed_ne" | "minnumf32" | "minnumf64" | "maxnumf32" - | "maxnumf64" | "type_name" => hir::Unsafety::Normal, + | "maxnumf64" | "type_name" | "variant_count" => hir::Unsafety::Normal, _ => hir::Unsafety::Unsafe, } } @@ -137,7 +137,9 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) { let unsafety = intrinsic_operation_unsafety(&name[..]); let (n_tps, inputs, output) = match &name[..] { "breakpoint" => (0, Vec::new(), tcx.mk_unit()), - "size_of" | "pref_align_of" | "min_align_of" => (1, Vec::new(), tcx.types.usize), + "size_of" | "pref_align_of" | "min_align_of" | "variant_count" => { + (1, Vec::new(), tcx.types.usize) + } "size_of_val" | "min_align_of_val" => { (1, vec![tcx.mk_imm_ptr(param(0))], tcx.types.usize) } diff --git a/src/test/ui/consts/const-variant-count.rs b/src/test/ui/consts/const-variant-count.rs new file mode 100644 index 0000000000000..f21f6e9c29168 --- /dev/null +++ b/src/test/ui/consts/const-variant-count.rs @@ -0,0 +1,46 @@ +// run-pass +#![allow(dead_code)] +#![feature(variant_count)] + +use std::mem::variant_count; + +enum Void {} + +enum Foo { + A, + B, + C, +} + +enum Bar { + A, + B, + C, + D(usize), + E { field_1: usize, field_2: Foo }, +} + +struct Baz { + a: u32, + b: *const u8, +} + +const TEST_VOID: usize = variant_count::(); +const TEST_FOO: usize = variant_count::(); +const TEST_BAR: usize = variant_count::(); + +const NO_ICE_STRUCT: usize = variant_count::(); +const NO_ICE_BOOL: usize = variant_count::(); +const NO_ICE_PRIM: usize = variant_count::<*const u8>(); + +fn main() { + assert_eq!(TEST_VOID, 0); + assert_eq!(TEST_FOO, 3); + assert_eq!(TEST_BAR, 5); + assert_eq!(variant_count::(), 0); + assert_eq!(variant_count::(), 3); + assert_eq!(variant_count::(), 5); + assert_eq!(variant_count::>(), 2); + assert_eq!(variant_count::>(), 2); + assert_eq!(variant_count::>(), 2); +} From c2dfc25c0eeb74d6c723312d612cd6899058971c Mon Sep 17 00:00:00 2001 From: Nathan Corbyn Date: Wed, 24 Jun 2020 15:10:10 +0100 Subject: [PATCH 097/142] Fix tests --- src/libcore/mem/mod.rs | 2 ++ src/test/ui/consts/const-variant-count.rs | 1 + 2 files changed, 3 insertions(+) diff --git a/src/libcore/mem/mod.rs b/src/libcore/mem/mod.rs index d041571f26079..2be105e68eb79 100644 --- a/src/libcore/mem/mod.rs +++ b/src/libcore/mem/mod.rs @@ -1009,6 +1009,8 @@ pub const fn discriminant(v: &T) -> Discriminant { /// # Examples /// /// ``` +/// # #![feature(never_type)] +/// /// use std::mem; /// /// enum Void {} diff --git a/src/test/ui/consts/const-variant-count.rs b/src/test/ui/consts/const-variant-count.rs index f21f6e9c29168..455419d2c7f1d 100644 --- a/src/test/ui/consts/const-variant-count.rs +++ b/src/test/ui/consts/const-variant-count.rs @@ -1,6 +1,7 @@ // run-pass #![allow(dead_code)] #![feature(variant_count)] +#![feature(never_type)] use std::mem::variant_count; From 493199626baf8a0a8f6d3a19a089165d18b3f1fb Mon Sep 17 00:00:00 2001 From: Nathan Corbyn Date: Wed, 24 Jun 2020 15:36:04 +0100 Subject: [PATCH 098/142] Fix tests --- src/libcore/mem/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libcore/mem/mod.rs b/src/libcore/mem/mod.rs index 2be105e68eb79..1bd7ae3a34ebb 100644 --- a/src/libcore/mem/mod.rs +++ b/src/libcore/mem/mod.rs @@ -1010,6 +1010,7 @@ pub const fn discriminant(v: &T) -> Discriminant { /// /// ``` /// # #![feature(never_type)] +/// # #![feature(variant_count)] /// /// use std::mem; /// From 5881b52d9af78fad44320bfe1a8be9369160205c Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Wed, 24 Jun 2020 12:32:44 -0300 Subject: [PATCH 099/142] Change wg-prioritization stream --- triagebot.toml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/triagebot.toml b/triagebot.toml index a939a3e8106e2..6b57b6340049a 100644 --- a/triagebot.toml +++ b/triagebot.toml @@ -76,7 +76,7 @@ exclude_labels = [ ] [notify-zulip."I-prioritize"] -zulip_stream = 227806 # #t-compiler/wg-prioritization +zulip_stream = 245100 # #t-compiler/wg-prioritization/alerts topic = "I-prioritize #{number} {title}" message_on_add = """\ @*WG-prioritization* issue #{number} has been requested for prioritization. @@ -91,7 +91,7 @@ message_on_remove = "Issue #{number}'s prioritization request has been removed." [notify-zulip."I-nominated"] required_labels = ["T-compiler"] -zulip_stream = 227806 # #t-compiler/wg-prioritization +zulip_stream = 245100 # #t-compiler/wg-prioritization/alerts topic = "I-prioritize #{number} {title}" message_on_add = """\ #{number} has been nominated for discussion in `T-compiler` meeting. @@ -108,7 +108,7 @@ message_on_add = """\ message_on_remove = "#{number}'s nomination has been removed." [notify-zulip."beta-nominated"] -zulip_stream = 227806 # #t-compiler/wg-prioritization +zulip_stream = 245100 # #t-compiler/wg-prioritization/alerts topic = "Backport #{number} {title}" message_on_add = """\ PR #{number} has been requested for beta backport. @@ -122,7 +122,7 @@ Prepare agenda entry: message_on_remove = "PR #{number}'s beta backport request has been removed." [notify-zulip."stable-nominated"] -zulip_stream = 227806 # #t-compiler/wg-prioritization +zulip_stream = 245100 # #t-compiler/wg-prioritization/alerts topic = "Backport #{number} {title}" message_on_add = """\ PR #{number} has been requested for stable backport. @@ -137,7 +137,7 @@ message_on_remove = "PR #{number}'s stable backport request has been removed." [notify-zulip."S-waiting-on-team"] required_labels = ["T-compiler"] -zulip_stream = 227806 # #t-compiler/wg-prioritization +zulip_stream = 245100 # #t-compiler/wg-prioritization/alerts topic = "S-waiting-on-team #{number} {title}" message_on_add = """\ PR #{number} is waiting on `T-compiler`. @@ -151,7 +151,7 @@ PR #{number} is waiting on `T-compiler`. message_on_remove = "PR #{number}'s is no longer waiting on `T-compiler`." [notify-zulip."P-critical"] -zulip_stream = 227806 # #t-compiler/wg-prioritization +zulip_stream = 245100 # #t-compiler/wg-prioritization/alerts topic = "P-critical #{number} {title}" message_on_add = """\ Issue #{number} has been assigned `P-critical`. @@ -167,7 +167,7 @@ Issue #{number} has been assigned `P-critical`. [notify-zulip."P-high"] required_labels = ["regression-from-stable-to-[bn]*"] # only nightly and beta regressions -zulip_stream = 227806 # #t-compiler/wg-prioritization +zulip_stream = 245100 # #t-compiler/wg-prioritization/alerts topic = "P-high regression #{number} {title}" message_on_add = """\ Issue #{number} has been assigned `P-high` and is a regression. From ff068762a0a1a7bc9559101ba74d16862b7028b6 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Wed, 24 Jun 2020 12:36:17 -0300 Subject: [PATCH 100/142] Alert @WG-prioritization/alerts instead of @WG-prioritization --- triagebot.toml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/triagebot.toml b/triagebot.toml index 6b57b6340049a..73ca7abfed363 100644 --- a/triagebot.toml +++ b/triagebot.toml @@ -79,7 +79,7 @@ exclude_labels = [ zulip_stream = 245100 # #t-compiler/wg-prioritization/alerts topic = "I-prioritize #{number} {title}" message_on_add = """\ -@*WG-prioritization* issue #{number} has been requested for prioritization. +@*WG-prioritization/alerts* issue #{number} has been requested for prioritization. # [Procedure](https://hackmd.io/WJ0G17DHTHGgv0OW9I2PxA?view#Unprioritized-I-prioritize) - Priority? @@ -94,7 +94,7 @@ required_labels = ["T-compiler"] zulip_stream = 245100 # #t-compiler/wg-prioritization/alerts topic = "I-prioritize #{number} {title}" message_on_add = """\ -#{number} has been nominated for discussion in `T-compiler` meeting. +@*WG-prioritization/alerts* #{number} has been nominated for discussion in `T-compiler` meeting. # [Procedure](https://hackmd.io/WJ0G17DHTHGgv0OW9I2PxA?view#I-nominated) - Already discussed? @@ -111,7 +111,7 @@ message_on_remove = "#{number}'s nomination has been removed." zulip_stream = 245100 # #t-compiler/wg-prioritization/alerts topic = "Backport #{number} {title}" message_on_add = """\ -PR #{number} has been requested for beta backport. +@*WG-prioritization/alerts* PR #{number} has been requested for beta backport. # [Procedure](https://hackmd.io/WJ0G17DHTHGgv0OW9I2PxA?view#StableBeta-nominations) Prepare agenda entry: @@ -125,7 +125,7 @@ message_on_remove = "PR #{number}'s beta backport request has been removed." zulip_stream = 245100 # #t-compiler/wg-prioritization/alerts topic = "Backport #{number} {title}" message_on_add = """\ -PR #{number} has been requested for stable backport. +@*WG-prioritization/alerts* PR #{number} has been requested for stable backport. # [Procedure](https://hackmd.io/WJ0G17DHTHGgv0OW9I2PxA?view#StableBeta-nominations) Prepare agenda entry: @@ -140,7 +140,7 @@ required_labels = ["T-compiler"] zulip_stream = 245100 # #t-compiler/wg-prioritization/alerts topic = "S-waiting-on-team #{number} {title}" message_on_add = """\ -PR #{number} is waiting on `T-compiler`. +@*WG-prioritization/alerts* PR #{number} is waiting on `T-compiler`. # [Procedure](https://hackmd.io/WJ0G17DHTHGgv0OW9I2PxA?view#PR%E2%80%99s-waiting-on-team) - Prepare agenda entry: @@ -154,7 +154,7 @@ message_on_remove = "PR #{number}'s is no longer waiting on `T-compiler`." zulip_stream = 245100 # #t-compiler/wg-prioritization/alerts topic = "P-critical #{number} {title}" message_on_add = """\ -Issue #{number} has been assigned `P-critical`. +@*WG-prioritization/alerts* issue #{number} has been assigned `P-critical`. # [Procedure](https://hackmd.io/WJ0G17DHTHGgv0OW9I2PxA?view#P-critical-and-Unassigned-P-high-regressions) - Notify people/groups? @@ -170,7 +170,7 @@ required_labels = ["regression-from-stable-to-[bn]*"] # only nightly and beta re zulip_stream = 245100 # #t-compiler/wg-prioritization/alerts topic = "P-high regression #{number} {title}" message_on_add = """\ -Issue #{number} has been assigned `P-high` and is a regression. +@*WG-prioritization/alerts* issue #{number} has been assigned `P-high` and is a regression. # [Procedure](https://hackmd.io/WJ0G17DHTHGgv0OW9I2PxA?view#P-critical-and-Unassigned-P-high-regressions) Is issue assigned? If not: From 771a1d8e0ad4e6702aaab91cb5e58adbf3ec3708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20S=C3=A1nchez=20Mu=C3=B1oz?= Date: Wed, 24 Jun 2020 18:17:27 +0200 Subject: [PATCH 101/142] Make `std::panicking::panic_count::is_zero` inline and move the slow path into a separate cold function. --- src/libstd/panicking.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/libstd/panicking.rs b/src/libstd/panicking.rs index 46196960e718b..9a5d5e2b5ae9f 100644 --- a/src/libstd/panicking.rs +++ b/src/libstd/panicking.rs @@ -258,6 +258,7 @@ pub mod panic_count { LOCAL_PANIC_COUNT.with(|c| c.get()) } + #[inline] pub fn is_zero() -> bool { if GLOBAL_PANIC_COUNT.load(Ordering::Relaxed) == 0 { // Fast path: if `GLOBAL_PANIC_COUNT` is zero, all threads @@ -265,9 +266,17 @@ pub mod panic_count { // equal to zero, so TLS access can be avoided. true } else { - LOCAL_PANIC_COUNT.with(|c| c.get() == 0) + is_zero_slow_path() } } + + // Slow path is in a separate function to reduce the amount of code + // inlined from `is_zero`. + #[inline(never)] + #[cold] + fn is_zero_slow_path() -> bool { + LOCAL_PANIC_COUNT.with(|c| c.get() == 0) + } } #[cfg(test)] @@ -350,6 +359,7 @@ pub unsafe fn r#try R>(f: F) -> Result> } /// Determines whether the current thread is unwinding because of panic. +#[inline] pub fn panicking() -> bool { !panic_count::is_zero() } From 09af1845d7b43c0a17c1b98f6be92c2c0fbc202b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Wed, 24 Jun 2020 14:16:41 -0700 Subject: [PATCH 102/142] review comments: clean up code * deduplicate logic * fix typos * remove unnecessary state --- src/librustc_typeck/check/method/mod.rs | 3 +- src/librustc_typeck/check/method/probe.rs | 4 +- src/librustc_typeck/check/op.rs | 502 +++++++++------------- src/test/ui/issues/issue-5239-1.stderr | 2 +- 4 files changed, 214 insertions(+), 297 deletions(-) diff --git a/src/librustc_typeck/check/method/mod.rs b/src/librustc_typeck/check/method/mod.rs index ac3fa15417e9c..ad980fd2f1215 100644 --- a/src/librustc_typeck/check/method/mod.rs +++ b/src/librustc_typeck/check/method/mod.rs @@ -296,8 +296,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { opt_input_types: Option<&[Ty<'tcx>]>, ) -> Option>> { debug!( - "lookup_in_trait_adjusted(self_ty={:?}, \ - m_name={}, trait_def_id={:?})", + "lookup_in_trait_adjusted(self_ty={:?}, m_name={}, trait_def_id={:?})", self_ty, m_name, trait_def_id ); diff --git a/src/librustc_typeck/check/method/probe.rs b/src/librustc_typeck/check/method/probe.rs index 93bcd5cf29149..093f76be00865 100644 --- a/src/librustc_typeck/check/method/probe.rs +++ b/src/librustc_typeck/check/method/probe.rs @@ -379,8 +379,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { self.tcx.sess, span, E0699, - "the type of this value must be known \ - to call a method on a raw pointer on it" + "the type of this value must be known to call a method on a raw pointer on \ + it" ) .emit(); } else { diff --git a/src/librustc_typeck/check/op.rs b/src/librustc_typeck/check/op.rs index 7acf884318573..0184c00c475b5 100644 --- a/src/librustc_typeck/check/op.rs +++ b/src/librustc_typeck/check/op.rs @@ -251,303 +251,222 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { method.sig.output() } + // error types are considered "builtin" + Err(()) if lhs_ty.references_error() || rhs_ty.references_error() => { + self.tcx.ty_error() + } Err(()) => { - // error types are considered "builtin" - if !lhs_ty.references_error() && !rhs_ty.references_error() { - let source_map = self.tcx.sess.source_map(); - - let note = |err: &mut DiagnosticBuilder<'_>, missing_trait| { - err.note(&format!( - "the trait `{}` is not implemented for `{}`", - missing_trait, lhs_ty - )); - }; - match is_assign { - IsAssign::Yes => { - let mut err = struct_span_err!( - self.tcx.sess, - expr.span, - E0368, - "binary assignment operation `{}=` cannot be applied to type `{}`", - op.node.as_str(), + let source_map = self.tcx.sess.source_map(); + let (mut err, missing_trait, use_output, involves_fn) = match is_assign { + IsAssign::Yes => { + let mut err = struct_span_err!( + self.tcx.sess, + expr.span, + E0368, + "binary assignment operation `{}=` cannot be applied to type `{}`", + op.node.as_str(), + lhs_ty, + ); + err.span_label( + lhs_expr.span, + format!("cannot use `{}=` on type `{}`", op.node.as_str(), lhs_ty), + ); + let missing_trait = match op.node { + hir::BinOpKind::Add => Some("std::ops::AddAssign"), + hir::BinOpKind::Sub => Some("std::ops::SubAssign"), + hir::BinOpKind::Mul => Some("std::ops::MulAssign"), + hir::BinOpKind::Div => Some("std::ops::DivAssign"), + hir::BinOpKind::Rem => Some("std::ops::RemAssign"), + hir::BinOpKind::BitAnd => Some("std::ops::BitAndAssign"), + hir::BinOpKind::BitXor => Some("std::ops::BitXorAssign"), + hir::BinOpKind::BitOr => Some("std::ops::BitOrAssign"), + hir::BinOpKind::Shl => Some("std::ops::ShlAssign"), + hir::BinOpKind::Shr => Some("std::ops::ShrAssign"), + _ => None, + }; + (err, missing_trait, false, false) + } + IsAssign::No => { + let (message, missing_trait, use_output) = match op.node { + hir::BinOpKind::Add => ( + format!("cannot add `{}` to `{}`", rhs_ty, lhs_ty), + Some("std::ops::Add"), + true, + ), + hir::BinOpKind::Sub => ( + format!("cannot subtract `{}` from `{}`", rhs_ty, lhs_ty), + Some("std::ops::Sub"), + true, + ), + hir::BinOpKind::Mul => ( + format!("cannot multiply `{}` to `{}`", rhs_ty, lhs_ty), + Some("std::ops::Mul"), + true, + ), + hir::BinOpKind::Div => ( + format!("cannot divide `{}` by `{}`", lhs_ty, rhs_ty), + Some("std::ops::Div"), + true, + ), + hir::BinOpKind::Rem => ( + format!("cannot mod `{}` by `{}`", lhs_ty, rhs_ty), + Some("std::ops::Rem"), + true, + ), + hir::BinOpKind::BitAnd => ( + format!("no implementation for `{} & {}`", lhs_ty, rhs_ty), + Some("std::ops::BitAnd"), + true, + ), + hir::BinOpKind::BitXor => ( + format!("no implementation for `{} ^ {}`", lhs_ty, rhs_ty), + Some("std::ops::BitXor"), + true, + ), + hir::BinOpKind::BitOr => ( + format!("no implementation for `{} | {}`", lhs_ty, rhs_ty), + Some("std::ops::BitOr"), + true, + ), + hir::BinOpKind::Shl => ( + format!("no implementation for `{} << {}`", lhs_ty, rhs_ty), + Some("std::ops::Shl"), + true, + ), + hir::BinOpKind::Shr => ( + format!("no implementation for `{} >> {}`", lhs_ty, rhs_ty), + Some("std::ops::Shr"), + true, + ), + hir::BinOpKind::Eq | hir::BinOpKind::Ne => ( + format!( + "binary operation `{}` cannot be applied to type `{}`", + op.node.as_str(), + lhs_ty + ), + Some("std::cmp::PartialEq"), + false, + ), + hir::BinOpKind::Lt + | hir::BinOpKind::Le + | hir::BinOpKind::Gt + | hir::BinOpKind::Ge => ( + format!( + "binary operation `{}` cannot be applied to type `{}`", + op.node.as_str(), + lhs_ty + ), + Some("std::cmp::PartialOrd"), + false, + ), + _ => ( + format!( + "binary operation `{}` cannot be applied to type `{}`", + op.node.as_str(), + lhs_ty + ), + None, + false, + ), + }; + let mut err = + struct_span_err!(self.tcx.sess, op.span, E0369, "{}", message.as_str()); + let mut involves_fn = false; + if !lhs_expr.span.eq(&rhs_expr.span) { + involves_fn |= self.add_type_neq_err_label( + &mut err, + lhs_expr.span, lhs_ty, + rhs_ty, + op, + is_assign, ); - err.span_label( - lhs_expr.span, - format!("cannot use `{}=` on type `{}`", op.node.as_str(), lhs_ty), + involves_fn |= self.add_type_neq_err_label( + &mut err, + rhs_expr.span, + rhs_ty, + lhs_ty, + op, + is_assign, ); - let mut suggested_deref = false; - if let Ref(_, rty, _) = lhs_ty.kind { - if { - self.infcx.type_is_copy_modulo_regions( - self.param_env, - rty, - lhs_expr.span, - ) && self - .lookup_op_method(rty, &[rhs_ty], Op::Binary(op, is_assign)) - .is_ok() - } { - if let Ok(lstring) = source_map.span_to_snippet(lhs_expr.span) { - let msg = &format!( - "`{}=` can be used on '{}', you can dereference `{}`", - op.node.as_str(), - rty.peel_refs(), - lstring, - ); - err.span_suggestion_verbose( - lhs_expr.span.shrink_to_lo(), - msg, - "*".to_string(), - rustc_errors::Applicability::MachineApplicable, - ); - suggested_deref = true; - } - } - } - let missing_trait = match op.node { - hir::BinOpKind::Add => Some("std::ops::AddAssign"), - hir::BinOpKind::Sub => Some("std::ops::SubAssign"), - hir::BinOpKind::Mul => Some("std::ops::MulAssign"), - hir::BinOpKind::Div => Some("std::ops::DivAssign"), - hir::BinOpKind::Rem => Some("std::ops::RemAssign"), - hir::BinOpKind::BitAnd => Some("std::ops::BitAndAssign"), - hir::BinOpKind::BitXor => Some("std::ops::BitXorAssign"), - hir::BinOpKind::BitOr => Some("std::ops::BitOrAssign"), - hir::BinOpKind::Shl => Some("std::ops::ShlAssign"), - hir::BinOpKind::Shr => Some("std::ops::ShrAssign"), - _ => None, - }; - if let Some(missing_trait) = missing_trait { - let mut visitor = TypeParamVisitor(vec![]); - visitor.visit_ty(lhs_ty); - - let mut sugg = false; - if op.node == hir::BinOpKind::Add - && self.check_str_addition( - lhs_expr, rhs_expr, lhs_ty, rhs_ty, &mut err, true, op, - ) - { - // This has nothing here because it means we did string - // concatenation (e.g., "Hello " += "World!"). This means - // we don't want the note in the else clause to be emitted - sugg = true; - } else if let [ty] = &visitor.0[..] { - if let ty::Param(p) = ty.kind { - // FIXME: This *guesses* that constraining the type param - // will make the operation available, but this is only true - // when the corresponding trait has a blanked - // implementation, like the following: - // `impl<'a> PartialEq for &'a [T] where T: PartialEq {}` - // The correct thing to do would be to verify this - // projection would hold. - if *ty != lhs_ty { - note(&mut err, missing_trait); - } - suggest_constraining_param( - self.tcx, - self.body_id, - &mut err, - ty, - rhs_ty, - missing_trait, - p, - false, - ); - sugg = true; - } - } - if !sugg && !suggested_deref { - suggest_impl_missing(&mut err, lhs_ty, &missing_trait); - } - } - err.emit(); } - IsAssign::No => { - let (message, missing_trait, use_output) = match op.node { - hir::BinOpKind::Add => ( - format!("cannot add `{}` to `{}`", rhs_ty, lhs_ty), - Some("std::ops::Add"), - true, - ), - hir::BinOpKind::Sub => ( - format!("cannot subtract `{}` from `{}`", rhs_ty, lhs_ty), - Some("std::ops::Sub"), - true, - ), - hir::BinOpKind::Mul => ( - format!("cannot multiply `{}` to `{}`", rhs_ty, lhs_ty), - Some("std::ops::Mul"), - true, - ), - hir::BinOpKind::Div => ( - format!("cannot divide `{}` by `{}`", lhs_ty, rhs_ty), - Some("std::ops::Div"), - true, - ), - hir::BinOpKind::Rem => ( - format!("cannot mod `{}` by `{}`", lhs_ty, rhs_ty), - Some("std::ops::Rem"), - true, - ), - hir::BinOpKind::BitAnd => ( - format!("no implementation for `{} & {}`", lhs_ty, rhs_ty), - Some("std::ops::BitAnd"), - true, - ), - hir::BinOpKind::BitXor => ( - format!("no implementation for `{} ^ {}`", lhs_ty, rhs_ty), - Some("std::ops::BitXor"), - true, - ), - hir::BinOpKind::BitOr => ( - format!("no implementation for `{} | {}`", lhs_ty, rhs_ty), - Some("std::ops::BitOr"), - true, - ), - hir::BinOpKind::Shl => ( - format!("no implementation for `{} << {}`", lhs_ty, rhs_ty), - Some("std::ops::Shl"), - true, - ), - hir::BinOpKind::Shr => ( - format!("no implementation for `{} >> {}`", lhs_ty, rhs_ty), - Some("std::ops::Shr"), - true, - ), - hir::BinOpKind::Eq | hir::BinOpKind::Ne => ( - format!( - "binary operation `{}` cannot be applied to type `{}`", - op.node.as_str(), - lhs_ty - ), - Some("std::cmp::PartialEq"), - false, - ), - hir::BinOpKind::Lt - | hir::BinOpKind::Le - | hir::BinOpKind::Gt - | hir::BinOpKind::Ge => ( - format!( - "binary operation `{}` cannot be applied to type `{}`", - op.node.as_str(), - lhs_ty - ), - Some("std::cmp::PartialOrd"), - false, - ), - _ => ( - format!( - "binary operation `{}` cannot be applied to type `{}`", - op.node.as_str(), - lhs_ty - ), - None, - false, - ), - }; - let mut err = struct_span_err!( - self.tcx.sess, - op.span, - E0369, - "{}", - message.as_str() + (err, missing_trait, use_output, involves_fn) + } + }; + let mut suggested_deref = false; + if let Ref(_, rty, _) = lhs_ty.kind { + if { + self.infcx.type_is_copy_modulo_regions(self.param_env, rty, lhs_expr.span) + && self + .lookup_op_method(rty, &[rhs_ty], Op::Binary(op, is_assign)) + .is_ok() + } { + if let Ok(lstring) = source_map.span_to_snippet(lhs_expr.span) { + let msg = &format!( + "`{}{}` can be used on `{}`, you can dereference `{}`", + op.node.as_str(), + match is_assign { + IsAssign::Yes => "=", + IsAssign::No => "", + }, + rty.peel_refs(), + lstring, ); - - let mut involves_fn = false; - if !lhs_expr.span.eq(&rhs_expr.span) { - involves_fn |= self.add_type_neq_err_label( - &mut err, - lhs_expr.span, - lhs_ty, - rhs_ty, - op, - is_assign, - ); - involves_fn |= self.add_type_neq_err_label( - &mut err, - rhs_expr.span, - rhs_ty, - lhs_ty, - op, - is_assign, - ); - } - - let mut suggested_deref = false; - if let Ref(_, rty, _) = lhs_ty.kind { - if { - self.infcx.type_is_copy_modulo_regions( - self.param_env, - rty, - lhs_expr.span, - ) && self - .lookup_op_method(rty, &[rhs_ty], Op::Binary(op, is_assign)) - .is_ok() - } { - if let Ok(lstring) = source_map.span_to_snippet(lhs_expr.span) { - err.span_suggestion_verbose( - lhs_expr.span.shrink_to_lo(), - &format!( - "`{}` can be used on `{}`, you can dereference \ - `{}`", - op.node.as_str(), - rty.peel_refs(), - lstring, - ), - "*".to_string(), - Applicability::MachineApplicable, - ); - suggested_deref = true; - } - } - } - if let Some(missing_trait) = missing_trait { - let mut visitor = TypeParamVisitor(vec![]); - visitor.visit_ty(lhs_ty); - - let mut sugg = false; - if op.node == hir::BinOpKind::Add - && self.check_str_addition( - lhs_expr, rhs_expr, lhs_ty, rhs_ty, &mut err, false, op, - ) - { - // This has nothing here because it means we did string - // concatenation (e.g., "Hello " + "World!"). This means - // we don't want the note in the else clause to be emitted - sugg = true; - } else if let [ty] = &visitor.0[..] { - if let ty::Param(p) = ty.kind { - // FIXME: This *guesses* that constraining the type param - // will make the operation available, but this is only true - // when the corresponding trait has a blanked - // implementation, like the following: - // `impl<'a> PartialEq for &'a [T] where T: PartialEq {}` - // The correct thing to do would be to verify this - // projection would hold. - if *ty != lhs_ty { - note(&mut err, missing_trait); - } - suggest_constraining_param( - self.tcx, - self.body_id, - &mut err, - ty, - rhs_ty, - missing_trait, - p, - use_output, - ); - sugg = true; - } - } - if !sugg && !suggested_deref && !involves_fn { - suggest_impl_missing(&mut err, lhs_ty, &missing_trait); - } + err.span_suggestion_verbose( + lhs_expr.span.shrink_to_lo(), + msg, + "*".to_string(), + rustc_errors::Applicability::MachineApplicable, + ); + suggested_deref = true; + } + } + } + if let Some(missing_trait) = missing_trait { + let mut visitor = TypeParamVisitor(vec![]); + visitor.visit_ty(lhs_ty); + + if op.node == hir::BinOpKind::Add + && self.check_str_addition( + lhs_expr, rhs_expr, lhs_ty, rhs_ty, &mut err, is_assign, op, + ) + { + // This has nothing here because it means we did string + // concatenation (e.g., "Hello " + "World!"). This means + // we don't want the note in the else clause to be emitted + } else if let [ty] = &visitor.0[..] { + if let ty::Param(p) = ty.kind { + // FIXME: This *guesses* that constraining the type param + // will make the operation available, but this is only true + // when the corresponding trait has a blanket + // implementation, like the following: + // `impl<'a> PartialEq for &'a [T] where T: PartialEq {}` + // The correct thing to do would be to verify this + // projection would hold. + if *ty != lhs_ty { + err.note(&format!( + "the trait `{}` is not implemented for `{}`", + missing_trait, lhs_ty + )); } - err.emit(); + suggest_constraining_param( + self.tcx, + self.body_id, + &mut err, + ty, + rhs_ty, + missing_trait, + p, + use_output, + ); + } else { + bug!("type param visitor stored a non type param: {:?}", ty.kind); } + } else if !suggested_deref && !involves_fn { + suggest_impl_missing(&mut err, lhs_ty, &missing_trait); } } + err.emit(); self.tcx.ty_error() } }; @@ -621,7 +540,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { lhs_ty: Ty<'tcx>, rhs_ty: Ty<'tcx>, err: &mut rustc_errors::DiagnosticBuilder<'_>, - is_assign: bool, + is_assign: IsAssign, op: hir::BinOp, ) -> bool { let source_map = self.tcx.sess.source_map(); @@ -644,7 +563,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { &format!("{:?}", rhs_ty) == "&&str" ) => { - if !is_assign { // Do not supply this message if `&str += &str` + if let IsAssign::No = is_assign { // Do not supply this message if `&str += &str` err.span_label( op.span, "`+` cannot be used to concatenate two `&str` strings", @@ -685,7 +604,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { source_map.span_to_snippet(rhs_expr.span), is_assign, ) { - (Ok(l), Ok(r), false) => { + (Ok(l), Ok(r), IsAssign::No) => { let to_string = if l.starts_with('&') { // let a = String::new(); let b = String::new(); // let _ = &a + b; @@ -738,8 +657,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { err.span_label( ex.span, format!( - "cannot apply unary \ - operator `{}`", + "cannot apply unary operator `{}`", op.as_str() ), ); diff --git a/src/test/ui/issues/issue-5239-1.stderr b/src/test/ui/issues/issue-5239-1.stderr index d0c71e73463c1..078a7ef2173bd 100644 --- a/src/test/ui/issues/issue-5239-1.stderr +++ b/src/test/ui/issues/issue-5239-1.stderr @@ -6,7 +6,7 @@ LL | let x = |ref x: isize| { x += 1; }; | | | cannot use `+=` on type `&isize` | -help: `+=` can be used on 'isize', you can dereference `x` +help: `+=` can be used on `isize`, you can dereference `x` | LL | let x = |ref x: isize| { *x += 1; }; | ^ From 2735f43cef6b00ac4ca2d59f07830a25513031a9 Mon Sep 17 00:00:00 2001 From: LeSeulArtichaut Date: Wed, 24 Jun 2020 23:34:19 +0200 Subject: [PATCH 103/142] Fix links in `SliceIndex` documentation --- src/libcore/slice/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libcore/slice/mod.rs b/src/libcore/slice/mod.rs index c69aafe687cf8..57bacdd99eff4 100644 --- a/src/libcore/slice/mod.rs +++ b/src/libcore/slice/mod.rs @@ -2817,6 +2817,7 @@ pub trait SliceIndex: private_slice_index::Sealed { /// performing any bounds checking. /// Calling this method with an out-of-bounds index is *[undefined behavior]* /// even if the resulting reference is not used. + /// /// [undefined behavior]: ../../reference/behavior-considered-undefined.html #[unstable(feature = "slice_index_methods", issue = "none")] unsafe fn get_unchecked(self, slice: &T) -> &Self::Output; @@ -2825,6 +2826,7 @@ pub trait SliceIndex: private_slice_index::Sealed { /// performing any bounds checking. /// Calling this method with an out-of-bounds index is *[undefined behavior]* /// even if the resulting reference is not used. + /// /// [undefined behavior]: ../../reference/behavior-considered-undefined.html #[unstable(feature = "slice_index_methods", issue = "none")] unsafe fn get_unchecked_mut(self, slice: &mut T) -> &mut Self::Output; From a5a831f51169767c27ddd7edb30269d01f00bf29 Mon Sep 17 00:00:00 2001 From: Tyler Mandry Date: Wed, 17 Jun 2020 16:04:25 -0700 Subject: [PATCH 104/142] Emit line info for generator variants --- .../debuginfo/metadata.rs | 66 ++++++++++++++++--- src/librustc_middle/mir/query.rs | 4 ++ src/librustc_mir/transform/generator.rs | 22 ++++++- ...ustc.main-{{closure}}.generator_drop.0.mir | 2 +- ...tc.main-{{closure}}.generator_resume.0.mir | 2 +- 5 files changed, 83 insertions(+), 13 deletions(-) diff --git a/src/librustc_codegen_llvm/debuginfo/metadata.rs b/src/librustc_codegen_llvm/debuginfo/metadata.rs index 8a957a729fb68..ee8ab7c0e4df3 100644 --- a/src/librustc_codegen_llvm/debuginfo/metadata.rs +++ b/src/librustc_codegen_llvm/debuginfo/metadata.rs @@ -392,6 +392,7 @@ fn vec_slice_metadata( align: pointer_align, flags: DIFlags::FlagZero, discriminant: None, + source_info: None, }, MemberDescription { name: "length".to_owned(), @@ -401,6 +402,7 @@ fn vec_slice_metadata( align: usize_align, flags: DIFlags::FlagZero, discriminant: None, + source_info: None, }, ]; @@ -508,6 +510,7 @@ fn trait_pointer_metadata( align: data_ptr_field.align.abi, flags: DIFlags::FlagArtificial, discriminant: None, + source_info: None, }, MemberDescription { name: "vtable".to_owned(), @@ -517,6 +520,7 @@ fn trait_pointer_metadata( align: vtable_field.align.abi, flags: DIFlags::FlagArtificial, discriminant: None, + source_info: None, }, ]; @@ -1026,6 +1030,12 @@ impl MetadataCreationResult<'ll> { } } +#[derive(Debug)] +struct SourceInfo<'ll> { + file: &'ll DIFile, + line: u32, +} + /// Description of a type member, which can either be a regular field (as in /// structs or tuples) or an enum variant. #[derive(Debug)] @@ -1037,6 +1047,7 @@ struct MemberDescription<'ll> { align: Align, flags: DIFlags, discriminant: Option, + source_info: Option>, } impl<'ll> MemberDescription<'ll> { @@ -1045,14 +1056,18 @@ impl<'ll> MemberDescription<'ll> { cx: &CodegenCx<'ll, '_>, composite_type_metadata: &'ll DIScope, ) -> &'ll DIType { + let (file, line) = self + .source_info + .map(|info| (info.file, info.line)) + .unwrap_or_else(|| (unknown_file_metadata(cx), UNKNOWN_LINE_NUMBER)); unsafe { llvm::LLVMRustDIBuilderCreateVariantMemberType( DIB(cx), composite_type_metadata, self.name.as_ptr().cast(), self.name.len(), - unknown_file_metadata(cx), - UNKNOWN_LINE_NUMBER, + file, + line, self.size.bits(), self.align.bits() as u32, self.offset.bits(), @@ -1124,6 +1139,7 @@ impl<'tcx> StructMemberDescriptionFactory<'tcx> { align: field.align.abi, flags: DIFlags::FlagZero, discriminant: None, + source_info: None, } }) .collect() @@ -1185,6 +1201,7 @@ impl<'tcx> TupleMemberDescriptionFactory<'tcx> { align, flags: DIFlags::FlagZero, discriminant: None, + source_info: None, } }) .collect() @@ -1244,6 +1261,7 @@ impl<'tcx> UnionMemberDescriptionFactory<'tcx> { align: field.align.abi, flags: DIFlags::FlagZero, discriminant: None, + source_info: None, } }) .collect() @@ -1351,10 +1369,11 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { let variant_info_for = |index: VariantIdx| match self.enum_type.kind { ty::Adt(adt, _) => VariantInfo::Adt(&adt.variants[index]), - ty::Generator(_, substs, _) => { + ty::Generator(def_id, substs, _) => { let (generator_layout, generator_saved_local_names) = generator_variant_info_data.as_ref().unwrap(); VariantInfo::Generator { + def_id, substs, generator_layout: *generator_layout, generator_saved_local_names, @@ -1406,6 +1425,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { align: self.layout.align.abi, flags: DIFlags::FlagZero, discriminant: None, + source_info: variant_info.source_info(cx), }] } Variants::Multiple { @@ -1462,6 +1482,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { self.layout.ty.discriminant_for_variant(cx.tcx, i).unwrap().val as u64, ), + source_info: variant_info.source_info(cx), } }) .collect() @@ -1527,7 +1548,8 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { self.layout.fields.offset(tag_field), self.layout.field(cx, tag_field).size, ); - variant_info_for(*niche_variants.start()).map_struct_name(|variant_name| { + let variant_info = variant_info_for(*niche_variants.start()); + variant_info.map_struct_name(|variant_name| { name.push_str(variant_name); }); @@ -1540,6 +1562,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { align: variant.align.abi, flags: DIFlags::FlagZero, discriminant: None, + source_info: variant_info.source_info(cx), }] } else { variants @@ -1589,6 +1612,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { align: self.layout.align.abi, flags: DIFlags::FlagZero, discriminant: niche_value, + source_info: variant_info.source_info(cx), } }) .collect() @@ -1631,6 +1655,7 @@ impl VariantMemberDescriptionFactory<'ll, 'tcx> { align, flags: DIFlags::FlagZero, discriminant: None, + source_info: None, } }) .collect() @@ -1651,6 +1676,7 @@ enum EnumTagInfo<'ll> { enum VariantInfo<'a, 'tcx> { Adt(&'tcx ty::VariantDef), Generator { + def_id: DefId, substs: SubstsRef<'tcx>, generator_layout: &'tcx GeneratorLayout<'tcx>, generator_saved_local_names: &'a IndexVec>, @@ -1699,6 +1725,24 @@ impl<'tcx> VariantInfo<'_, 'tcx> { }; field_name.map(|name| name.to_string()).unwrap_or_else(|| format!("__{}", i)) } + + fn source_info(&self, cx: &CodegenCx<'ll, 'tcx>) -> Option> { + match self { + VariantInfo::Generator { def_id, variant_index, .. } => { + let span = + cx.tcx.generator_layout(*def_id).variant_source_info[*variant_index].span; + if !span.is_dummy() { + let loc = cx.lookup_debug_loc(span.lo()); + return Some(SourceInfo { + file: file_metadata(cx, &loc.file, def_id.krate), + line: loc.line.unwrap_or(UNKNOWN_LINE_NUMBER), + }); + } + } + _ => {} + } + None + } } /// Returns a tuple of (1) `type_metadata_stub` of the variant, (2) a @@ -1778,7 +1822,8 @@ fn prepare_enum_metadata( span: Span, outer_field_tys: Vec>, ) -> RecursiveTypeDescription<'ll, 'tcx> { - let enum_name = compute_debuginfo_type_name(cx.tcx, enum_type, false); + let tcx = cx.tcx; + let enum_name = compute_debuginfo_type_name(tcx, enum_type, false); let containing_scope = get_namespace_for_item(cx, enum_def_id); // FIXME: This should emit actual file metadata for the enum, but we @@ -1792,7 +1837,7 @@ fn prepare_enum_metadata( let discriminant_type_metadata = |discr: Primitive| { let enumerators_metadata: Vec<_> = match enum_type.kind { ty::Adt(def, _) => def - .discriminants(cx.tcx) + .discriminants(tcx) .zip(&def.variants) .map(|((_, discr), v)| { let name = v.ident.as_str(); @@ -1815,15 +1860,16 @@ fn prepare_enum_metadata( .collect(), ty::Generator(_, substs, _) => substs .as_generator() - .variant_range(enum_def_id, cx.tcx) + .variant_range(enum_def_id, tcx) .map(|variant_index| { + debug_assert_eq!(tcx.types.u32, substs.as_generator().discr_ty(tcx)); let name = substs.as_generator().variant_name(variant_index); unsafe { Some(llvm::LLVMRustDIBuilderCreateEnumerator( DIB(cx), name.as_ptr().cast(), name.len(), - // Generators use u32 as discriminant type. + // Generators use u32 as discriminant type, verified above. variant_index.as_u32().into(), true, // IsUnsigned )) @@ -1841,12 +1887,12 @@ fn prepare_enum_metadata( None => { let (discriminant_size, discriminant_align) = (discr.size(cx), discr.align(cx)); let discriminant_base_type_metadata = - type_metadata(cx, discr.to_ty(cx.tcx), rustc_span::DUMMY_SP); + type_metadata(cx, discr.to_ty(tcx), rustc_span::DUMMY_SP); let item_name; let discriminant_name = match enum_type.kind { ty::Adt(..) => { - item_name = cx.tcx.item_name(enum_def_id).as_str(); + item_name = tcx.item_name(enum_def_id).as_str(); &*item_name } ty::Generator(..) => enum_name.as_str(), diff --git a/src/librustc_middle/mir/query.rs b/src/librustc_middle/mir/query.rs index 1aae97cc2a894..b77b069befd00 100644 --- a/src/librustc_middle/mir/query.rs +++ b/src/librustc_middle/mir/query.rs @@ -67,6 +67,10 @@ pub struct GeneratorLayout<'tcx> { /// be stored in multiple variants. pub variant_fields: IndexVec>, + /// The source that led to each variant being created (usually, a yield or + /// await). + pub variant_source_info: IndexVec, + /// Which saved locals are storage-live at the same time. Locals that do not /// have conflicts with each other are allowed to overlap in the computed /// layout. diff --git a/src/librustc_mir/transform/generator.rs b/src/librustc_mir/transform/generator.rs index 59be8dc224dee..523d3c9af3f68 100644 --- a/src/librustc_mir/transform/generator.rs +++ b/src/librustc_mir/transform/generator.rs @@ -422,6 +422,9 @@ struct LivenessInfo { /// The set of saved locals live at each suspension point. live_locals_at_suspension_points: Vec>, + /// Parallel vec to the above with SourceInfo for each yield terminator. + source_info_at_suspension_points: Vec, + /// For every saved local, the set of other saved locals that are /// storage-live at the same time as this local. We cannot overlap locals in /// the layout which have conflicting storage. @@ -473,6 +476,7 @@ fn locals_live_across_suspend_points( let mut storage_liveness_map = IndexVec::from_elem(None, body.basic_blocks()); let mut live_locals_at_suspension_points = Vec::new(); + let mut source_info_at_suspension_points = Vec::new(); let mut live_locals_at_any_suspension_point = BitSet::new_empty(body.local_decls.len()); for (block, data) in body.basic_blocks().iter_enumerated() { @@ -518,6 +522,7 @@ fn locals_live_across_suspend_points( live_locals_at_any_suspension_point.union(&live_locals); live_locals_at_suspension_points.push(live_locals); + source_info_at_suspension_points.push(data.terminator().source_info); } } @@ -541,6 +546,7 @@ fn locals_live_across_suspend_points( LivenessInfo { saved_locals, live_locals_at_suspension_points, + source_info_at_suspension_points, storage_conflicts, storage_liveness: storage_liveness_map, } @@ -754,6 +760,7 @@ fn compute_layout<'tcx>( let LivenessInfo { saved_locals, live_locals_at_suspension_points, + source_info_at_suspension_points, storage_conflicts, storage_liveness, } = liveness; @@ -768,7 +775,18 @@ fn compute_layout<'tcx>( } // Leave empty variants for the UNRESUMED, RETURNED, and POISONED states. + // In debuginfo, these will correspond to the beginning (UNRESUMED) or end + // (RETURNED, POISONED) of the function. const RESERVED_VARIANTS: usize = 3; + let body_span = body.source_scopes[OUTERMOST_SOURCE_SCOPE].span; + let mut variant_source_info: IndexVec = [ + SourceInfo::outermost(body_span.shrink_to_lo()), + SourceInfo::outermost(body_span.shrink_to_hi()), + SourceInfo::outermost(body_span.shrink_to_hi()), + ] + .iter() + .copied() + .collect(); // Build the generator variant field list. // Create a map from local indices to generator struct indices. @@ -787,11 +805,13 @@ fn compute_layout<'tcx>( remap.entry(locals[saved_local]).or_insert((tys[saved_local], variant_index, idx)); } variant_fields.push(fields); + variant_source_info.push(source_info_at_suspension_points[suspension_point_idx]); } debug!("generator variant_fields = {:?}", variant_fields); debug!("generator storage_conflicts = {:#?}", storage_conflicts); - let layout = GeneratorLayout { field_tys: tys, variant_fields, storage_conflicts }; + let layout = + GeneratorLayout { field_tys: tys, variant_fields, variant_source_info, storage_conflicts }; (remap, layout, storage_liveness) } diff --git a/src/test/mir-opt/generator-drop-cleanup/rustc.main-{{closure}}.generator_drop.0.mir b/src/test/mir-opt/generator-drop-cleanup/rustc.main-{{closure}}.generator_drop.0.mir index 3e7083ff62ecd..b34d42155cc6c 100644 --- a/src/test/mir-opt/generator-drop-cleanup/rustc.main-{{closure}}.generator_drop.0.mir +++ b/src/test/mir-opt/generator-drop-cleanup/rustc.main-{{closure}}.generator_drop.0.mir @@ -1,5 +1,5 @@ // MIR for `main::{{closure}}#0` 0 generator_drop -// generator_layout = GeneratorLayout { field_tys: [std::string::String], variant_fields: [[], [], [], [_0]], storage_conflicts: BitMatrix { num_rows: 1, num_columns: 1, words: [1], marker: PhantomData } } +// generator_layout = GeneratorLayout { field_tys: [std::string::String], variant_fields: [[], [], [], [_0]], variant_source_info: [SourceInfo { span: $DIR/generator-drop-cleanup.rs:10:15: 10:15 (#0), scope: scope[0] }, SourceInfo { span: $DIR/generator-drop-cleanup.rs:13:6: 13:6 (#0), scope: scope[0] }, SourceInfo { span: $DIR/generator-drop-cleanup.rs:13:6: 13:6 (#0), scope: scope[0] }, SourceInfo { span: $DIR/generator-drop-cleanup.rs:12:9: 12:14 (#0), scope: scope[1] }], storage_conflicts: BitMatrix { num_rows: 1, num_columns: 1, words: [1], marker: PhantomData } } fn main::{{closure}}#0(_1: *mut [generator@$DIR/generator-drop-cleanup.rs:10:15: 13:6 {std::string::String, ()}]) -> () { let mut _0: (); // return place in scope 0 at $DIR/generator-drop-cleanup.rs:10:15: 13:6 diff --git a/src/test/mir-opt/generator-tiny/rustc.main-{{closure}}.generator_resume.0.mir b/src/test/mir-opt/generator-tiny/rustc.main-{{closure}}.generator_resume.0.mir index c73dea5f8fde6..2398e9501452e 100644 --- a/src/test/mir-opt/generator-tiny/rustc.main-{{closure}}.generator_resume.0.mir +++ b/src/test/mir-opt/generator-tiny/rustc.main-{{closure}}.generator_resume.0.mir @@ -1,5 +1,5 @@ // MIR for `main::{{closure}}#0` 0 generator_resume -// generator_layout = GeneratorLayout { field_tys: [HasDrop], variant_fields: [[], [], [], [_0]], storage_conflicts: BitMatrix { num_rows: 1, num_columns: 1, words: [1], marker: PhantomData } } +// generator_layout = GeneratorLayout { field_tys: [HasDrop], variant_fields: [[], [], [], [_0]], variant_source_info: [SourceInfo { span: $DIR/generator-tiny.rs:19:16: 19:16 (#0), scope: scope[0] }, SourceInfo { span: $DIR/generator-tiny.rs:25:6: 25:6 (#0), scope: scope[0] }, SourceInfo { span: $DIR/generator-tiny.rs:25:6: 25:6 (#0), scope: scope[0] }, SourceInfo { span: $DIR/generator-tiny.rs:22:13: 22:18 (#0), scope: scope[1] }], storage_conflicts: BitMatrix { num_rows: 1, num_columns: 1, words: [1], marker: PhantomData } } fn main::{{closure}}#0(_1: std::pin::Pin<&mut [generator@$DIR/generator-tiny.rs:19:16: 25:6 {u8, HasDrop, ()}]>, _2: u8) -> std::ops::GeneratorState<(), ()> { debug _x => _10; // in scope 0 at $DIR/generator-tiny.rs:19:17: 19:19 From eb726c0fcec3f9d12a6a9990c5c041478e1e7187 Mon Sep 17 00:00:00 2001 From: Tyler Mandry Date: Wed, 17 Jun 2020 19:39:23 -0700 Subject: [PATCH 105/142] Add Artificial flag to generator variants --- .../debuginfo/metadata.rs | 67 +++++++++++++++---- 1 file changed, 53 insertions(+), 14 deletions(-) diff --git a/src/librustc_codegen_llvm/debuginfo/metadata.rs b/src/librustc_codegen_llvm/debuginfo/metadata.rs index ee8ab7c0e4df3..f26c45e90110a 100644 --- a/src/librustc_codegen_llvm/debuginfo/metadata.rs +++ b/src/librustc_codegen_llvm/debuginfo/metadata.rs @@ -863,7 +863,7 @@ fn foreign_type_metadata( debug!("foreign_type_metadata: {:?}", t); let name = compute_debuginfo_type_name(cx.tcx, t, false); - create_struct_stub(cx, t, &name, unique_type_id, NO_SCOPE_METADATA) + create_struct_stub(cx, t, &name, unique_type_id, NO_SCOPE_METADATA, DIFlags::FlagZero) } fn pointer_type_metadata( @@ -1161,8 +1161,14 @@ fn prepare_struct_metadata( let containing_scope = get_namespace_for_item(cx, struct_def_id); - let struct_metadata_stub = - create_struct_stub(cx, struct_type, &struct_name, unique_type_id, Some(containing_scope)); + let struct_metadata_stub = create_struct_stub( + cx, + struct_type, + &struct_name, + unique_type_id, + Some(containing_scope), + DIFlags::FlagZero, + ); create_and_register_recursive_type_forward_declaration( cx, @@ -1218,8 +1224,14 @@ fn prepare_tuple_metadata( ) -> RecursiveTypeDescription<'ll, 'tcx> { let tuple_name = compute_debuginfo_type_name(cx.tcx, tuple_type, false); - let struct_stub = - create_struct_stub(cx, tuple_type, &tuple_name[..], unique_type_id, containing_scope); + let struct_stub = create_struct_stub( + cx, + tuple_type, + &tuple_name[..], + unique_type_id, + containing_scope, + DIFlags::FlagZero, + ); create_and_register_recursive_type_forward_declaration( cx, @@ -1390,6 +1402,10 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { } else { type_metadata(cx, self.enum_type, self.span) }; + let flags = match self.enum_type.kind { + ty::Generator(..) => DIFlags::FlagArtificial, + _ => DIFlags::FlagZero, + }; match self.layout.variants { Variants::Single { index } => { @@ -1423,7 +1439,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { offset: Size::ZERO, size: self.layout.size, align: self.layout.align.abi, - flags: DIFlags::FlagZero, + flags, discriminant: None, source_info: variant_info.source_info(cx), }] @@ -1477,7 +1493,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { offset: Size::ZERO, size: self.layout.size, align: self.layout.align.abi, - flags: DIFlags::FlagZero, + flags, discriminant: Some( self.layout.ty.discriminant_for_variant(cx.tcx, i).unwrap().val as u64, @@ -1560,7 +1576,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { offset: Size::ZERO, size: variant.size, align: variant.align.abi, - flags: DIFlags::FlagZero, + flags, discriminant: None, source_info: variant_info.source_info(cx), }] @@ -1610,7 +1626,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { offset: Size::ZERO, size: self.layout.size, align: self.layout.align.abi, - flags: DIFlags::FlagZero, + flags, discriminant: niche_value, source_info: variant_info.source_info(cx), } @@ -1743,6 +1759,14 @@ impl<'tcx> VariantInfo<'_, 'tcx> { } None } + + #[allow(dead_code)] + fn is_artificial(&self) -> bool { + match self { + VariantInfo::Generator { .. } => true, + VariantInfo::Adt(..) => false, + } + } } /// Returns a tuple of (1) `type_metadata_stub` of the variant, (2) a @@ -1762,7 +1786,15 @@ fn describe_enum_variant( .type_map .borrow_mut() .get_unique_type_id_of_enum_variant(cx, layout.ty, &variant_name); - create_struct_stub(cx, layout.ty, &variant_name, unique_type_id, Some(containing_scope)) + create_struct_stub( + cx, + layout.ty, + &variant_name, + unique_type_id, + Some(containing_scope), + // FIXME(tmandry): This doesn't seem to have any effect. + if variant.is_artificial() { DIFlags::FlagArtificial } else { DIFlags::FlagZero }, + ) }); // Build an array of (field name, field type) pairs to be captured in the factory closure. @@ -1824,6 +1856,11 @@ fn prepare_enum_metadata( ) -> RecursiveTypeDescription<'ll, 'tcx> { let tcx = cx.tcx; let enum_name = compute_debuginfo_type_name(tcx, enum_type, false); + // FIXME(tmandry): This doesn't seem to have any effect. + let enum_flags = match enum_type.kind { + ty::Generator(..) => DIFlags::FlagArtificial, + _ => DIFlags::FlagZero, + }; let containing_scope = get_namespace_for_item(cx, enum_def_id); // FIXME: This should emit actual file metadata for the enum, but we @@ -1958,7 +1995,7 @@ fn prepare_enum_metadata( UNKNOWN_LINE_NUMBER, layout.size.bits(), layout.align.abi.bits() as u32, - DIFlags::FlagZero, + enum_flags, None, 0, // RuntimeLang unique_type_id_str.as_ptr().cast(), @@ -2079,7 +2116,7 @@ fn prepare_enum_metadata( UNKNOWN_LINE_NUMBER, layout.size.bits(), layout.align.abi.bits() as u32, - DIFlags::FlagZero, + enum_flags, discriminator_metadata, empty_array, variant_part_unique_type_id_str.as_ptr().cast(), @@ -2105,7 +2142,7 @@ fn prepare_enum_metadata( UNKNOWN_LINE_NUMBER, layout.size.bits(), layout.align.abi.bits() as u32, - DIFlags::FlagZero, + enum_flags, None, type_array, 0, @@ -2156,6 +2193,7 @@ fn composite_type_metadata( composite_type_name, composite_type_unique_id, containing_scope, + DIFlags::FlagZero, ); // ... and immediately create and add the member descriptions. set_members_of_composite_type(cx, composite_type, composite_type_metadata, member_descriptions); @@ -2257,6 +2295,7 @@ fn create_struct_stub( struct_type_name: &str, unique_type_id: UniqueTypeId, containing_scope: Option<&'ll DIScope>, + flags: DIFlags, ) -> &'ll DICompositeType { let (struct_size, struct_align) = cx.size_and_align_of(struct_type); @@ -2278,7 +2317,7 @@ fn create_struct_stub( UNKNOWN_LINE_NUMBER, struct_size.bits(), struct_align.bits() as u32, - DIFlags::FlagZero, + flags, None, empty_array, 0, From 367858aedc1e1dbee5560676c00618a386ed8e37 Mon Sep 17 00:00:00 2001 From: Tyler Mandry Date: Thu, 18 Jun 2020 16:17:25 -0700 Subject: [PATCH 106/142] Add test for generator debuginfo --- src/test/codegen/generator-debug.rs | 94 +++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/test/codegen/generator-debug.rs diff --git a/src/test/codegen/generator-debug.rs b/src/test/codegen/generator-debug.rs new file mode 100644 index 0000000000000..3007099393ffe --- /dev/null +++ b/src/test/codegen/generator-debug.rs @@ -0,0 +1,94 @@ +// Verify debuginfo for generators: +// - Each variant points to the file and line of its yield point +// - The generator types and variants are marked artificial +// - Captured vars from the source are not marked artificial +// +// ignore-tidy-linelength +// compile-flags: -C debuginfo=2 --edition=2018 + +#![feature(generators, generator_trait)] +use std::ops::Generator; + +fn generator_test() -> impl Generator { + || { + yield 0; + let s = String::from("foo"); + yield 1; + } +} + +async fn foo() {} +async fn async_fn_test() { + foo().await; + let s = String::from("foo"); + foo().await; +} + +// FIXME: We need "checksum" to prevent matching with the wrong (duplicate) file +// metadata, even when -C codegen-units=1. +// CHECK: [[FILE:!.*]] = !DIFile(filename: "{{.*}}/generator-debug.rs", {{.*}}, checksum: + +// CHECK: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "generator-0", scope: [[FN:![0-9]*]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: [[FN]] = !DINamespace(name: "generator_test" +// CHECK: [[VARIANT:!.*]] = !DICompositeType(tag: DW_TAG_variant_part, scope: [[FN]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK-SAME: discriminator: [[DISC:![0-9]*]] +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "0", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE]], line: 13, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DICompositeType(tag: DW_TAG_structure_type, name: "Unresumed", scope: [[GEN]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "1", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE]], line: 17, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "2", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE]], line: 17, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "3", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE]], line: 14, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "4", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE]], line: 16, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[GEN]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]] +// CHECK-NOT: flags: DIFlagArtificial +// CHECK-SAME: ) +// CHECK: [[DISC]] = !DIDerivedType(tag: DW_TAG_member, name: "__state", scope: [[FN]], +// CHECK-SAME: flags: DIFlagArtificial + +// CHECK: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "generator-0", scope: [[FN:![0-9]*]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: [[FN]] = !DINamespace(name: "async_fn_test" +// CHECK: [[VARIANT:!.*]] = !DICompositeType(tag: DW_TAG_variant_part, scope: [[FN]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK-SAME: discriminator: [[DISC:![0-9]*]] +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "0", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE]], line: 21, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "1", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE]], line: 25, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "2", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE]], line: 25, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "3", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE]], line: 22, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "4", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE]], line: 24, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[GEN]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]] +// CHECK-NOT: flags: DIFlagArtificial +// CHECK-SAME: ) +// CHECK: [[DISC]] = !DIDerivedType(tag: DW_TAG_member, name: "__state", scope: [[FN]], +// CHECK-SAME: flags: DIFlagArtificial + +fn main() { + let _dummy = generator_test(); + let _dummy = async_fn_test(); +} From 242a5cd4c673c02d817fb5cbadd5bd3ff08f10eb Mon Sep 17 00:00:00 2001 From: Tyler Mandry Date: Fri, 19 Jun 2020 18:37:52 -0700 Subject: [PATCH 107/142] Allow calling GeneratorSubsts::variant_name() without substs --- src/librustc_codegen_llvm/debuginfo/metadata.rs | 14 ++++++-------- src/librustc_codegen_llvm/type_of.rs | 4 ++-- src/librustc_middle/ty/sty.rs | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/librustc_codegen_llvm/debuginfo/metadata.rs b/src/librustc_codegen_llvm/debuginfo/metadata.rs index f26c45e90110a..0338aff509658 100644 --- a/src/librustc_codegen_llvm/debuginfo/metadata.rs +++ b/src/librustc_codegen_llvm/debuginfo/metadata.rs @@ -33,9 +33,9 @@ use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags; use rustc_middle::mir::interpret::truncate; use rustc_middle::mir::{self, Field, GeneratorLayout}; use rustc_middle::ty::layout::{self, IntegerExt, PrimitiveExt, TyAndLayout}; -use rustc_middle::ty::subst::{GenericArgKind, SubstsRef}; +use rustc_middle::ty::subst::GenericArgKind; use rustc_middle::ty::Instance; -use rustc_middle::ty::{self, AdtKind, ParamEnv, Ty, TyCtxt}; +use rustc_middle::ty::{self, AdtKind, GeneratorSubsts, ParamEnv, Ty, TyCtxt}; use rustc_middle::{bug, span_bug}; use rustc_session::config::{self, DebugInfo}; use rustc_span::symbol::{Interner, Symbol}; @@ -1381,12 +1381,11 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { let variant_info_for = |index: VariantIdx| match self.enum_type.kind { ty::Adt(adt, _) => VariantInfo::Adt(&adt.variants[index]), - ty::Generator(def_id, substs, _) => { + ty::Generator(def_id, _, _) => { let (generator_layout, generator_saved_local_names) = generator_variant_info_data.as_ref().unwrap(); VariantInfo::Generator { def_id, - substs, generator_layout: *generator_layout, generator_saved_local_names, variant_index: index, @@ -1693,7 +1692,6 @@ enum VariantInfo<'a, 'tcx> { Adt(&'tcx ty::VariantDef), Generator { def_id: DefId, - substs: SubstsRef<'tcx>, generator_layout: &'tcx GeneratorLayout<'tcx>, generator_saved_local_names: &'a IndexVec>, variant_index: VariantIdx, @@ -1704,8 +1702,8 @@ impl<'tcx> VariantInfo<'_, 'tcx> { fn map_struct_name(&self, f: impl FnOnce(&str) -> R) -> R { match self { VariantInfo::Adt(variant) => f(&variant.ident.as_str()), - VariantInfo::Generator { substs, variant_index, .. } => { - f(&substs.as_generator().variant_name(*variant_index)) + VariantInfo::Generator { variant_index, .. } => { + f(&GeneratorSubsts::variant_name(*variant_index)) } } } @@ -1900,7 +1898,7 @@ fn prepare_enum_metadata( .variant_range(enum_def_id, tcx) .map(|variant_index| { debug_assert_eq!(tcx.types.u32, substs.as_generator().discr_ty(tcx)); - let name = substs.as_generator().variant_name(variant_index); + let name = GeneratorSubsts::variant_name(variant_index); unsafe { Some(llvm::LLVMRustDIBuilderCreateEnumerator( DIB(cx), diff --git a/src/librustc_codegen_llvm/type_of.rs b/src/librustc_codegen_llvm/type_of.rs index 77009aca6d32e..5a0da6be5980e 100644 --- a/src/librustc_codegen_llvm/type_of.rs +++ b/src/librustc_codegen_llvm/type_of.rs @@ -70,10 +70,10 @@ fn uncached_llvm_type<'a, 'tcx>( write!(&mut name, "::{}", def.variants[index].ident).unwrap(); } } - if let (&ty::Generator(_, substs, _), &Variants::Single { index }) + if let (&ty::Generator(_, _, _), &Variants::Single { index }) = (&layout.ty.kind, &layout.variants) { - write!(&mut name, "::{}", substs.as_generator().variant_name(index)).unwrap(); + write!(&mut name, "::{}", ty::GeneratorSubsts::variant_name(index)).unwrap(); } Some(name) } diff --git a/src/librustc_middle/ty/sty.rs b/src/librustc_middle/ty/sty.rs index 1d680c3563675..79fa06790bd4a 100644 --- a/src/librustc_middle/ty/sty.rs +++ b/src/librustc_middle/ty/sty.rs @@ -523,7 +523,7 @@ impl<'tcx> GeneratorSubsts<'tcx> { /// Calls `f` with a reference to the name of the enumerator for the given /// variant `v`. #[inline] - pub fn variant_name(self, v: VariantIdx) -> Cow<'static, str> { + pub fn variant_name(v: VariantIdx) -> Cow<'static, str> { match v.as_usize() { Self::UNRESUMED => Cow::from(Self::UNRESUMED_NAME), Self::RETURNED => Cow::from(Self::RETURNED_NAME), From 547d86307c6acd10520af96f8e2974522c50ac1e Mon Sep 17 00:00:00 2001 From: Tyler Mandry Date: Fri, 19 Jun 2020 20:19:19 -0700 Subject: [PATCH 108/142] Improve GeneratorLayout debug output --- src/librustc_index/bit_set.rs | 18 +++++- src/librustc_middle/mir/query.rs | 60 ++++++++++++++++++- src/librustc_middle/ty/sty.rs | 1 - src/librustc_mir/util/pretty.rs | 2 +- ...ustc.main-{{closure}}.generator_drop.0.mir | 15 ++++- ...tc.main-{{closure}}.generator_resume.0.mir | 15 ++++- 6 files changed, 105 insertions(+), 6 deletions(-) diff --git a/src/librustc_index/bit_set.rs b/src/librustc_index/bit_set.rs index 46c38840516e2..cb8b30830c5de 100644 --- a/src/librustc_index/bit_set.rs +++ b/src/librustc_index/bit_set.rs @@ -700,7 +700,7 @@ impl GrowableBitSet { /// /// All operations that involve a row and/or column index will panic if the /// index exceeds the relevant bound. -#[derive(Clone, Debug, Eq, PartialEq, RustcDecodable, RustcEncodable)] +#[derive(Clone, Eq, PartialEq, RustcDecodable, RustcEncodable)] pub struct BitMatrix { num_rows: usize, num_columns: usize, @@ -876,6 +876,22 @@ impl BitMatrix { } } +impl fmt::Debug for BitMatrix { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + /// Forces its contents to print in regular mode instead of alternate mode. + struct OneLinePrinter(T); + impl fmt::Debug for OneLinePrinter { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(fmt, "{:?}", self.0) + } + } + + write!(fmt, "BitMatrix({}x{}) ", self.num_rows, self.num_columns)?; + let items = self.rows().flat_map(|r| self.iter(r).map(move |c| (r, c))); + fmt.debug_set().entries(items.map(OneLinePrinter)).finish() + } +} + /// A fixed-column-size, variable-row-size 2D bit matrix with a moderately /// sparse representation. /// diff --git a/src/librustc_middle/mir/query.rs b/src/librustc_middle/mir/query.rs index b77b069befd00..9ad79230a4f6d 100644 --- a/src/librustc_middle/mir/query.rs +++ b/src/librustc_middle/mir/query.rs @@ -10,6 +10,8 @@ use rustc_index::vec::IndexVec; use rustc_span::{Span, Symbol}; use rustc_target::abi::VariantIdx; use smallvec::SmallVec; +use std::cell::Cell; +use std::fmt::{self, Debug}; use super::{Field, SourceInfo}; @@ -58,7 +60,7 @@ rustc_index::newtype_index! { } /// The layout of generator state. -#[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable, TypeFoldable)] +#[derive(Clone, RustcEncodable, RustcDecodable, HashStable, TypeFoldable)] pub struct GeneratorLayout<'tcx> { /// The type of every local stored inside the generator. pub field_tys: IndexVec>, @@ -77,6 +79,62 @@ pub struct GeneratorLayout<'tcx> { pub storage_conflicts: BitMatrix, } +impl Debug for GeneratorLayout<'_> { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + /// Prints an iterator of (key, value) tuples as a map. + struct MapPrinter<'a, K, V>(Cell + 'a>>>); + impl<'a, K, V> MapPrinter<'a, K, V> { + fn new(iter: impl Iterator + 'a) -> Self { + Self(Cell::new(Some(Box::new(iter)))) + } + } + impl<'a, K: Debug, V: Debug> Debug for MapPrinter<'a, K, V> { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt.debug_map().entries(self.0.take().unwrap()).finish() + } + } + + /// Prints the generator variant name. + struct GenVariantPrinter(VariantIdx); + impl From for GenVariantPrinter { + fn from(idx: VariantIdx) -> Self { + GenVariantPrinter(idx) + } + } + impl Debug for GenVariantPrinter { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + let variant_name = ty::GeneratorSubsts::variant_name(self.0); + if fmt.alternate() { + write!(fmt, "{:9}({:?})", variant_name, self.0) + } else { + write!(fmt, "{}", variant_name) + } + } + } + + /// Forces its contents to print in regular mode instead of alternate mode. + struct OneLinePrinter(T); + impl Debug for OneLinePrinter { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(fmt, "{:?}", self.0) + } + } + + fmt.debug_struct("GeneratorLayout") + .field("field_tys", &MapPrinter::new(self.field_tys.iter_enumerated())) + .field( + "variant_fields", + &MapPrinter::new( + self.variant_fields + .iter_enumerated() + .map(|(k, v)| (GenVariantPrinter(k), OneLinePrinter(v))), + ), + ) + .field("storage_conflicts", &self.storage_conflicts) + .finish() + } +} + #[derive(Debug, RustcEncodable, RustcDecodable, HashStable)] pub struct BorrowCheckResult<'tcx> { /// All the opaque types that are restricted to concrete types diff --git a/src/librustc_middle/ty/sty.rs b/src/librustc_middle/ty/sty.rs index 79fa06790bd4a..8f86d2ef522d3 100644 --- a/src/librustc_middle/ty/sty.rs +++ b/src/librustc_middle/ty/sty.rs @@ -522,7 +522,6 @@ impl<'tcx> GeneratorSubsts<'tcx> { /// Calls `f` with a reference to the name of the enumerator for the given /// variant `v`. - #[inline] pub fn variant_name(v: VariantIdx) -> Cow<'static, str> { match v.as_usize() { Self::UNRESUMED => Cow::from(Self::UNRESUMED_NAME), diff --git a/src/librustc_mir/util/pretty.rs b/src/librustc_mir/util/pretty.rs index 02614044063fc..db45481e4fd25 100644 --- a/src/librustc_mir/util/pretty.rs +++ b/src/librustc_mir/util/pretty.rs @@ -131,7 +131,7 @@ fn dump_matched_mir_node<'tcx, F>( } writeln!(file, " {} {}", disambiguator, pass_name)?; if let Some(ref layout) = body.generator_layout { - writeln!(file, "// generator_layout = {:?}", layout)?; + writeln!(file, "/* generator_layout = {:#?} */", layout)?; } writeln!(file)?; extra_data(PassWhere::BeforeCFG, &mut file)?; diff --git a/src/test/mir-opt/generator-drop-cleanup/rustc.main-{{closure}}.generator_drop.0.mir b/src/test/mir-opt/generator-drop-cleanup/rustc.main-{{closure}}.generator_drop.0.mir index b34d42155cc6c..3c77995eea893 100644 --- a/src/test/mir-opt/generator-drop-cleanup/rustc.main-{{closure}}.generator_drop.0.mir +++ b/src/test/mir-opt/generator-drop-cleanup/rustc.main-{{closure}}.generator_drop.0.mir @@ -1,5 +1,18 @@ // MIR for `main::{{closure}}#0` 0 generator_drop -// generator_layout = GeneratorLayout { field_tys: [std::string::String], variant_fields: [[], [], [], [_0]], variant_source_info: [SourceInfo { span: $DIR/generator-drop-cleanup.rs:10:15: 10:15 (#0), scope: scope[0] }, SourceInfo { span: $DIR/generator-drop-cleanup.rs:13:6: 13:6 (#0), scope: scope[0] }, SourceInfo { span: $DIR/generator-drop-cleanup.rs:13:6: 13:6 (#0), scope: scope[0] }, SourceInfo { span: $DIR/generator-drop-cleanup.rs:12:9: 12:14 (#0), scope: scope[1] }], storage_conflicts: BitMatrix { num_rows: 1, num_columns: 1, words: [1], marker: PhantomData } } +/* generator_layout = GeneratorLayout { + field_tys: { + _0: std::string::String, + }, + variant_fields: { + Unresumed(0): [], + Returned (1): [], + Panicked (2): [], + Suspend0 (3): [_0], + }, + storage_conflicts: BitMatrix(1x1) { + (_0, _0), + }, +} */ fn main::{{closure}}#0(_1: *mut [generator@$DIR/generator-drop-cleanup.rs:10:15: 13:6 {std::string::String, ()}]) -> () { let mut _0: (); // return place in scope 0 at $DIR/generator-drop-cleanup.rs:10:15: 13:6 diff --git a/src/test/mir-opt/generator-tiny/rustc.main-{{closure}}.generator_resume.0.mir b/src/test/mir-opt/generator-tiny/rustc.main-{{closure}}.generator_resume.0.mir index 2398e9501452e..bd6db11a7e73e 100644 --- a/src/test/mir-opt/generator-tiny/rustc.main-{{closure}}.generator_resume.0.mir +++ b/src/test/mir-opt/generator-tiny/rustc.main-{{closure}}.generator_resume.0.mir @@ -1,5 +1,18 @@ // MIR for `main::{{closure}}#0` 0 generator_resume -// generator_layout = GeneratorLayout { field_tys: [HasDrop], variant_fields: [[], [], [], [_0]], variant_source_info: [SourceInfo { span: $DIR/generator-tiny.rs:19:16: 19:16 (#0), scope: scope[0] }, SourceInfo { span: $DIR/generator-tiny.rs:25:6: 25:6 (#0), scope: scope[0] }, SourceInfo { span: $DIR/generator-tiny.rs:25:6: 25:6 (#0), scope: scope[0] }, SourceInfo { span: $DIR/generator-tiny.rs:22:13: 22:18 (#0), scope: scope[1] }], storage_conflicts: BitMatrix { num_rows: 1, num_columns: 1, words: [1], marker: PhantomData } } +/* generator_layout = GeneratorLayout { + field_tys: { + _0: HasDrop, + }, + variant_fields: { + Unresumed(0): [], + Returned (1): [], + Panicked (2): [], + Suspend0 (3): [_0], + }, + storage_conflicts: BitMatrix(1x1) { + (_0, _0), + }, +} */ fn main::{{closure}}#0(_1: std::pin::Pin<&mut [generator@$DIR/generator-tiny.rs:19:16: 25:6 {u8, HasDrop, ()}]>, _2: u8) -> std::ops::GeneratorState<(), ()> { debug _x => _10; // in scope 0 at $DIR/generator-tiny.rs:19:17: 19:19 From 477ecc51caea03c22eb6c7dedcf5656593b71fb0 Mon Sep 17 00:00:00 2001 From: Tyler Mandry Date: Tue, 23 Jun 2020 16:21:53 -0700 Subject: [PATCH 109/142] Generalize generator-debug test a bit Don't be so reliant on particular line ordering (though FileCheck makes this hard in general, IMO). Also disable for MSVC. --- src/test/codegen/generator-debug.rs | 40 ++++++++++++++--------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/test/codegen/generator-debug.rs b/src/test/codegen/generator-debug.rs index 3007099393ffe..fa16a460dde4d 100644 --- a/src/test/codegen/generator-debug.rs +++ b/src/test/codegen/generator-debug.rs @@ -5,6 +5,7 @@ // // ignore-tidy-linelength // compile-flags: -C debuginfo=2 --edition=2018 +// ignore-msvc #![feature(generators, generator_trait)] use std::ops::Generator; @@ -26,66 +27,63 @@ async fn async_fn_test() { // FIXME: We need "checksum" to prevent matching with the wrong (duplicate) file // metadata, even when -C codegen-units=1. -// CHECK: [[FILE:!.*]] = !DIFile(filename: "{{.*}}/generator-debug.rs", {{.*}}, checksum: +// CHECK-DAG: [[FILE:!.*]] = !DIFile(filename: "{{.*}}generator-debug.rs", {{.*}}, checksum: -// CHECK: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "generator-0", scope: [[FN:![0-9]*]], -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: [[FN]] = !DINamespace(name: "generator_test" -// CHECK: [[VARIANT:!.*]] = !DICompositeType(tag: DW_TAG_variant_part, scope: [[FN]], +// CHECK-DAG: [[GEN_FN:!.*]] = !DINamespace(name: "generator_test" +// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "generator-0", scope: [[GEN_FN]], {{.*}}flags: DIFlagArtificial +// CHECK: [[VARIANT:!.*]] = !DICompositeType(tag: DW_TAG_variant_part, scope: [[GEN_FN]], // CHECK-SAME: flags: DIFlagArtificial // CHECK-SAME: discriminator: [[DISC:![0-9]*]] // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "0", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 13, +// CHECK-SAME: file: [[FILE]], line: 14, // CHECK-SAME: flags: DIFlagArtificial // CHECK: {{!.*}} = !DICompositeType(tag: DW_TAG_structure_type, name: "Unresumed", scope: [[GEN]], // CHECK-SAME: flags: DIFlagArtificial // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "1", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 17, +// CHECK-SAME: file: [[FILE]], line: 18, // CHECK-SAME: flags: DIFlagArtificial // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "2", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 17, +// CHECK-SAME: file: [[FILE]], line: 18, // CHECK-SAME: flags: DIFlagArtificial // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "3", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 14, +// CHECK-SAME: file: [[FILE]], line: 15, // CHECK-SAME: flags: DIFlagArtificial // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "4", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 16, +// CHECK-SAME: file: [[FILE]], line: 17, // CHECK-SAME: flags: DIFlagArtificial // CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[GEN]], // CHECK-SAME: flags: DIFlagArtificial // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]] // CHECK-NOT: flags: DIFlagArtificial // CHECK-SAME: ) -// CHECK: [[DISC]] = !DIDerivedType(tag: DW_TAG_member, name: "__state", scope: [[FN]], +// CHECK: [[DISC]] = !DIDerivedType(tag: DW_TAG_member, name: "__state", scope: [[GEN_FN]], // CHECK-SAME: flags: DIFlagArtificial -// CHECK: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "generator-0", scope: [[FN:![0-9]*]], -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: [[FN]] = !DINamespace(name: "async_fn_test" -// CHECK: [[VARIANT:!.*]] = !DICompositeType(tag: DW_TAG_variant_part, scope: [[FN]], +// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "generator-0", scope: [[ASYNC_FN:![0-9]*]], {{.*}}flags: DIFlagArtificial +// CHECK: [[VARIANT:!.*]] = !DICompositeType(tag: DW_TAG_variant_part, scope: [[ASYNC_FN]], // CHECK-SAME: flags: DIFlagArtificial // CHECK-SAME: discriminator: [[DISC:![0-9]*]] // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "0", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 21, +// CHECK-SAME: file: [[FILE]], line: 22, // CHECK-SAME: flags: DIFlagArtificial // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "1", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 25, +// CHECK-SAME: file: [[FILE]], line: 26, // CHECK-SAME: flags: DIFlagArtificial // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "2", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 25, +// CHECK-SAME: file: [[FILE]], line: 26, // CHECK-SAME: flags: DIFlagArtificial // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "3", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 22, +// CHECK-SAME: file: [[FILE]], line: 23, // CHECK-SAME: flags: DIFlagArtificial // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "4", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 24, +// CHECK-SAME: file: [[FILE]], line: 25, // CHECK-SAME: flags: DIFlagArtificial // CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[GEN]], // CHECK-SAME: flags: DIFlagArtificial // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]] // CHECK-NOT: flags: DIFlagArtificial // CHECK-SAME: ) -// CHECK: [[DISC]] = !DIDerivedType(tag: DW_TAG_member, name: "__state", scope: [[FN]], +// CHECK: [[DISC]] = !DIDerivedType(tag: DW_TAG_member, name: "__state", scope: [[ASYNC_FN]], // CHECK-SAME: flags: DIFlagArtificial fn main() { From 2d652d9d735f10402803318351f7a8ee91fc4c47 Mon Sep 17 00:00:00 2001 From: Tyler Mandry Date: Tue, 23 Jun 2020 16:23:01 -0700 Subject: [PATCH 110/142] Add generator-debug test for MSVC ..which doesn't use variant types. --- .../debuginfo/metadata.rs | 18 ++-- src/test/codegen/generator-debug-msvc.rs | 88 +++++++++++++++++++ 2 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 src/test/codegen/generator-debug-msvc.rs diff --git a/src/librustc_codegen_llvm/debuginfo/metadata.rs b/src/librustc_codegen_llvm/debuginfo/metadata.rs index 0338aff509658..33351c06d27ee 100644 --- a/src/librustc_codegen_llvm/debuginfo/metadata.rs +++ b/src/librustc_codegen_llvm/debuginfo/metadata.rs @@ -1652,23 +1652,25 @@ impl VariantMemberDescriptionFactory<'ll, 'tcx> { .iter() .enumerate() .map(|(i, &(ref name, ty))| { + // Discriminant is always the first field of our variant + // when using the enum fallback. + let is_artificial_discr = use_enum_fallback(cx) && i == 0; let (size, align) = cx.size_and_align_of(ty); MemberDescription { name: name.to_string(), - type_metadata: if use_enum_fallback(cx) { - match self.tag_type_metadata { - // Discriminant is always the first field of our variant - // when using the enum fallback. - Some(metadata) if i == 0 => metadata, - _ => type_metadata(cx, ty, self.span), - } + type_metadata: if is_artificial_discr { + self.tag_type_metadata.unwrap_or_else(|| type_metadata(cx, ty, self.span)) } else { type_metadata(cx, ty, self.span) }, offset: self.offsets[i], size, align, - flags: DIFlags::FlagZero, + flags: if is_artificial_discr { + DIFlags::FlagArtificial + } else { + DIFlags::FlagZero + }, discriminant: None, source_info: None, } diff --git a/src/test/codegen/generator-debug-msvc.rs b/src/test/codegen/generator-debug-msvc.rs new file mode 100644 index 0000000000000..ebd0c7ba544b0 --- /dev/null +++ b/src/test/codegen/generator-debug-msvc.rs @@ -0,0 +1,88 @@ +// Verify debuginfo for generators: +// - Each variant points to the file and line of its yield point +// - The generator types and variants are marked artificial +// - Captured vars from the source are not marked artificial +// +// ignore-tidy-linelength +// compile-flags: -C debuginfo=2 --edition=2018 +// only-msvc + +#![feature(generators, generator_trait)] +use std::ops::Generator; + +fn generator_test() -> impl Generator { + || { + yield 0; + let s = String::from("foo"); + yield 1; + } +} + +async fn foo() {} +async fn async_fn_test() { + foo().await; + let s = String::from("foo"); + foo().await; +} + +// FIXME: We need "checksum" to prevent matching with the wrong (duplicate) file +// metadata, even when -C codegen-units=1. +// CHECK-DAG: [[FILE:!.*]] = !DIFile(filename: "{{.*}}generator-debug-msvc.rs", {{.*}}, checksum: + +// CHECK-DAG: [[GEN_FN:!.*]] = !DINamespace(name: "generator_test" +// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_union_type, name: "generator-0", scope: [[GEN_FN]], +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// For brevity, we just check the struct name and members of the last variant. +// CHECK-SAME: file: [[FILE]], line: 14, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// CHECK-SAME: file: [[FILE]], line: 18, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// CHECK-SAME: file: [[FILE]], line: 18, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// CHECK-SAME: file: [[FILE]], line: 15, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// CHECK-SAME: file: [[FILE]], line: 17, +// CHECK-SAME: baseType: [[VARIANT:![0-9]*]] +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[GEN_FN]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "RUST$ENUM$DISR", scope: [[S1]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]] +// CHECK-NOT: flags: DIFlagArtificial +// CHECK-SAME: ) + +// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_union_type, name: "generator-0", scope: [[ASYNC_FN:![0-9]*]], {{.*}}flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// For brevity, we just check the struct name and members of the last variant. +// CHECK-SAME: file: [[FILE]], line: 22, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// CHECK-SAME: file: [[FILE]], line: 26, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// CHECK-SAME: file: [[FILE]], line: 26, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// CHECK-SAME: file: [[FILE]], line: 23, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// CHECK-SAME: file: [[FILE]], line: 25, +// CHECK-SAME: baseType: [[VARIANT:![0-9]*]] +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[ASYNC_FN]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "RUST$ENUM$DISR", scope: [[S1]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]] +// CHECK-NOT: flags: DIFlagArtificial +// CHECK-SAME: ) + +fn main() { + let _dummy = generator_test(); + let _dummy = async_fn_test(); +} From fe3df646fe415123d0a6bd09df698dc69074263a Mon Sep 17 00:00:00 2001 From: Tyler Mandry Date: Tue, 23 Jun 2020 20:19:26 -0700 Subject: [PATCH 111/142] Give up on checking filename --- src/test/codegen/generator-debug-msvc.rs | 6 ++---- src/test/codegen/generator-debug.rs | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/test/codegen/generator-debug-msvc.rs b/src/test/codegen/generator-debug-msvc.rs index ebd0c7ba544b0..705fa5187292c 100644 --- a/src/test/codegen/generator-debug-msvc.rs +++ b/src/test/codegen/generator-debug-msvc.rs @@ -25,15 +25,13 @@ async fn async_fn_test() { foo().await; } -// FIXME: We need "checksum" to prevent matching with the wrong (duplicate) file -// metadata, even when -C codegen-units=1. -// CHECK-DAG: [[FILE:!.*]] = !DIFile(filename: "{{.*}}generator-debug-msvc.rs", {{.*}}, checksum: +// FIXME: No way to reliably check the filename. // CHECK-DAG: [[GEN_FN:!.*]] = !DINamespace(name: "generator_test" // CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_union_type, name: "generator-0", scope: [[GEN_FN]], // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], // For brevity, we just check the struct name and members of the last variant. -// CHECK-SAME: file: [[FILE]], line: 14, +// CHECK-SAME: file: [[FILE:![0-9]*]], line: 14, // CHECK-SAME: flags: DIFlagArtificial // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], // CHECK-SAME: file: [[FILE]], line: 18, diff --git a/src/test/codegen/generator-debug.rs b/src/test/codegen/generator-debug.rs index fa16a460dde4d..4de57c644e8ca 100644 --- a/src/test/codegen/generator-debug.rs +++ b/src/test/codegen/generator-debug.rs @@ -25,9 +25,7 @@ async fn async_fn_test() { foo().await; } -// FIXME: We need "checksum" to prevent matching with the wrong (duplicate) file -// metadata, even when -C codegen-units=1. -// CHECK-DAG: [[FILE:!.*]] = !DIFile(filename: "{{.*}}generator-debug.rs", {{.*}}, checksum: +// FIXME: No way to reliably check the filename. // CHECK-DAG: [[GEN_FN:!.*]] = !DINamespace(name: "generator_test" // CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "generator-0", scope: [[GEN_FN]], {{.*}}flags: DIFlagArtificial @@ -35,7 +33,7 @@ async fn async_fn_test() { // CHECK-SAME: flags: DIFlagArtificial // CHECK-SAME: discriminator: [[DISC:![0-9]*]] // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "0", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 14, +// CHECK-SAME: file: [[FILE:![0-9]*]], line: 14, // CHECK-SAME: flags: DIFlagArtificial // CHECK: {{!.*}} = !DICompositeType(tag: DW_TAG_structure_type, name: "Unresumed", scope: [[GEN]], // CHECK-SAME: flags: DIFlagArtificial From 887fbd9d3411ea7def2cc7a508d74bea6b7f19bb Mon Sep 17 00:00:00 2001 From: Tyler Mandry Date: Wed, 24 Jun 2020 14:17:31 -0700 Subject: [PATCH 112/142] Split out async fn and generator test This keeps FileCheck from tripping over unimportant differences in codegen. --- src/test/codegen/async-fn-debug-msvc.rs | 48 ++++++++++++++++++++++ src/test/codegen/async-fn-debug.rs | 51 ++++++++++++++++++++++++ src/test/codegen/generator-debug-msvc.rs | 40 ++----------------- src/test/codegen/generator-debug.rs | 35 ---------------- 4 files changed, 102 insertions(+), 72 deletions(-) create mode 100644 src/test/codegen/async-fn-debug-msvc.rs create mode 100644 src/test/codegen/async-fn-debug.rs diff --git a/src/test/codegen/async-fn-debug-msvc.rs b/src/test/codegen/async-fn-debug-msvc.rs new file mode 100644 index 0000000000000..4e145b81ecbf7 --- /dev/null +++ b/src/test/codegen/async-fn-debug-msvc.rs @@ -0,0 +1,48 @@ +// Verify debuginfo for generators: +// - Each variant points to the file and line of its yield point +// - The generator types and variants are marked artificial +// - Captured vars from the source are not marked artificial +// +// ignore-tidy-linelength +// compile-flags: -C debuginfo=2 --edition=2018 +// only-msvc + +async fn foo() {} +async fn async_fn_test() { + foo().await; + let s = String::from("foo"); + foo().await; +} + +// FIXME: No way to reliably check the filename. + +// CHECK-DAG: [[ASYNC_FN:!.*]] = !DINamespace(name: "async_fn_test" +// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_union_type, name: "generator-0", scope: [[ASYNC_FN]], {{.*}}flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// For brevity, we only check the struct name and members of the last variant. +// CHECK-SAME: file: [[FILE:![0-9]*]], line: 11, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// CHECK-SAME: file: [[FILE]], line: 15, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// CHECK-SAME: file: [[FILE]], line: 15, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// CHECK-SAME: file: [[FILE]], line: 12, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], +// CHECK-SAME: file: [[FILE]], line: 14, +// CHECK-SAME: baseType: [[VARIANT:![0-9]*]] +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[ASYNC_FN]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "RUST$ENUM$DISR", scope: [[S1]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]] +// CHECK-NOT: flags: DIFlagArtificial +// CHECK-SAME: ) + +fn main() { + let _dummy = async_fn_test(); +} diff --git a/src/test/codegen/async-fn-debug.rs b/src/test/codegen/async-fn-debug.rs new file mode 100644 index 0000000000000..8fa4be1ae86d8 --- /dev/null +++ b/src/test/codegen/async-fn-debug.rs @@ -0,0 +1,51 @@ +// Verify debuginfo for async fn: +// - Each variant points to the file and line of its yield point +// - The generator types and variants are marked artificial +// - Captured vars from the source are not marked artificial +// +// ignore-tidy-linelength +// compile-flags: -C debuginfo=2 --edition=2018 +// ignore-msvc + +async fn foo() {} +async fn async_fn_test() { + foo().await; + let s = String::from("foo"); + foo().await; +} + +// FIXME: No way to reliably check the filename. + +// CHECK-DAG: [[ASYNC_FN:!.*]] = !DINamespace(name: "async_fn_test" +// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "generator-0", scope: [[ASYNC_FN]], {{.*}}flags: DIFlagArtificial +// CHECK: [[VARIANT:!.*]] = !DICompositeType(tag: DW_TAG_variant_part, scope: [[ASYNC_FN]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK-SAME: discriminator: [[DISC:![0-9]*]] +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "0", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE:![0-9]*]], line: 11, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DICompositeType(tag: DW_TAG_structure_type, name: "Unresumed", scope: [[GEN]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "1", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE]], line: 15, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "2", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE]], line: 15, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "3", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE]], line: 12, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "4", scope: [[VARIANT]], +// CHECK-SAME: file: [[FILE]], line: 14, +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[GEN]], +// CHECK-SAME: flags: DIFlagArtificial +// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]] +// CHECK-NOT: flags: DIFlagArtificial +// CHECK-SAME: ) +// CHECK: [[DISC]] = !DIDerivedType(tag: DW_TAG_member, name: "__state", scope: [[ASYNC_FN]], +// CHECK-SAME: flags: DIFlagArtificial + +fn main() { + let _dummy = async_fn_test(); +} diff --git a/src/test/codegen/generator-debug-msvc.rs b/src/test/codegen/generator-debug-msvc.rs index 705fa5187292c..82a1568ea9584 100644 --- a/src/test/codegen/generator-debug-msvc.rs +++ b/src/test/codegen/generator-debug-msvc.rs @@ -4,7 +4,7 @@ // - Captured vars from the source are not marked artificial // // ignore-tidy-linelength -// compile-flags: -C debuginfo=2 --edition=2018 +// compile-flags: -C debuginfo=2 // only-msvc #![feature(generators, generator_trait)] @@ -18,19 +18,12 @@ fn generator_test() -> impl Generator { } } -async fn foo() {} -async fn async_fn_test() { - foo().await; - let s = String::from("foo"); - foo().await; -} - // FIXME: No way to reliably check the filename. // CHECK-DAG: [[GEN_FN:!.*]] = !DINamespace(name: "generator_test" -// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_union_type, name: "generator-0", scope: [[GEN_FN]], +// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_union_type, name: "generator-0", scope: [[GEN_FN]], {{.*}}flags: DIFlagArtificial // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], -// For brevity, we just check the struct name and members of the last variant. +// For brevity, we only check the struct name and members of the last variant. // CHECK-SAME: file: [[FILE:![0-9]*]], line: 14, // CHECK-SAME: flags: DIFlagArtificial // CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], @@ -54,33 +47,6 @@ async fn async_fn_test() { // CHECK-NOT: flags: DIFlagArtificial // CHECK-SAME: ) -// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_union_type, name: "generator-0", scope: [[ASYNC_FN:![0-9]*]], {{.*}}flags: DIFlagArtificial -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], -// For brevity, we just check the struct name and members of the last variant. -// CHECK-SAME: file: [[FILE]], line: 22, -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], -// CHECK-SAME: file: [[FILE]], line: 26, -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], -// CHECK-SAME: file: [[FILE]], line: 26, -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], -// CHECK-SAME: file: [[FILE]], line: 23, -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]], -// CHECK-SAME: file: [[FILE]], line: 25, -// CHECK-SAME: baseType: [[VARIANT:![0-9]*]] -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[ASYNC_FN]], -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "RUST$ENUM$DISR", scope: [[S1]], -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]] -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) - fn main() { let _dummy = generator_test(); - let _dummy = async_fn_test(); } diff --git a/src/test/codegen/generator-debug.rs b/src/test/codegen/generator-debug.rs index 4de57c644e8ca..5c7c64148189a 100644 --- a/src/test/codegen/generator-debug.rs +++ b/src/test/codegen/generator-debug.rs @@ -18,13 +18,6 @@ fn generator_test() -> impl Generator { } } -async fn foo() {} -async fn async_fn_test() { - foo().await; - let s = String::from("foo"); - foo().await; -} - // FIXME: No way to reliably check the filename. // CHECK-DAG: [[GEN_FN:!.*]] = !DINamespace(name: "generator_test" @@ -57,34 +50,6 @@ async fn async_fn_test() { // CHECK: [[DISC]] = !DIDerivedType(tag: DW_TAG_member, name: "__state", scope: [[GEN_FN]], // CHECK-SAME: flags: DIFlagArtificial -// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "generator-0", scope: [[ASYNC_FN:![0-9]*]], {{.*}}flags: DIFlagArtificial -// CHECK: [[VARIANT:!.*]] = !DICompositeType(tag: DW_TAG_variant_part, scope: [[ASYNC_FN]], -// CHECK-SAME: flags: DIFlagArtificial -// CHECK-SAME: discriminator: [[DISC:![0-9]*]] -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "0", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 22, -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "1", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 26, -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "2", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 26, -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "3", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 23, -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "4", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 25, -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[GEN]], -// CHECK-SAME: flags: DIFlagArtificial -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]] -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: [[DISC]] = !DIDerivedType(tag: DW_TAG_member, name: "__state", scope: [[ASYNC_FN]], -// CHECK-SAME: flags: DIFlagArtificial - fn main() { let _dummy = generator_test(); - let _dummy = async_fn_test(); } From a13d4678feadf03e247ab6aae8279bfab9cdaa6d Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Sun, 24 May 2020 23:07:55 -0400 Subject: [PATCH 113/142] Implement associated lang items Fixes #70718 This commit allows making associated items (e.g. associated functions and types) into lang items via the `#[lang]` attribute. This allows such items to be accessed directly, rather than by iterating over the parent item's associated items. I've added `FnOnce::Output` as a lang item, and updated one old usage to use the new lang item. The remaining uses can be updated separately. --- src/libcore/ops/function.rs | 1 + src/librustc_hir/lang_items.rs | 4 +- src/librustc_passes/check_attr.rs | 5 +- src/librustc_passes/lang_items.rs | 49 ++++++++++++------- .../traits/project.rs | 15 +++--- src/test/ui/assoc-lang-items.rs | 21 ++++++++ src/test/ui/assoc-lang-items.stderr | 27 ++++++++++ 7 files changed, 94 insertions(+), 28 deletions(-) create mode 100644 src/test/ui/assoc-lang-items.rs create mode 100644 src/test/ui/assoc-lang-items.stderr diff --git a/src/libcore/ops/function.rs b/src/libcore/ops/function.rs index 04c7789fa4ff4..2cdfee87a3546 100644 --- a/src/libcore/ops/function.rs +++ b/src/libcore/ops/function.rs @@ -224,6 +224,7 @@ pub trait FnMut: FnOnce { #[must_use = "closures are lazy and do nothing unless called"] pub trait FnOnce { /// The returned type after the call operator is used. + #[cfg_attr(not(bootstrap), lang = "fn_once_output")] #[stable(feature = "fn_once_output", since = "1.12.0")] type Output; diff --git a/src/librustc_hir/lang_items.rs b/src/librustc_hir/lang_items.rs index 091ded6d74d0f..cd6f034f7a5da 100644 --- a/src/librustc_hir/lang_items.rs +++ b/src/librustc_hir/lang_items.rs @@ -25,7 +25,7 @@ use lazy_static::lazy_static; // So you probably just want to nip down to the end. macro_rules! language_item_table { ( - $( $variant:ident, $name:expr, $method:ident, $target:path; )* + $( $variant:ident, $name:expr, $method:ident, $target:expr; )* ) => { enum_from_u32! { @@ -207,6 +207,8 @@ language_item_table! { FnMutTraitLangItem, "fn_mut", fn_mut_trait, Target::Trait; FnOnceTraitLangItem, "fn_once", fn_once_trait, Target::Trait; + FnOnceOutputLangItem, "fn_once_output", fn_once_output, Target::AssocTy; + FutureTraitLangItem, "future_trait", future_trait, Target::Trait; GeneratorStateLangItem, "generator_state", gen_state, Target::Enum; GeneratorTraitLangItem, "generator", gen_trait, Target::Trait; diff --git a/src/librustc_passes/check_attr.rs b/src/librustc_passes/check_attr.rs index 80681c143750f..408f2e8c19a5d 100644 --- a/src/librustc_passes/check_attr.rs +++ b/src/librustc_passes/check_attr.rs @@ -21,7 +21,10 @@ use rustc_session::parse::feature_err; use rustc_span::symbol::sym; use rustc_span::Span; -fn target_from_impl_item<'tcx>(tcx: TyCtxt<'tcx>, impl_item: &hir::ImplItem<'_>) -> Target { +pub(crate) fn target_from_impl_item<'tcx>( + tcx: TyCtxt<'tcx>, + impl_item: &hir::ImplItem<'_>, +) -> Target { match impl_item.kind { hir::ImplItemKind::Const(..) => Target::AssocConst, hir::ImplItemKind::Fn(..) => { diff --git a/src/librustc_passes/lang_items.rs b/src/librustc_passes/lang_items.rs index 779fb8039d157..f4167c8644e6e 100644 --- a/src/librustc_passes/lang_items.rs +++ b/src/librustc_passes/lang_items.rs @@ -7,17 +7,19 @@ //! * Traits that represent operators; e.g., `Add`, `Sub`, `Index`. //! * Functions called by the compiler itself. +use crate::check_attr::target_from_impl_item; use crate::weak_lang_items; use rustc_middle::middle::cstore::ExternCrate; use rustc_middle::ty::TyCtxt; +use rustc_ast::ast::Attribute; use rustc_errors::struct_span_err; use rustc_hir as hir; use rustc_hir::def_id::{DefId, LOCAL_CRATE}; use rustc_hir::itemlikevisit::ItemLikeVisitor; use rustc_hir::lang_items::{extract, ITEM_REFS}; -use rustc_hir::{LangItem, LanguageItems, Target}; +use rustc_hir::{HirId, LangItem, LanguageItems, Target}; use rustc_middle::ty::query::Providers; @@ -28,12 +30,37 @@ struct LanguageItemCollector<'tcx> { impl ItemLikeVisitor<'v> for LanguageItemCollector<'tcx> { fn visit_item(&mut self, item: &hir::Item<'_>) { - if let Some((value, span)) = extract(&item.attrs) { - let actual_target = Target::from_item(item); + self.check_for_lang(Target::from_item(item), item.hir_id, item.attrs) + } + + fn visit_trait_item(&mut self, trait_item: &hir::TraitItem<'_>) { + self.check_for_lang( + Target::from_trait_item(trait_item), + trait_item.hir_id, + trait_item.attrs, + ) + } + + fn visit_impl_item(&mut self, impl_item: &hir::ImplItem<'_>) { + self.check_for_lang( + target_from_impl_item(self.tcx, impl_item), + impl_item.hir_id, + impl_item.attrs, + ) + } +} + +impl LanguageItemCollector<'tcx> { + fn new(tcx: TyCtxt<'tcx>) -> LanguageItemCollector<'tcx> { + LanguageItemCollector { tcx, items: LanguageItems::new() } + } + + fn check_for_lang(&mut self, actual_target: Target, hir_id: HirId, attrs: &[Attribute]) { + if let Some((value, span)) = extract(&attrs) { match ITEM_REFS.get(&*value.as_str()).cloned() { // Known lang item with attribute on correct target. Some((item_index, expected_target)) if actual_target == expected_target => { - let def_id = self.tcx.hir().local_def_id(item.hir_id); + let def_id = self.tcx.hir().local_def_id(hir_id); self.collect_item(item_index, def_id.to_def_id()); } // Known lang item with attribute on incorrect target. @@ -71,20 +98,6 @@ impl ItemLikeVisitor<'v> for LanguageItemCollector<'tcx> { } } - fn visit_trait_item(&mut self, _trait_item: &hir::TraitItem<'_>) { - // At present, lang items are always items, not trait items. - } - - fn visit_impl_item(&mut self, _impl_item: &hir::ImplItem<'_>) { - // At present, lang items are always items, not impl items. - } -} - -impl LanguageItemCollector<'tcx> { - fn new(tcx: TyCtxt<'tcx>) -> LanguageItemCollector<'tcx> { - LanguageItemCollector { tcx, items: LanguageItems::new() } - } - fn collect_item(&mut self, item_index: usize, item_def_id: DefId) { // Check for duplicates. if let Some(original_def_id) = self.items.items[item_index] { diff --git a/src/librustc_trait_selection/traits/project.rs b/src/librustc_trait_selection/traits/project.rs index bc696214cbc66..f71b3fcf129da 100644 --- a/src/librustc_trait_selection/traits/project.rs +++ b/src/librustc_trait_selection/traits/project.rs @@ -23,13 +23,13 @@ use crate::traits::error_reporting::InferCtxtExt; use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_errors::ErrorReported; use rustc_hir::def_id::DefId; -use rustc_hir::lang_items::{FnOnceTraitLangItem, GeneratorTraitLangItem}; +use rustc_hir::lang_items::{FnOnceOutputLangItem, FnOnceTraitLangItem, GeneratorTraitLangItem}; use rustc_infer::infer::resolve::OpportunisticRegionResolver; use rustc_middle::ty::fold::{TypeFoldable, TypeFolder}; use rustc_middle::ty::subst::Subst; use rustc_middle::ty::util::IntTypeExt; use rustc_middle::ty::{self, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, WithConstness}; -use rustc_span::symbol::{sym, Ident}; +use rustc_span::symbol::sym; use rustc_span::DUMMY_SP; pub use rustc_middle::traits::Reveal; @@ -1399,8 +1399,8 @@ fn confirm_callable_candidate<'cx, 'tcx>( debug!("confirm_callable_candidate({:?},{:?})", obligation, fn_sig); - // the `Output` associated type is declared on `FnOnce` let fn_once_def_id = tcx.require_lang_item(FnOnceTraitLangItem, None); + let fn_once_output_def_id = tcx.require_lang_item(FnOnceOutputLangItem, None); let predicate = super::util::closure_trait_ref_and_return_type( tcx, @@ -1410,11 +1410,10 @@ fn confirm_callable_candidate<'cx, 'tcx>( flag, ) .map_bound(|(trait_ref, ret_type)| ty::ProjectionPredicate { - projection_ty: ty::ProjectionTy::from_ref_and_name( - tcx, - trait_ref, - Ident::with_dummy_span(rustc_hir::FN_OUTPUT_NAME), - ), + projection_ty: ty::ProjectionTy { + substs: trait_ref.substs, + item_def_id: fn_once_output_def_id, + }, ty: ret_type, }); diff --git a/src/test/ui/assoc-lang-items.rs b/src/test/ui/assoc-lang-items.rs new file mode 100644 index 0000000000000..23453d201a72f --- /dev/null +++ b/src/test/ui/assoc-lang-items.rs @@ -0,0 +1,21 @@ +#![feature(lang_items)] + +trait Foo { + #[lang = "dummy_lang_item_1"] //~ ERROR definition + fn foo() {} + + #[lang = "dummy_lang_item_2"] //~ ERROR definition + fn bar(); + + #[lang = "dummy_lang_item_3"] //~ ERROR definition + type MyType; +} + +struct Bar; + +impl Bar { + #[lang = "dummy_lang_item_4"] //~ ERROR definition + fn test() {} +} + +fn main() {} diff --git a/src/test/ui/assoc-lang-items.stderr b/src/test/ui/assoc-lang-items.stderr new file mode 100644 index 0000000000000..040792fb1cd5f --- /dev/null +++ b/src/test/ui/assoc-lang-items.stderr @@ -0,0 +1,27 @@ +error[E0522]: definition of an unknown language item: `dummy_lang_item_1` + --> $DIR/assoc-lang-items.rs:4:5 + | +LL | #[lang = "dummy_lang_item_1"] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition of unknown language item `dummy_lang_item_1` + +error[E0522]: definition of an unknown language item: `dummy_lang_item_2` + --> $DIR/assoc-lang-items.rs:7:5 + | +LL | #[lang = "dummy_lang_item_2"] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition of unknown language item `dummy_lang_item_2` + +error[E0522]: definition of an unknown language item: `dummy_lang_item_3` + --> $DIR/assoc-lang-items.rs:10:5 + | +LL | #[lang = "dummy_lang_item_3"] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition of unknown language item `dummy_lang_item_3` + +error[E0522]: definition of an unknown language item: `dummy_lang_item_4` + --> $DIR/assoc-lang-items.rs:17:5 + | +LL | #[lang = "dummy_lang_item_4"] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition of unknown language item `dummy_lang_item_4` + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0522`. From 8f40dae93b3a66a9cdd0f940244da7f602618fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Wed, 24 Jun 2020 16:17:04 -0700 Subject: [PATCH 114/142] Suggest type param trait bound for binop only when appropriate Verify that the binop trait *is* implemented for the types *if* all the involved type parameters are replaced with fresh inferred types. When this is the case, it means that the type parameter was indeed missing a trait bound. If this is not the case, provide a generic `note` refering to the type that doesn't implement the expected trait. --- src/librustc_typeck/check/op.rs | 67 +++++++++++++------ src/test/ui/issues/issue-35668.stderr | 1 - src/test/ui/suggestions/invalid-bin-op.rs | 7 ++ src/test/ui/suggestions/invalid-bin-op.stderr | 13 ++++ .../missing-trait-bound-for-op.fixed | 12 +--- .../suggestions/missing-trait-bound-for-op.rs | 12 +--- .../missing-trait-bound-for-op.stderr | 15 ++--- .../trait-resolution-in-overloaded-op.stderr | 1 - 8 files changed, 78 insertions(+), 50 deletions(-) create mode 100644 src/test/ui/suggestions/invalid-bin-op.rs create mode 100644 src/test/ui/suggestions/invalid-bin-op.stderr diff --git a/src/librustc_typeck/check/op.rs b/src/librustc_typeck/check/op.rs index 0184c00c475b5..e333b706e745d 100644 --- a/src/librustc_typeck/check/op.rs +++ b/src/librustc_typeck/check/op.rs @@ -8,6 +8,7 @@ use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKi use rustc_middle::ty::adjustment::{ Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability, }; +use rustc_middle::ty::fold::TypeFolder; use rustc_middle::ty::TyKind::{Adt, Array, Char, FnDef, Never, Ref, Str, Tuple, Uint}; use rustc_middle::ty::{ self, suggest_constraining_type_param, Ty, TyCtxt, TypeFoldable, TypeVisitor, @@ -436,29 +437,36 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // we don't want the note in the else clause to be emitted } else if let [ty] = &visitor.0[..] { if let ty::Param(p) = ty.kind { - // FIXME: This *guesses* that constraining the type param - // will make the operation available, but this is only true - // when the corresponding trait has a blanket - // implementation, like the following: - // `impl<'a> PartialEq for &'a [T] where T: PartialEq {}` - // The correct thing to do would be to verify this - // projection would hold. - if *ty != lhs_ty { + // Check if the method would be found if the type param wasn't + // involved. If so, it means that adding a trait bound to the param is + // enough. Otherwise we do not give the suggestion. + let mut eraser = TypeParamEraser(&self, expr.span); + let needs_bound = self + .lookup_op_method( + eraser.fold_ty(lhs_ty), + &[eraser.fold_ty(rhs_ty)], + Op::Binary(op, is_assign), + ) + .is_ok(); + if needs_bound { + suggest_constraining_param( + self.tcx, + self.body_id, + &mut err, + ty, + rhs_ty, + missing_trait, + p, + use_output, + ); + } else if *ty != lhs_ty { + // When we know that a missing bound is responsible, we don't show + // this note as it is redundant. err.note(&format!( "the trait `{}` is not implemented for `{}`", missing_trait, lhs_ty )); } - suggest_constraining_param( - self.tcx, - self.body_id, - &mut err, - ty, - rhs_ty, - missing_trait, - p, - use_output, - ); } else { bug!("type param visitor stored a non type param: {:?}", ty.kind); } @@ -656,10 +664,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { ); err.span_label( ex.span, - format!( - "cannot apply unary operator `{}`", - op.as_str() - ), + format!("cannot apply unary operator `{}`", op.as_str()), ); match actual.kind { Uint(_) if op == hir::UnOp::UnNeg => { @@ -954,3 +959,21 @@ impl<'tcx> TypeVisitor<'tcx> for TypeParamVisitor<'tcx> { ty.super_visit_with(self) } } + +struct TypeParamEraser<'a, 'tcx>(&'a FnCtxt<'a, 'tcx>, Span); + +impl TypeFolder<'tcx> for TypeParamEraser<'_, 'tcx> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.0.tcx + } + + fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> { + match ty.kind { + ty::Param(_) => self.0.next_ty_var(TypeVariableOrigin { + kind: TypeVariableOriginKind::MiscVariable, + span: self.1, + }), + _ => ty.super_fold_with(self), + } + } +} diff --git a/src/test/ui/issues/issue-35668.stderr b/src/test/ui/issues/issue-35668.stderr index c8f1f88a4708e..600cacc23aef5 100644 --- a/src/test/ui/issues/issue-35668.stderr +++ b/src/test/ui/issues/issue-35668.stderr @@ -6,7 +6,6 @@ LL | a.iter().map(|a| a*a) | | | &T | - = note: the trait `std::ops::Mul` is not implemented for `&T` help: consider restricting type parameter `T` | LL | fn func<'a, T: std::ops::Mul>(a: &'a [T]) -> impl Iterator { diff --git a/src/test/ui/suggestions/invalid-bin-op.rs b/src/test/ui/suggestions/invalid-bin-op.rs new file mode 100644 index 0000000000000..bea1b91558646 --- /dev/null +++ b/src/test/ui/suggestions/invalid-bin-op.rs @@ -0,0 +1,7 @@ +pub fn foo(s: S, t: S) { + let _ = s == t; //~ ERROR binary operation `==` cannot be applied to type `S` +} + +struct S(T); + +fn main() {} diff --git a/src/test/ui/suggestions/invalid-bin-op.stderr b/src/test/ui/suggestions/invalid-bin-op.stderr new file mode 100644 index 0000000000000..7668eddf6070a --- /dev/null +++ b/src/test/ui/suggestions/invalid-bin-op.stderr @@ -0,0 +1,13 @@ +error[E0369]: binary operation `==` cannot be applied to type `S` + --> $DIR/invalid-bin-op.rs:2:15 + | +LL | let _ = s == t; + | - ^^ - S + | | + | S + | + = note: the trait `std::cmp::PartialEq` is not implemented for `S` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0369`. diff --git a/src/test/ui/suggestions/missing-trait-bound-for-op.fixed b/src/test/ui/suggestions/missing-trait-bound-for-op.fixed index 02886bb845cf7..6b24375e41503 100644 --- a/src/test/ui/suggestions/missing-trait-bound-for-op.fixed +++ b/src/test/ui/suggestions/missing-trait-bound-for-op.fixed @@ -1,13 +1,7 @@ // run-rustfix -pub fn strip_prefix<'a, T: std::cmp::PartialEq>(s: &'a [T], prefix: &[T]) -> Option<&'a [T]> { - let n = prefix.len(); - if n <= s.len() { - let (head, tail) = s.split_at(n); - if head == prefix { //~ ERROR binary operation `==` cannot be applied to type `&[T]` - return Some(tail); - } - } - None +pub fn foo(s: &[T], t: &[T]) { + let _ = s == t; //~ ERROR binary operation `==` cannot be applied to type `&[T]` } + fn main() {} diff --git a/src/test/ui/suggestions/missing-trait-bound-for-op.rs b/src/test/ui/suggestions/missing-trait-bound-for-op.rs index aa4ef467360d9..df47be070c9ea 100644 --- a/src/test/ui/suggestions/missing-trait-bound-for-op.rs +++ b/src/test/ui/suggestions/missing-trait-bound-for-op.rs @@ -1,13 +1,7 @@ // run-rustfix -pub fn strip_prefix<'a, T>(s: &'a [T], prefix: &[T]) -> Option<&'a [T]> { - let n = prefix.len(); - if n <= s.len() { - let (head, tail) = s.split_at(n); - if head == prefix { //~ ERROR binary operation `==` cannot be applied to type `&[T]` - return Some(tail); - } - } - None +pub fn foo(s: &[T], t: &[T]) { + let _ = s == t; //~ ERROR binary operation `==` cannot be applied to type `&[T]` } + fn main() {} diff --git a/src/test/ui/suggestions/missing-trait-bound-for-op.stderr b/src/test/ui/suggestions/missing-trait-bound-for-op.stderr index dab4e575be1fa..0e0d397d6fc15 100644 --- a/src/test/ui/suggestions/missing-trait-bound-for-op.stderr +++ b/src/test/ui/suggestions/missing-trait-bound-for-op.stderr @@ -1,16 +1,15 @@ error[E0369]: binary operation `==` cannot be applied to type `&[T]` - --> $DIR/missing-trait-bound-for-op.rs:7:17 + --> $DIR/missing-trait-bound-for-op.rs:4:15 | -LL | if head == prefix { - | ---- ^^ ------ &[T] - | | - | &[T] +LL | let _ = s == t; + | - ^^ - &[T] + | | + | &[T] | - = note: the trait `std::cmp::PartialEq` is not implemented for `&[T]` help: consider restricting type parameter `T` | -LL | pub fn strip_prefix<'a, T: std::cmp::PartialEq>(s: &'a [T], prefix: &[T]) -> Option<&'a [T]> { - | ^^^^^^^^^^^^^^^^^^^^^ +LL | pub fn foo(s: &[T], t: &[T]) { + | ^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr b/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr index 1c424ce7da669..507d53dc07c4c 100644 --- a/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr +++ b/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr @@ -6,7 +6,6 @@ LL | a * b | | | &T | - = note: the trait `std::ops::Mul` is not implemented for `&T` help: consider further restricting this bound | LL | fn foo + std::ops::Mul>(a: &T, b: f64) -> f64 { From 520461f1fb2730f8edb17922f3bcc74fccdc52d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 19 Jun 2020 22:45:09 -0700 Subject: [PATCH 115/142] Provide suggestions for some moved value errors When encountering an used moved value where the previous move happened in a `match` or `if let` pattern, suggest using `ref`. Fix #63988. When encountering a `&mut` value that is used in multiple iterations of a loop, suggest reborrowing it with `&mut *`. Fix #62112. --- .../diagnostics/conflict_errors.rs | 39 +++++++++++++++++-- .../diagnostics/explain_borrow.rs | 2 +- .../borrow_check/diagnostics/mod.rs | 20 +++++++--- src/test/ui/borrowck/issue-41962.stderr | 4 ++ src/test/ui/borrowck/move-in-pattern-mut.rs | 23 +++++++++++ .../ui/borrowck/move-in-pattern-mut.stderr | 33 ++++++++++++++++ src/test/ui/borrowck/move-in-pattern.fixed | 24 ++++++++++++ src/test/ui/borrowck/move-in-pattern.rs | 24 ++++++++++++ src/test/ui/borrowck/move-in-pattern.stderr | 33 ++++++++++++++++ .../ui/borrowck/mut-borrow-in-loop-2.fixed | 35 +++++++++++++++++ src/test/ui/borrowck/mut-borrow-in-loop-2.rs | 35 +++++++++++++++++ .../ui/borrowck/mut-borrow-in-loop-2.stderr | 17 ++++++++ ...sed-on-type-cyclic-types-issue-4821.stderr | 4 ++ src/test/ui/nll/issue-53807.stderr | 4 ++ ...can-live-while-the-other-survives-1.stderr | 8 ++++ ...orrowck-pat-by-move-and-ref-inverse.stderr | 16 ++++++++ src/test/ui/ref-suggestion.stderr | 4 ++ 17 files changed, 315 insertions(+), 10 deletions(-) create mode 100644 src/test/ui/borrowck/move-in-pattern-mut.rs create mode 100644 src/test/ui/borrowck/move-in-pattern-mut.stderr create mode 100644 src/test/ui/borrowck/move-in-pattern.fixed create mode 100644 src/test/ui/borrowck/move-in-pattern.rs create mode 100644 src/test/ui/borrowck/move-in-pattern.stderr create mode 100644 src/test/ui/borrowck/mut-borrow-in-loop-2.fixed create mode 100644 src/test/ui/borrowck/mut-borrow-in-loop-2.rs create mode 100644 src/test/ui/borrowck/mut-borrow-in-loop-2.stderr diff --git a/src/librustc_mir/borrow_check/diagnostics/conflict_errors.rs b/src/librustc_mir/borrow_check/diagnostics/conflict_errors.rs index 8d7944004c75e..60a1fe0b19870 100644 --- a/src/librustc_mir/borrow_check/diagnostics/conflict_errors.rs +++ b/src/librustc_mir/borrow_check/diagnostics/conflict_errors.rs @@ -156,6 +156,20 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { format!("variable moved due to use{}", move_spans.describe()), ); } + if let UseSpans::PatUse(span) = move_spans { + err.span_suggestion_verbose( + span.shrink_to_lo(), + &format!( + "borrow this field in the pattern to avoid moving {}", + self.describe_place(moved_place.as_ref()) + .map(|n| format!("`{}`", n)) + .unwrap_or_else(|| "the value".to_string()) + ), + "ref ".to_string(), + Applicability::MachineApplicable, + ); + } + if Some(DesugaringKind::ForLoop) == move_span.desugaring_kind() { let sess = self.infcx.tcx.sess; if let Ok(snippet) = sess.source_map().span_to_snippet(move_span) { @@ -198,11 +212,28 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { _ => true, }; - if needs_note { - let mpi = self.move_data.moves[move_out_indices[0]].path; - let place = &self.move_data.move_paths[mpi].place; + let mpi = self.move_data.moves[move_out_indices[0]].path; + let place = &self.move_data.move_paths[mpi].place; + let ty = place.ty(self.body, self.infcx.tcx).ty; + + if is_loop_move { + if let ty::Ref(_, _, hir::Mutability::Mut) = ty.kind { + // We have a `&mut` ref, we need to reborrow on each iteration (#62112). + err.span_suggestion_verbose( + span.shrink_to_lo(), + &format!( + "consider creating a fresh reborrow of {} here", + self.describe_place(moved_place) + .map(|n| format!("`{}`", n)) + .unwrap_or_else(|| "the mutable reference".to_string()), + ), + "&mut *".to_string(), + Applicability::MachineApplicable, + ); + } + } - let ty = place.ty(self.body, self.infcx.tcx).ty; + if needs_note { let opt_name = self.describe_place_with_options(place.as_ref(), IncludingDowncast(true)); let note_msg = match opt_name { diff --git a/src/librustc_mir/borrow_check/diagnostics/explain_borrow.rs b/src/librustc_mir/borrow_check/diagnostics/explain_borrow.rs index 5253acbba7f1c..849fd63998db4 100644 --- a/src/librustc_mir/borrow_check/diagnostics/explain_borrow.rs +++ b/src/librustc_mir/borrow_check/diagnostics/explain_borrow.rs @@ -509,7 +509,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // Used in a closure. (LaterUseKind::ClosureCapture, var_span) } - UseSpans::OtherUse(span) => { + UseSpans::PatUse(span) | UseSpans::OtherUse(span) => { let block = &self.body.basic_blocks()[location.block]; let kind = if let Some(&Statement { diff --git a/src/librustc_mir/borrow_check/diagnostics/mod.rs b/src/librustc_mir/borrow_check/diagnostics/mod.rs index ca8e54ea28649..388076a9d60af 100644 --- a/src/librustc_mir/borrow_check/diagnostics/mod.rs +++ b/src/librustc_mir/borrow_check/diagnostics/mod.rs @@ -542,20 +542,26 @@ pub(super) enum UseSpans { // The span of the first use of the captured variable inside the closure. var_span: Span, }, - // This access has a single span associated to it: common case. + /// This access is caused by a `match` or `if let` pattern. + PatUse(Span), + /// This access has a single span associated to it: common case. OtherUse(Span), } impl UseSpans { pub(super) fn args_or_use(self) -> Span { match self { - UseSpans::ClosureUse { args_span: span, .. } | UseSpans::OtherUse(span) => span, + UseSpans::ClosureUse { args_span: span, .. } + | UseSpans::PatUse(span) + | UseSpans::OtherUse(span) => span, } } pub(super) fn var_or_use(self) -> Span { match self { - UseSpans::ClosureUse { var_span: span, .. } | UseSpans::OtherUse(span) => span, + UseSpans::ClosureUse { var_span: span, .. } + | UseSpans::PatUse(span) + | UseSpans::OtherUse(span) => span, } } @@ -624,7 +630,7 @@ impl UseSpans { { match self { closure @ UseSpans::ClosureUse { .. } => closure, - UseSpans::OtherUse(_) => if_other(), + UseSpans::PatUse(_) | UseSpans::OtherUse(_) => if_other(), } } } @@ -741,7 +747,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } } - OtherUse(stmt.source_info.span) + if moved_place.projection.iter().any(|p| matches!(p, ProjectionElem::Downcast(..))) { + PatUse(stmt.source_info.span) + } else { + OtherUse(stmt.source_info.span) + } } /// Finds the span of arguments of a closure (within `maybe_closure_span`) diff --git a/src/test/ui/borrowck/issue-41962.stderr b/src/test/ui/borrowck/issue-41962.stderr index 422d1605aa46b..604143b4e7efd 100644 --- a/src/test/ui/borrowck/issue-41962.stderr +++ b/src/test/ui/borrowck/issue-41962.stderr @@ -5,6 +5,10 @@ LL | if let Some(thing) = maybe { | ^^^^^ value moved here, in previous iteration of loop | = note: move occurs because value has type `std::vec::Vec`, which does not implement the `Copy` trait +help: borrow this field in the pattern to avoid moving `maybe.0` + | +LL | if let Some(ref thing) = maybe { + | ^^^ error: aborting due to previous error diff --git a/src/test/ui/borrowck/move-in-pattern-mut.rs b/src/test/ui/borrowck/move-in-pattern-mut.rs new file mode 100644 index 0000000000000..175eb3b7a04d1 --- /dev/null +++ b/src/test/ui/borrowck/move-in-pattern-mut.rs @@ -0,0 +1,23 @@ +// Issue #63988 +#[derive(Debug)] +struct S; +fn foo(_: Option) {} + +enum E { + V { + s: S, + } +} +fn bar(_: E) {} + +fn main() { + let s = Some(S); + if let Some(mut x) = s { + x = S; + } + foo(s); //~ ERROR use of moved value: `s` + let mut e = E::V { s: S }; + let E::V { s: mut x } = e; + x = S; + bar(e); //~ ERROR use of moved value: `e` +} diff --git a/src/test/ui/borrowck/move-in-pattern-mut.stderr b/src/test/ui/borrowck/move-in-pattern-mut.stderr new file mode 100644 index 0000000000000..391638444c3bd --- /dev/null +++ b/src/test/ui/borrowck/move-in-pattern-mut.stderr @@ -0,0 +1,33 @@ +error[E0382]: use of moved value: `s` + --> $DIR/move-in-pattern-mut.rs:18:9 + | +LL | if let Some(mut x) = s { + | ----- value moved here +... +LL | foo(s); + | ^ value used here after partial move + | + = note: move occurs because value has type `S`, which does not implement the `Copy` trait +help: borrow this field in the pattern to avoid moving `s.0` + | +LL | if let Some(ref mut x) = s { + | ^^^ + +error[E0382]: use of moved value: `e` + --> $DIR/move-in-pattern-mut.rs:22:9 + | +LL | let E::V { s: mut x } = e; + | ----- value moved here +LL | x = S; +LL | bar(e); + | ^ value used here after partial move + | + = note: move occurs because value has type `S`, which does not implement the `Copy` trait +help: borrow this field in the pattern to avoid moving `e.s` + | +LL | let E::V { s: ref mut x } = e; + | ^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0382`. diff --git a/src/test/ui/borrowck/move-in-pattern.fixed b/src/test/ui/borrowck/move-in-pattern.fixed new file mode 100644 index 0000000000000..f55fdcc5f90e8 --- /dev/null +++ b/src/test/ui/borrowck/move-in-pattern.fixed @@ -0,0 +1,24 @@ +// run-rustfix +// Issue #63988 +#[derive(Debug)] +struct S; +fn foo(_: Option) {} + +enum E { + V { + s: S, + } +} +fn bar(_: E) {} + +fn main() { + let s = Some(S); + if let Some(ref x) = s { + let _ = x; + } + foo(s); //~ ERROR use of moved value: `s` + let e = E::V { s: S }; + let E::V { s: ref x } = e; + let _ = x; + bar(e); //~ ERROR use of moved value: `e` +} diff --git a/src/test/ui/borrowck/move-in-pattern.rs b/src/test/ui/borrowck/move-in-pattern.rs new file mode 100644 index 0000000000000..7ad04b9490c25 --- /dev/null +++ b/src/test/ui/borrowck/move-in-pattern.rs @@ -0,0 +1,24 @@ +// run-rustfix +// Issue #63988 +#[derive(Debug)] +struct S; +fn foo(_: Option) {} + +enum E { + V { + s: S, + } +} +fn bar(_: E) {} + +fn main() { + let s = Some(S); + if let Some(x) = s { + let _ = x; + } + foo(s); //~ ERROR use of moved value: `s` + let e = E::V { s: S }; + let E::V { s: x } = e; + let _ = x; + bar(e); //~ ERROR use of moved value: `e` +} diff --git a/src/test/ui/borrowck/move-in-pattern.stderr b/src/test/ui/borrowck/move-in-pattern.stderr new file mode 100644 index 0000000000000..c5cb24455eb61 --- /dev/null +++ b/src/test/ui/borrowck/move-in-pattern.stderr @@ -0,0 +1,33 @@ +error[E0382]: use of moved value: `s` + --> $DIR/move-in-pattern.rs:19:9 + | +LL | if let Some(x) = s { + | - value moved here +... +LL | foo(s); + | ^ value used here after partial move + | + = note: move occurs because value has type `S`, which does not implement the `Copy` trait +help: borrow this field in the pattern to avoid moving `s.0` + | +LL | if let Some(ref x) = s { + | ^^^ + +error[E0382]: use of moved value: `e` + --> $DIR/move-in-pattern.rs:23:9 + | +LL | let E::V { s: x } = e; + | - value moved here +LL | let _ = x; +LL | bar(e); + | ^ value used here after partial move + | + = note: move occurs because value has type `S`, which does not implement the `Copy` trait +help: borrow this field in the pattern to avoid moving `e.s` + | +LL | let E::V { s: ref x } = e; + | ^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0382`. diff --git a/src/test/ui/borrowck/mut-borrow-in-loop-2.fixed b/src/test/ui/borrowck/mut-borrow-in-loop-2.fixed new file mode 100644 index 0000000000000..ceeba30a90f29 --- /dev/null +++ b/src/test/ui/borrowck/mut-borrow-in-loop-2.fixed @@ -0,0 +1,35 @@ +// run-rustfix +#![allow(dead_code)] + +struct Events(R); + +struct Other; + +pub trait Trait { + fn handle(value: T) -> Self; +} + +// Blanket impl. (If you comment this out, compiler figures out that it +// is passing an `&mut` to a method that must be expecting an `&mut`, +// and injects an auto-reborrow.) +impl Trait for T where T: From { + fn handle(_: U) -> Self { unimplemented!() } +} + +impl<'a, R> Trait<&'a mut Events> for Other { + fn handle(_: &'a mut Events) -> Self { unimplemented!() } +} + +fn this_compiles<'a, R>(value: &'a mut Events) { + for _ in 0..3 { + Other::handle(&mut *value); + } +} + +fn this_does_not<'a, R>(value: &'a mut Events) { + for _ in 0..3 { + Other::handle(&mut *value); //~ ERROR use of moved value: `value` + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/mut-borrow-in-loop-2.rs b/src/test/ui/borrowck/mut-borrow-in-loop-2.rs new file mode 100644 index 0000000000000..d13fb7e567939 --- /dev/null +++ b/src/test/ui/borrowck/mut-borrow-in-loop-2.rs @@ -0,0 +1,35 @@ +// run-rustfix +#![allow(dead_code)] + +struct Events(R); + +struct Other; + +pub trait Trait { + fn handle(value: T) -> Self; +} + +// Blanket impl. (If you comment this out, compiler figures out that it +// is passing an `&mut` to a method that must be expecting an `&mut`, +// and injects an auto-reborrow.) +impl Trait for T where T: From { + fn handle(_: U) -> Self { unimplemented!() } +} + +impl<'a, R> Trait<&'a mut Events> for Other { + fn handle(_: &'a mut Events) -> Self { unimplemented!() } +} + +fn this_compiles<'a, R>(value: &'a mut Events) { + for _ in 0..3 { + Other::handle(&mut *value); + } +} + +fn this_does_not<'a, R>(value: &'a mut Events) { + for _ in 0..3 { + Other::handle(value); //~ ERROR use of moved value: `value` + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/mut-borrow-in-loop-2.stderr b/src/test/ui/borrowck/mut-borrow-in-loop-2.stderr new file mode 100644 index 0000000000000..fa1b741394acb --- /dev/null +++ b/src/test/ui/borrowck/mut-borrow-in-loop-2.stderr @@ -0,0 +1,17 @@ +error[E0382]: use of moved value: `value` + --> $DIR/mut-borrow-in-loop-2.rs:31:23 + | +LL | fn this_does_not<'a, R>(value: &'a mut Events) { + | ----- move occurs because `value` has type `&mut Events`, which does not implement the `Copy` trait +LL | for _ in 0..3 { +LL | Other::handle(value); + | ^^^^^ value moved here, in previous iteration of loop + | +help: consider creating a fresh reborrow of `value` here + | +LL | Other::handle(&mut *value); + | ^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0382`. diff --git a/src/test/ui/moves/moves-based-on-type-cyclic-types-issue-4821.stderr b/src/test/ui/moves/moves-based-on-type-cyclic-types-issue-4821.stderr index fb8562d00ead1..952985fcddee6 100644 --- a/src/test/ui/moves/moves-based-on-type-cyclic-types-issue-4821.stderr +++ b/src/test/ui/moves/moves-based-on-type-cyclic-types-issue-4821.stderr @@ -8,6 +8,10 @@ LL | consume(node) + r | ^^^^ value used here after partial move | = note: move occurs because value has type `std::boxed::Box`, which does not implement the `Copy` trait +help: borrow this field in the pattern to avoid moving `node.next.0` + | +LL | Some(ref right) => consume(right), + | ^^^ error: aborting due to previous error diff --git a/src/test/ui/nll/issue-53807.stderr b/src/test/ui/nll/issue-53807.stderr index 2b15da3710e62..4f36a4ccab28f 100644 --- a/src/test/ui/nll/issue-53807.stderr +++ b/src/test/ui/nll/issue-53807.stderr @@ -5,6 +5,10 @@ LL | if let Some(thing) = maybe { | ^^^^^ value moved here, in previous iteration of loop | = note: move occurs because value has type `std::vec::Vec`, which does not implement the `Copy` trait +help: borrow this field in the pattern to avoid moving `maybe.0` + | +LL | if let Some(ref thing) = maybe { + | ^^^ error: aborting due to previous error diff --git a/src/test/ui/pattern/bindings-after-at/bind-by-move-neither-can-live-while-the-other-survives-1.stderr b/src/test/ui/pattern/bindings-after-at/bind-by-move-neither-can-live-while-the-other-survives-1.stderr index f2186b9298e68..8a6ea8e91a25a 100644 --- a/src/test/ui/pattern/bindings-after-at/bind-by-move-neither-can-live-while-the-other-survives-1.stderr +++ b/src/test/ui/pattern/bindings-after-at/bind-by-move-neither-can-live-while-the-other-survives-1.stderr @@ -46,6 +46,10 @@ LL | Some(_z @ ref _y) => {} | value moved here | = note: move occurs because value has type `X`, which does not implement the `Copy` trait +help: borrow this field in the pattern to avoid moving `x.0` + | +LL | Some(ref _z @ ref _y) => {} + | ^^^ error[E0382]: borrow of moved value --> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:35:19 @@ -57,6 +61,10 @@ LL | Some(_z @ ref mut _y) => {} | value moved here | = note: move occurs because value has type `X`, which does not implement the `Copy` trait +help: borrow this field in the pattern to avoid moving `x.0` + | +LL | Some(ref _z @ ref mut _y) => {} + | ^^^ error: aborting due to 6 previous errors diff --git a/src/test/ui/pattern/bindings-after-at/borrowck-pat-by-move-and-ref-inverse.stderr b/src/test/ui/pattern/bindings-after-at/borrowck-pat-by-move-and-ref-inverse.stderr index f819e671436ec..5058998f2a7c1 100644 --- a/src/test/ui/pattern/bindings-after-at/borrowck-pat-by-move-and-ref-inverse.stderr +++ b/src/test/ui/pattern/bindings-after-at/borrowck-pat-by-move-and-ref-inverse.stderr @@ -357,6 +357,10 @@ LL | a @ Some((mut b @ ref mut c, d @ ref e)) => {} | value moved here | = note: move occurs because value has type `main::U`, which does not implement the `Copy` trait +help: borrow this field in the pattern to avoid moving the value + | +LL | a @ Some((ref mut b @ ref mut c, d @ ref e)) => {} + | ^^^ error[E0382]: use of moved value --> $DIR/borrowck-pat-by-move-and-ref-inverse.rs:61:38 @@ -379,6 +383,10 @@ LL | a @ Some((mut b @ ref mut c, d @ ref e)) => {} | value moved here | = note: move occurs because value has type `main::U`, which does not implement the `Copy` trait +help: borrow this field in the pattern to avoid moving the value + | +LL | a @ Some((mut b @ ref mut c, ref d @ ref e)) => {} + | ^^^ error[E0382]: borrow of moved value --> $DIR/borrowck-pat-by-move-and-ref-inverse.rs:71:30 @@ -412,6 +420,10 @@ LL | a @ Some((mut b @ ref mut c, d @ ref e)) => {} | value moved here | = note: move occurs because value has type `main::U`, which does not implement the `Copy` trait +help: borrow this field in the pattern to avoid moving the value + | +LL | a @ Some((ref mut b @ ref mut c, d @ ref e)) => {} + | ^^^ error[E0382]: use of moved value --> $DIR/borrowck-pat-by-move-and-ref-inverse.rs:83:38 @@ -434,6 +446,10 @@ LL | a @ Some((mut b @ ref mut c, d @ ref e)) => {} | value moved here | = note: move occurs because value has type `main::U`, which does not implement the `Copy` trait +help: borrow this field in the pattern to avoid moving the value + | +LL | a @ Some((mut b @ ref mut c, ref d @ ref e)) => {} + | ^^^ error[E0382]: borrow of moved value --> $DIR/borrowck-pat-by-move-and-ref-inverse.rs:93:30 diff --git a/src/test/ui/ref-suggestion.stderr b/src/test/ui/ref-suggestion.stderr index 9ff8e21bb58bd..97d2c174d9adb 100644 --- a/src/test/ui/ref-suggestion.stderr +++ b/src/test/ui/ref-suggestion.stderr @@ -28,6 +28,10 @@ LL | x; | ^ value used here after partial move | = note: move occurs because value has type `std::vec::Vec`, which does not implement the `Copy` trait +help: borrow this field in the pattern to avoid moving `x.0.0` + | +LL | (Some(ref y), ()) => {}, + | ^^^ error: aborting due to 3 previous errors From 3d09017477e562d44cb90fca1a4a38c75f664f2d Mon Sep 17 00:00:00 2001 From: Alexis Bourget Date: Thu, 25 Jun 2020 10:05:30 +0200 Subject: [PATCH 116/142] Add a compile fail example, binding -> variable, apply suggestions --- src/libstd/keyword_docs.rs | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/libstd/keyword_docs.rs b/src/libstd/keyword_docs.rs index 7d54f9ed2d20f..32fa0da3e2925 100644 --- a/src/libstd/keyword_docs.rs +++ b/src/libstd/keyword_docs.rs @@ -965,20 +965,21 @@ mod move_keyword {} #[doc(keyword = "mut")] // -/// A mutable binding, reference, or pointer. +/// A mutable variable, reference, or pointer. /// -/// `mut` can be used in several situations. The first is mutable bindings, +/// `mut` can be used in several situations. The first is mutable variables, /// which can be used anywhere you can bind a value to a variable name. Some /// examples: /// -/// ``` -/// // A mutable binding in the parameter list of a function. +/// ```rust +/// // A mutable variable in the parameter list of a function. /// fn foo(mut x: u8, y: u8) -> u8 { /// x += y; /// x /// } /// -/// // A mutable binding for a variable. +/// // Modifying a mutable variable. +/// # #[allow(unused_assignments)] /// let mut a = 5; /// a = 6; /// @@ -986,17 +987,17 @@ mod move_keyword {} /// assert_eq!(a, 6); /// ``` /// -/// The second is references. They can be created from `mut` bindings and must -/// be unique: no other binding can have a mutable reference, nor a simple -/// reference. +/// The second is mutable references. They can be created from `mut` variables +/// and must be unique: no other variables can have a mutable reference, nor a +/// shared reference. /// -/// ``` +/// ```rust /// // Taking a mutable reference. /// fn push_two(v: &mut Vec) { /// v.push(2); /// } /// -/// // You cannot take a mutable reference to a non-mutable variable. +/// // A mutable reference cannot be taken to a non-mutable variable. /// let mut v = vec![0, 1]; /// // Passing a mutable reference. /// push_two(&mut v); @@ -1004,10 +1005,18 @@ mod move_keyword {} /// assert_eq!(v, vec![0, 1, 2]); /// ``` /// -/// Mutable pointers work much like mutable references, with the added -/// possibility of being nul. The syntax is `*mut Type`. +/// ```rust,compile_fail,E0502 +/// let mut v = vec![0, 1]; +/// let mut_ref_v = &mut v; +/// ##[allow(unused)] +/// let ref_v = &v; +/// mut_ref_v.push(2); +/// ``` +/// +/// Mutable raw pointers work much like mutable references, with the added +/// possibility of not pointing to a valid object. The syntax is `*mut Type`. /// -/// You can find more information on mutable references and pointers in the +/// More information on mutable references and pointers can be found in``` /// [Reference]. /// /// [Reference]: ../reference/types/pointer.html#mutable-references-mut From 2e3f51775a6427f34878c2041be8e0c8d656ea3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Thu, 28 May 2020 19:54:08 +0200 Subject: [PATCH 117/142] Add unstable rustc option to control self-contained linkage mode --- src/librustc_codegen_ssa/back/link.rs | 54 ++++++++++++++++++--------- src/librustc_session/filesearch.rs | 4 +- src/librustc_session/options.rs | 3 ++ 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs index 6c995be913c9e..ae1e4da753331 100644 --- a/src/librustc_codegen_ssa/back/link.rs +++ b/src/librustc_codegen_ssa/back/link.rs @@ -140,7 +140,12 @@ pub fn link_binary<'a, B: ArchiveBuilder<'a>>( // The third parameter is for env vars, used on windows to set up the // path for MSVC to find its DLLs, and gcc to find its bundled // toolchain -fn get_linker(sess: &Session, linker: &Path, flavor: LinkerFlavor) -> Command { +fn get_linker( + sess: &Session, + linker: &Path, + flavor: LinkerFlavor, + self_contained: bool, +) -> Command { let msvc_tool = windows_registry::find_tool(&sess.opts.target_triple.triple(), "link.exe"); // If our linker looks like a batch script on Windows then to execute this @@ -199,7 +204,7 @@ fn get_linker(sess: &Session, linker: &Path, flavor: LinkerFlavor) -> Command { // The compiler's sysroot often has some bundled tools, so add it to the // PATH for the child. - let mut new_path = sess.host_filesearch(PathKind::All).get_tools_search_paths(); + let mut new_path = sess.host_filesearch(PathKind::All).get_tools_search_paths(self_contained); let mut msvc_changed_path = false; if sess.target.target.options.is_like_msvc { if let Some(ref tool) = msvc_tool { @@ -563,7 +568,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>( .iter() .copied() .flatten() - .map(|obj| get_object_file_path(sess, obj).into_os_string()) + .map(|obj| get_object_file_path(sess, obj, fallback).into_os_string()) .collect::>() }; let pre_objects_static_pie = get_objects(pre_objects, LinkOutputKind::StaticPicExe); @@ -1066,9 +1071,11 @@ fn get_crt_libs_path(sess: &Session) -> Option { } } -fn get_object_file_path(sess: &Session, name: &str) -> PathBuf { +fn get_object_file_path(sess: &Session, name: &str, self_contained: bool) -> PathBuf { // prefer system {,dll}crt2.o libs, see get_crt_libs_path comment for more details - if sess.target.target.llvm_target.contains("windows-gnu") { + if sess.opts.debugging_opts.link_self_contained.is_none() + && sess.target.target.llvm_target.contains("windows-gnu") + { if let Some(compiler_libs_path) = get_crt_libs_path(sess) { let file_path = compiler_libs_path.join(name); if file_path.exists() { @@ -1081,9 +1088,12 @@ fn get_object_file_path(sess: &Session, name: &str) -> PathBuf { if file_path.exists() { return file_path; } - let file_path = fs.get_selfcontained_lib_path().join(name); - if file_path.exists() { - return file_path; + // Special directory with objects used only in self-contained linkage mode + if self_contained { + let file_path = fs.get_selfcontained_lib_path().join(name); + if file_path.exists() { + return file_path; + } } for search_path in fs.search_paths() { let file_path = search_path.dir.join(name); @@ -1268,6 +1278,10 @@ fn link_output_kind(sess: &Session, crate_type: CrateType) -> LinkOutputKind { /// Whether we link to our own CRT objects instead of relying on gcc to pull them. /// We only provide such support for a very limited number of targets. fn crt_objects_fallback(sess: &Session, crate_type: CrateType) -> bool { + if let Some(self_contained) = sess.opts.debugging_opts.link_self_contained { + return self_contained; + } + match sess.target.target.options.crt_objects_fallback { // FIXME: Find a better heuristic for "native musl toolchain is available", // based on host and linker path, for example. @@ -1292,7 +1306,7 @@ fn add_pre_link_objects( let opts = &sess.target.target.options; let objects = if fallback { &opts.pre_link_objects_fallback } else { &opts.pre_link_objects }; for obj in objects.get(&link_output_kind).iter().copied().flatten() { - cmd.add_object(&get_object_file_path(sess, obj)); + cmd.add_object(&get_object_file_path(sess, obj, fallback)); } } @@ -1306,7 +1320,7 @@ fn add_post_link_objects( let opts = &sess.target.target.options; let objects = if fallback { &opts.post_link_objects_fallback } else { &opts.post_link_objects }; for obj in objects.get(&link_output_kind).iter().copied().flatten() { - cmd.add_object(&get_object_file_path(sess, obj)); + cmd.add_object(&get_object_file_path(sess, obj, fallback)); } } @@ -1468,9 +1482,12 @@ fn link_local_crate_native_libs_and_dependent_crate_libs<'a, B: ArchiveBuilder<' } /// Add sysroot and other globally set directories to the directory search list. -fn add_library_search_dirs(cmd: &mut dyn Linker, sess: &Session) { +fn add_library_search_dirs(cmd: &mut dyn Linker, sess: &Session, self_contained: bool) { // Prefer system mingw-w64 libs, see get_crt_libs_path comment for more details. - if cfg!(windows) && sess.target.target.llvm_target.contains("windows-gnu") { + if sess.opts.debugging_opts.link_self_contained.is_none() + && cfg!(windows) + && sess.target.target.llvm_target.contains("windows-gnu") + { if let Some(compiler_libs_path) = get_crt_libs_path(sess) { cmd.include_path(&compiler_libs_path); } @@ -1481,8 +1498,11 @@ fn add_library_search_dirs(cmd: &mut dyn Linker, sess: &Session) { let lib_path = sess.target_filesearch(PathKind::All).get_lib_path(); cmd.include_path(&fix_windows_verbatim_for_gcc(&lib_path)); - let lib_path = sess.target_filesearch(PathKind::All).get_selfcontained_lib_path(); - cmd.include_path(&fix_windows_verbatim_for_gcc(&lib_path)); + // Special directory with libraries used only in self-contained linkage mode + if self_contained { + let lib_path = sess.target_filesearch(PathKind::All).get_selfcontained_lib_path(); + cmd.include_path(&fix_windows_verbatim_for_gcc(&lib_path)); + } } /// Add options making relocation sections in the produced ELF files read-only @@ -1545,13 +1565,13 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>( codegen_results: &CodegenResults, target_cpu: &str, ) -> Command { - let base_cmd = get_linker(sess, path, flavor); + let crt_objects_fallback = crt_objects_fallback(sess, crate_type); + let base_cmd = get_linker(sess, path, flavor, crt_objects_fallback); // FIXME: Move `/LIBPATH` addition for uwp targets from the linker construction // to the linker args construction. assert!(base_cmd.get_args().is_empty() || sess.target.target.target_vendor == "uwp"); let cmd = &mut *codegen_results.linker_info.to_linker(base_cmd, &sess, flavor, target_cpu); let link_output_kind = link_output_kind(sess, crate_type); - let crt_objects_fallback = crt_objects_fallback(sess, crate_type); // NO-OPT-OUT, OBJECT-FILES-MAYBE, CUSTOMIZATION-POINT add_pre_link_args(cmd, sess, flavor); @@ -1597,7 +1617,7 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>( // NO-OPT-OUT, OBJECT-FILES-NO, AUDIT-ORDER // FIXME: Order-dependent, at least relatively to other args adding searh directories. - add_library_search_dirs(cmd, sess); + add_library_search_dirs(cmd, sess, crt_objects_fallback); // OBJECT-FILES-YES add_local_crate_regular_objects(cmd, codegen_results); diff --git a/src/librustc_session/filesearch.rs b/src/librustc_session/filesearch.rs index 5586b82b0edc0..675a880cef47c 100644 --- a/src/librustc_session/filesearch.rs +++ b/src/librustc_session/filesearch.rs @@ -92,13 +92,13 @@ impl<'a> FileSearch<'a> { } // Returns a list of directories where target-specific tool binaries are located. - pub fn get_tools_search_paths(&self) -> Vec { + pub fn get_tools_search_paths(&self, self_contained: bool) -> Vec { let mut p = PathBuf::from(self.sysroot); p.push(find_libdir(self.sysroot).as_ref()); p.push(RUST_LIB_DIR); p.push(&self.triple); p.push("bin"); - vec![p.clone(), p.join("self-contained")] + if self_contained { vec![p.clone(), p.join("self-contained")] } else { vec![p.clone()] } } } diff --git a/src/librustc_session/options.rs b/src/librustc_session/options.rs index 6c6f27502b614..055ae2fa2b5e5 100644 --- a/src/librustc_session/options.rs +++ b/src/librustc_session/options.rs @@ -888,6 +888,9 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, "keep hygiene data after analysis (default: no)"), link_native_libraries: bool = (true, parse_bool, [UNTRACKED], "link native libraries in the linker invocation (default: yes)"), + link_self_contained: Option = (None, parse_opt_bool, [TRACKED], + "control whether to link Rust provided C objects/libraries or rely + on C toolchain installed in the system"), link_only: bool = (false, parse_bool, [TRACKED], "link the `.rlink` file generated by `-Z no-link` (default: no)"), llvm_time_trace: bool = (false, parse_bool, [UNTRACKED], From 54293c1f157ee83d8e9949a7908e093ae0d5817a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Mon, 22 Jun 2020 19:56:56 +0200 Subject: [PATCH 118/142] Rename get_self_contained_lib_path --- src/librustc_codegen_ssa/back/link.rs | 4 ++-- src/librustc_session/filesearch.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs index ae1e4da753331..39f54b83a23bc 100644 --- a/src/librustc_codegen_ssa/back/link.rs +++ b/src/librustc_codegen_ssa/back/link.rs @@ -1090,7 +1090,7 @@ fn get_object_file_path(sess: &Session, name: &str, self_contained: bool) -> Pat } // Special directory with objects used only in self-contained linkage mode if self_contained { - let file_path = fs.get_selfcontained_lib_path().join(name); + let file_path = fs.get_self_contained_lib_path().join(name); if file_path.exists() { return file_path; } @@ -1500,7 +1500,7 @@ fn add_library_search_dirs(cmd: &mut dyn Linker, sess: &Session, self_contained: // Special directory with libraries used only in self-contained linkage mode if self_contained { - let lib_path = sess.target_filesearch(PathKind::All).get_selfcontained_lib_path(); + let lib_path = sess.target_filesearch(PathKind::All).get_self_contained_lib_path(); cmd.include_path(&fix_windows_verbatim_for_gcc(&lib_path)); } } diff --git a/src/librustc_session/filesearch.rs b/src/librustc_session/filesearch.rs index 675a880cef47c..27396c524f4e6 100644 --- a/src/librustc_session/filesearch.rs +++ b/src/librustc_session/filesearch.rs @@ -41,7 +41,7 @@ impl<'a> FileSearch<'a> { make_target_lib_path(self.sysroot, self.triple) } - pub fn get_selfcontained_lib_path(&self) -> PathBuf { + pub fn get_self_contained_lib_path(&self) -> PathBuf { self.get_lib_path().join("self-contained") } From f27dcd7ee05e948c92fb7e742d6b26c34e20b39c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Thu, 25 Jun 2020 11:15:09 +0200 Subject: [PATCH 119/142] Rename remaining `fallback` to `self_contained` --- src/librustc_codegen_ssa/back/link.rs | 32 +++++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs index 39f54b83a23bc..a34029410784a 100644 --- a/src/librustc_codegen_ssa/back/link.rs +++ b/src/librustc_codegen_ssa/back/link.rs @@ -556,19 +556,25 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>( "Linker does not support -static-pie command line option. Retrying with -static instead." ); // Mirror `add_(pre,post)_link_objects` to replace CRT objects. - let fallback = crt_objects_fallback(sess, crate_type); + let self_contained = crt_objects_fallback(sess, crate_type); let opts = &sess.target.target.options; - let pre_objects = - if fallback { &opts.pre_link_objects_fallback } else { &opts.pre_link_objects }; - let post_objects = - if fallback { &opts.post_link_objects_fallback } else { &opts.post_link_objects }; + let pre_objects = if self_contained { + &opts.pre_link_objects_fallback + } else { + &opts.pre_link_objects + }; + let post_objects = if self_contained { + &opts.post_link_objects_fallback + } else { + &opts.post_link_objects + }; let get_objects = |objects: &CrtObjects, kind| { objects .get(&kind) .iter() .copied() .flatten() - .map(|obj| get_object_file_path(sess, obj, fallback).into_os_string()) + .map(|obj| get_object_file_path(sess, obj, self_contained).into_os_string()) .collect::>() }; let pre_objects_static_pie = get_objects(pre_objects, LinkOutputKind::StaticPicExe); @@ -1301,12 +1307,13 @@ fn add_pre_link_objects( cmd: &mut dyn Linker, sess: &Session, link_output_kind: LinkOutputKind, - fallback: bool, + self_contained: bool, ) { let opts = &sess.target.target.options; - let objects = if fallback { &opts.pre_link_objects_fallback } else { &opts.pre_link_objects }; + let objects = + if self_contained { &opts.pre_link_objects_fallback } else { &opts.pre_link_objects }; for obj in objects.get(&link_output_kind).iter().copied().flatten() { - cmd.add_object(&get_object_file_path(sess, obj, fallback)); + cmd.add_object(&get_object_file_path(sess, obj, self_contained)); } } @@ -1315,12 +1322,13 @@ fn add_post_link_objects( cmd: &mut dyn Linker, sess: &Session, link_output_kind: LinkOutputKind, - fallback: bool, + self_contained: bool, ) { let opts = &sess.target.target.options; - let objects = if fallback { &opts.post_link_objects_fallback } else { &opts.post_link_objects }; + let objects = + if self_contained { &opts.post_link_objects_fallback } else { &opts.post_link_objects }; for obj in objects.get(&link_output_kind).iter().copied().flatten() { - cmd.add_object(&get_object_file_path(sess, obj, fallback)); + cmd.add_object(&get_object_file_path(sess, obj, self_contained)); } } From 5232e2025f809aa64ce3f2ba8c31004b90800485 Mon Sep 17 00:00:00 2001 From: Alexis Bourget Date: Thu, 25 Jun 2020 11:40:07 +0200 Subject: [PATCH 120/142] Document the super keyword --- src/libstd/keyword_docs.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/libstd/keyword_docs.rs b/src/libstd/keyword_docs.rs index a4996d9eee810..25868c9cfebfd 100644 --- a/src/libstd/keyword_docs.rs +++ b/src/libstd/keyword_docs.rs @@ -1147,10 +1147,26 @@ mod struct_keyword {} // /// The parent of the current [module]. /// -/// The documentation for this keyword is [not yet complete]. Pull requests welcome! +/// ```rust +/// # #![allow(dead_code)] +/// # fn main() {} +/// mod a { +/// pub fn foo() {} +/// } +/// mod b { +/// pub fn foo() { +/// super::a::foo(); // call a's foo function +/// } +/// } +/// ``` +/// +/// It is also possible to use `super` multiple times: `super::super::foo`, +/// going up the ancestor chain. +/// +/// See the [Reference] for more information. /// /// [module]: ../reference/items/modules.html -/// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 +/// [Reference]: ../reference/paths.html#super mod super_keyword {} #[doc(keyword = "trait")] From 343a9212b0421b5d81c15b2ef4ef0f02c19d2850 Mon Sep 17 00:00:00 2001 From: Adrian Cruceru Date: Thu, 25 Jun 2020 12:01:02 +0200 Subject: [PATCH 121/142] Fix comments --- src/bootstrap/compile.rs | 7 +++++++ src/ci/docker/dist-various-2/Dockerfile | 2 +- .../build-x86_64-fortanix-unknown-sgx-toolchain.sh | 7 ------- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index 5fb489cb9ac5a..345741d900911 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -133,6 +133,13 @@ fn copy_third_party_objects( ) -> Vec<(PathBuf, DependencyType)> { let mut target_deps = vec![]; + // FIXME: remove this in 2021 + if target == "x86_64-fortanix-unknown-sgx" { + if env::var_os("X86_FORTANIX_SGX_LIBS").is_some() { + builder.info("Warning: X86_FORTANIX_SGX_LIBS environment variable is ignored, libunwind is now compiled as part of rustbuild"); + } + } + if builder.config.sanitizers && compiler.stage != 0 { // The sanitizers are only copied in stage1 or above, // to avoid creating dependency on LLVM. diff --git a/src/ci/docker/dist-various-2/Dockerfile b/src/ci/docker/dist-various-2/Dockerfile index b495d8c2daeb1..208d45fa83fe1 100644 --- a/src/ci/docker/dist-various-2/Dockerfile +++ b/src/ci/docker/dist-various-2/Dockerfile @@ -73,7 +73,7 @@ COPY dist-various-2/x86_64-fortanix-unknown-sgx-clang-wrap.sh /usr/bin/x86_64-fo RUN ln -s /usr/bin/x86_64-fortanix-unknown-sgx-clang-11 /usr/bin/x86_64-fortanix-unknown-sgx-clang++-11 # We pass the commit id of the port of LLVM's libunwind to the build script. # Any update to the commit id here, should cause the container image to be re-built from this point on. -RUN /tmp/build-x86_64-fortanix-unknown-sgx-toolchain.sh "800f95131fe6acd20b96b6f4723ca3c820f3d379" +RUN /tmp/build-x86_64-fortanix-unknown-sgx-toolchain.sh COPY dist-various-2/build-wasi-toolchain.sh /tmp/ RUN /tmp/build-wasi-toolchain.sh diff --git a/src/ci/docker/dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh b/src/ci/docker/dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh index 46a0ca7290999..78bf4527feff1 100755 --- a/src/ci/docker/dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh +++ b/src/ci/docker/dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh @@ -3,14 +3,7 @@ set -eu source shared.sh -if [ -z "$1" ]; then - echo "Usage: ${0} " - exit -1 -fi - target="x86_64-fortanix-unknown-sgx" -url="https://github.com/fortanix/llvm-project/archive/${1}.tar.gz" -repo_name="llvm-project" install_prereq() { curl https://apt.llvm.org/llvm-snapshot.gpg.key|apt-key add - From db6fa2fff58c1071f66d3b91e1baf626571e0bcd Mon Sep 17 00:00:00 2001 From: Adrian Cruceru Date: Thu, 25 Jun 2020 12:30:27 +0200 Subject: [PATCH 122/142] Remove deprecated comments --- src/ci/docker/dist-various-2/Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ci/docker/dist-various-2/Dockerfile b/src/ci/docker/dist-various-2/Dockerfile index 208d45fa83fe1..1f1c246002352 100644 --- a/src/ci/docker/dist-various-2/Dockerfile +++ b/src/ci/docker/dist-various-2/Dockerfile @@ -71,8 +71,6 @@ RUN /tmp/build-solaris-toolchain.sh sparcv9 sparcv9 solaris-sparc COPY dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh /tmp/ COPY dist-various-2/x86_64-fortanix-unknown-sgx-clang-wrap.sh /usr/bin/x86_64-fortanix-unknown-sgx-clang-11 RUN ln -s /usr/bin/x86_64-fortanix-unknown-sgx-clang-11 /usr/bin/x86_64-fortanix-unknown-sgx-clang++-11 -# We pass the commit id of the port of LLVM's libunwind to the build script. -# Any update to the commit id here, should cause the container image to be re-built from this point on. RUN /tmp/build-x86_64-fortanix-unknown-sgx-toolchain.sh COPY dist-various-2/build-wasi-toolchain.sh /tmp/ From 11a3584de4084deabe23354cb387984d6664a4a8 Mon Sep 17 00:00:00 2001 From: David Wood Date: Thu, 25 Jun 2020 11:56:15 +0100 Subject: [PATCH 123/142] emitter: column width defaults to 140 This commit modifies the column width computation in the emitter when `termize::dimensions` returns `None` so that it uses the default value of 140 (which is used in UI testing currently) instead of `usize::MAX` which just ends up causing overflows in later computations. This is hard to test but appears to produce the same output as using saturating functions instead. Signed-off-by: David Wood --- src/librustc_errors/emitter.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/librustc_errors/emitter.rs b/src/librustc_errors/emitter.rs index b22da86c09187..1362a1155bcdd 100644 --- a/src/librustc_errors/emitter.rs +++ b/src/librustc_errors/emitter.rs @@ -31,6 +31,9 @@ use std::path::Path; use termcolor::{Ansi, BufferWriter, ColorChoice, ColorSpec, StandardStream}; use termcolor::{Buffer, Color, WriteColor}; +/// Default column width, used in tests and when terminal dimensions cannot be determined. +const DEFAULT_COLUMN_WIDTH: usize = 140; + /// Describes the way the content of the `rendered` field of the json output is generated #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum HumanReadableErrorType { @@ -74,7 +77,8 @@ struct Margin { pub computed_left: usize, /// The end of the line to be displayed. pub computed_right: usize, - /// The current width of the terminal. 140 by default and in tests. + /// The current width of the terminal. Uses value of `DEFAULT_COLUMN_WIDTH` constant by default + /// and in tests. pub column_width: usize, /// The end column of a span label, including the span. Doesn't account for labels not in the /// same line as the span. @@ -1414,11 +1418,11 @@ impl EmitterWriter { let column_width = if let Some(width) = self.terminal_width { width.saturating_sub(code_offset) } else if self.ui_testing { - 140 + DEFAULT_COLUMN_WIDTH } else { termize::dimensions() .map(|(w, _)| w.saturating_sub(code_offset)) - .unwrap_or(usize::MAX) + .unwrap_or(DEFAULT_COLUMN_WIDTH) }; let margin = Margin::new( From eb6d9a49a803ee84c9f9aad7ca5657b4ded76941 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sun, 21 Jun 2020 14:07:59 +0200 Subject: [PATCH 124/142] Add E0766 error for unterminated double quote byte string --- src/librustc_error_codes/error_codes.rs | 1 + src/librustc_error_codes/error_codes/E0766.md | 13 +++++++++++++ src/librustc_parse/lexer/mod.rs | 15 +++++++++------ 3 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 src/librustc_error_codes/error_codes/E0766.md diff --git a/src/librustc_error_codes/error_codes.rs b/src/librustc_error_codes/error_codes.rs index 6a5e23adafa53..162585360fbda 100644 --- a/src/librustc_error_codes/error_codes.rs +++ b/src/librustc_error_codes/error_codes.rs @@ -446,6 +446,7 @@ E0762: include_str!("./error_codes/E0762.md"), E0763: include_str!("./error_codes/E0763.md"), E0764: include_str!("./error_codes/E0764.md"), E0765: include_str!("./error_codes/E0765.md"), +E0766: include_str!("./error_codes/E0766.md"), ; // E0006, // merged with E0005 // E0008, // cannot bind by-move into a pattern guard diff --git a/src/librustc_error_codes/error_codes/E0766.md b/src/librustc_error_codes/error_codes/E0766.md new file mode 100644 index 0000000000000..4e775df2cac4d --- /dev/null +++ b/src/librustc_error_codes/error_codes/E0766.md @@ -0,0 +1,13 @@ +A double quote byte string (`b"`) was not terminated. + +Erroneous code example: + +```compile_fail,E0766 +let s = b"; // error! +``` + +To fix this error, add the missing double quote at the end of the string: + +``` +let s = b""; // ok! +``` diff --git a/src/librustc_parse/lexer/mod.rs b/src/librustc_parse/lexer/mod.rs index 8e74c3847bc90..5050f03bea9b2 100644 --- a/src/librustc_parse/lexer/mod.rs +++ b/src/librustc_parse/lexer/mod.rs @@ -367,12 +367,15 @@ impl<'a> StringReader<'a> { } rustc_lexer::LiteralKind::ByteStr { terminated } => { if !terminated { - self.fatal_span_( - start + BytePos(1), - suffix_start, - "unterminated double quote byte string", - ) - .raise() + self.sess + .span_diagnostic + .struct_span_fatal_with_code( + self.mk_sp(start + BytePos(1), suffix_start), + "unterminated double quote byte string", + error_code!(E0766), + ) + .emit(); + FatalError.raise(); } (token::ByteStr, Mode::ByteStr, 2, 1) // b" " } From 33302fa7d225a2d1152f0fe9a52e55fbd85d3017 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sun, 21 Jun 2020 14:08:06 +0200 Subject: [PATCH 125/142] Update UI test --- src/test/ui/parser/byte-string-literals.stderr | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/ui/parser/byte-string-literals.stderr b/src/test/ui/parser/byte-string-literals.stderr index ca964cd4b8f21..9be9064414796 100644 --- a/src/test/ui/parser/byte-string-literals.stderr +++ b/src/test/ui/parser/byte-string-literals.stderr @@ -22,7 +22,7 @@ error: byte constant must be ASCII. Use a \xHH escape for a non-ASCII byte LL | b"é"; | ^ -error: unterminated double quote byte string +error[E0766]: unterminated double quote byte string --> $DIR/byte-string-literals.rs:7:6 | LL | b"a @@ -32,3 +32,4 @@ LL | | } error: aborting due to 5 previous errors +For more information about this error, try `rustc --explain E0766`. From 8b368dbcbb1ee67553f72837b0e9893e6912a5a9 Mon Sep 17 00:00:00 2001 From: Andrew Paverd Date: Thu, 25 Jun 2020 15:45:24 +0100 Subject: [PATCH 126/142] Bootstrap: fallback detection of Windows --- src/bootstrap/bootstrap.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py index 82a755c7892b1..1949d70e5deea 100644 --- a/src/bootstrap/bootstrap.py +++ b/src/bootstrap/bootstrap.py @@ -184,6 +184,7 @@ def default_build_triple(): ostype = require(["uname", "-s"], exit=required) cputype = require(['uname', '-m'], exit=required) + # If we do not have `uname`, assume Windows. if ostype is None or cputype is None: return 'x86_64-pc-windows-msvc' @@ -236,6 +237,11 @@ def default_build_triple(): if ostype.endswith('WOW64'): cputype = 'x86_64' ostype = 'pc-windows-gnu' + elif sys.platform == 'win32': + # Some Windows platforms might have a `uname` command that returns a + # non-standard string (e.g. gnuwin32 tools returns `windows32`). In + # these cases, fall back to using sys.platform. + return 'x86_64-pc-windows-msvc' else: err = "unknown OS type: {}".format(ostype) sys.exit(err) From 1a355a21ebbe70ebfa2856dee2becc18d9ab3b13 Mon Sep 17 00:00:00 2001 From: Oliver Scherer Date: Thu, 25 Jun 2020 19:08:06 +0200 Subject: [PATCH 127/142] Document some invariants correctly/more --- src/librustc_mir/transform/const_prop.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/librustc_mir/transform/const_prop.rs b/src/librustc_mir/transform/const_prop.rs index eb614170baae5..c7125a35165cf 100644 --- a/src/librustc_mir/transform/const_prop.rs +++ b/src/librustc_mir/transform/const_prop.rs @@ -350,14 +350,20 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { } fn get_const(&self, place: Place<'tcx>) -> Option> { - let op = self.ecx.eval_place_to_op(place, None).ok(); + let op = match self.ecx.eval_place_to_op(place, None) { + Ok(op) => op, + Err(e) => { + trace!("get_const failed: {}", e); + return None; + } + }; // Try to read the local as an immediate so that if it is representable as a scalar, we can // handle it as such, but otherwise, just return the value as is. - match op.map(|ret| self.ecx.try_read_immediate(ret)) { - Some(Ok(Ok(imm))) => Some(imm.into()), + Some(match self.ecx.try_read_immediate(op) { + Ok(Ok(imm)) => imm.into(), _ => op, - } + }) } /// Remove `local` from the pool of `Locals`. Allows writing to them, @@ -857,8 +863,9 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> { if let Ok(place_layout) = self.tcx.layout_of(self.param_env.and(place_ty)) { let can_const_prop = self.can_const_prop[place.local]; if let Some(()) = self.const_prop(rval, place_layout, source_info, place) { - // This will return None for variables that are from other blocks, - // so it should be okay to propagate from here on down. + // This will return None if the above `const_prop` invocation only "wrote" a + // type whose creation requires no write. E.g. a generator whose initial state + // consists solely of uninitialized memory (so it doesn't capture any locals). if let Some(value) = self.get_const(place) { if self.should_const_prop(value) { trace!("replacing {:?} with {:?}", rval, value); From 25e864e19812e079a9e69134fd1bbbfee444c0a2 Mon Sep 17 00:00:00 2001 From: Charles Lew Date: Tue, 23 Jun 2020 19:45:13 +0800 Subject: [PATCH 128/142] Implement mixed script confusable lint. --- Cargo.lock | 8 +- src/librustc_lint/Cargo.toml | 2 +- src/librustc_lint/non_ascii_idents.rs | 127 +++++++++++++++++- .../lint-mixed-script-confusables-2.rs | 20 +++ .../lint-mixed-script-confusables.rs | 15 +++ .../lint-mixed-script-confusables.stderr | 34 +++++ src/test/ui/utf8_idents.rs | 2 + src/test/ui/utf8_idents.stderr | 10 +- 8 files changed, 206 insertions(+), 12 deletions(-) create mode 100644 src/test/ui/lint/rfc-2457-non-ascii-idents/lint-mixed-script-confusables-2.rs create mode 100644 src/test/ui/lint/rfc-2457-non-ascii-idents/lint-mixed-script-confusables.rs create mode 100644 src/test/ui/lint/rfc-2457-non-ascii-idents/lint-mixed-script-confusables.stderr diff --git a/Cargo.lock b/Cargo.lock index 0c1c533f39579..e05439d71e7e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5405,15 +5405,15 @@ dependencies = [ [[package]] name = "unicode-script" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b2c5c29e805da6817f5af6a627d65adb045cebf05cccd5a3493d6109454391c" +checksum = "58b33414ea8db4b7ea0343548dbdc31d27aef06beacf7044a87e564d9b0feb7d" [[package]] name = "unicode-security" -version = "0.0.3" +version = "0.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5f9011bbed9c13372bc8df618b55a38138445199caf3b61d432c6859c36dee0" +checksum = "5d87c28edc5b263377e448d6cdcb935c06b95413d8013ba6fae470558ccab18f" dependencies = [ "unicode-normalization", "unicode-script", diff --git a/src/librustc_lint/Cargo.toml b/src/librustc_lint/Cargo.toml index ada6f2a9381dc..58c15257326ae 100644 --- a/src/librustc_lint/Cargo.toml +++ b/src/librustc_lint/Cargo.toml @@ -10,7 +10,7 @@ path = "lib.rs" [dependencies] log = "0.4" -unicode-security = "0.0.3" +unicode-security = "0.0.5" rustc_middle = { path = "../librustc_middle" } rustc_ast_pretty = { path = "../librustc_ast_pretty" } rustc_attr = { path = "../librustc_attr" } diff --git a/src/librustc_lint/non_ascii_idents.rs b/src/librustc_lint/non_ascii_idents.rs index 90bd7ad4acf71..30dbd069c29bd 100644 --- a/src/librustc_lint/non_ascii_idents.rs +++ b/src/librustc_lint/non_ascii_idents.rs @@ -24,12 +24,20 @@ declare_lint! { crate_level_only } -declare_lint_pass!(NonAsciiIdents => [NON_ASCII_IDENTS, UNCOMMON_CODEPOINTS, CONFUSABLE_IDENTS]); +declare_lint! { + pub MIXED_SCRIPT_CONFUSABLES, + Warn, + "detects Unicode scripts whose mixed script confusables codepoints are solely used", + crate_level_only +} + +declare_lint_pass!(NonAsciiIdents => [NON_ASCII_IDENTS, UNCOMMON_CODEPOINTS, CONFUSABLE_IDENTS, MIXED_SCRIPT_CONFUSABLES]); impl EarlyLintPass for NonAsciiIdents { fn check_crate(&mut self, cx: &EarlyContext<'_>, _: &ast::Crate) { use rustc_session::lint::Level; use rustc_span::Span; + use std::collections::BTreeMap; use unicode_security::GeneralSecurityProfile; use utils::CowBoxSymStr; @@ -37,8 +45,14 @@ impl EarlyLintPass for NonAsciiIdents { let check_uncommon_codepoints = cx.builder.lint_level(UNCOMMON_CODEPOINTS).0 != Level::Allow; let check_confusable_idents = cx.builder.lint_level(CONFUSABLE_IDENTS).0 != Level::Allow; + let check_mixed_script_confusables = + cx.builder.lint_level(MIXED_SCRIPT_CONFUSABLES).0 != Level::Allow; - if !check_non_ascii_idents && !check_uncommon_codepoints && !check_confusable_idents { + if !check_non_ascii_idents + && !check_uncommon_codepoints + && !check_confusable_idents + && !check_mixed_script_confusables + { return; } @@ -107,6 +121,115 @@ impl EarlyLintPass for NonAsciiIdents { .or_insert((symbol_str, sp, is_ascii)); } } + + if has_non_ascii_idents && check_mixed_script_confusables { + use unicode_security::is_potential_mixed_script_confusable_char; + use unicode_security::mixed_script::AugmentedScriptSet; + + #[derive(Clone)] + enum ScriptSetUsage { + Suspicious(Vec, Span), + Verified, + } + + let mut script_states: FxHashMap = + FxHashMap::default(); + let latin_augmented_script_set = AugmentedScriptSet::for_char('A'); + script_states.insert(latin_augmented_script_set, ScriptSetUsage::Verified); + + let mut has_suspicous = false; + for (symbol, &sp) in symbols.iter() { + let symbol_str = symbol.as_str(); + for ch in symbol_str.chars() { + if ch.is_ascii() { + // all ascii characters are covered by exception. + continue; + } + if !GeneralSecurityProfile::identifier_allowed(ch) { + // this character is covered by `uncommon_codepoints` lint. + continue; + } + let augmented_script_set = AugmentedScriptSet::for_char(ch); + script_states + .entry(augmented_script_set) + .and_modify(|existing_state| { + if let ScriptSetUsage::Suspicious(ch_list, _) = existing_state { + if is_potential_mixed_script_confusable_char(ch) { + ch_list.push(ch); + } else { + *existing_state = ScriptSetUsage::Verified; + } + } + }) + .or_insert_with(|| { + if !is_potential_mixed_script_confusable_char(ch) { + ScriptSetUsage::Verified + } else { + has_suspicous = true; + ScriptSetUsage::Suspicious(vec![ch], sp) + } + }); + } + } + + if has_suspicous { + let verified_augmented_script_sets = script_states + .iter() + .flat_map(|(k, v)| match v { + ScriptSetUsage::Verified => Some(*k), + _ => None, + }) + .collect::>(); + + // we're sorting the output here. + let mut lint_reports: BTreeMap<(Span, Vec), AugmentedScriptSet> = + BTreeMap::new(); + + 'outerloop: for (augment_script_set, usage) in script_states { + let (mut ch_list, sp) = match usage { + ScriptSetUsage::Verified => continue, + ScriptSetUsage::Suspicious(ch_list, sp) => (ch_list, sp), + }; + + if augment_script_set.is_all() { + continue; + } + + for existing in verified_augmented_script_sets.iter() { + if existing.is_all() { + continue; + } + let mut intersect = *existing; + intersect.intersect_with(augment_script_set); + if !intersect.is_empty() && !intersect.is_all() { + continue 'outerloop; + } + } + + ch_list.sort(); + ch_list.dedup(); + lint_reports.insert((sp, ch_list), augment_script_set); + } + + for ((sp, ch_list), script_set) in lint_reports { + cx.struct_span_lint(MIXED_SCRIPT_CONFUSABLES, sp, |lint| { + let message = format!( + "The usage of Script Group `{}` in this crate consists solely of mixed script confusables", + script_set); + let mut note = "The usage includes ".to_string(); + for (idx, ch) in ch_list.into_iter().enumerate() { + if idx != 0 { + note += ", "; + } + let char_info = format!("'{}' (U+{:04X})", ch, ch as u32); + note += &char_info; + } + note += "."; + lint.build(&message).note(¬e).note("Please recheck to make sure their usages are indeed what you want.").emit() + }); + } + } + } } } diff --git a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-mixed-script-confusables-2.rs b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-mixed-script-confusables-2.rs new file mode 100644 index 0000000000000..a5b45466da5ca --- /dev/null +++ b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-mixed-script-confusables-2.rs @@ -0,0 +1,20 @@ +// check-pass +#![feature(non_ascii_idents)] +#![deny(mixed_script_confusables)] + +struct ΑctuallyNotLatin; + +fn main() { + let λ = 42; // this usage of Greek confirms that Greek is used intentionally. +} + +mod роре { + const エ: &'static str = "アイウ"; + + // this usage of Katakana confirms that Katakana is used intentionally. + fn ニャン() { + let д: usize = 100; // this usage of Cyrillic confirms that Cyrillic is used intentionally. + + println!("meow!"); + } +} diff --git a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-mixed-script-confusables.rs b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-mixed-script-confusables.rs new file mode 100644 index 0000000000000..4637b03f250de --- /dev/null +++ b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-mixed-script-confusables.rs @@ -0,0 +1,15 @@ +#![feature(non_ascii_idents)] +#![deny(mixed_script_confusables)] + +struct ΑctuallyNotLatin; +//~^ ERROR The usage of Script Group `Greek` in this crate consists solely of + +fn main() { + let v = ΑctuallyNotLatin; +} + +mod роре { +//~^ ERROR The usage of Script Group `Cyrillic` in this crate consists solely of + const エ: &'static str = "アイウ"; + //~^ ERROR The usage of Script Group `Japanese, Katakana` in this crate consists solely of +} diff --git a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-mixed-script-confusables.stderr b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-mixed-script-confusables.stderr new file mode 100644 index 0000000000000..6f75a1ece3766 --- /dev/null +++ b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-mixed-script-confusables.stderr @@ -0,0 +1,34 @@ +error: The usage of Script Group `Greek` in this crate consists solely of mixed script confusables + --> $DIR/lint-mixed-script-confusables.rs:4:8 + | +LL | struct ΑctuallyNotLatin; + | ^^^^^^^^^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/lint-mixed-script-confusables.rs:2:9 + | +LL | #![deny(mixed_script_confusables)] + | ^^^^^^^^^^^^^^^^^^^^^^^^ + = note: The usage includes 'Α' (U+0391). + = note: Please recheck to make sure their usages are indeed what you want. + +error: The usage of Script Group `Cyrillic` in this crate consists solely of mixed script confusables + --> $DIR/lint-mixed-script-confusables.rs:11:5 + | +LL | mod роре { + | ^^^^ + | + = note: The usage includes 'е' (U+0435), 'о' (U+043E), 'р' (U+0440). + = note: Please recheck to make sure their usages are indeed what you want. + +error: The usage of Script Group `Japanese, Katakana` in this crate consists solely of mixed script confusables + --> $DIR/lint-mixed-script-confusables.rs:13:11 + | +LL | const エ: &'static str = "アイウ"; + | ^^ + | + = note: The usage includes 'エ' (U+30A8). + = note: Please recheck to make sure their usages are indeed what you want. + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/utf8_idents.rs b/src/test/ui/utf8_idents.rs index f59d5502aae30..6c54086cc2009 100644 --- a/src/test/ui/utf8_idents.rs +++ b/src/test/ui/utf8_idents.rs @@ -1,3 +1,5 @@ +#![allow(mixed_script_confusables)] + fn foo< 'β, //~ ERROR non-ascii idents are not fully supported γ //~ ERROR non-ascii idents are not fully supported diff --git a/src/test/ui/utf8_idents.stderr b/src/test/ui/utf8_idents.stderr index 877412df8fa1c..2fc0b1c39effb 100644 --- a/src/test/ui/utf8_idents.stderr +++ b/src/test/ui/utf8_idents.stderr @@ -1,5 +1,5 @@ error[E0658]: non-ascii idents are not fully supported - --> $DIR/utf8_idents.rs:2:5 + --> $DIR/utf8_idents.rs:4:5 | LL | 'β, | ^^ @@ -8,7 +8,7 @@ LL | 'β, = help: add `#![feature(non_ascii_idents)]` to the crate attributes to enable error[E0658]: non-ascii idents are not fully supported - --> $DIR/utf8_idents.rs:3:5 + --> $DIR/utf8_idents.rs:5:5 | LL | γ | ^ @@ -17,7 +17,7 @@ LL | γ = help: add `#![feature(non_ascii_idents)]` to the crate attributes to enable error[E0658]: non-ascii idents are not fully supported - --> $DIR/utf8_idents.rs:8:5 + --> $DIR/utf8_idents.rs:10:5 | LL | δ: usize | ^ @@ -26,7 +26,7 @@ LL | δ: usize = help: add `#![feature(non_ascii_idents)]` to the crate attributes to enable error[E0658]: non-ascii idents are not fully supported - --> $DIR/utf8_idents.rs:12:9 + --> $DIR/utf8_idents.rs:14:9 | LL | let α = 0.00001f64; | ^ @@ -35,7 +35,7 @@ LL | let α = 0.00001f64; = help: add `#![feature(non_ascii_idents)]` to the crate attributes to enable warning: type parameter `γ` should have an upper camel case name - --> $DIR/utf8_idents.rs:3:5 + --> $DIR/utf8_idents.rs:5:5 | LL | γ | ^ help: convert the identifier to upper camel case: `Γ` From f13d89eb2ed30b26dea577985393c58e6dbd0bca Mon Sep 17 00:00:00 2001 From: Nell Shamrell Date: Thu, 25 Jun 2020 11:13:22 -0700 Subject: [PATCH 129/142] disable collectionbenches for android Signed-off-by: Nell Shamrell --- src/liballoc/benches/lib.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/liballoc/benches/lib.rs b/src/liballoc/benches/lib.rs index f31717d9fd517..608eafc88d2a6 100644 --- a/src/liballoc/benches/lib.rs +++ b/src/liballoc/benches/lib.rs @@ -1,3 +1,6 @@ +// Disabling on android for the time being +// See https://github.com/rust-lang/rust/issues/73535#event-3477699747 +#![cfg(not(target_os = "android"))] #![feature(btree_drain_filter)] #![feature(map_first_last)] #![feature(repr_simd)] From 5c88b5172f3b00c838a1ce825f67d28f0ff01b65 Mon Sep 17 00:00:00 2001 From: Nell Shamrell Date: Thu, 25 Jun 2020 13:57:29 -0700 Subject: [PATCH 130/142] add exception for liballoc benches to tidy Signed-off-by: Nell Shamrell --- src/tools/tidy/src/pal.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/tidy/src/pal.rs b/src/tools/tidy/src/pal.rs index 247e85603cfc2..7e77ae1db0d1b 100644 --- a/src/tools/tidy/src/pal.rs +++ b/src/tools/tidy/src/pal.rs @@ -67,6 +67,7 @@ const EXCEPTION_PATHS: &[&str] = &[ // std testing crates, okay for now at least "src/libcore/tests", "src/liballoc/tests/lib.rs", + "src/liballoc/benches/lib.rs", // The `VaList` implementation must have platform specific code. // The Windows implementation of a `va_list` is always a character // pointer regardless of the target architecture. As a result, From 77b0ed70b3658cb7ba7b18f68519b3baf953213b Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Sun, 7 Jun 2020 21:29:48 +0300 Subject: [PATCH 131/142] proc_macro: Stop flattening groups with dummy spans --- src/librustc_ast/attr/mod.rs | 2 +- src/librustc_ast/mut_visit.rs | 2 +- src/librustc_ast/token.rs | 31 +++++++++++------ src/librustc_ast/util/literal.rs | 2 +- src/librustc_ast_lowering/lib.rs | 2 +- src/librustc_ast_pretty/pprust.rs | 2 +- src/librustc_expand/base.rs | 6 ++-- src/librustc_expand/mbe/macro_parser.rs | 10 +++--- src/librustc_expand/mbe/transcribe.rs | 7 ++-- src/librustc_expand/proc_macro.rs | 4 +-- src/librustc_expand/proc_macro_server.rs | 38 ++++++++++++++------- src/librustc_parse/parser/attr.rs | 4 +-- src/librustc_parse/parser/expr.rs | 2 +- src/librustc_parse/parser/item.rs | 2 +- src/librustc_parse/parser/mod.rs | 6 ++-- src/librustc_parse/parser/pat.rs | 2 +- src/librustc_resolve/build_reduced_graph.rs | 2 +- src/librustc_resolve/def_collector.rs | 2 +- 18 files changed, 76 insertions(+), 50 deletions(-) diff --git a/src/librustc_ast/attr/mod.rs b/src/librustc_ast/attr/mod.rs index b812f2dadf6d4..6c128f0176f66 100644 --- a/src/librustc_ast/attr/mod.rs +++ b/src/librustc_ast/attr/mod.rs @@ -475,7 +475,7 @@ impl MetaItem { let span = span.with_hi(segments.last().unwrap().ident.span.hi()); Path { span, segments } } - Some(TokenTree::Token(Token { kind: token::Interpolated(nt), .. })) => match *nt { + Some(TokenTree::Token(Token { kind: token::Interpolated(nt, _), .. })) => match *nt { token::Nonterminal::NtMeta(ref item) => return item.meta(item.path.span), token::Nonterminal::NtPath(ref path) => path.clone(), _ => return None, diff --git a/src/librustc_ast/mut_visit.rs b/src/librustc_ast/mut_visit.rs index 2ffef9d48c181..0cbf902030660 100644 --- a/src/librustc_ast/mut_visit.rs +++ b/src/librustc_ast/mut_visit.rs @@ -656,7 +656,7 @@ pub fn noop_visit_token(t: &mut Token, vis: &mut T) { *span = ident.span; return; // Avoid visiting the span for the second time. } - token::Interpolated(nt) => { + token::Interpolated(nt, _) => { let mut nt = Lrc::make_mut(nt); vis.visit_interpolated(&mut nt); } diff --git a/src/librustc_ast/token.rs b/src/librustc_ast/token.rs index a5b9c2a95bbea..89be3e6e212cc 100644 --- a/src/librustc_ast/token.rs +++ b/src/librustc_ast/token.rs @@ -182,6 +182,15 @@ fn ident_can_begin_type(name: Symbol, span: Span, is_raw: bool) -> bool { .contains(&name) } +/// A hack used to pass AST fragments to attribute and derive macros +/// as a single nonterminal token instead of a token stream. +/// FIXME: It needs to be removed, but there are some compatibility issues (see #73345). +#[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum FlattenGroup { + Yes, + No, +} + #[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] pub enum TokenKind { /* Expression-operator symbols. */ @@ -236,7 +245,7 @@ pub enum TokenKind { /// treat regular and interpolated lifetime identifiers in the same way. Lifetime(Symbol), - Interpolated(Lrc), + Interpolated(Lrc, FlattenGroup), // Can be expanded into several tokens. /// A doc comment. @@ -343,7 +352,7 @@ impl Token { /// if they keep spans or perform edition checks. pub fn uninterpolated_span(&self) -> Span { match &self.kind { - Interpolated(nt) => nt.span(), + Interpolated(nt, _) => nt.span(), _ => self.span, } } @@ -382,7 +391,7 @@ impl Token { ModSep | // global path Lifetime(..) | // labeled loop Pound => true, // expression attributes - Interpolated(ref nt) => match **nt { + Interpolated(ref nt, _) => match **nt { NtLiteral(..) | NtExpr(..) | NtBlock(..) | @@ -408,7 +417,7 @@ impl Token { Lifetime(..) | // lifetime bound in trait object Lt | BinOp(Shl) | // associated path ModSep => true, // global path - Interpolated(ref nt) => match **nt { + Interpolated(ref nt, _) => match **nt { NtTy(..) | NtPath(..) => true, _ => false, }, @@ -420,7 +429,7 @@ impl Token { pub fn can_begin_const_arg(&self) -> bool { match self.kind { OpenDelim(Brace) => true, - Interpolated(ref nt) => match **nt { + Interpolated(ref nt, _) => match **nt { NtExpr(..) | NtBlock(..) | NtLiteral(..) => true, _ => false, }, @@ -455,7 +464,7 @@ impl Token { match self.uninterpolate().kind { Literal(..) | BinOp(Minus) => true, Ident(name, false) if name.is_bool_lit() => true, - Interpolated(ref nt) => match &**nt { + Interpolated(ref nt, _) => match &**nt { NtLiteral(_) => true, NtExpr(e) => match &e.kind { ast::ExprKind::Lit(_) => true, @@ -476,7 +485,7 @@ impl Token { // otherwise returns the original token. pub fn uninterpolate(&self) -> Cow<'_, Token> { match &self.kind { - Interpolated(nt) => match **nt { + Interpolated(nt, _) => match **nt { NtIdent(ident, is_raw) => { Cow::Owned(Token::new(Ident(ident.name, is_raw), ident.span)) } @@ -523,7 +532,7 @@ impl Token { /// Returns `true` if the token is an interpolated path. fn is_path(&self) -> bool { - if let Interpolated(ref nt) = self.kind { + if let Interpolated(ref nt, _) = self.kind { if let NtPath(..) = **nt { return true; } @@ -535,7 +544,7 @@ impl Token { /// That is, is this a pre-parsed expression dropped into the token stream /// (which happens while parsing the result of macro expansion)? pub fn is_whole_expr(&self) -> bool { - if let Interpolated(ref nt) = self.kind { + if let Interpolated(ref nt, _) = self.kind { if let NtExpr(_) | NtLiteral(_) | NtPath(_) | NtIdent(..) | NtBlock(_) = **nt { return true; } @@ -546,7 +555,7 @@ impl Token { // Is the token an interpolated block (`$b:block`)? pub fn is_whole_block(&self) -> bool { - if let Interpolated(ref nt) = self.kind { + if let Interpolated(ref nt, _) = self.kind { if let NtBlock(..) = **nt { return true; } @@ -724,7 +733,7 @@ impl Token { b == d && (a == c || a == kw::DollarCrate || c == kw::DollarCrate) } - (&Interpolated(_), &Interpolated(_)) => false, + (&Interpolated(..), &Interpolated(..)) => false, _ => panic!("forgot to add a token?"), } diff --git a/src/librustc_ast/util/literal.rs b/src/librustc_ast/util/literal.rs index 4428d09902b92..ea59f867c59d2 100644 --- a/src/librustc_ast/util/literal.rs +++ b/src/librustc_ast/util/literal.rs @@ -205,7 +205,7 @@ impl Lit { token::Lit::new(token::Bool, name, None) } token::Literal(lit) => lit, - token::Interpolated(ref nt) => { + token::Interpolated(ref nt, _) => { if let token::NtExpr(expr) | token::NtLiteral(expr) = &**nt { if let ast::ExprKind::Lit(lit) = &expr.kind { return Ok(lit.clone()); diff --git a/src/librustc_ast_lowering/lib.rs b/src/librustc_ast_lowering/lib.rs index 39b14ac458832..38a4dfa7a77b6 100644 --- a/src/librustc_ast_lowering/lib.rs +++ b/src/librustc_ast_lowering/lib.rs @@ -1027,7 +1027,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { fn lower_token(&mut self, token: Token) -> TokenStream { match token.kind { - token::Interpolated(nt) => { + token::Interpolated(nt, _) => { let tts = (self.nt_to_tokenstream)(&nt, &self.sess.parse_sess, token.span); self.lower_token_stream(tts) } diff --git a/src/librustc_ast_pretty/pprust.rs b/src/librustc_ast_pretty/pprust.rs index b1abc08aa67b0..c0c8b5dda5182 100644 --- a/src/librustc_ast_pretty/pprust.rs +++ b/src/librustc_ast_pretty/pprust.rs @@ -266,7 +266,7 @@ fn token_kind_to_string_ext(tok: &TokenKind, convert_dollar_crate: Option) token::Shebang(s) => format!("/* shebang: {}*/", s), token::Unknown(s) => s.to_string(), - token::Interpolated(ref nt) => nonterminal_to_string(nt), + token::Interpolated(ref nt, _) => nonterminal_to_string(nt), } } diff --git a/src/librustc_expand/base.rs b/src/librustc_expand/base.rs index a57ae798ffceb..d4c756c9ec7f8 100644 --- a/src/librustc_expand/base.rs +++ b/src/librustc_expand/base.rs @@ -4,7 +4,7 @@ use crate::module::DirectoryOwnership; use rustc_ast::ast::{self, Attribute, NodeId, PatKind}; use rustc_ast::mut_visit::{self, MutVisitor}; use rustc_ast::ptr::P; -use rustc_ast::token; +use rustc_ast::token::{self, FlattenGroup}; use rustc_ast::tokenstream::{self, TokenStream, TokenTree}; use rustc_ast::visit::{AssocCtxt, Visitor}; use rustc_attr::{self as attr, Deprecation, HasAttrs, Stability}; @@ -142,7 +142,7 @@ impl Annotatable { | Annotatable::StructField(..) | Annotatable::Variant(..) => panic!("unexpected annotatable"), }; - TokenTree::token(token::Interpolated(Lrc::new(nt)), DUMMY_SP).into() + TokenTree::token(token::Interpolated(Lrc::new(nt), FlattenGroup::Yes), DUMMY_SP).into() } pub fn expect_item(self) -> P { @@ -374,7 +374,7 @@ where impl MutVisitor for AvoidInterpolatedIdents { fn visit_tt(&mut self, tt: &mut tokenstream::TokenTree) { if let tokenstream::TokenTree::Token(token) = tt { - if let token::Interpolated(nt) = &token.kind { + if let token::Interpolated(nt, _) = &token.kind { if let token::NtIdent(ident, is_raw) = **nt { *tt = tokenstream::TokenTree::token( token::Ident(ident.name, is_raw), diff --git a/src/librustc_expand/mbe/macro_parser.rs b/src/librustc_expand/mbe/macro_parser.rs index 968f7c8e273a3..c90a438c25ece 100644 --- a/src/librustc_expand/mbe/macro_parser.rs +++ b/src/librustc_expand/mbe/macro_parser.rs @@ -785,12 +785,12 @@ fn may_begin_with(token: &Token, name: Symbol) -> bool { sym::literal => token.can_begin_literal_maybe_minus(), sym::vis => match token.kind { // The follow-set of :vis + "priv" keyword + interpolated - token::Comma | token::Ident(..) | token::Interpolated(_) => true, + token::Comma | token::Ident(..) | token::Interpolated(..) => true, _ => token.can_begin_type(), }, sym::block => match token.kind { token::OpenDelim(token::Brace) => true, - token::Interpolated(ref nt) => match **nt { + token::Interpolated(ref nt, _) => match **nt { token::NtItem(_) | token::NtPat(_) | token::NtTy(_) @@ -804,7 +804,7 @@ fn may_begin_with(token: &Token, name: Symbol) -> bool { }, sym::path | sym::meta => match token.kind { token::ModSep | token::Ident(..) => true, - token::Interpolated(ref nt) => match **nt { + token::Interpolated(ref nt, _) => match **nt { token::NtPath(_) | token::NtMeta(_) => true, _ => may_be_ident(&nt), }, @@ -823,12 +823,12 @@ fn may_begin_with(token: &Token, name: Symbol) -> bool { token::ModSep | // path token::Lt | // path (UFCS constant) token::BinOp(token::Shl) => true, // path (double UFCS) - token::Interpolated(ref nt) => may_be_ident(nt), + token::Interpolated(ref nt, _) => may_be_ident(nt), _ => false, }, sym::lifetime => match token.kind { token::Lifetime(_) => true, - token::Interpolated(ref nt) => match **nt { + token::Interpolated(ref nt, _) => match **nt { token::NtLifetime(_) | token::NtTT(_) => true, _ => false, }, diff --git a/src/librustc_expand/mbe/transcribe.rs b/src/librustc_expand/mbe/transcribe.rs index e2d3d5c4d644e..486f0a6420d6e 100644 --- a/src/librustc_expand/mbe/transcribe.rs +++ b/src/librustc_expand/mbe/transcribe.rs @@ -4,7 +4,7 @@ use crate::mbe::macro_parser::{MatchedNonterminal, MatchedSeq, NamedMatch}; use rustc_ast::ast::MacCall; use rustc_ast::mut_visit::{self, MutVisitor}; -use rustc_ast::token::{self, NtTT, Token}; +use rustc_ast::token::{self, FlattenGroup, NtTT, Token}; use rustc_ast::tokenstream::{DelimSpan, TokenStream, TokenTree, TreeAndJoint}; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::sync::Lrc; @@ -240,7 +240,10 @@ pub(super) fn transcribe<'a>( result.push(tt.clone().into()); } else { marker.visit_span(&mut sp); - let token = TokenTree::token(token::Interpolated(nt.clone()), sp); + let token = TokenTree::token( + token::Interpolated(nt.clone(), FlattenGroup::No), + sp, + ); result.push(token.into()); } } else { diff --git a/src/librustc_expand/proc_macro.rs b/src/librustc_expand/proc_macro.rs index df7bf9438c3d0..1e26c832a2621 100644 --- a/src/librustc_expand/proc_macro.rs +++ b/src/librustc_expand/proc_macro.rs @@ -2,7 +2,7 @@ use crate::base::{self, *}; use crate::proc_macro_server; use rustc_ast::ast::{self, ItemKind, MetaItemKind, NestedMetaItem}; -use rustc_ast::token; +use rustc_ast::token::{self, FlattenGroup}; use rustc_ast::tokenstream::{self, TokenStream}; use rustc_data_structures::sync::Lrc; use rustc_errors::{Applicability, ErrorReported}; @@ -102,7 +102,7 @@ impl MultiItemModifier for ProcMacroDerive { } } - let token = token::Interpolated(Lrc::new(token::NtItem(item))); + let token = token::Interpolated(Lrc::new(token::NtItem(item)), FlattenGroup::Yes); let input = tokenstream::TokenTree::token(token, DUMMY_SP).into(); let server = proc_macro_server::Rustc::new(ecx); diff --git a/src/librustc_expand/proc_macro_server.rs b/src/librustc_expand/proc_macro_server.rs index ea55674045c0f..c88b5a37f718a 100644 --- a/src/librustc_expand/proc_macro_server.rs +++ b/src/librustc_expand/proc_macro_server.rs @@ -1,7 +1,7 @@ use crate::base::ExtCtxt; use rustc_ast::ast; -use rustc_ast::token; +use rustc_ast::token::{self, FlattenGroup}; use rustc_ast::tokenstream::{self, DelimSpan, IsJoint::*, TokenStream, TreeAndJoint}; use rustc_ast::util::comments; use rustc_ast_pretty::pprust; @@ -60,7 +60,12 @@ impl FromInternal<(TreeAndJoint, &'_ ParseSess, &'_ mut Vec)> let Token { kind, span } = match tree { tokenstream::TokenTree::Delimited(span, delim, tts) => { let delimiter = Delimiter::from_internal(delim); - return TokenTree::Group(Group { delimiter, stream: tts, span }); + return TokenTree::Group(Group { + delimiter, + stream: tts, + span, + flatten: FlattenGroup::No, + }); } tokenstream::TokenTree::Token(token) => token, }; @@ -167,6 +172,7 @@ impl FromInternal<(TreeAndJoint, &'_ ParseSess, &'_ mut Vec)> delimiter: Delimiter::Bracket, stream, span: DelimSpan::from_single(span), + flatten: FlattenGroup::No, })); if style == ast::AttrStyle::Inner { stack.push(tt!(Punct::new('!', false))); @@ -174,12 +180,13 @@ impl FromInternal<(TreeAndJoint, &'_ ParseSess, &'_ mut Vec)> tt!(Punct::new('#', false)) } - Interpolated(nt) => { + Interpolated(nt, flatten) => { let stream = nt_to_tokenstream(&nt, sess, span); TokenTree::Group(Group { delimiter: Delimiter::None, stream, span: DelimSpan::from_single(span), + flatten, }) } @@ -195,7 +202,7 @@ impl ToInternal for TokenTree { let (ch, joint, span) = match self { TokenTree::Punct(Punct { ch, joint, span }) => (ch, joint, span), - TokenTree::Group(Group { delimiter, stream, span }) => { + TokenTree::Group(Group { delimiter, stream, span, .. }) => { return tokenstream::TokenTree::Delimited(span, delimiter.to_internal(), stream) .into(); } @@ -283,6 +290,10 @@ pub struct Group { delimiter: Delimiter, stream: TokenStream, span: DelimSpan, + /// A hack used to pass AST fragments to attribute and derive macros + /// as a single nonterminal token instead of a token stream. + /// FIXME: It needs to be removed, but there are some compatibility issues (see #73345). + flatten: FlattenGroup, } #[derive(Copy, Clone, PartialEq, Eq, Hash)] @@ -437,14 +448,12 @@ impl server::TokenStreamIter for Rustc<'_> { let next = iter.cursor.next_with_joint()?; Some(TokenTree::from_internal((next, self.sess, &mut iter.stack))) })?; - // HACK: The condition "dummy span + group with empty delimiter" represents an AST - // fragment approximately converted into a token stream. This may happen, for - // example, with inputs to proc macro attributes, including derives. Such "groups" - // need to flattened during iteration over stream's token trees. - // Eventually this needs to be removed in favor of keeping original token trees - // and not doing the roundtrip through AST. + // A hack used to pass AST fragments to attribute and derive macros + // as a single nonterminal token instead of a token stream. + // Such token needs to be "unwrapped" and not represented as a delimited group. + // FIXME: It needs to be removed, but there are some compatibility issues (see #73345). if let TokenTree::Group(ref group) = tree { - if group.delimiter == Delimiter::None && group.span.entire().is_dummy() { + if matches!(group.flatten, FlattenGroup::Yes) { iter.cursor.append(group.stream.clone()); continue; } @@ -456,7 +465,12 @@ impl server::TokenStreamIter for Rustc<'_> { impl server::Group for Rustc<'_> { fn new(&mut self, delimiter: Delimiter, stream: Self::TokenStream) -> Self::Group { - Group { delimiter, stream, span: DelimSpan::from_single(server::Span::call_site(self)) } + Group { + delimiter, + stream, + span: DelimSpan::from_single(server::Span::call_site(self)), + flatten: FlattenGroup::No, + } } fn delimiter(&mut self, group: &Self::Group) -> Delimiter { group.delimiter diff --git a/src/librustc_parse/parser/attr.rs b/src/librustc_parse/parser/attr.rs index 803f14a2a228a..b8cb146145b98 100644 --- a/src/librustc_parse/parser/attr.rs +++ b/src/librustc_parse/parser/attr.rs @@ -155,7 +155,7 @@ impl<'a> Parser<'a> { /// The delimiters or `=` are still put into the resulting token stream. pub fn parse_attr_item(&mut self) -> PResult<'a, ast::AttrItem> { let item = match self.token.kind { - token::Interpolated(ref nt) => match **nt { + token::Interpolated(ref nt, _) => match **nt { Nonterminal::NtMeta(ref item) => Some(item.clone().into_inner()), _ => None, }, @@ -254,7 +254,7 @@ impl<'a> Parser<'a> { /// meta_item_inner : (meta_item | UNSUFFIXED_LIT) (',' meta_item_inner)? ; pub fn parse_meta_item(&mut self) -> PResult<'a, ast::MetaItem> { let nt_meta = match self.token.kind { - token::Interpolated(ref nt) => match **nt { + token::Interpolated(ref nt, _) => match **nt { token::NtMeta(ref e) => Some(e.clone()), _ => None, }, diff --git a/src/librustc_parse/parser/expr.rs b/src/librustc_parse/parser/expr.rs index 49a5c8801766c..2745b18a8cd51 100644 --- a/src/librustc_parse/parser/expr.rs +++ b/src/librustc_parse/parser/expr.rs @@ -26,7 +26,7 @@ use std::mem; /// `token::Interpolated` tokens. macro_rules! maybe_whole_expr { ($p:expr) => { - if let token::Interpolated(nt) = &$p.token.kind { + if let token::Interpolated(nt, _) = &$p.token.kind { match &**nt { token::NtExpr(e) | token::NtLiteral(e) => { let e = e.clone(); diff --git a/src/librustc_parse/parser/item.rs b/src/librustc_parse/parser/item.rs index 6f13d7994d17d..10df16964da08 100644 --- a/src/librustc_parse/parser/item.rs +++ b/src/librustc_parse/parser/item.rs @@ -1780,7 +1780,7 @@ impl<'a> Parser<'a> { fn is_named_param(&self) -> bool { let offset = match self.token.kind { - token::Interpolated(ref nt) => match **nt { + token::Interpolated(ref nt, _) => match **nt { token::NtPat(..) => return self.look_ahead(1, |t| t == &token::Colon), _ => 0, }, diff --git a/src/librustc_parse/parser/mod.rs b/src/librustc_parse/parser/mod.rs index 7811d5fb741b2..04074479a21a4 100644 --- a/src/librustc_parse/parser/mod.rs +++ b/src/librustc_parse/parser/mod.rs @@ -54,7 +54,7 @@ enum BlockMode { #[macro_export] macro_rules! maybe_whole { ($p:expr, $constructor:ident, |$x:ident| $e:expr) => { - if let token::Interpolated(nt) = &$p.token.kind { + if let token::Interpolated(nt, _) = &$p.token.kind { if let token::$constructor(x) = &**nt { let $x = x.clone(); $p.bump(); @@ -69,7 +69,7 @@ macro_rules! maybe_whole { macro_rules! maybe_recover_from_interpolated_ty_qpath { ($self: expr, $allow_qpath_recovery: expr) => { if $allow_qpath_recovery && $self.look_ahead(1, |t| t == &token::ModSep) { - if let token::Interpolated(nt) = &$self.token.kind { + if let token::Interpolated(nt, _) = &$self.token.kind { if let token::NtTy(ty) = &**nt { let ty = ty.clone(); $self.bump(); @@ -922,7 +922,7 @@ impl<'a> Parser<'a> { if self.eat(&token::Eq) { let eq_span = self.prev_token.span; let mut is_interpolated_expr = false; - if let token::Interpolated(nt) = &self.token.kind { + if let token::Interpolated(nt, _) = &self.token.kind { if let token::NtExpr(..) = **nt { is_interpolated_expr = true; } diff --git a/src/librustc_parse/parser/pat.rs b/src/librustc_parse/parser/pat.rs index 6603d0afc0248..742183d369735 100644 --- a/src/librustc_parse/parser/pat.rs +++ b/src/librustc_parse/parser/pat.rs @@ -515,7 +515,7 @@ impl<'a> Parser<'a> { self.recover_additional_muts(); // Make sure we don't allow e.g. `let mut $p;` where `$p:pat`. - if let token::Interpolated(ref nt) = self.token.kind { + if let token::Interpolated(ref nt, _) = self.token.kind { if let token::NtPat(_) = **nt { self.expected_ident_found().emit(); } diff --git a/src/librustc_resolve/build_reduced_graph.rs b/src/librustc_resolve/build_reduced_graph.rs index ef43f597eab47..72faa68d0b243 100644 --- a/src/librustc_resolve/build_reduced_graph.rs +++ b/src/librustc_resolve/build_reduced_graph.rs @@ -1325,7 +1325,7 @@ impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> { } fn visit_token(&mut self, t: Token) { - if let token::Interpolated(nt) = t.kind { + if let token::Interpolated(nt, _) = t.kind { if let token::NtExpr(ref expr) = *nt { if let ast::ExprKind::MacCall(..) = expr.kind { self.visit_invoc(expr.id); diff --git a/src/librustc_resolve/def_collector.rs b/src/librustc_resolve/def_collector.rs index f1063f42c91ec..dc8d1a8d3fdf9 100644 --- a/src/librustc_resolve/def_collector.rs +++ b/src/librustc_resolve/def_collector.rs @@ -256,7 +256,7 @@ impl<'a, 'b> visit::Visitor<'a> for DefCollector<'a, 'b> { } fn visit_token(&mut self, t: Token) { - if let token::Interpolated(nt) = t.kind { + if let token::Interpolated(nt, _) = t.kind { if let token::NtExpr(ref expr) = *nt { if let ExprKind::MacCall(..) = expr.kind { self.visit_macro_invoc(expr.id); From f9af59def21ed0a2e540dde90779a87d0a802332 Mon Sep 17 00:00:00 2001 From: Gary Guo Date: Thu, 25 Jun 2020 23:08:58 +0100 Subject: [PATCH 132/142] Remove irrelevant comment --- src/libcore/option.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/libcore/option.rs b/src/libcore/option.rs index 5f0a12678ff43..7aca6af3de6f3 100644 --- a/src/libcore/option.rs +++ b/src/libcore/option.rs @@ -142,11 +142,6 @@ use crate::{ ops::{self, Deref, DerefMut}, }; -// Note that this is not a lang item per se, but it has a hidden dependency on -// `Iterator`, which is one. The compiler assumes that the `next` method of -// `Iterator` is an enumeration with one type parameter and two variants, -// which basically means it must be `Option`. - /// The `Option` type. See [the module level documentation](index.html) for more. #[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)] #[rustc_diagnostic_item = "option_type"] From 0cf4b9de68701ad82130388f5626d5572f2fe8c2 Mon Sep 17 00:00:00 2001 From: Eduard-Mihai Burtescu Date: Fri, 26 Jun 2020 02:56:23 +0300 Subject: [PATCH 133/142] rustc_lint: only query `typeck_tables_of` when a lint needs it. --- src/librustc_lint/array_into_iter.rs | 8 +- src/librustc_lint/builtin.rs | 20 ++-- src/librustc_lint/context.rs | 31 ++++- src/librustc_lint/late.rs | 39 ++++-- src/librustc_lint/types.rs | 9 +- src/librustc_lint/unused.rs | 8 +- .../clippy/clippy_lints/src/arithmetic.rs | 6 +- .../src/assertions_on_constants.rs | 4 +- .../clippy/clippy_lints/src/assign_ops.rs | 6 +- .../clippy_lints/src/atomic_ordering.rs | 8 +- src/tools/clippy/clippy_lints/src/bit_mask.rs | 2 +- src/tools/clippy/clippy_lints/src/booleans.rs | 6 +- .../clippy/clippy_lints/src/bytecount.rs | 4 +- .../clippy_lints/src/cognitive_complexity.rs | 2 +- .../clippy_lints/src/comparison_chain.rs | 2 +- src/tools/clippy/clippy_lints/src/copies.rs | 8 +- .../clippy_lints/src/default_trait_access.rs | 4 +- .../clippy/clippy_lints/src/dereference.rs | 18 +-- .../clippy_lints/src/drop_forget_ref.rs | 2 +- .../clippy_lints/src/duration_subsec.rs | 4 +- src/tools/clippy/clippy_lints/src/entry.rs | 2 +- src/tools/clippy/clippy_lints/src/eq_op.rs | 16 +-- .../clippy/clippy_lints/src/erasing_op.rs | 2 +- src/tools/clippy/clippy_lints/src/escape.rs | 2 +- .../clippy/clippy_lints/src/eta_reduction.rs | 6 +- .../clippy_lints/src/eval_order_dependence.rs | 8 +- .../clippy/clippy_lints/src/float_literal.rs | 2 +- .../src/floating_point_arithmetic.rs | 24 ++-- src/tools/clippy/clippy_lints/src/format.rs | 4 +- .../clippy_lints/src/get_last_with_len.rs | 2 +- .../clippy/clippy_lints/src/identity_op.rs | 8 +- .../clippy/clippy_lints/src/if_let_mutex.rs | 2 +- .../clippy_lints/src/if_let_some_result.rs | 2 +- .../clippy_lints/src/implicit_return.rs | 2 +- .../src/implicit_saturating_sub.rs | 4 +- .../clippy_lints/src/indexing_slicing.rs | 8 +- .../clippy/clippy_lints/src/infinite_iter.rs | 7 +- .../clippy_lints/src/integer_division.rs | 2 +- .../clippy_lints/src/large_stack_arrays.rs | 2 +- src/tools/clippy/clippy_lints/src/len_zero.rs | 2 +- .../clippy/clippy_lints/src/let_and_return.rs | 4 +- .../clippy/clippy_lints/src/let_if_seq.rs | 2 +- .../clippy/clippy_lints/src/let_underscore.rs | 4 +- .../clippy/clippy_lints/src/lifetimes.rs | 2 +- src/tools/clippy/clippy_lints/src/loops.rs | 34 +++--- .../clippy/clippy_lints/src/map_clone.rs | 6 +- .../clippy/clippy_lints/src/map_unit_fn.rs | 8 +- .../clippy_lints/src/match_on_vec_items.rs | 4 +- src/tools/clippy/clippy_lints/src/matches.rs | 26 ++-- .../clippy_lints/src/mem_discriminant.rs | 4 +- .../clippy/clippy_lints/src/mem_forget.rs | 2 +- .../clippy/clippy_lints/src/mem_replace.rs | 10 +- .../src/methods/bind_instead_of_map.rs | 2 +- .../src/methods/inefficient_to_string.rs | 4 +- .../methods/manual_saturating_arithmetic.rs | 4 +- .../clippy/clippy_lints/src/methods/mod.rs | 111 +++++++++--------- .../src/methods/option_map_unwrap_or.rs | 4 +- .../src/methods/unnecessary_filter_map.rs | 2 +- src/tools/clippy/clippy_lints/src/minmax.rs | 29 +++-- src/tools/clippy/clippy_lints/src/misc.rs | 18 +-- .../clippy_lints/src/modulo_arithmetic.rs | 6 +- src/tools/clippy/clippy_lints/src/mut_key.rs | 2 +- src/tools/clippy/clippy_lints/src/mut_mut.rs | 2 +- .../clippy/clippy_lints/src/mut_reference.rs | 6 +- .../src/mutable_debug_assertion.rs | 2 +- .../clippy/clippy_lints/src/mutex_atomic.rs | 2 +- .../clippy/clippy_lints/src/needless_bool.rs | 2 +- .../clippy_lints/src/needless_borrow.rs | 6 +- .../src/needless_pass_by_value.rs | 10 +- .../clippy_lints/src/needless_update.rs | 2 +- .../src/neg_cmp_op_on_partial_ord.rs | 2 +- .../clippy/clippy_lints/src/neg_multiply.rs | 4 +- .../clippy/clippy_lints/src/no_effect.rs | 10 +- .../clippy/clippy_lints/src/non_copy_const.rs | 6 +- .../clippy/clippy_lints/src/open_options.rs | 4 +- .../src/overflow_check_conditional.rs | 8 +- .../src/path_buf_push_overwrite.rs | 2 +- .../clippy_lints/src/ptr_offset_with_cast.rs | 4 +- .../clippy/clippy_lints/src/question_mark.rs | 6 +- src/tools/clippy/clippy_lints/src/ranges.rs | 6 +- src/tools/clippy/clippy_lints/src/regex.rs | 6 +- src/tools/clippy/clippy_lints/src/shadow.rs | 2 +- src/tools/clippy/clippy_lints/src/strings.rs | 2 +- src/tools/clippy/clippy_lints/src/swap.rs | 2 +- .../clippy_lints/src/temporary_assignment.rs | 2 +- .../clippy_lints/src/to_digit_is_some.rs | 4 +- .../clippy/clippy_lints/src/trait_bounds.rs | 2 +- .../clippy/clippy_lints/src/transmute.rs | 6 +- .../clippy_lints/src/transmuting_null.rs | 2 +- src/tools/clippy/clippy_lints/src/try_err.rs | 4 +- src/tools/clippy/clippy_lints/src/types.rs | 36 +++--- .../clippy_lints/src/unnamed_address.rs | 12 +- .../clippy_lints/src/unnecessary_sort_by.rs | 2 +- src/tools/clippy/clippy_lints/src/unwrap.rs | 2 +- .../clippy_lints/src/useless_conversion.rs | 18 +-- .../clippy/clippy_lints/src/utils/higher.rs | 4 +- .../clippy_lints/src/utils/hir_utils.rs | 4 +- .../clippy_lints/src/utils/inspector.rs | 6 +- .../clippy_lints/src/utils/internal_lints.rs | 6 +- .../clippy/clippy_lints/src/utils/mod.rs | 16 +-- .../clippy/clippy_lints/src/utils/usage.rs | 2 +- src/tools/clippy/clippy_lints/src/vec.rs | 6 +- .../clippy_lints/src/vec_resize_to_zero.rs | 2 +- .../clippy_lints/src/verbose_file_reads.rs | 4 +- .../clippy/clippy_lints/src/zero_div_zero.rs | 4 +- .../clippy/doc/common_tools_writing_lints.md | 16 +-- 106 files changed, 441 insertions(+), 401 deletions(-) diff --git a/src/librustc_lint/array_into_iter.rs b/src/librustc_lint/array_into_iter.rs index 5b282c4203400..82ac60be17c82 100644 --- a/src/librustc_lint/array_into_iter.rs +++ b/src/librustc_lint/array_into_iter.rs @@ -31,7 +31,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ArrayIntoIter { // Check if the method call actually calls the libcore // `IntoIterator::into_iter`. - let def_id = cx.tables.type_dependent_def_id(expr.hir_id).unwrap(); + let def_id = cx.tables().type_dependent_def_id(expr.hir_id).unwrap(); match cx.tcx.trait_of_item(def_id) { Some(trait_id) if cx.tcx.is_diagnostic_item(sym::IntoIterator, trait_id) => {} _ => return, @@ -45,7 +45,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ArrayIntoIter { // `Box` is the only thing that values can be moved out of via // method call. `Box::new([1]).into_iter()` should trigger this // lint. - let mut recv_ty = cx.tables.expr_ty(receiver_arg); + let mut recv_ty = cx.tables().expr_ty(receiver_arg); let mut num_box_derefs = 0; while recv_ty.is_box() { num_box_derefs += 1; @@ -60,13 +60,13 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ArrayIntoIter { // Make sure that there is an autoref coercion at the expected // position. The first `num_box_derefs` adjustments are the derefs // of the box. - match cx.tables.expr_adjustments(receiver_arg).get(num_box_derefs) { + match cx.tables().expr_adjustments(receiver_arg).get(num_box_derefs) { Some(Adjustment { kind: Adjust::Borrow(_), .. }) => {} _ => return, } // Emit lint diagnostic. - let target = match cx.tables.expr_ty_adjusted(receiver_arg).kind { + let target = match cx.tables().expr_ty_adjusted(receiver_arg).kind { ty::Ref(_, ty::TyS { kind: ty::Array(..), .. }, _) => "[T; N]", ty::Ref(_, ty::TyS { kind: ty::Slice(..), .. }, _) => "[T]", diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index e746396e4c684..d8f3caa2c4434 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -144,7 +144,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for BoxPointers { } fn check_expr(&mut self, cx: &LateContext<'_, '_>, e: &hir::Expr<'_>) { - let ty = cx.tables.node_type(e.hir_id); + let ty = cx.tables().node_type(e.hir_id); self.check_heap_type(cx, e.span, ty); } } @@ -161,11 +161,11 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonShorthandFieldPatterns { fn check_pat(&mut self, cx: &LateContext<'_, '_>, pat: &hir::Pat<'_>) { if let PatKind::Struct(ref qpath, field_pats, _) = pat.kind { let variant = cx - .tables + .tables() .pat_ty(pat) .ty_adt_def() .expect("struct pattern type is not an ADT") - .variant_of_res(cx.tables.qpath_res(qpath, pat.hir_id)); + .variant_of_res(cx.tables().qpath_res(qpath, pat.hir_id)); for fieldpat in field_pats { if fieldpat.is_shorthand { continue; @@ -178,7 +178,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonShorthandFieldPatterns { } if let PatKind::Binding(binding_annot, _, ident, None) = fieldpat.pat.kind { if cx.tcx.find_field_index(ident, &variant) - == Some(cx.tcx.field_index(fieldpat.hir_id, cx.tables)) + == Some(cx.tcx.field_index(fieldpat.hir_id, cx.tables())) { cx.struct_span_lint(NON_SHORTHAND_FIELD_PATTERNS, fieldpat.span, |lint| { let mut err = lint @@ -901,7 +901,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MutableTransmutes { expr: &hir::Expr<'_>, ) -> Option<(Ty<'tcx>, Ty<'tcx>)> { let def = if let hir::ExprKind::Path(ref qpath) = expr.kind { - cx.tables.qpath_res(qpath, expr.hir_id) + cx.tables().qpath_res(qpath, expr.hir_id) } else { return None; }; @@ -909,7 +909,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MutableTransmutes { if !def_id_is_transmute(cx, did) { return None; } - let sig = cx.tables.node_type(expr.hir_id).fn_sig(cx.tcx); + let sig = cx.tables().node_type(expr.hir_id).fn_sig(cx.tcx); let from = sig.inputs().skip_binder()[0]; let to = *sig.output().skip_binder(); return Some((from, to)); @@ -1891,7 +1891,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidValue { if let hir::ExprKind::Call(ref path_expr, ref args) = expr.kind { // Find calls to `mem::{uninitialized,zeroed}` methods. if let hir::ExprKind::Path(ref qpath) = path_expr.kind { - let def_id = cx.tables.qpath_res(qpath, path_expr.hir_id).opt_def_id()?; + let def_id = cx.tables().qpath_res(qpath, path_expr.hir_id).opt_def_id()?; if cx.tcx.is_diagnostic_item(sym::mem_zeroed, def_id) { return Some(InitKind::Zeroed); @@ -1905,14 +1905,14 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidValue { } } else if let hir::ExprKind::MethodCall(_, _, ref args, _) = expr.kind { // Find problematic calls to `MaybeUninit::assume_init`. - let def_id = cx.tables.type_dependent_def_id(expr.hir_id)?; + let def_id = cx.tables().type_dependent_def_id(expr.hir_id)?; if cx.tcx.is_diagnostic_item(sym::assume_init, def_id) { // This is a call to *some* method named `assume_init`. // See if the `self` parameter is one of the dangerous constructors. if let hir::ExprKind::Call(ref path_expr, _) = args[0].kind { if let hir::ExprKind::Path(ref qpath) = path_expr.kind { let def_id = - cx.tables.qpath_res(qpath, path_expr.hir_id).opt_def_id()?; + cx.tables().qpath_res(qpath, path_expr.hir_id).opt_def_id()?; if cx.tcx.is_diagnostic_item(sym::maybe_uninit_zeroed, def_id) { return Some(InitKind::Zeroed); @@ -2025,7 +2025,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidValue { // This conjures an instance of a type out of nothing, // using zeroed or uninitialized memory. // We are extremely conservative with what we warn about. - let conjured_ty = cx.tables.expr_ty(expr); + let conjured_ty = cx.tables().expr_ty(expr); if let Some((msg, span)) = ty_find_init_error(cx.tcx, conjured_ty, init) { cx.struct_span_lint(INVALID_VALUE, expr.span, |lint| { let mut err = lint.build(&format!( diff --git a/src/librustc_lint/context.rs b/src/librustc_lint/context.rs index e5d3227d5afd4..0b4ae131af0fc 100644 --- a/src/librustc_lint/context.rs +++ b/src/librustc_lint/context.rs @@ -37,6 +37,7 @@ use rustc_session::Session; use rustc_span::{symbol::Symbol, MultiSpan, Span, DUMMY_SP}; use rustc_target::abi::LayoutOf; +use std::cell::Cell; use std::slice; /// Information about the registered lints. @@ -423,9 +424,17 @@ pub struct LateContext<'a, 'tcx> { /// Type context we're checking in. pub tcx: TyCtxt<'tcx>, - /// Side-tables for the body we are in. - // FIXME: Make this lazy to avoid running the TypeckTables query? - pub tables: &'a ty::TypeckTables<'tcx>, + /// Current body, or `None` if outside a body. + pub enclosing_body: Option, + + /// Type-checking side-tables for the current body. Access using the + /// `tables` method, which handles querying the tables on demand. + // FIXME(eddyb) move all the code accessing internal fields like this, + // to this module, to avoid exposing it to lint logic. + pub(super) cached_typeck_tables: Cell>>, + + // HACK(eddyb) replace this with having `Option` around `&TypeckTables`. + pub(super) empty_typeck_tables: &'a ty::TypeckTables<'tcx>, /// Parameter environment for the item we are in. pub param_env: ty::ParamEnv<'tcx>, @@ -667,6 +676,22 @@ impl LintContext for EarlyContext<'_> { } impl<'a, 'tcx> LateContext<'a, 'tcx> { + /// Gets the type-checking side-tables for the current body, + /// or empty `TypeckTables` if outside a body. + // FIXME(eddyb) return `Option<&'tcx ty::TypeckTables<'tcx>>`, + // where `None` indicates we're outside a body. + pub fn tables(&self) -> &'a ty::TypeckTables<'tcx> { + if let Some(body) = self.enclosing_body { + self.cached_typeck_tables.get().unwrap_or_else(|| { + let tables = self.tcx.body_tables(body); + self.cached_typeck_tables.set(Some(tables)); + tables + }) + } else { + self.empty_typeck_tables + } + } + pub fn current_lint_root(&self) -> hir::HirId { self.last_node_with_lint_attrs } diff --git a/src/librustc_lint/late.rs b/src/librustc_lint/late.rs index c8f827b1f5ced..ef62d44c4026b 100644 --- a/src/librustc_lint/late.rs +++ b/src/librustc_lint/late.rs @@ -30,6 +30,7 @@ use rustc_span::Span; use log::debug; use std::any::Any; +use std::cell::Cell; use std::slice; /// Extract the `LintStore` from the query context. @@ -104,12 +105,25 @@ impl<'a, 'tcx, T: LateLintPass<'a, 'tcx>> hir_visit::Visitor<'tcx> hir_visit::NestedVisitorMap::All(self.context.tcx.hir()) } - fn visit_nested_body(&mut self, body: hir::BodyId) { - let old_tables = self.context.tables; - self.context.tables = self.context.tcx.body_tables(body); - let body = self.context.tcx.hir().body(body); + fn visit_nested_body(&mut self, body_id: hir::BodyId) { + let old_enclosing_body = self.context.enclosing_body.replace(body_id); + let old_cached_typeck_tables = self.context.cached_typeck_tables.get(); + + // HACK(eddyb) avoid trashing `cached_typeck_tables` when we're + // nested in `visit_fn`, which may have already resulted in them + // being queried. + if old_enclosing_body != Some(body_id) { + self.context.cached_typeck_tables.set(None); + } + + let body = self.context.tcx.hir().body(body_id); self.visit_body(body); - self.context.tables = old_tables; + self.context.enclosing_body = old_enclosing_body; + + // See HACK comment above. + if old_enclosing_body != Some(body_id) { + self.context.cached_typeck_tables.set(old_cached_typeck_tables); + } } fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) { @@ -181,13 +195,14 @@ impl<'a, 'tcx, T: LateLintPass<'a, 'tcx>> hir_visit::Visitor<'tcx> ) { // Wrap in tables here, not just in visit_nested_body, // in order for `check_fn` to be able to use them. - let old_tables = self.context.tables; - self.context.tables = self.context.tcx.body_tables(body_id); + let old_enclosing_body = self.context.enclosing_body.replace(body_id); + let old_cached_typeck_tables = self.context.cached_typeck_tables.take(); let body = self.context.tcx.hir().body(body_id); lint_callback!(self, check_fn, fk, decl, body, span, id); hir_visit::walk_fn(self, fk, decl, body_id, span, id); lint_callback!(self, check_fn_post, fk, decl, body, span, id); - self.context.tables = old_tables; + self.context.enclosing_body = old_enclosing_body; + self.context.cached_typeck_tables.set(old_cached_typeck_tables); } fn visit_variant_data( @@ -361,7 +376,9 @@ fn late_lint_mod_pass<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>( let context = LateContext { tcx, - tables: &ty::TypeckTables::empty(None), + enclosing_body: None, + cached_typeck_tables: Cell::new(None), + empty_typeck_tables: &ty::TypeckTables::empty(None), param_env: ty::ParamEnv::empty(), access_levels, lint_store: unerased_lint_store(tcx), @@ -408,7 +425,9 @@ fn late_lint_pass_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(tcx: TyCtxt<'tc let context = LateContext { tcx, - tables: &ty::TypeckTables::empty(None), + enclosing_body: None, + cached_typeck_tables: Cell::new(None), + empty_typeck_tables: &ty::TypeckTables::empty(None), param_env: ty::ParamEnv::empty(), access_levels, lint_store: unerased_lint_store(tcx), diff --git a/src/librustc_lint/types.rs b/src/librustc_lint/types.rs index cfafb86fbedb1..814ca627e2cf8 100644 --- a/src/librustc_lint/types.rs +++ b/src/librustc_lint/types.rs @@ -167,7 +167,8 @@ fn report_bin_hex_error( the type `{}` and will become `{}{}`", repr_str, val, t, actually, t )); - if let Some(sugg_ty) = get_type_suggestion(&cx.tables.node_type(expr.hir_id), val, negative) + if let Some(sugg_ty) = + get_type_suggestion(&cx.tables().node_type(expr.hir_id), val, negative) { if let Some(pos) = repr_str.chars().position(|c| c == 'i' || c == 'u') { let (sans_suffix, _) = repr_str.split_at(pos); @@ -301,7 +302,7 @@ fn lint_uint_literal<'a, 'tcx>( if let Node::Expr(par_e) = cx.tcx.hir().get(parent_id) { match par_e.kind { hir::ExprKind::Cast(..) => { - if let ty::Char = cx.tables.expr_ty(par_e).kind { + if let ty::Char = cx.tables().expr_ty(par_e).kind { cx.struct_span_lint(OVERFLOWING_LITERALS, par_e.span, |lint| { lint.build("only `u8` can be cast into `char`") .span_suggestion( @@ -352,7 +353,7 @@ fn lint_literal<'a, 'tcx>( e: &'tcx hir::Expr<'tcx>, lit: &hir::Lit, ) { - match cx.tables.node_type(e.hir_id).kind { + match cx.tables().node_type(e.hir_id).kind { ty::Int(t) => { match lit.node { ast::LitKind::Int(v, ast::LitIntType::Signed(_) | ast::LitIntType::Unsuffixed) => { @@ -448,7 +449,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TypeLimits { // Normalize the binop so that the literal is always on the RHS in // the comparison let norm_binop = if swap { rev_binop(binop) } else { binop }; - match cx.tables.node_type(expr.hir_id).kind { + match cx.tables().node_type(expr.hir_id).kind { ty::Int(int_ty) => { let (min, max) = int_ty_range(int_ty); let lit_val: i128 = match lit.kind { diff --git a/src/librustc_lint/unused.rs b/src/librustc_lint/unused.rs index 8196b37391b21..506ac77894a41 100644 --- a/src/librustc_lint/unused.rs +++ b/src/librustc_lint/unused.rs @@ -46,7 +46,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { return; } - let ty = cx.tables.expr_ty(&expr); + let ty = cx.tables().expr_ty(&expr); let type_permits_lack_of_use = check_must_use_ty(cx, ty, &expr, s.span, "", "", 1); let mut fn_warned = false; @@ -55,7 +55,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { hir::ExprKind::Call(ref callee, _) => { match callee.kind { hir::ExprKind::Path(ref qpath) => { - match cx.tables.qpath_res(qpath, callee.hir_id) { + match cx.tables().qpath_res(qpath, callee.hir_id) { Res::Def(DefKind::Fn | DefKind::AssocFn, def_id) => Some(def_id), // `Res::Local` if it was a closure, for which we // do not currently support must-use linting @@ -65,7 +65,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { _ => None, } } - hir::ExprKind::MethodCall(..) => cx.tables.type_dependent_def_id(expr.hir_id), + hir::ExprKind::MethodCall(..) => cx.tables().type_dependent_def_id(expr.hir_id), _ => None, }; if let Some(def_id) = maybe_def_id { @@ -950,7 +950,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedAllocation { _ => return, } - for adj in cx.tables.expr_adjustments(e) { + for adj in cx.tables().expr_adjustments(e) { if let adjustment::Adjust::Borrow(adjustment::AutoBorrow::Ref(_, m)) = adj.kind { cx.struct_span_lint(UNUSED_ALLOCATION, e.span, |lint| { let msg = match m { diff --git a/src/tools/clippy/clippy_lints/src/arithmetic.rs b/src/tools/clippy/clippy_lints/src/arithmetic.rs index 6cbe10a5352d1..cc09b99cf1dd1 100644 --- a/src/tools/clippy/clippy_lints/src/arithmetic.rs +++ b/src/tools/clippy/clippy_lints/src/arithmetic.rs @@ -86,7 +86,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Arithmetic { _ => (), } - let (l_ty, r_ty) = (cx.tables.expr_ty(l), cx.tables.expr_ty(r)); + let (l_ty, r_ty) = (cx.tables().expr_ty(l), cx.tables().expr_ty(r)); if l_ty.peel_refs().is_integral() && r_ty.peel_refs().is_integral() { span_lint(cx, INTEGER_ARITHMETIC, expr.span, "integer arithmetic detected"); self.expr_span = Some(expr.span); @@ -96,8 +96,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Arithmetic { } }, hir::ExprKind::Unary(hir::UnOp::UnNeg, arg) => { - let ty = cx.tables.expr_ty(arg); - if constant_simple(cx, cx.tables, expr).is_none() { + let ty = cx.tables().expr_ty(arg); + if constant_simple(cx, cx.tables(), expr).is_none() { if ty.is_integral() { span_lint(cx, INTEGER_ARITHMETIC, expr.span, "integer arithmetic detected"); self.expr_span = Some(expr.span); diff --git a/src/tools/clippy/clippy_lints/src/assertions_on_constants.rs b/src/tools/clippy/clippy_lints/src/assertions_on_constants.rs index f8a8fdcd3aa35..c4536b57f8a99 100644 --- a/src/tools/clippy/clippy_lints/src/assertions_on_constants.rs +++ b/src/tools/clippy/clippy_lints/src/assertions_on_constants.rs @@ -72,7 +72,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for AssertionsOnConstants { } if_chain! { if let ExprKind::Unary(_, ref lit) = e.kind; - if let Some((Constant::Bool(is_true), _)) = constant(cx, cx.tables, lit); + if let Some((Constant::Bool(is_true), _)) = constant(cx, cx.tables(), lit); if is_true; then { lint_true(true); @@ -121,7 +121,7 @@ fn match_assert_with_message<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx E if let ExprKind::DropTemps(ref expr) = expr.kind; if let ExprKind::Unary(UnOp::UnNot, ref expr) = expr.kind; // bind the first argument of the `assert!` macro - if let Some((Constant::Bool(is_true), _)) = constant(cx, cx.tables, expr); + if let Some((Constant::Bool(is_true), _)) = constant(cx, cx.tables(), expr); // arm 1 pattern if let PatKind::Lit(ref lit_expr) = arms[0].pat.kind; if let ExprKind::Lit(ref lit) = lit_expr.kind; diff --git a/src/tools/clippy/clippy_lints/src/assign_ops.rs b/src/tools/clippy/clippy_lints/src/assign_ops.rs index 13e61fe98bac1..51a7647d3208f 100644 --- a/src/tools/clippy/clippy_lints/src/assign_ops.rs +++ b/src/tools/clippy/clippy_lints/src/assign_ops.rs @@ -82,8 +82,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for AssignOps { hir::ExprKind::Assign(assignee, e, _) => { if let hir::ExprKind::Binary(op, l, r) = &e.kind { let lint = |assignee: &hir::Expr<'_>, rhs: &hir::Expr<'_>| { - let ty = cx.tables.expr_ty(assignee); - let rty = cx.tables.expr_ty(rhs); + let ty = cx.tables().expr_ty(assignee); + let rty = cx.tables().expr_ty(rhs); macro_rules! ops { ($op:expr, $cx:expr, @@ -167,7 +167,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for AssignOps { // a = b commutative_op a // Limited to primitive type as these ops are know to be commutative if SpanlessEq::new(cx).ignore_fn().eq_expr(assignee, r) - && cx.tables.expr_ty(assignee).is_primitive_ty() + && cx.tables().expr_ty(assignee).is_primitive_ty() { match op.node { hir::BinOpKind::Add diff --git a/src/tools/clippy/clippy_lints/src/atomic_ordering.rs b/src/tools/clippy/clippy_lints/src/atomic_ordering.rs index fca9aaaff9dce..65e1e2c519c26 100644 --- a/src/tools/clippy/clippy_lints/src/atomic_ordering.rs +++ b/src/tools/clippy/clippy_lints/src/atomic_ordering.rs @@ -53,7 +53,7 @@ const ATOMIC_TYPES: [&str; 12] = [ ]; fn type_is_atomic(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { - if let ty::Adt(&ty::AdtDef { did, .. }, _) = cx.tables.expr_ty(expr).kind { + if let ty::Adt(&ty::AdtDef { did, .. }, _) = cx.tables().expr_ty(expr).kind { ATOMIC_TYPES .iter() .any(|ty| match_def_path(cx, did, &["core", "sync", "atomic", ty])) @@ -76,7 +76,7 @@ fn check_atomic_load_store(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { if method == "load" || method == "store"; let ordering_arg = if method == "load" { &args[1] } else { &args[2] }; if let ExprKind::Path(ref ordering_qpath) = ordering_arg.kind; - if let Some(ordering_def_id) = cx.tables.qpath_res(ordering_qpath, ordering_arg.hir_id).opt_def_id(); + if let Some(ordering_def_id) = cx.tables().qpath_res(ordering_qpath, ordering_arg.hir_id).opt_def_id(); then { if method == "load" && match_ordering_def_path(cx, ordering_def_id, &["Release", "AcqRel"]) { @@ -107,12 +107,12 @@ fn check_memory_fence(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { if_chain! { if let ExprKind::Call(ref func, ref args) = expr.kind; if let ExprKind::Path(ref func_qpath) = func.kind; - if let Some(def_id) = cx.tables.qpath_res(func_qpath, func.hir_id).opt_def_id(); + if let Some(def_id) = cx.tables().qpath_res(func_qpath, func.hir_id).opt_def_id(); if ["fence", "compiler_fence"] .iter() .any(|func| match_def_path(cx, def_id, &["core", "sync", "atomic", func])); if let ExprKind::Path(ref ordering_qpath) = &args[0].kind; - if let Some(ordering_def_id) = cx.tables.qpath_res(ordering_qpath, args[0].hir_id).opt_def_id(); + if let Some(ordering_def_id) = cx.tables().qpath_res(ordering_qpath, args[0].hir_id).opt_def_id(); if match_ordering_def_path(cx, ordering_def_id, &["Relaxed"]); then { span_lint_and_help( diff --git a/src/tools/clippy/clippy_lints/src/bit_mask.rs b/src/tools/clippy/clippy_lints/src/bit_mask.rs index ccb62cb038fd0..a53f3249b85b6 100644 --- a/src/tools/clippy/clippy_lints/src/bit_mask.rs +++ b/src/tools/clippy/clippy_lints/src/bit_mask.rs @@ -319,7 +319,7 @@ fn check_ineffective_gt(cx: &LateContext<'_, '_>, span: Span, m: u128, c: u128, } fn fetch_int_literal(cx: &LateContext<'_, '_>, lit: &Expr<'_>) -> Option { - match constant(cx, cx.tables, lit)?.0 { + match constant(cx, cx.tables(), lit)?.0 { Constant::Int(n) => Some(n), _ => None, } diff --git a/src/tools/clippy/clippy_lints/src/booleans.rs b/src/tools/clippy/clippy_lints/src/booleans.rs index f92c564543b89..cc399a1f8a009 100644 --- a/src/tools/clippy/clippy_lints/src/booleans.rs +++ b/src/tools/clippy/clippy_lints/src/booleans.rs @@ -248,7 +248,7 @@ fn simplify_not(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> Option { }) }, ExprKind::MethodCall(path, _, args, _) if args.len() == 1 => { - let type_of_receiver = cx.tables.expr_ty(&args[0]); + let type_of_receiver = cx.tables().expr_ty(&args[0]); if !is_type_diagnostic_item(cx, type_of_receiver, sym!(option_type)) && !is_type_diagnostic_item(cx, type_of_receiver, sym!(result_type)) { @@ -450,7 +450,7 @@ impl<'a, 'tcx> Visitor<'tcx> for NonminimalBoolVisitor<'a, 'tcx> { self.bool_expr(e) }, ExprKind::Unary(UnOp::UnNot, inner) => { - if self.cx.tables.node_types()[inner.hir_id].is_bool() { + if self.cx.tables().node_types()[inner.hir_id].is_bool() { self.bool_expr(e); } else { walk_expr(self, e); @@ -465,7 +465,7 @@ impl<'a, 'tcx> Visitor<'tcx> for NonminimalBoolVisitor<'a, 'tcx> { } fn implements_ord<'a, 'tcx>(cx: &'a LateContext<'a, 'tcx>, expr: &Expr<'_>) -> bool { - let ty = cx.tables.expr_ty(expr); + let ty = cx.tables().expr_ty(expr); get_trait_def_id(cx, &paths::ORD).map_or(false, |id| implements_trait(cx, ty, id, &[])) } diff --git a/src/tools/clippy/clippy_lints/src/bytecount.rs b/src/tools/clippy/clippy_lints/src/bytecount.rs index 531531a654d0e..c00bb23069bf4 100644 --- a/src/tools/clippy/clippy_lints/src/bytecount.rs +++ b/src/tools/clippy/clippy_lints/src/bytecount.rs @@ -53,7 +53,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ByteCount { if let ExprKind::Binary(ref op, ref l, ref r) = body.value.kind; if op.node == BinOpKind::Eq; if match_type(cx, - walk_ptrs_ty(cx.tables.expr_ty(&filter_args[0])), + walk_ptrs_ty(cx.tables().expr_ty(&filter_args[0])), &paths::SLICE_ITER); then { let needle = match get_path_name(l) { @@ -63,7 +63,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ByteCount { _ => { return; } } }; - if ty::Uint(UintTy::U8) != walk_ptrs_ty(cx.tables.expr_ty(needle)).kind { + if ty::Uint(UintTy::U8) != walk_ptrs_ty(cx.tables().expr_ty(needle)).kind { return; } let haystack = if let ExprKind::MethodCall(ref path, _, ref args, _) = diff --git a/src/tools/clippy/clippy_lints/src/cognitive_complexity.rs b/src/tools/clippy/clippy_lints/src/cognitive_complexity.rs index 3ba72e84fa827..78e509d2ecd83 100644 --- a/src/tools/clippy/clippy_lints/src/cognitive_complexity.rs +++ b/src/tools/clippy/clippy_lints/src/cognitive_complexity.rs @@ -60,7 +60,7 @@ impl CognitiveComplexity { let mut helper = CCHelper { cc: 1, returns: 0 }; helper.visit_expr(expr); let CCHelper { cc, returns } = helper; - let ret_ty = cx.tables.node_type(expr.hir_id); + let ret_ty = cx.tables().node_type(expr.hir_id); let ret_adjust = if is_type_diagnostic_item(cx, ret_ty, sym!(result_type)) { returns } else { diff --git a/src/tools/clippy/clippy_lints/src/comparison_chain.rs b/src/tools/clippy/clippy_lints/src/comparison_chain.rs index 93e29edcaa58f..9c0d33f928015 100644 --- a/src/tools/clippy/clippy_lints/src/comparison_chain.rs +++ b/src/tools/clippy/clippy_lints/src/comparison_chain.rs @@ -99,7 +99,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ComparisonChain { } // Check that the type being compared implements `core::cmp::Ord` - let ty = cx.tables.expr_ty(lhs1); + let ty = cx.tables().expr_ty(lhs1); let is_ord = get_trait_def_id(cx, &paths::ORD).map_or(false, |id| implements_trait(cx, ty, id, &[])); if !is_ord { diff --git a/src/tools/clippy/clippy_lints/src/copies.rs b/src/tools/clippy/clippy_lints/src/copies.rs index b6d50bdfa1466..efd4a31f55960 100644 --- a/src/tools/clippy/clippy_lints/src/copies.rs +++ b/src/tools/clippy/clippy_lints/src/copies.rs @@ -192,7 +192,7 @@ fn lint_same_then_else(cx: &LateContext<'_, '_>, blocks: &[&Block<'_>]) { /// Implementation of `IFS_SAME_COND`. fn lint_same_cond(cx: &LateContext<'_, '_>, conds: &[&Expr<'_>]) { let hash: &dyn Fn(&&Expr<'_>) -> u64 = &|expr| -> u64 { - let mut h = SpanlessHash::new(cx, cx.tables); + let mut h = SpanlessHash::new(cx, cx.tables()); h.hash_expr(expr); h.finish() }; @@ -215,7 +215,7 @@ fn lint_same_cond(cx: &LateContext<'_, '_>, conds: &[&Expr<'_>]) { /// Implementation of `SAME_FUNCTIONS_IN_IF_CONDITION`. fn lint_same_fns_in_if_cond(cx: &LateContext<'_, '_>, conds: &[&Expr<'_>]) { let hash: &dyn Fn(&&Expr<'_>) -> u64 = &|expr| -> u64 { - let mut h = SpanlessHash::new(cx, cx.tables); + let mut h = SpanlessHash::new(cx, cx.tables()); h.hash_expr(expr); h.finish() }; @@ -251,7 +251,7 @@ fn lint_match_arms<'tcx>(cx: &LateContext<'_, 'tcx>, expr: &Expr<'_>) { if let ExprKind::Match(_, ref arms, MatchSource::Normal) = expr.kind { let hash = |&(_, arm): &(usize, &Arm<'_>)| -> u64 { - let mut h = SpanlessHash::new(cx, cx.tables); + let mut h = SpanlessHash::new(cx, cx.tables()); h.hash_expr(&arm.body); h.finish() }; @@ -320,7 +320,7 @@ fn bindings<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, pat: &Pat<'_>) -> FxHashMap { if let Entry::Vacant(v) = map.entry(ident.name) { - v.insert(cx.tables.pat_ty(pat)); + v.insert(cx.tables().pat_ty(pat)); } if let Some(ref as_pat) = *as_pat { bindings_impl(cx, as_pat, map); diff --git a/src/tools/clippy/clippy_lints/src/default_trait_access.rs b/src/tools/clippy/clippy_lints/src/default_trait_access.rs index 635d609c38289..69ae509fb23e9 100644 --- a/src/tools/clippy/clippy_lints/src/default_trait_access.rs +++ b/src/tools/clippy/clippy_lints/src/default_trait_access.rs @@ -36,7 +36,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for DefaultTraitAccess { if let ExprKind::Call(ref path, ..) = expr.kind; if !any_parent_is_automatically_derived(cx.tcx, expr.hir_id); if let ExprKind::Path(ref qpath) = path.kind; - if let Some(def_id) = cx.tables.qpath_res(qpath, path.hir_id).opt_def_id(); + if let Some(def_id) = cx.tables().qpath_res(qpath, path.hir_id).opt_def_id(); if match_def_path(cx, def_id, &paths::DEFAULT_TRAIT_METHOD); then { match qpath { @@ -54,7 +54,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for DefaultTraitAccess { // TODO: Work out a way to put "whatever the imported way of referencing // this type in this file" rather than a fully-qualified type. - let expr_ty = cx.tables.expr_ty(expr); + let expr_ty = cx.tables().expr_ty(expr); if let ty::Adt(..) = expr_ty.kind { let replacement = format!("{}::default()", expr_ty); span_lint_and_sugg( diff --git a/src/tools/clippy/clippy_lints/src/dereference.rs b/src/tools/clippy/clippy_lints/src/dereference.rs index 1cd30ae2c6381..1c6cc93690096 100644 --- a/src/tools/clippy/clippy_lints/src/dereference.rs +++ b/src/tools/clippy/clippy_lints/src/dereference.rs @@ -73,12 +73,9 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Dereferencing { fn lint_deref(cx: &LateContext<'_, '_>, method_name: &str, call_expr: &Expr<'_>, var_span: Span, expr_span: Span) { match method_name { "deref" => { - if cx - .tcx - .lang_items() - .deref_trait() - .map_or(false, |id| implements_trait(cx, cx.tables.expr_ty(&call_expr), id, &[])) - { + if cx.tcx.lang_items().deref_trait().map_or(false, |id| { + implements_trait(cx, cx.tables().expr_ty(&call_expr), id, &[]) + }) { span_lint_and_sugg( cx, EXPLICIT_DEREF_METHODS, @@ -91,12 +88,9 @@ fn lint_deref(cx: &LateContext<'_, '_>, method_name: &str, call_expr: &Expr<'_>, } }, "deref_mut" => { - if cx - .tcx - .lang_items() - .deref_mut_trait() - .map_or(false, |id| implements_trait(cx, cx.tables.expr_ty(&call_expr), id, &[])) - { + if cx.tcx.lang_items().deref_mut_trait().map_or(false, |id| { + implements_trait(cx, cx.tables().expr_ty(&call_expr), id, &[]) + }) { span_lint_and_sugg( cx, EXPLICIT_DEREF_METHODS, diff --git a/src/tools/clippy/clippy_lints/src/drop_forget_ref.rs b/src/tools/clippy/clippy_lints/src/drop_forget_ref.rs index 9de9056c14029..014873eb13255 100644 --- a/src/tools/clippy/clippy_lints/src/drop_forget_ref.rs +++ b/src/tools/clippy/clippy_lints/src/drop_forget_ref.rs @@ -119,7 +119,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for DropForgetRef { let lint; let msg; let arg = &args[0]; - let arg_ty = cx.tables.expr_ty(arg); + let arg_ty = cx.tables().expr_ty(arg); if let ty::Ref(..) = arg_ty.kind { if match_def_path(cx, def_id, &paths::DROP) { diff --git a/src/tools/clippy/clippy_lints/src/duration_subsec.rs b/src/tools/clippy/clippy_lints/src/duration_subsec.rs index 7171dcef968c1..5eb320ceca247 100644 --- a/src/tools/clippy/clippy_lints/src/duration_subsec.rs +++ b/src/tools/clippy/clippy_lints/src/duration_subsec.rs @@ -43,8 +43,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for DurationSubsec { if_chain! { if let ExprKind::Binary(Spanned { node: BinOpKind::Div, .. }, ref left, ref right) = expr.kind; if let ExprKind::MethodCall(ref method_path, _ , ref args, _) = left.kind; - if match_type(cx, walk_ptrs_ty(cx.tables.expr_ty(&args[0])), &paths::DURATION); - if let Some((Constant::Int(divisor), _)) = constant(cx, cx.tables, right); + if match_type(cx, walk_ptrs_ty(cx.tables().expr_ty(&args[0])), &paths::DURATION); + if let Some((Constant::Int(divisor), _)) = constant(cx, cx.tables(), right); then { let suggested_fn = match (method_path.ident.as_str().as_ref(), divisor) { ("subsec_micros", 1_000) | ("subsec_nanos", 1_000_000) => "subsec_millis", diff --git a/src/tools/clippy/clippy_lints/src/entry.rs b/src/tools/clippy/clippy_lints/src/entry.rs index f625058b6703c..e37e23b8944d7 100644 --- a/src/tools/clippy/clippy_lints/src/entry.rs +++ b/src/tools/clippy/clippy_lints/src/entry.rs @@ -109,7 +109,7 @@ fn check_cond<'a, 'tcx, 'b>( if let ExprKind::AddrOf(BorrowKind::Ref, _, ref key) = params[1].kind; then { let map = ¶ms[0]; - let obj_ty = walk_ptrs_ty(cx.tables.expr_ty(map)); + let obj_ty = walk_ptrs_ty(cx.tables().expr_ty(map)); return if match_type(cx, obj_ty, &paths::BTREEMAP) { Some(("BTreeMap", map, key)) diff --git a/src/tools/clippy/clippy_lints/src/eq_op.rs b/src/tools/clippy/clippy_lints/src/eq_op.rs index d7819d737ea04..98757624a13b5 100644 --- a/src/tools/clippy/clippy_lints/src/eq_op.rs +++ b/src/tools/clippy/clippy_lints/src/eq_op.rs @@ -103,8 +103,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for EqOp { (&ExprKind::Lit(..), _) | (_, &ExprKind::Lit(..)) => {}, // &foo == &bar (&ExprKind::AddrOf(BorrowKind::Ref, _, ref l), &ExprKind::AddrOf(BorrowKind::Ref, _, ref r)) => { - let lty = cx.tables.expr_ty(l); - let rty = cx.tables.expr_ty(r); + let lty = cx.tables().expr_ty(l); + let rty = cx.tables().expr_ty(r); let lcpy = is_copy(cx, lty); let rcpy = is_copy(cx, rty); // either operator autorefs or both args are copyable @@ -126,7 +126,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for EqOp { ) } else if lcpy && !rcpy - && implements_trait(cx, lty, trait_id, &[cx.tables.expr_ty(right).into()]) + && implements_trait(cx, lty, trait_id, &[cx.tables().expr_ty(right).into()]) { span_lint_and_then( cx, @@ -145,7 +145,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for EqOp { ) } else if !lcpy && rcpy - && implements_trait(cx, cx.tables.expr_ty(left), trait_id, &[rty.into()]) + && implements_trait(cx, cx.tables().expr_ty(left), trait_id, &[rty.into()]) { span_lint_and_then( cx, @@ -166,10 +166,10 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for EqOp { }, // &foo == bar (&ExprKind::AddrOf(BorrowKind::Ref, _, ref l), _) => { - let lty = cx.tables.expr_ty(l); + let lty = cx.tables().expr_ty(l); let lcpy = is_copy(cx, lty); if (requires_ref || lcpy) - && implements_trait(cx, lty, trait_id, &[cx.tables.expr_ty(right).into()]) + && implements_trait(cx, lty, trait_id, &[cx.tables().expr_ty(right).into()]) { span_lint_and_then( cx, @@ -190,10 +190,10 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for EqOp { }, // foo == &bar (_, &ExprKind::AddrOf(BorrowKind::Ref, _, ref r)) => { - let rty = cx.tables.expr_ty(r); + let rty = cx.tables().expr_ty(r); let rcpy = is_copy(cx, rty); if (requires_ref || rcpy) - && implements_trait(cx, cx.tables.expr_ty(left), trait_id, &[rty.into()]) + && implements_trait(cx, cx.tables().expr_ty(left), trait_id, &[rty.into()]) { span_lint_and_then(cx, OP_REF, e.span, "taken reference of right operand", |diag| { let rsnip = snippet(cx, r.span, "...").to_string(); diff --git a/src/tools/clippy/clippy_lints/src/erasing_op.rs b/src/tools/clippy/clippy_lints/src/erasing_op.rs index 3ff0506e28d00..804a9c1904b73 100644 --- a/src/tools/clippy/clippy_lints/src/erasing_op.rs +++ b/src/tools/clippy/clippy_lints/src/erasing_op.rs @@ -48,7 +48,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ErasingOp { } fn check(cx: &LateContext<'_, '_>, e: &Expr<'_>, span: Span) { - if let Some(Constant::Int(0)) = constant_simple(cx, cx.tables, e) { + if let Some(Constant::Int(0)) = constant_simple(cx, cx.tables(), e) { span_lint( cx, ERASING_OP, diff --git a/src/tools/clippy/clippy_lints/src/escape.rs b/src/tools/clippy/clippy_lints/src/escape.rs index 77e90eeac4958..bb74f193a48e7 100644 --- a/src/tools/clippy/clippy_lints/src/escape.rs +++ b/src/tools/clippy/clippy_lints/src/escape.rs @@ -84,7 +84,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for BoxedLocal { let fn_def_id = cx.tcx.hir().local_def_id(hir_id); cx.tcx.infer_ctxt().enter(|infcx| { - ExprUseVisitor::new(&mut v, &infcx, fn_def_id, cx.param_env, cx.tables).consume_body(body); + ExprUseVisitor::new(&mut v, &infcx, fn_def_id, cx.param_env, cx.tables()).consume_body(body); }); for node in v.set { diff --git a/src/tools/clippy/clippy_lints/src/eta_reduction.rs b/src/tools/clippy/clippy_lints/src/eta_reduction.rs index a889856de2742..0ac8b95de8d61 100644 --- a/src/tools/clippy/clippy_lints/src/eta_reduction.rs +++ b/src/tools/clippy/clippy_lints/src/eta_reduction.rs @@ -97,7 +97,7 @@ fn check_closure(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { // Are the expression or the arguments type-adjusted? Then we need the closure if !(is_adjusted(cx, ex) || args.iter().any(|arg| is_adjusted(cx, arg))); - let fn_ty = cx.tables.expr_ty(caller); + let fn_ty = cx.tables().expr_ty(caller); if matches!(fn_ty.kind, ty::FnDef(_, _) | ty::FnPtr(_) | ty::Closure(_, _)); @@ -128,7 +128,7 @@ fn check_closure(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { // Are the expression or the arguments type-adjusted? Then we need the closure if !(is_adjusted(cx, ex) || args.iter().skip(1).any(|arg| is_adjusted(cx, arg))); - let method_def_id = cx.tables.type_dependent_def_id(ex.hir_id).unwrap(); + let method_def_id = cx.tables().type_dependent_def_id(ex.hir_id).unwrap(); if !type_is_unsafe_function(cx, cx.tcx.type_of(method_def_id)); if compare_inputs(&mut iter_input_pats(decl, body), &mut args.iter()); @@ -153,7 +153,7 @@ fn check_closure(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { /// Tries to determine the type for universal function call to be used instead of the closure fn get_ufcs_type_name(cx: &LateContext<'_, '_>, method_def_id: def_id::DefId, self_arg: &Expr<'_>) -> Option { let expected_type_of_self = &cx.tcx.fn_sig(method_def_id).inputs_and_output().skip_binder()[0]; - let actual_type_of_self = &cx.tables.node_type(self_arg.hir_id); + let actual_type_of_self = &cx.tables().node_type(self_arg.hir_id); if let Some(trait_id) = cx.tcx.trait_of_item(method_def_id) { if match_borrow_depth(expected_type_of_self, &actual_type_of_self) diff --git a/src/tools/clippy/clippy_lints/src/eval_order_dependence.rs b/src/tools/clippy/clippy_lints/src/eval_order_dependence.rs index 74144fb299de2..04af6c2c1f85d 100644 --- a/src/tools/clippy/clippy_lints/src/eval_order_dependence.rs +++ b/src/tools/clippy/clippy_lints/src/eval_order_dependence.rs @@ -75,7 +75,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for EvalOrderDependence { if let ExprKind::Path(ref qpath) = lhs.kind { if let QPath::Resolved(_, ref path) = *qpath { if path.segments.len() == 1 { - if let def::Res::Local(var) = cx.tables.qpath_res(qpath, lhs.hir_id) { + if let def::Res::Local(var) = cx.tables().qpath_res(qpath, lhs.hir_id) { let mut visitor = ReadVisitor { cx, var, @@ -137,7 +137,7 @@ impl<'a, 'tcx> Visitor<'tcx> for DivergenceVisitor<'a, 'tcx> { match e.kind { ExprKind::Continue(_) | ExprKind::Break(_, _) | ExprKind::Ret(_) => self.report_diverging_sub_expr(e), ExprKind::Call(ref func, _) => { - let typ = self.cx.tables.expr_ty(func); + let typ = self.cx.tables().expr_ty(func); match typ.kind { ty::FnDef(..) | ty::FnPtr(_) => { let sig = typ.fn_sig(self.cx.tcx); @@ -149,7 +149,7 @@ impl<'a, 'tcx> Visitor<'tcx> for DivergenceVisitor<'a, 'tcx> { } }, ExprKind::MethodCall(..) => { - let borrowed_table = self.cx.tables; + let borrowed_table = self.cx.tables(); if borrowed_table.expr_ty(e).is_never() { self.report_diverging_sub_expr(e); } @@ -309,7 +309,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ReadVisitor<'a, 'tcx> { if_chain! { if let QPath::Resolved(None, ref path) = *qpath; if path.segments.len() == 1; - if let def::Res::Local(local_id) = self.cx.tables.qpath_res(qpath, expr.hir_id); + if let def::Res::Local(local_id) = self.cx.tables().qpath_res(qpath, expr.hir_id); if local_id == self.var; // Check that this is a read, not a write. if !is_in_assignment_position(self.cx, expr); diff --git a/src/tools/clippy/clippy_lints/src/float_literal.rs b/src/tools/clippy/clippy_lints/src/float_literal.rs index 4c604cd01075e..cd3d443ec58ef 100644 --- a/src/tools/clippy/clippy_lints/src/float_literal.rs +++ b/src/tools/clippy/clippy_lints/src/float_literal.rs @@ -61,7 +61,7 @@ declare_lint_pass!(FloatLiteral => [EXCESSIVE_PRECISION, LOSSY_FLOAT_LITERAL]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for FloatLiteral { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx hir::Expr<'_>) { if_chain! { - let ty = cx.tables.expr_ty(expr); + let ty = cx.tables().expr_ty(expr); if let ty::Float(fty) = ty.kind; if let hir::ExprKind::Lit(ref lit) = expr.kind; if let LitKind::Float(sym, lit_float_ty) = lit.node; diff --git a/src/tools/clippy/clippy_lints/src/floating_point_arithmetic.rs b/src/tools/clippy/clippy_lints/src/floating_point_arithmetic.rs index ad4f66c52c2c8..76713cb1afc41 100644 --- a/src/tools/clippy/clippy_lints/src/floating_point_arithmetic.rs +++ b/src/tools/clippy/clippy_lints/src/floating_point_arithmetic.rs @@ -112,7 +112,7 @@ declare_lint_pass!(FloatingPointArithmetic => [ // Returns the specialized log method for a given base if base is constant // and is one of 2, 10 and e fn get_specialized_log_method(cx: &LateContext<'_, '_>, base: &Expr<'_>) -> Option<&'static str> { - if let Some((value, _)) = constant(cx, cx.tables, base) { + if let Some((value, _)) = constant(cx, cx.tables(), base) { if F32(2.0) == value || F64(2.0) == value { return Some("log2"); } else if F32(10.0) == value || F64(10.0) == value { @@ -136,7 +136,7 @@ fn prepare_receiver_sugg<'a>(cx: &LateContext<'_, '_>, mut expr: &'a Expr<'a>) - if_chain! { // if the expression is a float literal and it is unsuffixed then // add a suffix so the suggestion is valid and unambiguous - if let ty::Float(float_ty) = cx.tables.expr_ty(expr).kind; + if let ty::Float(float_ty) = cx.tables().expr_ty(expr).kind; if let ExprKind::Lit(lit) = &expr.kind; if let ast::LitKind::Float(sym, ast::LitFloatType::Unsuffixed) = lit.node; then { @@ -188,7 +188,7 @@ fn check_ln1p(cx: &LateContext<'_, '_>, expr: &Expr<'_>, args: &[Expr<'_>]) { rhs, ) = &args[0].kind { - let recv = match (constant(cx, cx.tables, lhs), constant(cx, cx.tables, rhs)) { + let recv = match (constant(cx, cx.tables(), lhs), constant(cx, cx.tables(), rhs)) { (Some((value, _)), _) if F32(1.0) == value || F64(1.0) == value => rhs, (_, Some((value, _))) if F32(1.0) == value || F64(1.0) == value => lhs, _ => return, @@ -233,7 +233,7 @@ fn get_integer_from_float_constant(value: &Constant) -> Option { fn check_powf(cx: &LateContext<'_, '_>, expr: &Expr<'_>, args: &[Expr<'_>]) { // Check receiver - if let Some((value, _)) = constant(cx, cx.tables, &args[0]) { + if let Some((value, _)) = constant(cx, cx.tables(), &args[0]) { let method = if F32(f32_consts::E) == value || F64(f64_consts::E) == value { "exp" } else if F32(2.0) == value || F64(2.0) == value { @@ -254,7 +254,7 @@ fn check_powf(cx: &LateContext<'_, '_>, expr: &Expr<'_>, args: &[Expr<'_>]) { } // Check argument - if let Some((value, _)) = constant(cx, cx.tables, &args[1]) { + if let Some((value, _)) = constant(cx, cx.tables(), &args[1]) { let (lint, help, suggestion) = if F32(1.0 / 2.0) == value || F64(1.0 / 2.0) == value { ( SUBOPTIMAL_FLOPS, @@ -298,11 +298,11 @@ fn check_powf(cx: &LateContext<'_, '_>, expr: &Expr<'_>, args: &[Expr<'_>]) { fn check_expm1(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { if_chain! { if let ExprKind::Binary(Spanned { node: BinOpKind::Sub, .. }, ref lhs, ref rhs) = expr.kind; - if cx.tables.expr_ty(lhs).is_floating_point(); - if let Some((value, _)) = constant(cx, cx.tables, rhs); + if cx.tables().expr_ty(lhs).is_floating_point(); + if let Some((value, _)) = constant(cx, cx.tables(), rhs); if F32(1.0) == value || F64(1.0) == value; if let ExprKind::MethodCall(ref path, _, ref method_args, _) = lhs.kind; - if cx.tables.expr_ty(&method_args[0]).is_floating_point(); + if cx.tables().expr_ty(&method_args[0]).is_floating_point(); if path.ident.name.as_str() == "exp"; then { span_lint_and_sugg( @@ -324,8 +324,8 @@ fn check_expm1(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { fn is_float_mul_expr<'a>(cx: &LateContext<'_, '_>, expr: &'a Expr<'a>) -> Option<(&'a Expr<'a>, &'a Expr<'a>)> { if_chain! { if let ExprKind::Binary(Spanned { node: BinOpKind::Mul, .. }, ref lhs, ref rhs) = &expr.kind; - if cx.tables.expr_ty(lhs).is_floating_point(); - if cx.tables.expr_ty(rhs).is_floating_point(); + if cx.tables().expr_ty(lhs).is_floating_point(); + if cx.tables().expr_ty(rhs).is_floating_point(); then { return Some((lhs, rhs)); } @@ -404,7 +404,7 @@ fn are_exprs_equal(cx: &LateContext<'_, '_>, expr1: &Expr<'_>, expr2: &Expr<'_>) /// Returns true iff expr is some zero literal fn is_zero(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { - match constant_simple(cx, cx.tables, expr) { + match constant_simple(cx, cx.tables(), expr) { Some(Constant::Int(i)) => i == 0, Some(Constant::F32(f)) => f == 0.0, Some(Constant::F64(f)) => f == 0.0, @@ -482,7 +482,7 @@ fn check_custom_abs(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { impl<'a, 'tcx> LateLintPass<'a, 'tcx> for FloatingPointArithmetic { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) { if let ExprKind::MethodCall(ref path, _, args, _) = &expr.kind { - let recv_ty = cx.tables.expr_ty(&args[0]); + let recv_ty = cx.tables().expr_ty(&args[0]); if recv_ty.is_floating_point() { match &*path.ident.name.as_str() { diff --git a/src/tools/clippy/clippy_lints/src/format.rs b/src/tools/clippy/clippy_lints/src/format.rs index 4cae5ca2c4326..58cf0027ea4d4 100644 --- a/src/tools/clippy/clippy_lints/src/format.rs +++ b/src/tools/clippy/clippy_lints/src/format.rs @@ -88,13 +88,13 @@ fn on_argumentv1_new<'a, 'tcx>( // matches `core::fmt::Display::fmt` if args.len() == 2; if let ExprKind::Path(ref qpath) = args[1].kind; - if let Some(did) = cx.tables.qpath_res(qpath, args[1].hir_id).opt_def_id(); + if let Some(did) = cx.tables().qpath_res(qpath, args[1].hir_id).opt_def_id(); if match_def_path(cx, did, &paths::DISPLAY_FMT_METHOD); // check `(arg0,)` in match block if let PatKind::Tuple(ref pats, None) = arms[0].pat.kind; if pats.len() == 1; then { - let ty = walk_ptrs_ty(cx.tables.pat_ty(&pats[0])); + let ty = walk_ptrs_ty(cx.tables().pat_ty(&pats[0])); if ty.kind != rustc_middle::ty::Str && !is_type_diagnostic_item(cx, ty, sym!(string_type)) { return None; } diff --git a/src/tools/clippy/clippy_lints/src/get_last_with_len.rs b/src/tools/clippy/clippy_lints/src/get_last_with_len.rs index 3629ba623ce43..57a7fbb565679 100644 --- a/src/tools/clippy/clippy_lints/src/get_last_with_len.rs +++ b/src/tools/clippy/clippy_lints/src/get_last_with_len.rs @@ -54,7 +54,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for GetLastWithLen { // Argument 0 (the struct we're calling the method on) is a vector if let Some(struct_calling_on) = args.get(0); - let struct_ty = cx.tables.expr_ty(struct_calling_on); + let struct_ty = cx.tables().expr_ty(struct_calling_on); if is_type_diagnostic_item(cx, struct_ty, sym!(vec_type)); // Argument to "get" is a subtraction diff --git a/src/tools/clippy/clippy_lints/src/identity_op.rs b/src/tools/clippy/clippy_lints/src/identity_op.rs index 78e07d25f67c5..1c25e050997ea 100644 --- a/src/tools/clippy/clippy_lints/src/identity_op.rs +++ b/src/tools/clippy/clippy_lints/src/identity_op.rs @@ -62,8 +62,8 @@ fn is_allowed(cx: &LateContext<'_, '_>, cmp: BinOp, left: &Expr<'_>, right: &Exp // `1 << 0` is a common pattern in bit manipulation code if_chain! { if let BinOpKind::Shl = cmp.node; - if let Some(Constant::Int(0)) = constant_simple(cx, cx.tables, right); - if let Some(Constant::Int(1)) = constant_simple(cx, cx.tables, left); + if let Some(Constant::Int(0)) = constant_simple(cx, cx.tables(), right); + if let Some(Constant::Int(1)) = constant_simple(cx, cx.tables(), left); then { return true; } @@ -74,8 +74,8 @@ fn is_allowed(cx: &LateContext<'_, '_>, cmp: BinOp, left: &Expr<'_>, right: &Exp #[allow(clippy::cast_possible_wrap)] fn check(cx: &LateContext<'_, '_>, e: &Expr<'_>, m: i8, span: Span, arg: Span) { - if let Some(Constant::Int(v)) = constant_simple(cx, cx.tables, e) { - let check = match cx.tables.expr_ty(e).kind { + if let Some(Constant::Int(v)) = constant_simple(cx, cx.tables(), e) { + let check = match cx.tables().expr_ty(e).kind { ty::Int(ity) => unsext(cx.tcx, -1_i128, ity), ty::Uint(uty) => clip(cx.tcx, !0, uty), _ => return, diff --git a/src/tools/clippy/clippy_lints/src/if_let_mutex.rs b/src/tools/clippy/clippy_lints/src/if_let_mutex.rs index 04d17c91d63c1..e357c7b3b2eb2 100644 --- a/src/tools/clippy/clippy_lints/src/if_let_mutex.rs +++ b/src/tools/clippy/clippy_lints/src/if_let_mutex.rs @@ -149,7 +149,7 @@ fn is_mutex_lock_call<'a>(cx: &LateContext<'a, '_>, expr: &'a Expr<'_>) -> Optio if_chain! { if let ExprKind::MethodCall(path, _span, args, _) = &expr.kind; if path.ident.to_string() == "lock"; - let ty = cx.tables.expr_ty(&args[0]); + let ty = cx.tables().expr_ty(&args[0]); if is_type_diagnostic_item(cx, ty, sym!(mutex_type)); then { Some(&args[0]) diff --git a/src/tools/clippy/clippy_lints/src/if_let_some_result.rs b/src/tools/clippy/clippy_lints/src/if_let_some_result.rs index 6a1fcdd1ce445..3f1ae9b86d387 100644 --- a/src/tools/clippy/clippy_lints/src/if_let_some_result.rs +++ b/src/tools/clippy/clippy_lints/src/if_let_some_result.rs @@ -45,7 +45,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for OkIfLet { if let ExprKind::MethodCall(_, ok_span, ref result_types, _) = op.kind; //check is expr.ok() has type Result.ok(, _) if let PatKind::TupleStruct(QPath::Resolved(_, ref x), ref y, _) = body[0].pat.kind; //get operation if method_chain_args(op, &["ok"]).is_some(); //test to see if using ok() methoduse std::marker::Sized; - if is_type_diagnostic_item(cx, cx.tables.expr_ty(&result_types[0]), sym!(result_type)); + if is_type_diagnostic_item(cx, cx.tables().expr_ty(&result_types[0]), sym!(result_type)); if rustc_hir_pretty::to_string(rustc_hir_pretty::NO_ANN, |s| s.print_path(x, false)) == "Some"; then { diff --git a/src/tools/clippy/clippy_lints/src/implicit_return.rs b/src/tools/clippy/clippy_lints/src/implicit_return.rs index c4308fd26a302..5a0531ff749e9 100644 --- a/src/tools/clippy/clippy_lints/src/implicit_return.rs +++ b/src/tools/clippy/clippy_lints/src/implicit_return.rs @@ -108,7 +108,7 @@ fn expr_match(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { ExprKind::Call(expr, ..) => { if_chain! { if let ExprKind::Path(qpath) = &expr.kind; - if let Some(path_def_id) = cx.tables.qpath_res(qpath, expr.hir_id).opt_def_id(); + if let Some(path_def_id) = cx.tables().qpath_res(qpath, expr.hir_id).opt_def_id(); if match_def_path(cx, path_def_id, &BEGIN_PANIC) || match_def_path(cx, path_def_id, &BEGIN_PANIC_FMT); then { } diff --git a/src/tools/clippy/clippy_lints/src/implicit_saturating_sub.rs b/src/tools/clippy/clippy_lints/src/implicit_saturating_sub.rs index fdaf37e5e08fa..1a6cb0b0c566e 100644 --- a/src/tools/clippy/clippy_lints/src/implicit_saturating_sub.rs +++ b/src/tools/clippy/clippy_lints/src/implicit_saturating_sub.rs @@ -81,7 +81,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ImplicitSaturatingSub { }; // Check if the variable in the condition statement is an integer - if !cx.tables.expr_ty(cond_var).is_integral() { + if !cx.tables().expr_ty(cond_var).is_integral() { return; } @@ -93,7 +93,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ImplicitSaturatingSub { ExprKind::Lit(ref cond_lit) => { // Check if the constant is zero if let LitKind::Int(0, _) = cond_lit.node { - if cx.tables.expr_ty(cond_left).is_signed() { + if cx.tables().expr_ty(cond_left).is_signed() { } else { print_lint_and_sugg(cx, &var_name, expr); }; diff --git a/src/tools/clippy/clippy_lints/src/indexing_slicing.rs b/src/tools/clippy/clippy_lints/src/indexing_slicing.rs index c5808dd540b6f..c5e4abc94a8a6 100644 --- a/src/tools/clippy/clippy_lints/src/indexing_slicing.rs +++ b/src/tools/clippy/clippy_lints/src/indexing_slicing.rs @@ -88,7 +88,7 @@ declare_lint_pass!(IndexingSlicing => [INDEXING_SLICING, OUT_OF_BOUNDS_INDEXING] impl<'a, 'tcx> LateLintPass<'a, 'tcx> for IndexingSlicing { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) { if let ExprKind::Index(ref array, ref index) = &expr.kind { - let ty = cx.tables.expr_ty(array); + let ty = cx.tables().expr_ty(array); if let Some(range) = higher::range(cx, index) { // Ranged indexes, i.e., &x[n..m], &x[n..], &x[..n] and &x[..] if let ty::Array(_, s) = ty.kind { @@ -143,7 +143,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for IndexingSlicing { // Catchall non-range index, i.e., [n] or [n << m] if let ty::Array(..) = ty.kind { // Index is a constant uint. - if let Some(..) = constant(cx, cx.tables, index) { + if let Some(..) = constant(cx, cx.tables(), index) { // Let rustc's `const_err` lint handle constant `usize` indexing on arrays. return; } @@ -169,14 +169,14 @@ fn to_const_range<'a, 'tcx>( range: higher::Range<'_>, array_size: u128, ) -> (Option, Option) { - let s = range.start.map(|expr| constant(cx, cx.tables, expr).map(|(c, _)| c)); + let s = range.start.map(|expr| constant(cx, cx.tables(), expr).map(|(c, _)| c)); let start = match s { Some(Some(Constant::Int(x))) => Some(x), Some(_) => None, None => Some(0), }; - let e = range.end.map(|expr| constant(cx, cx.tables, expr).map(|(c, _)| c)); + let e = range.end.map(|expr| constant(cx, cx.tables(), expr).map(|(c, _)| c)); let end = match e { Some(Some(Constant::Int(x))) => { if range.limits == RangeLimits::Closed { diff --git a/src/tools/clippy/clippy_lints/src/infinite_iter.rs b/src/tools/clippy/clippy_lints/src/infinite_iter.rs index a860a9def2422..38f086c9221fe 100644 --- a/src/tools/clippy/clippy_lints/src/infinite_iter.rs +++ b/src/tools/clippy/clippy_lints/src/infinite_iter.rs @@ -230,13 +230,14 @@ fn complete_infinite_iter(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> Finitene } } if method.ident.name == sym!(last) && args.len() == 1 { - let not_double_ended = get_trait_def_id(cx, &paths::DOUBLE_ENDED_ITERATOR) - .map_or(false, |id| !implements_trait(cx, cx.tables.expr_ty(&args[0]), id, &[])); + let not_double_ended = get_trait_def_id(cx, &paths::DOUBLE_ENDED_ITERATOR).map_or(false, |id| { + !implements_trait(cx, cx.tables().expr_ty(&args[0]), id, &[]) + }); if not_double_ended { return is_infinite(cx, &args[0]); } } else if method.ident.name == sym!(collect) { - let ty = cx.tables.expr_ty(expr); + let ty = cx.tables().expr_ty(expr); if INFINITE_COLLECTORS.iter().any(|path| match_type(cx, ty, path)) { return is_infinite(cx, &args[0]); } diff --git a/src/tools/clippy/clippy_lints/src/integer_division.rs b/src/tools/clippy/clippy_lints/src/integer_division.rs index d537ef3f3238e..83ae1c1a971e1 100644 --- a/src/tools/clippy/clippy_lints/src/integer_division.rs +++ b/src/tools/clippy/clippy_lints/src/integer_division.rs @@ -50,7 +50,7 @@ fn is_integer_division<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx hir::Ex if let hir::ExprKind::Binary(binop, left, right) = &expr.kind; if let hir::BinOpKind::Div = &binop.node; then { - let (left_ty, right_ty) = (cx.tables.expr_ty(left), cx.tables.expr_ty(right)); + let (left_ty, right_ty) = (cx.tables().expr_ty(left), cx.tables().expr_ty(right)); return left_ty.is_integral() && right_ty.is_integral(); } } diff --git a/src/tools/clippy/clippy_lints/src/large_stack_arrays.rs b/src/tools/clippy/clippy_lints/src/large_stack_arrays.rs index deb57db167896..0301f263489f4 100644 --- a/src/tools/clippy/clippy_lints/src/large_stack_arrays.rs +++ b/src/tools/clippy/clippy_lints/src/large_stack_arrays.rs @@ -42,7 +42,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for LargeStackArrays { fn check_expr(&mut self, cx: &LateContext<'_, '_>, expr: &Expr<'_>) { if_chain! { if let ExprKind::Repeat(_, _) = expr.kind; - if let ty::Array(element_type, cst) = cx.tables.expr_ty(expr).kind; + if let ty::Array(element_type, cst) = cx.tables().expr_ty(expr).kind; if let ConstKind::Value(val) = cst.val; if let ConstValue::Scalar(element_count) = val; if let Ok(element_count) = element_count.to_machine_usize(&cx.tcx); diff --git a/src/tools/clippy/clippy_lints/src/len_zero.rs b/src/tools/clippy/clippy_lints/src/len_zero.rs index 7838e8e8ab774..e17297e969516 100644 --- a/src/tools/clippy/clippy_lints/src/len_zero.rs +++ b/src/tools/clippy/clippy_lints/src/len_zero.rs @@ -300,7 +300,7 @@ fn has_is_empty(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { return false; } - let ty = &walk_ptrs_ty(cx.tables.expr_ty(expr)); + let ty = &walk_ptrs_ty(cx.tables().expr_ty(expr)); match ty.kind { ty::Dynamic(ref tt, ..) => { if let Some(principal) = tt.principal() { diff --git a/src/tools/clippy/clippy_lints/src/let_and_return.rs b/src/tools/clippy/clippy_lints/src/let_and_return.rs index 6d3fb317bcfc5..299202981b1f3 100644 --- a/src/tools/clippy/clippy_lints/src/let_and_return.rs +++ b/src/tools/clippy/clippy_lints/src/let_and_return.rs @@ -100,14 +100,14 @@ struct BorrowVisitor<'a, 'tcx> { impl BorrowVisitor<'_, '_> { fn fn_def_id(&self, expr: &Expr<'_>) -> Option { match &expr.kind { - ExprKind::MethodCall(..) => self.cx.tables.type_dependent_def_id(expr.hir_id), + ExprKind::MethodCall(..) => self.cx.tables().type_dependent_def_id(expr.hir_id), ExprKind::Call( Expr { kind: ExprKind::Path(qpath), .. }, .., - ) => self.cx.tables.qpath_res(qpath, expr.hir_id).opt_def_id(), + ) => self.cx.tables().qpath_res(qpath, expr.hir_id).opt_def_id(), _ => None, } } diff --git a/src/tools/clippy/clippy_lints/src/let_if_seq.rs b/src/tools/clippy/clippy_lints/src/let_if_seq.rs index e097f40f87e47..7b03812b82260 100644 --- a/src/tools/clippy/clippy_lints/src/let_if_seq.rs +++ b/src/tools/clippy/clippy_lints/src/let_if_seq.rs @@ -73,7 +73,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for LetIfSeq { then { let span = stmt.span.to(if_.span); - let has_interior_mutability = !cx.tables.node_type(canonical_id).is_freeze( + let has_interior_mutability = !cx.tables().node_type(canonical_id).is_freeze( cx.tcx.at(span), cx.param_env, ); diff --git a/src/tools/clippy/clippy_lints/src/let_underscore.rs b/src/tools/clippy/clippy_lints/src/let_underscore.rs index acd628bbaca59..0864bbe0f9127 100644 --- a/src/tools/clippy/clippy_lints/src/let_underscore.rs +++ b/src/tools/clippy/clippy_lints/src/let_underscore.rs @@ -76,7 +76,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for LetUnderscore { if let PatKind::Wild = local.pat.kind; if let Some(ref init) = local.init; then { - let init_ty = cx.tables.expr_ty(init); + let init_ty = cx.tables().expr_ty(init); let contains_sync_guard = init_ty.walk().any(|inner| match inner.unpack() { GenericArgKind::Type(inner_ty) => { SYNC_GUARD_PATHS.iter().any(|path| match_type(cx, inner_ty, path)) @@ -94,7 +94,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for LetUnderscore { "consider using an underscore-prefixed named \ binding or dropping explicitly with `std::mem::drop`" ) - } else if is_must_use_ty(cx, cx.tables.expr_ty(init)) { + } else if is_must_use_ty(cx, cx.tables().expr_ty(init)) { span_lint_and_help( cx, LET_UNDERSCORE_MUST_USE, diff --git a/src/tools/clippy/clippy_lints/src/lifetimes.rs b/src/tools/clippy/clippy_lints/src/lifetimes.rs index 318d0b69d57b7..6840e82d4bf1b 100644 --- a/src/tools/clippy/clippy_lints/src/lifetimes.rs +++ b/src/tools/clippy/clippy_lints/src/lifetimes.rs @@ -343,7 +343,7 @@ impl<'v, 't> RefVisitor<'v, 't> { }) { let hir_id = ty.hir_id; - match self.cx.tables.qpath_res(qpath, hir_id) { + match self.cx.tables().qpath_res(qpath, hir_id) { Res::Def(DefKind::TyAlias | DefKind::Struct, def_id) => { let generics = self.cx.tcx.generics_of(def_id); for _ in generics.params.as_slice() { diff --git a/src/tools/clippy/clippy_lints/src/loops.rs b/src/tools/clippy/clippy_lints/src/loops.rs index 9c8e8d8fabf4e..18b979176a0a0 100644 --- a/src/tools/clippy/clippy_lints/src/loops.rs +++ b/src/tools/clippy/clippy_lints/src/loops.rs @@ -535,7 +535,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Loops { if_chain! { if let ExprKind::MethodCall(..) | ExprKind::Call(..) = iter_expr.kind; if let Some(iter_def_id) = get_trait_def_id(cx, &paths::ITERATOR); - if implements_trait(cx, cx.tables.expr_ty(iter_expr), iter_def_id, &[]); + if implements_trait(cx, cx.tables().expr_ty(iter_expr), iter_def_id, &[]); then { return; } @@ -985,8 +985,8 @@ fn detect_manual_memcpy<'a, 'tcx>( if_chain! { if let ExprKind::Index(seqexpr_left, idx_left) = lhs.kind; if let ExprKind::Index(seqexpr_right, idx_right) = rhs.kind; - if is_slice_like(cx, cx.tables.expr_ty(seqexpr_left)) - && is_slice_like(cx, cx.tables.expr_ty(seqexpr_right)); + if is_slice_like(cx, cx.tables().expr_ty(seqexpr_left)) + && is_slice_like(cx, cx.tables().expr_ty(seqexpr_right)); if let Some(offset_left) = get_offset(cx, &idx_left, canonical_id); if let Some(offset_right) = get_offset(cx, &idx_right, canonical_id); @@ -1254,8 +1254,8 @@ fn check_for_loop_arg(cx: &LateContext<'_, '_>, pat: &Pat<'_>, arg: &Expr<'_>, e lint_iter_method(cx, args, arg, method_name); } } else if method_name == "into_iter" && match_trait_method(cx, arg, &paths::INTO_ITERATOR) { - let receiver_ty = cx.tables.expr_ty(&args[0]); - let receiver_ty_adjusted = cx.tables.expr_ty_adjusted(&args[0]); + let receiver_ty = cx.tables().expr_ty(&args[0]); + let receiver_ty_adjusted = cx.tables().expr_ty_adjusted(&args[0]); if TyS::same_type(receiver_ty, receiver_ty_adjusted) { let mut applicability = Applicability::MachineApplicable; let object = snippet_with_applicability(cx, args[0].span, "_", &mut applicability); @@ -1300,7 +1300,7 @@ fn check_for_loop_arg(cx: &LateContext<'_, '_>, pat: &Pat<'_>, arg: &Expr<'_>, e /// Checks for `for` loops over `Option`s and `Result`s. fn check_arg_type(cx: &LateContext<'_, '_>, pat: &Pat<'_>, arg: &Expr<'_>) { - let ty = cx.tables.expr_ty(arg); + let ty = cx.tables().expr_ty(arg); if is_type_diagnostic_item(cx, ty, sym!(option_type)) { span_lint_and_help( cx, @@ -1405,7 +1405,7 @@ fn check_for_loop_explicit_counter<'a, 'tcx>( /// actual `Iterator` that the loop uses. fn make_iterator_snippet(cx: &LateContext<'_, '_>, arg: &Expr<'_>, applic_ref: &mut Applicability) -> String { let impls_iterator = get_trait_def_id(cx, &paths::ITERATOR) - .map_or(false, |id| implements_trait(cx, cx.tables.expr_ty(arg), id, &[])); + .map_or(false, |id| implements_trait(cx, cx.tables().expr_ty(arg), id, &[])); if impls_iterator { format!( "{}", @@ -1416,7 +1416,7 @@ fn make_iterator_snippet(cx: &LateContext<'_, '_>, arg: &Expr<'_>, applic_ref: & // (&mut x).into_iter() ==> x.iter_mut() match &arg.kind { ExprKind::AddrOf(BorrowKind::Ref, mutability, arg_inner) - if has_iter_method(cx, cx.tables.expr_ty(&arg_inner)).is_some() => + if has_iter_method(cx, cx.tables().expr_ty(&arg_inner)).is_some() => { let meth_name = match mutability { Mutability::Mut => "iter_mut", @@ -1449,7 +1449,7 @@ fn check_for_loop_over_map_kv<'a, 'tcx>( if let PatKind::Tuple(ref pat, _) = pat.kind { if pat.len() == 2 { let arg_span = arg.span; - let (new_pat_span, kind, ty, mutbl) = match cx.tables.expr_ty(arg).kind { + let (new_pat_span, kind, ty, mutbl) = match cx.tables().expr_ty(arg).kind { ty::Ref(_, ty, mutbl) => match (&pat[0].kind, &pat[1].kind) { (key, _) if pat_is_wild(key, body) => (pat[1].span, "value", ty, mutbl), (_, value) if pat_is_wild(value, body) => (pat[0].span, "key", ty, Mutability::Not), @@ -1594,7 +1594,7 @@ fn check_for_mutation<'a, 'tcx>( }; let def_id = body.hir_id.owner.to_def_id(); cx.tcx.infer_ctxt().enter(|infcx| { - ExprUseVisitor::new(&mut delegate, &infcx, def_id.expect_local(), cx.param_env, cx.tables).walk_expr(body); + ExprUseVisitor::new(&mut delegate, &infcx, def_id.expect_local(), cx.param_env, cx.tables()).walk_expr(body); }); delegate.mutation_span() } @@ -1688,7 +1688,7 @@ impl<'a, 'tcx> VarVisitor<'a, 'tcx> { if index_used_directly { self.indexed_directly.insert( seqvar.segments[0].ident.name, - (Some(extent), self.cx.tables.node_type(seqexpr.hir_id)), + (Some(extent), self.cx.tables().node_type(seqexpr.hir_id)), ); } return false; // no need to walk further *on the variable* @@ -1700,7 +1700,7 @@ impl<'a, 'tcx> VarVisitor<'a, 'tcx> { if index_used_directly { self.indexed_directly.insert( seqvar.segments[0].ident.name, - (None, self.cx.tables.node_type(seqexpr.hir_id)), + (None, self.cx.tables().node_type(seqexpr.hir_id)), ); } return false; // no need to walk further *on the variable* @@ -1768,7 +1768,7 @@ impl<'a, 'tcx> Visitor<'tcx> for VarVisitor<'a, 'tcx> { ExprKind::Call(ref f, args) => { self.visit_expr(f); for expr in args { - let ty = self.cx.tables.expr_ty_adjusted(expr); + let ty = self.cx.tables().expr_ty_adjusted(expr); self.prefer_mutable = false; if let ty::Ref(_, _, mutbl) = ty.kind { if mutbl == Mutability::Mut { @@ -1779,7 +1779,7 @@ impl<'a, 'tcx> Visitor<'tcx> for VarVisitor<'a, 'tcx> { } }, ExprKind::MethodCall(_, _, args, _) => { - let def_id = self.cx.tables.type_dependent_def_id(expr.hir_id).unwrap(); + let def_id = self.cx.tables().type_dependent_def_id(expr.hir_id).unwrap(); for (ty, expr) in self.cx.tcx.fn_sig(def_id).inputs().skip_binder().iter().zip(args) { self.prefer_mutable = false; if let ty::Ref(_, _, mutbl) = ty.kind { @@ -1866,7 +1866,7 @@ impl<'a, 'tcx> Visitor<'tcx> for VarUsedAfterLoopVisitor<'a, 'tcx> { fn is_ref_iterable_type(cx: &LateContext<'_, '_>, e: &Expr<'_>) -> bool { // no walk_ptrs_ty: calling iter() on a reference can make sense because it // will allow further borrows afterwards - let ty = cx.tables.expr_ty(e); + let ty = cx.tables().expr_ty(e); is_iterable_array(ty, cx) || is_type_diagnostic_item(cx, ty, sym!(vec_type)) || match_type(cx, ty, &paths::LINKED_LIST) || @@ -2241,7 +2241,7 @@ fn path_name(e: &Expr<'_>) -> Option { } fn check_infinite_loop<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, cond: &'tcx Expr<'_>, expr: &'tcx Expr<'_>) { - if constant(cx, cx.tables, cond).is_some() { + if constant(cx, cx.tables(), cond).is_some() { // A pure constant condition (e.g., `while false`) is not linted. return; } @@ -2377,7 +2377,7 @@ fn check_needless_collect<'a, 'tcx>(expr: &'tcx Expr<'_>, cx: &LateContext<'a, ' if let Some(ref generic_args) = chain_method.args; if let Some(GenericArg::Type(ref ty)) = generic_args.args.get(0); then { - let ty = cx.tables.node_type(ty.hir_id); + let ty = cx.tables().node_type(ty.hir_id); if is_type_diagnostic_item(cx, ty, sym!(vec_type)) || is_type_diagnostic_item(cx, ty, sym!(vecdeque_type)) || match_type(cx, ty, &paths::BTREEMAP) || diff --git a/src/tools/clippy/clippy_lints/src/map_clone.rs b/src/tools/clippy/clippy_lints/src/map_clone.rs index 8f4fdc685ef38..9109de9458f1c 100644 --- a/src/tools/clippy/clippy_lints/src/map_clone.rs +++ b/src/tools/clippy/clippy_lints/src/map_clone.rs @@ -52,7 +52,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MapClone { if let hir::ExprKind::MethodCall(ref method, _, ref args, _) = e.kind; if args.len() == 2; if method.ident.as_str() == "map"; - let ty = cx.tables.expr_ty(&args[0]); + let ty = cx.tables().expr_ty(&args[0]); if is_type_diagnostic_item(cx, ty, sym!(option_type)) || match_trait_method(cx, e, &paths::ITERATOR); if let hir::ExprKind::Closure(_, _, body_id, _, _) = args[1].kind; let closure_body = cx.tcx.hir().body(body_id); @@ -70,7 +70,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MapClone { match closure_expr.kind { hir::ExprKind::Unary(hir::UnOp::UnDeref, ref inner) => { if ident_eq(name, inner) { - if let ty::Ref(.., Mutability::Not) = cx.tables.expr_ty(inner).kind { + if let ty::Ref(.., Mutability::Not) = cx.tables().expr_ty(inner).kind { lint(cx, e.span, args[0].span, true); } } @@ -79,7 +79,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MapClone { if ident_eq(name, &obj[0]) && method.ident.as_str() == "clone" && match_trait_method(cx, closure_expr, &paths::CLONE_TRAIT) { - let obj_ty = cx.tables.expr_ty(&obj[0]); + let obj_ty = cx.tables().expr_ty(&obj[0]); if let ty::Ref(_, ty, _) = obj_ty.kind { let copy = is_copy(cx, ty); lint(cx, e.span, args[0].span, copy); diff --git a/src/tools/clippy/clippy_lints/src/map_unit_fn.rs b/src/tools/clippy/clippy_lints/src/map_unit_fn.rs index 8f4b674c04f49..a4550f707ee22 100644 --- a/src/tools/clippy/clippy_lints/src/map_unit_fn.rs +++ b/src/tools/clippy/clippy_lints/src/map_unit_fn.rs @@ -101,7 +101,7 @@ fn is_unit_type(ty: Ty<'_>) -> bool { } fn is_unit_function(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>) -> bool { - let ty = cx.tables.expr_ty(expr); + let ty = cx.tables().expr_ty(expr); if let ty::FnDef(id, _) = ty.kind { if let Some(fn_type) = cx.tcx.fn_sig(id).no_bound_vars() { @@ -112,7 +112,7 @@ fn is_unit_function(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>) -> bool { } fn is_unit_expression(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>) -> bool { - is_unit_type(cx.tables.expr_ty(expr)) + is_unit_type(cx.tables().expr_ty(expr)) } /// The expression inside a closure may or may not have surrounding braces and @@ -205,9 +205,9 @@ fn suggestion_msg(function_type: &str, map_type: &str) -> String { fn lint_map_unit_fn(cx: &LateContext<'_, '_>, stmt: &hir::Stmt<'_>, expr: &hir::Expr<'_>, map_args: &[hir::Expr<'_>]) { let var_arg = &map_args[0]; - let (map_type, variant, lint) = if is_type_diagnostic_item(cx, cx.tables.expr_ty(var_arg), sym!(option_type)) { + let (map_type, variant, lint) = if is_type_diagnostic_item(cx, cx.tables().expr_ty(var_arg), sym!(option_type)) { ("Option", "Some", OPTION_MAP_UNIT_FN) - } else if is_type_diagnostic_item(cx, cx.tables.expr_ty(var_arg), sym!(result_type)) { + } else if is_type_diagnostic_item(cx, cx.tables().expr_ty(var_arg), sym!(result_type)) { ("Result", "Ok", RESULT_MAP_UNIT_FN) } else { return; diff --git a/src/tools/clippy/clippy_lints/src/match_on_vec_items.rs b/src/tools/clippy/clippy_lints/src/match_on_vec_items.rs index ee69628e9f052..4a025e0621f96 100644 --- a/src/tools/clippy/clippy_lints/src/match_on_vec_items.rs +++ b/src/tools/clippy/clippy_lints/src/match_on_vec_items.rs @@ -88,13 +88,13 @@ fn is_vec_indexing<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'tcx>) } fn is_vector(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { - let ty = cx.tables.expr_ty(expr); + let ty = cx.tables().expr_ty(expr); let ty = walk_ptrs_ty(ty); is_type_diagnostic_item(cx, ty, sym!(vec_type)) } fn is_full_range(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { - let ty = cx.tables.expr_ty(expr); + let ty = cx.tables().expr_ty(expr); let ty = walk_ptrs_ty(ty); match_type(cx, ty, &utils::paths::RANGE_FULL) } diff --git a/src/tools/clippy/clippy_lints/src/matches.rs b/src/tools/clippy/clippy_lints/src/matches.rs index 6d7af45a47224..0c91d8885d924 100644 --- a/src/tools/clippy/clippy_lints/src/matches.rs +++ b/src/tools/clippy/clippy_lints/src/matches.rs @@ -540,7 +540,7 @@ fn check_single_match(cx: &LateContext<'_, '_>, ex: &Expr<'_>, arms: &[Arm<'_>], // allow match arms with just expressions return; }; - let ty = cx.tables.expr_ty(ex); + let ty = cx.tables().expr_ty(ex); if ty.kind != ty::Bool || is_allowed(cx, MATCH_BOOL, ex.hir_id) { check_single_match_single_pattern(cx, ex, arms, expr, els); check_single_match_opt_like(cx, ex, arms, expr, ty, els); @@ -632,7 +632,7 @@ fn check_single_match_opt_like( fn check_match_bool(cx: &LateContext<'_, '_>, ex: &Expr<'_>, arms: &[Arm<'_>], expr: &Expr<'_>) { // Type of expression is `bool`. - if cx.tables.expr_ty(ex).kind == ty::Bool { + if cx.tables().expr_ty(ex).kind == ty::Bool { span_lint_and_then( cx, MATCH_BOOL, @@ -695,8 +695,8 @@ fn check_match_bool(cx: &LateContext<'_, '_>, ex: &Expr<'_>, arms: &[Arm<'_>], e } fn check_overlapping_arms<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, ex: &'tcx Expr<'_>, arms: &'tcx [Arm<'_>]) { - if arms.len() >= 2 && cx.tables.expr_ty(ex).is_integral() { - let ranges = all_ranges(cx, arms, cx.tables.expr_ty(ex)); + if arms.len() >= 2 && cx.tables().expr_ty(ex).is_integral() { + let ranges = all_ranges(cx, arms, cx.tables().expr_ty(ex)); let type_ranges = type_ranges(&ranges); if !type_ranges.is_empty() { if let Some((start, end)) = overlapping(&type_ranges) { @@ -714,7 +714,7 @@ fn check_overlapping_arms<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, ex: &'tcx Expr<' } fn check_wild_err_arm(cx: &LateContext<'_, '_>, ex: &Expr<'_>, arms: &[Arm<'_>]) { - let ex_ty = walk_ptrs_ty(cx.tables.expr_ty(ex)); + let ex_ty = walk_ptrs_ty(cx.tables().expr_ty(ex)); if is_type_diagnostic_item(cx, ex_ty, sym!(result_type)) { for arm in arms { if let PatKind::TupleStruct(ref path, ref inner, _) = arm.pat.kind { @@ -755,7 +755,7 @@ fn check_wild_err_arm(cx: &LateContext<'_, '_>, ex: &Expr<'_>, arms: &[Arm<'_>]) } fn check_wild_enum_match(cx: &LateContext<'_, '_>, ex: &Expr<'_>, arms: &[Arm<'_>]) { - let ty = cx.tables.expr_ty(ex); + let ty = cx.tables().expr_ty(ex); if !ty.is_enum() { // If there isn't a nice closed set of possible values that can be conveniently enumerated, // don't complain about not enumerating the mall. @@ -935,8 +935,8 @@ fn check_match_as_ref(cx: &LateContext<'_, '_>, ex: &Expr<'_>, arms: &[Arm<'_>], "as_mut" }; - let output_ty = cx.tables.expr_ty(expr); - let input_ty = cx.tables.expr_ty(ex); + let output_ty = cx.tables().expr_ty(expr); + let input_ty = cx.tables().expr_ty(ex); let cast = if_chain! { if let ty::Adt(_, substs) = input_ty.kind; @@ -1006,13 +1006,13 @@ fn check_match_single_binding<'a>(cx: &LateContext<'_, 'a>, ex: &Expr<'a>, arms: match match_body.kind { ExprKind::Block(block, _) => { // macro + expr_ty(body) == () - if block.span.from_expansion() && cx.tables.expr_ty(&match_body).is_unit() { + if block.span.from_expansion() && cx.tables().expr_ty(&match_body).is_unit() { snippet_body.push(';'); } }, _ => { // expr_ty(body) == () - if cx.tables.expr_ty(&match_body).is_unit() { + if cx.tables().expr_ty(&match_body).is_unit() { snippet_body.push(';'); } }, @@ -1111,11 +1111,11 @@ fn all_ranges<'a, 'tcx>( { if let PatKind::Range(ref lhs, ref rhs, range_end) = pat.kind { let lhs = match lhs { - Some(lhs) => constant(cx, cx.tables, lhs)?.0, + Some(lhs) => constant(cx, cx.tables(), lhs)?.0, None => miri_to_const(ty.numeric_min_val(cx.tcx)?)?, }; let rhs = match rhs { - Some(rhs) => constant(cx, cx.tables, rhs)?.0, + Some(rhs) => constant(cx, cx.tables(), rhs)?.0, None => miri_to_const(ty.numeric_max_val(cx.tcx)?)?, }; let rhs = match range_end { @@ -1129,7 +1129,7 @@ fn all_ranges<'a, 'tcx>( } if let PatKind::Lit(ref value) = pat.kind { - let value = constant(cx, cx.tables, value)?.0; + let value = constant(cx, cx.tables(), value)?.0; return Some(SpannedRange { span: pat.span, node: (value.clone(), Bound::Included(value)), diff --git a/src/tools/clippy/clippy_lints/src/mem_discriminant.rs b/src/tools/clippy/clippy_lints/src/mem_discriminant.rs index 3f953655670cf..d315c5ef89a88 100644 --- a/src/tools/clippy/clippy_lints/src/mem_discriminant.rs +++ b/src/tools/clippy/clippy_lints/src/mem_discriminant.rs @@ -35,10 +35,10 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MemDiscriminant { if let ExprKind::Call(ref func, ref func_args) = expr.kind; // is `mem::discriminant` if let ExprKind::Path(ref func_qpath) = func.kind; - if let Some(def_id) = cx.tables.qpath_res(func_qpath, func.hir_id).opt_def_id(); + if let Some(def_id) = cx.tables().qpath_res(func_qpath, func.hir_id).opt_def_id(); if match_def_path(cx, def_id, &paths::MEM_DISCRIMINANT); // type is non-enum - let ty_param = cx.tables.node_substs(func.hir_id).type_at(0); + let ty_param = cx.tables().node_substs(func.hir_id).type_at(0); if !ty_param.is_enum(); then { diff --git a/src/tools/clippy/clippy_lints/src/mem_forget.rs b/src/tools/clippy/clippy_lints/src/mem_forget.rs index c6ddc5de63b0e..1821bd9135f98 100644 --- a/src/tools/clippy/clippy_lints/src/mem_forget.rs +++ b/src/tools/clippy/clippy_lints/src/mem_forget.rs @@ -31,7 +31,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MemForget { if let ExprKind::Path(ref qpath) = path_expr.kind { if let Some(def_id) = qpath_res(cx, qpath, path_expr.hir_id).opt_def_id() { if match_def_path(cx, def_id, &paths::MEM_FORGET) { - let forgot_ty = cx.tables.expr_ty(&args[0]); + let forgot_ty = cx.tables().expr_ty(&args[0]); if forgot_ty.ty_adt_def().map_or(false, |def| def.has_dtor(cx.tcx)) { span_lint(cx, MEM_FORGET, e.span, "usage of `mem::forget` on `Drop` type"); diff --git a/src/tools/clippy/clippy_lints/src/mem_replace.rs b/src/tools/clippy/clippy_lints/src/mem_replace.rs index e2672e02b36da..16d31fc8346ea 100644 --- a/src/tools/clippy/clippy_lints/src/mem_replace.rs +++ b/src/tools/clippy/clippy_lints/src/mem_replace.rs @@ -138,7 +138,7 @@ fn check_replace_option_with_none(cx: &LateContext<'_, '_>, src: &Expr<'_>, dest fn check_replace_with_uninit(cx: &LateContext<'_, '_>, src: &Expr<'_>, dest: &Expr<'_>, expr_span: Span) { if_chain! { // check if replacement is mem::MaybeUninit::uninit().assume_init() - if let Some(method_def_id) = cx.tables.type_dependent_def_id(src.hir_id); + if let Some(method_def_id) = cx.tables().type_dependent_def_id(src.hir_id); if cx.tcx.is_diagnostic_item(sym::assume_init, method_def_id); then { let mut applicability = Applicability::MachineApplicable; @@ -162,7 +162,7 @@ fn check_replace_with_uninit(cx: &LateContext<'_, '_>, src: &Expr<'_>, dest: &Ex if let ExprKind::Call(ref repl_func, ref repl_args) = src.kind; if repl_args.is_empty(); if let ExprKind::Path(ref repl_func_qpath) = repl_func.kind; - if let Some(repl_def_id) = cx.tables.qpath_res(repl_func_qpath, repl_func.hir_id).opt_def_id(); + if let Some(repl_def_id) = cx.tables().qpath_res(repl_func_qpath, repl_func.hir_id).opt_def_id(); then { if cx.tcx.is_diagnostic_item(sym::mem_uninitialized, repl_def_id) { let mut applicability = Applicability::MachineApplicable; @@ -179,7 +179,7 @@ fn check_replace_with_uninit(cx: &LateContext<'_, '_>, src: &Expr<'_>, dest: &Ex applicability, ); } else if cx.tcx.is_diagnostic_item(sym::mem_zeroed, repl_def_id) && - !cx.tables.expr_ty(src).is_primitive() { + !cx.tables().expr_ty(src).is_primitive() { span_lint_and_help( cx, MEM_REPLACE_WITH_UNINIT, @@ -198,7 +198,7 @@ fn check_replace_with_default(cx: &LateContext<'_, '_>, src: &Expr<'_>, dest: &E if_chain! { if !in_external_macro(cx.tcx.sess, expr_span); if let ExprKind::Path(ref repl_func_qpath) = repl_func.kind; - if let Some(repl_def_id) = cx.tables.qpath_res(repl_func_qpath, repl_func.hir_id).opt_def_id(); + if let Some(repl_def_id) = cx.tables().qpath_res(repl_func_qpath, repl_func.hir_id).opt_def_id(); if match_def_path(cx, repl_def_id, &paths::DEFAULT_TRAIT_METHOD); then { span_lint_and_then( @@ -230,7 +230,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MemReplace { // Check that `expr` is a call to `mem::replace()` if let ExprKind::Call(ref func, ref func_args) = expr.kind; if let ExprKind::Path(ref func_qpath) = func.kind; - if let Some(def_id) = cx.tables.qpath_res(func_qpath, func.hir_id).opt_def_id(); + if let Some(def_id) = cx.tables().qpath_res(func_qpath, func.hir_id).opt_def_id(); if match_def_path(cx, def_id, &paths::MEM_REPLACE); if let [dest, src] = &**func_args; then { diff --git a/src/tools/clippy/clippy_lints/src/methods/bind_instead_of_map.rs b/src/tools/clippy/clippy_lints/src/methods/bind_instead_of_map.rs index 32e86637569ed..092702c8b8c7b 100644 --- a/src/tools/clippy/clippy_lints/src/methods/bind_instead_of_map.rs +++ b/src/tools/clippy/clippy_lints/src/methods/bind_instead_of_map.rs @@ -157,7 +157,7 @@ pub(crate) trait BindInsteadOfMap { /// Lint use of `_.and_then(|x| Some(y))` for `Option`s fn lint(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, args: &[hir::Expr<'_>]) { - if !match_type(cx, cx.tables.expr_ty(&args[0]), Self::TYPE_QPATH) { + if !match_type(cx, cx.tables().expr_ty(&args[0]), Self::TYPE_QPATH) { return; } diff --git a/src/tools/clippy/clippy_lints/src/methods/inefficient_to_string.rs b/src/tools/clippy/clippy_lints/src/methods/inefficient_to_string.rs index 06138ab9783c3..d29b9adcb7d43 100644 --- a/src/tools/clippy/clippy_lints/src/methods/inefficient_to_string.rs +++ b/src/tools/clippy/clippy_lints/src/methods/inefficient_to_string.rs @@ -11,9 +11,9 @@ use rustc_middle::ty::{self, Ty}; /// Checks for the `INEFFICIENT_TO_STRING` lint pub fn lint<'tcx>(cx: &LateContext<'_, 'tcx>, expr: &hir::Expr<'_>, arg: &hir::Expr<'_>, arg_ty: Ty<'tcx>) { if_chain! { - if let Some(to_string_meth_did) = cx.tables.type_dependent_def_id(expr.hir_id); + if let Some(to_string_meth_did) = cx.tables().type_dependent_def_id(expr.hir_id); if match_def_path(cx, to_string_meth_did, &paths::TO_STRING_METHOD); - if let Some(substs) = cx.tables.node_substs_opt(expr.hir_id); + if let Some(substs) = cx.tables().node_substs_opt(expr.hir_id); let self_ty = substs.type_at(0); let (deref_self_ty, deref_count) = walk_ptrs_ty_depth(self_ty); if deref_count >= 1; diff --git a/src/tools/clippy/clippy_lints/src/methods/manual_saturating_arithmetic.rs b/src/tools/clippy/clippy_lints/src/methods/manual_saturating_arithmetic.rs index 4f5c06e785c23..eb02314f4680a 100644 --- a/src/tools/clippy/clippy_lints/src/methods/manual_saturating_arithmetic.rs +++ b/src/tools/clippy/clippy_lints/src/methods/manual_saturating_arithmetic.rs @@ -11,7 +11,7 @@ pub fn lint(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, args: &[&[hir::Expr< let arith_lhs = &args[1][0]; let arith_rhs = &args[1][1]; - let ty = cx.tables.expr_ty(arith_lhs); + let ty = cx.tables().expr_ty(arith_lhs); if !ty.is_integral() { return; } @@ -101,7 +101,7 @@ fn is_min_or_max<'tcx>(cx: &LateContext<'_, 'tcx>, expr: &hir::Expr<'_>) -> Opti } } - let ty = cx.tables.expr_ty(expr); + let ty = cx.tables().expr_ty(expr); let ty_str = ty.to_string(); // `std::T::MAX` `std::T::MIN` constants diff --git a/src/tools/clippy/clippy_lints/src/methods/mod.rs b/src/tools/clippy/clippy_lints/src/methods/mod.rs index f25a9782813bb..c4e707ecf03ad 100644 --- a/src/tools/clippy/clippy_lints/src/methods/mod.rs +++ b/src/tools/clippy/clippy_lints/src/methods/mod.rs @@ -1433,7 +1433,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Methods { lint_or_fun_call(cx, expr, *method_span, &method_call.ident.as_str(), args); lint_expect_fun_call(cx, expr, *method_span, &method_call.ident.as_str(), args); - let self_ty = cx.tables.expr_ty_adjusted(&args[0]); + let self_ty = cx.tables().expr_ty_adjusted(&args[0]); if args.len() == 1 && method_call.ident.name == sym!(clone) { lint_clone_on_copy(cx, expr, &args[0], self_ty); lint_clone_on_ref_ptr(cx, expr, &args[0]); @@ -1639,7 +1639,7 @@ fn lint_or_fun_call<'a, 'tcx>( if let hir::ExprKind::Path(ref qpath) = fun.kind; let path = &*last_path_segment(qpath).ident.as_str(); if ["default", "new"].contains(&path); - let arg_ty = cx.tables.expr_ty(arg); + let arg_ty = cx.tables().expr_ty(arg); if let Some(default_trait_id) = get_trait_def_id(cx, &paths::DEFAULT_TRAIT); if implements_trait(cx, arg_ty, default_trait_id, &[]); @@ -1679,7 +1679,7 @@ fn lint_or_fun_call<'a, 'tcx>( ) { if let hir::ExprKind::MethodCall(ref path, _, ref args, _) = &arg.kind { if path.ident.as_str() == "len" { - let ty = walk_ptrs_ty(cx.tables.expr_ty(&args[0])); + let ty = walk_ptrs_ty(cx.tables().expr_ty(&args[0])); match ty.kind { ty::Slice(_) | ty::Array(_, _) => return, @@ -1707,7 +1707,7 @@ fn lint_or_fun_call<'a, 'tcx>( if { finder.visit_expr(&arg); finder.found }; if !contains_return(&arg); - let self_ty = cx.tables.expr_ty(self_expr); + let self_ty = cx.tables().expr_ty(self_expr); if let Some(&(_, fn_has_arguments, poss, suffix)) = know_types.iter().find(|&&i| match_type(cx, self_ty, i.0)); @@ -1786,7 +1786,7 @@ fn lint_expect_fun_call( if call_args.len() == 1 && (method_name.ident.name == sym!(as_str) || method_name.ident.name == sym!(as_ref)) && { - let arg_type = cx.tables.expr_ty(&call_args[0]); + let arg_type = cx.tables().expr_ty(&call_args[0]); let base_type = walk_ptrs_ty(arg_type); base_type.kind == ty::Str || is_type_diagnostic_item(cx, base_type, sym!(string_type)) } @@ -1805,7 +1805,7 @@ fn lint_expect_fun_call( // Only `&'static str` or `String` can be used directly in the `panic!`. Other types should be // converted to string. fn requires_to_string(cx: &LateContext<'_, '_>, arg: &hir::Expr<'_>) -> bool { - let arg_ty = cx.tables.expr_ty(arg); + let arg_ty = cx.tables().expr_ty(arg); if is_type_diagnostic_item(cx, arg_ty, sym!(string_type)) { return false; } @@ -1824,7 +1824,7 @@ fn lint_expect_fun_call( hir::ExprKind::Lit(_) => true, hir::ExprKind::Call(fun, _) => { if let hir::ExprKind::Path(ref p) = fun.kind { - match cx.tables.qpath_res(p, fun.hir_id) { + match cx.tables().qpath_res(p, fun.hir_id) { hir::def::Res::Def(hir::def::DefKind::Fn | hir::def::DefKind::AssocFn, def_id) => matches!( cx.tcx.fn_sig(def_id).output().skip_binder().kind, ty::Ref(ty::ReStatic, ..) @@ -1835,13 +1835,16 @@ fn lint_expect_fun_call( false } }, - hir::ExprKind::MethodCall(..) => cx.tables.type_dependent_def_id(arg.hir_id).map_or(false, |method_id| { - matches!( - cx.tcx.fn_sig(method_id).output().skip_binder().kind, - ty::Ref(ty::ReStatic, ..) - ) - }), - hir::ExprKind::Path(ref p) => match cx.tables.qpath_res(p, arg.hir_id) { + hir::ExprKind::MethodCall(..) => cx + .tables() + .type_dependent_def_id(arg.hir_id) + .map_or(false, |method_id| { + matches!( + cx.tcx.fn_sig(method_id).output().skip_binder().kind, + ty::Ref(ty::ReStatic, ..) + ) + }), + hir::ExprKind::Path(ref p) => match cx.tables().qpath_res(p, arg.hir_id) { hir::def::Res::Def(hir::def::DefKind::Const | hir::def::DefKind::Static, _) => true, _ => false, }, @@ -1888,7 +1891,7 @@ fn lint_expect_fun_call( return; } - let receiver_type = cx.tables.expr_ty_adjusted(&args[0]); + let receiver_type = cx.tables().expr_ty_adjusted(&args[0]); let closure_args = if is_type_diagnostic_item(cx, receiver_type, sym!(option_type)) { "||" } else if is_type_diagnostic_item(cx, receiver_type, sym!(result_type)) { @@ -1954,7 +1957,7 @@ fn lint_expect_fun_call( /// Checks for the `CLONE_ON_COPY` lint. fn lint_clone_on_copy(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, arg: &hir::Expr<'_>, arg_ty: Ty<'_>) { - let ty = cx.tables.expr_ty(expr); + let ty = cx.tables().expr_ty(expr); if let ty::Ref(_, inner, _) = arg_ty.kind { if let ty::Ref(_, innermost, _) = inner.kind { span_lint_and_then( @@ -2018,11 +2021,11 @@ fn lint_clone_on_copy(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, arg: &hir: } // x.clone() might have dereferenced x, possibly through Deref impls - if cx.tables.expr_ty(arg) == ty { + if cx.tables().expr_ty(arg) == ty { snip = Some(("try removing the `clone` call", format!("{}", snippet))); } else { let deref_count = cx - .tables + .tables() .expr_adjustments(arg) .iter() .filter(|adj| { @@ -2048,7 +2051,7 @@ fn lint_clone_on_copy(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, arg: &hir: } fn lint_clone_on_ref_ptr(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, arg: &hir::Expr<'_>) { - let obj_ty = walk_ptrs_ty(cx.tables.expr_ty(arg)); + let obj_ty = walk_ptrs_ty(cx.tables().expr_ty(arg)); if let ty::Adt(_, subst) = obj_ty.kind { let caller_type = if is_type_diagnostic_item(cx, obj_ty, sym::Rc) { @@ -2082,7 +2085,7 @@ fn lint_string_extend(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, args: &[hi let arg = &args[1]; if let Some(arglists) = method_chain_args(arg, &["chars"]) { let target = &arglists[0][0]; - let self_ty = walk_ptrs_ty(cx.tables.expr_ty(target)); + let self_ty = walk_ptrs_ty(cx.tables().expr_ty(target)); let ref_str = if self_ty.kind == ty::Str { "" } else if is_type_diagnostic_item(cx, self_ty, sym!(string_type)) { @@ -2110,7 +2113,7 @@ fn lint_string_extend(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, args: &[hi } fn lint_extend(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, args: &[hir::Expr<'_>]) { - let obj_ty = walk_ptrs_ty(cx.tables.expr_ty(&args[0])); + let obj_ty = walk_ptrs_ty(cx.tables().expr_ty(&args[0])); if is_type_diagnostic_item(cx, obj_ty, sym!(string_type)) { lint_string_extend(cx, expr, args); } @@ -2118,7 +2121,7 @@ fn lint_extend(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, args: &[hir::Expr fn lint_cstring_as_ptr(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, source: &hir::Expr<'_>, unwrap: &hir::Expr<'_>) { if_chain! { - let source_type = cx.tables.expr_ty(source); + let source_type = cx.tables().expr_ty(source); if let ty::Adt(def, substs) = source_type.kind; if cx.tcx.is_diagnostic_item(sym!(result_type), def.did); if match_type(cx, substs.type_at(0), &paths::CSTRING); @@ -2142,8 +2145,8 @@ fn lint_iter_cloned_collect<'a, 'tcx>( iter_args: &'tcx [hir::Expr<'_>], ) { if_chain! { - if is_type_diagnostic_item(cx, cx.tables.expr_ty(expr), sym!(vec_type)); - if let Some(slice) = derefs_to_slice(cx, &iter_args[0], cx.tables.expr_ty(&iter_args[0])); + if is_type_diagnostic_item(cx, cx.tables().expr_ty(expr), sym!(vec_type)); + if let Some(slice) = derefs_to_slice(cx, &iter_args[0], cx.tables().expr_ty(&iter_args[0])); if let Some(to_replace) = expr.span.trim_start(slice.span.source_callsite()); then { @@ -2250,7 +2253,7 @@ fn lint_unnecessary_fold(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, fold_ar fn lint_step_by<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &hir::Expr<'_>, args: &'tcx [hir::Expr<'_>]) { if match_trait_method(cx, expr, &paths::ITERATOR) { - if let Some((Constant::Int(0), _)) = constant(cx, cx.tables, &args[1]) { + if let Some((Constant::Int(0), _)) = constant(cx, cx.tables(), &args[1]) { span_lint( cx, ITERATOR_STEP_BY_ZERO, @@ -2274,7 +2277,7 @@ fn lint_iter_next<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx hir::Expr<'_ parent_expr_opt = get_parent_expr(cx, parent_expr); } - if derefs_to_slice(cx, caller_expr, cx.tables.expr_ty(caller_expr)).is_some() { + if derefs_to_slice(cx, caller_expr, cx.tables().expr_ty(caller_expr)).is_some() { // caller is a Slice if_chain! { if let hir::ExprKind::Index(ref caller_var, ref index_expr) = &caller_expr.kind; @@ -2295,8 +2298,8 @@ fn lint_iter_next<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx hir::Expr<'_ ); } } - } else if is_type_diagnostic_item(cx, cx.tables.expr_ty(caller_expr), sym!(vec_type)) - || matches!(&walk_ptrs_ty(cx.tables.expr_ty(caller_expr)).kind, ty::Array(_, _)) + } else if is_type_diagnostic_item(cx, cx.tables().expr_ty(caller_expr), sym!(vec_type)) + || matches!(&walk_ptrs_ty(cx.tables().expr_ty(caller_expr)).kind, ty::Array(_, _)) { // caller is a Vec or an Array let mut applicability = Applicability::MachineApplicable; @@ -2323,11 +2326,11 @@ fn lint_iter_nth<'a, 'tcx>( ) { let iter_args = nth_and_iter_args[1]; let mut_str = if is_mut { "_mut" } else { "" }; - let caller_type = if derefs_to_slice(cx, &iter_args[0], cx.tables.expr_ty(&iter_args[0])).is_some() { + let caller_type = if derefs_to_slice(cx, &iter_args[0], cx.tables().expr_ty(&iter_args[0])).is_some() { "slice" - } else if is_type_diagnostic_item(cx, cx.tables.expr_ty(&iter_args[0]), sym!(vec_type)) { + } else if is_type_diagnostic_item(cx, cx.tables().expr_ty(&iter_args[0]), sym!(vec_type)) { "Vec" - } else if is_type_diagnostic_item(cx, cx.tables.expr_ty(&iter_args[0]), sym!(vecdeque_type)) { + } else if is_type_diagnostic_item(cx, cx.tables().expr_ty(&iter_args[0]), sym!(vecdeque_type)) { "VecDeque" } else { let nth_args = nth_and_iter_args[0]; @@ -2348,7 +2351,7 @@ fn lint_iter_nth<'a, 'tcx>( fn lint_iter_nth_zero<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &hir::Expr<'_>, nth_args: &'tcx [hir::Expr<'_>]) { if_chain! { if match_trait_method(cx, expr, &paths::ITERATOR); - if let Some((Constant::Int(0), _)) = constant(cx, cx.tables, &nth_args[1]); + if let Some((Constant::Int(0), _)) = constant(cx, cx.tables(), &nth_args[1]); then { let mut applicability = Applicability::MachineApplicable; span_lint_and_sugg( @@ -2373,7 +2376,7 @@ fn lint_get_unwrap<'a, 'tcx>( // Note: we don't want to lint `get_mut().unwrap` for `HashMap` or `BTreeMap`, // because they do not implement `IndexMut` let mut applicability = Applicability::MachineApplicable; - let expr_ty = cx.tables.expr_ty(&get_args[0]); + let expr_ty = cx.tables().expr_ty(&get_args[0]); let get_args_str = if get_args.len() > 1 { snippet_with_applicability(cx, get_args[1].span, "_", &mut applicability) } else { @@ -2479,7 +2482,7 @@ fn derefs_to_slice<'a, 'tcx>( } if let hir::ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind { - if path.ident.name == sym!(iter) && may_slice(cx, cx.tables.expr_ty(&args[0])) { + if path.ident.name == sym!(iter) && may_slice(cx, cx.tables().expr_ty(&args[0])) { Some(&args[0]) } else { None @@ -2502,7 +2505,7 @@ fn derefs_to_slice<'a, 'tcx>( /// lint use of `unwrap()` for `Option`s and `Result`s fn lint_unwrap(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, unwrap_args: &[hir::Expr<'_>]) { - let obj_ty = walk_ptrs_ty(cx.tables.expr_ty(&unwrap_args[0])); + let obj_ty = walk_ptrs_ty(cx.tables().expr_ty(&unwrap_args[0])); let mess = if is_type_diagnostic_item(cx, obj_ty, sym!(option_type)) { Some((UNWRAP_USED, "an Option", "None")) @@ -2530,7 +2533,7 @@ fn lint_unwrap(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, unwrap_args: &[hi /// lint use of `expect()` for `Option`s and `Result`s fn lint_expect(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, expect_args: &[hir::Expr<'_>]) { - let obj_ty = walk_ptrs_ty(cx.tables.expr_ty(&expect_args[0])); + let obj_ty = walk_ptrs_ty(cx.tables().expr_ty(&expect_args[0])); let mess = if is_type_diagnostic_item(cx, obj_ty, sym!(option_type)) { Some((EXPECT_USED, "an Option", "None")) @@ -2556,8 +2559,8 @@ fn lint_expect(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, expect_args: &[hi fn lint_ok_expect(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, ok_args: &[hir::Expr<'_>]) { if_chain! { // lint if the caller of `ok()` is a `Result` - if is_type_diagnostic_item(cx, cx.tables.expr_ty(&ok_args[0]), sym!(result_type)); - let result_type = cx.tables.expr_ty(&ok_args[0]); + if is_type_diagnostic_item(cx, cx.tables().expr_ty(&ok_args[0]), sym!(result_type)); + let result_type = cx.tables().expr_ty(&ok_args[0]); if let Some(error_type) = get_error_type(cx, result_type); if has_debug_impl(error_type, cx); @@ -2595,7 +2598,7 @@ fn lint_map_flatten<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx hir::Expr< } // lint if caller of `.map().flatten()` is an Option - if is_type_diagnostic_item(cx, cx.tables.expr_ty(&map_args[0]), sym!(option_type)) { + if is_type_diagnostic_item(cx, cx.tables().expr_ty(&map_args[0]), sym!(option_type)) { let msg = "called `map(..).flatten()` on an `Option`. \ This is more succinctly expressed by calling `.and_then(..)`"; let self_snippet = snippet(cx, map_args[0].span, ".."); @@ -2621,8 +2624,8 @@ fn lint_map_unwrap_or_else<'a, 'tcx>( unwrap_args: &'tcx [hir::Expr<'_>], ) { // lint if the caller of `map()` is an `Option` - let is_option = is_type_diagnostic_item(cx, cx.tables.expr_ty(&map_args[0]), sym!(option_type)); - let is_result = is_type_diagnostic_item(cx, cx.tables.expr_ty(&map_args[0]), sym!(result_type)); + let is_option = is_type_diagnostic_item(cx, cx.tables().expr_ty(&map_args[0]), sym!(option_type)); + let is_result = is_type_diagnostic_item(cx, cx.tables().expr_ty(&map_args[0]), sym!(result_type)); if is_option || is_result { // Don't make a suggestion that may fail to compile due to mutably borrowing @@ -2676,8 +2679,8 @@ fn lint_map_or_none<'a, 'tcx>( expr: &'tcx hir::Expr<'_>, map_or_args: &'tcx [hir::Expr<'_>], ) { - let is_option = is_type_diagnostic_item(cx, cx.tables.expr_ty(&map_or_args[0]), sym!(option_type)); - let is_result = is_type_diagnostic_item(cx, cx.tables.expr_ty(&map_or_args[0]), sym!(result_type)); + let is_option = is_type_diagnostic_item(cx, cx.tables().expr_ty(&map_or_args[0]), sym!(option_type)); + let is_result = is_type_diagnostic_item(cx, cx.tables().expr_ty(&map_or_args[0]), sym!(result_type)); // There are two variants of this `map_or` lint: // (1) using `map_or` as an adapter from `Result` to `Option` @@ -3042,7 +3045,7 @@ fn lint_chars_cmp( if segment.ident.name == sym!(Some); then { let mut applicability = Applicability::MachineApplicable; - let self_ty = walk_ptrs_ty(cx.tables.expr_ty_adjusted(&args[0][0])); + let self_ty = walk_ptrs_ty(cx.tables().expr_ty_adjusted(&args[0][0])); if self_ty.kind != ty::Str { return false; @@ -3174,8 +3177,8 @@ fn lint_asref(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, call_name: &str, a if match_trait_method(cx, expr, &paths::ASREF_TRAIT) || match_trait_method(cx, expr, &paths::ASMUT_TRAIT) { // check if the type after `as_ref` or `as_mut` is the same as before let recvr = &as_ref_args[0]; - let rcv_ty = cx.tables.expr_ty(recvr); - let res_ty = cx.tables.expr_ty(expr); + let rcv_ty = cx.tables().expr_ty(recvr); + let res_ty = cx.tables().expr_ty(expr); let (base_res_ty, res_depth) = walk_ptrs_ty_depth(res_ty); let (base_rcv_ty, rcv_depth) = walk_ptrs_ty_depth(rcv_ty); if base_rcv_ty == base_res_ty && rcv_depth >= res_depth { @@ -3244,7 +3247,7 @@ fn lint_maybe_uninit(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, outer: &hir if args.is_empty(); if let hir::ExprKind::Path(ref path) = callee.kind; if match_qpath(path, &paths::MEM_MAYBEUNINIT_UNINIT); - if !is_maybe_uninit_ty_valid(cx, cx.tables.expr_ty_adjusted(outer)); + if !is_maybe_uninit_ty_valid(cx, cx.tables().expr_ty_adjusted(outer)); then { span_lint( cx, @@ -3286,7 +3289,7 @@ fn lint_option_as_ref_deref<'a, 'tcx>( ) { let same_mutability = |m| (is_mut && m == &hir::Mutability::Mut) || (!is_mut && m == &hir::Mutability::Not); - let option_ty = cx.tables.expr_ty(&as_ref_args[0]); + let option_ty = cx.tables().expr_ty(&as_ref_args[0]); if !is_type_diagnostic_item(cx, option_ty, sym!(option_type)) { return; } @@ -3314,12 +3317,12 @@ fn lint_option_as_ref_deref<'a, 'tcx>( if_chain! { if args.len() == 1; if let hir::ExprKind::Path(qpath) = &args[0].kind; - if let hir::def::Res::Local(local_id) = cx.tables.qpath_res(qpath, args[0].hir_id); + if let hir::def::Res::Local(local_id) = cx.tables().qpath_res(qpath, args[0].hir_id); if closure_body.params[0].pat.hir_id == local_id; - let adj = cx.tables.expr_adjustments(&args[0]).iter().map(|x| &x.kind).collect::>(); + let adj = cx.tables().expr_adjustments(&args[0]).iter().map(|x| &x.kind).collect::>(); if let [ty::adjustment::Adjust::Deref(None), ty::adjustment::Adjust::Borrow(_)] = *adj; then { - let method_did = cx.tables.type_dependent_def_id(closure_expr.hir_id).unwrap(); + let method_did = cx.tables().type_dependent_def_id(closure_expr.hir_id).unwrap(); deref_aliases.iter().any(|path| match_def_path(cx, method_did, path)) } else { false @@ -3331,7 +3334,7 @@ fn lint_option_as_ref_deref<'a, 'tcx>( if let hir::ExprKind::Unary(hir::UnOp::UnDeref, ref inner1) = inner.kind; if let hir::ExprKind::Unary(hir::UnOp::UnDeref, ref inner2) = inner1.kind; if let hir::ExprKind::Path(ref qpath) = inner2.kind; - if let hir::def::Res::Local(local_id) = cx.tables.qpath_res(qpath, inner2.hir_id); + if let hir::def::Res::Local(local_id) = cx.tables().qpath_res(qpath, inner2.hir_id); then { closure_body.params[0].pat.hir_id == local_id } else { @@ -3614,7 +3617,7 @@ fn contains_return(expr: &hir::Expr<'_>) -> bool { fn check_pointer_offset(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, args: &[hir::Expr<'_>]) { if_chain! { if args.len() == 2; - if let ty::RawPtr(ty::TypeAndMut { ref ty, .. }) = cx.tables.expr_ty(&args[0]).kind; + if let ty::RawPtr(ty::TypeAndMut { ref ty, .. }) = cx.tables().expr_ty(&args[0]).kind; if let Ok(layout) = cx.tcx.layout_of(cx.param_env.and(ty)); if layout.is_zst(); then { @@ -3624,7 +3627,7 @@ fn check_pointer_offset(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, args: &[ } fn lint_filetype_is_file(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, args: &[hir::Expr<'_>]) { - let ty = cx.tables.expr_ty(&args[0]); + let ty = cx.tables().expr_ty(&args[0]); if !match_type(cx, ty, &paths::FILE_TYPE) { return; diff --git a/src/tools/clippy/clippy_lints/src/methods/option_map_unwrap_or.rs b/src/tools/clippy/clippy_lints/src/methods/option_map_unwrap_or.rs index 20c60ef33189d..7f4529a5870ac 100644 --- a/src/tools/clippy/clippy_lints/src/methods/option_map_unwrap_or.rs +++ b/src/tools/clippy/clippy_lints/src/methods/option_map_unwrap_or.rs @@ -20,8 +20,8 @@ pub(super) fn lint<'a, 'tcx>( map_span: Span, ) { // lint if the caller of `map()` is an `Option` - if is_type_diagnostic_item(cx, cx.tables.expr_ty(&map_args[0]), sym!(option_type)) { - if !is_copy(cx, cx.tables.expr_ty(&unwrap_args[1])) { + if is_type_diagnostic_item(cx, cx.tables().expr_ty(&map_args[0]), sym!(option_type)) { + if !is_copy(cx, cx.tables().expr_ty(&unwrap_args[1])) { // Do not lint if the `map` argument uses identifiers in the `map` // argument that are also used in the `unwrap_or` argument diff --git a/src/tools/clippy/clippy_lints/src/methods/unnecessary_filter_map.rs b/src/tools/clippy/clippy_lints/src/methods/unnecessary_filter_map.rs index 41c9ce7cda3e6..88243a88d9dd7 100644 --- a/src/tools/clippy/clippy_lints/src/methods/unnecessary_filter_map.rs +++ b/src/tools/clippy/clippy_lints/src/methods/unnecessary_filter_map.rs @@ -65,7 +65,7 @@ fn check_expression<'a, 'tcx>( if match_qpath(path, &paths::OPTION_SOME) { if_chain! { if let hir::ExprKind::Path(path) = &args[0].kind; - if let Res::Local(ref local) = cx.tables.qpath_res(path, args[0].hir_id); + if let Res::Local(ref local) = cx.tables().qpath_res(path, args[0].hir_id); then { if arg_id == *local { return (false, false) diff --git a/src/tools/clippy/clippy_lints/src/minmax.rs b/src/tools/clippy/clippy_lints/src/minmax.rs index b02c993de526b..8e6f3925d6605 100644 --- a/src/tools/clippy/clippy_lints/src/minmax.rs +++ b/src/tools/clippy/clippy_lints/src/minmax.rs @@ -36,7 +36,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MinMaxPass { } match ( outer_max, - Constant::partial_cmp(cx.tcx, cx.tables.expr_ty(ie), &outer_c, &inner_c), + Constant::partial_cmp(cx.tcx, cx.tables().expr_ty(ie), &outer_c, &inner_c), ) { (_, None) | (MinMax::Max, Some(Ordering::Less)) | (MinMax::Min, Some(Ordering::Greater)) => (), _ => { @@ -62,15 +62,18 @@ enum MinMax { fn min_max<'a>(cx: &LateContext<'_, '_>, expr: &'a Expr<'a>) -> Option<(MinMax, Constant, &'a Expr<'a>)> { if let ExprKind::Call(ref path, ref args) = expr.kind { if let ExprKind::Path(ref qpath) = path.kind { - cx.tables.qpath_res(qpath, path.hir_id).opt_def_id().and_then(|def_id| { - if match_def_path(cx, def_id, &paths::CMP_MIN) { - fetch_const(cx, args, MinMax::Min) - } else if match_def_path(cx, def_id, &paths::CMP_MAX) { - fetch_const(cx, args, MinMax::Max) - } else { - None - } - }) + cx.tables() + .qpath_res(qpath, path.hir_id) + .opt_def_id() + .and_then(|def_id| { + if match_def_path(cx, def_id, &paths::CMP_MIN) { + fetch_const(cx, args, MinMax::Min) + } else if match_def_path(cx, def_id, &paths::CMP_MAX) { + fetch_const(cx, args, MinMax::Max) + } else { + None + } + }) } else { None } @@ -87,14 +90,14 @@ fn fetch_const<'a>( if args.len() != 2 { return None; } - if let Some(c) = constant_simple(cx, cx.tables, &args[0]) { - if constant_simple(cx, cx.tables, &args[1]).is_none() { + if let Some(c) = constant_simple(cx, cx.tables(), &args[0]) { + if constant_simple(cx, cx.tables(), &args[1]).is_none() { // otherwise ignore Some((m, c, &args[1])) } else { None } - } else if let Some(c) = constant_simple(cx, cx.tables, &args[1]) { + } else if let Some(c) = constant_simple(cx, cx.tables(), &args[1]) { Some((m, c, &args[0])) } else { None diff --git a/src/tools/clippy/clippy_lints/src/misc.rs b/src/tools/clippy/clippy_lints/src/misc.rs index a0947608e6077..99cd864cae4e3 100644 --- a/src/tools/clippy/clippy_lints/src/misc.rs +++ b/src/tools/clippy/clippy_lints/src/misc.rs @@ -436,7 +436,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MiscLints { binding != "_result" && // FIXME: #944 is_used(cx, expr) && // don't lint if the declaration is in a macro - non_macro_local(cx, cx.tables.qpath_res(qpath, expr.hir_id)) + non_macro_local(cx, cx.tables().qpath_res(qpath, expr.hir_id)) { Some(binding) } else { @@ -496,7 +496,7 @@ fn get_lint_and_message( fn check_nan(cx: &LateContext<'_, '_>, expr: &Expr<'_>, cmp_expr: &Expr<'_>) { if_chain! { if !in_constant(cx, cmp_expr.hir_id); - if let Some((value, _)) = constant(cx, cx.tables, expr); + if let Some((value, _)) = constant(cx, cx.tables(), expr); then { let needs_lint = match value { Constant::F32(num) => num.is_nan(), @@ -517,7 +517,7 @@ fn check_nan(cx: &LateContext<'_, '_>, expr: &Expr<'_>, cmp_expr: &Expr<'_>) { } fn is_named_constant<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) -> bool { - if let Some((_, res)) = constant(cx, cx.tables, expr) { + if let Some((_, res)) = constant(cx, cx.tables(), expr) { res } else { false @@ -525,7 +525,7 @@ fn is_named_constant<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) } fn is_allowed<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) -> bool { - match constant(cx, cx.tables, expr) { + match constant(cx, cx.tables(), expr) { Some((Constant::F32(f), _)) => f == 0.0 || f.is_infinite(), Some((Constant::F64(f), _)) => f == 0.0 || f.is_infinite(), Some((Constant::Vec(vec), _)) => vec.iter().all(|f| match f { @@ -557,7 +557,7 @@ fn is_signum(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { } fn is_float(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { - let value = &walk_ptrs_ty(cx.tables.expr_ty(expr)).kind; + let value = &walk_ptrs_ty(cx.tables().expr_ty(expr)).kind; if let ty::Array(arr_ty, _) = value { return matches!(arr_ty.kind, ty::Float(_)); @@ -567,14 +567,14 @@ fn is_float(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { } fn is_array(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { - matches!(&walk_ptrs_ty(cx.tables.expr_ty(expr)).kind, ty::Array(_, _)) + matches!(&walk_ptrs_ty(cx.tables().expr_ty(expr)).kind, ty::Array(_, _)) } fn check_to_owned(cx: &LateContext<'_, '_>, expr: &Expr<'_>, other: &Expr<'_>) { let (arg_ty, snip) = match expr.kind { ExprKind::MethodCall(.., ref args, _) if args.len() == 1 => { if match_trait_method(cx, expr, &paths::TO_STRING) || match_trait_method(cx, expr, &paths::TO_OWNED) { - (cx.tables.expr_ty_adjusted(&args[0]), snippet(cx, args[0].span, "..")) + (cx.tables().expr_ty_adjusted(&args[0]), snippet(cx, args[0].span, "..")) } else { return; } @@ -582,7 +582,7 @@ fn check_to_owned(cx: &LateContext<'_, '_>, expr: &Expr<'_>, other: &Expr<'_>) { ExprKind::Call(ref path, ref v) if v.len() == 1 => { if let ExprKind::Path(ref path) = path.kind { if match_qpath(path, &["String", "from_str"]) || match_qpath(path, &["String", "from"]) { - (cx.tables.expr_ty_adjusted(&v[0]), snippet(cx, v[0].span, "..")) + (cx.tables().expr_ty_adjusted(&v[0]), snippet(cx, v[0].span, "..")) } else { return; } @@ -593,7 +593,7 @@ fn check_to_owned(cx: &LateContext<'_, '_>, expr: &Expr<'_>, other: &Expr<'_>) { _ => return, }; - let other_ty = cx.tables.expr_ty_adjusted(other); + let other_ty = cx.tables().expr_ty_adjusted(other); let partial_eq_trait_id = match cx.tcx.lang_items().eq_trait() { Some(id) => id, None => return, diff --git a/src/tools/clippy/clippy_lints/src/modulo_arithmetic.rs b/src/tools/clippy/clippy_lints/src/modulo_arithmetic.rs index 4ca90455bc4d1..f76e4721e1f63 100644 --- a/src/tools/clippy/clippy_lints/src/modulo_arithmetic.rs +++ b/src/tools/clippy/clippy_lints/src/modulo_arithmetic.rs @@ -37,8 +37,8 @@ struct OperandInfo { } fn analyze_operand(operand: &Expr<'_>, cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> Option { - match constant(cx, cx.tables, operand) { - Some((Constant::Int(v), _)) => match cx.tables.expr_ty(expr).kind { + match constant(cx, cx.tables(), operand) { + Some((Constant::Int(v), _)) => match cx.tables().expr_ty(expr).kind { ty::Int(ity) => { let value = sext(cx.tcx, v, ity); return Some(OperandInfo { @@ -106,7 +106,7 @@ fn check_const_operands<'a, 'tcx>( } fn check_non_const_operands<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>, operand: &Expr<'_>) { - let operand_type = cx.tables.expr_ty(operand); + let operand_type = cx.tables().expr_ty(operand); if might_have_negative_value(operand_type) { span_lint_and_then( cx, diff --git a/src/tools/clippy/clippy_lints/src/mut_key.rs b/src/tools/clippy/clippy_lints/src/mut_key.rs index 93569a04f7a3a..755b196c698c2 100644 --- a/src/tools/clippy/clippy_lints/src/mut_key.rs +++ b/src/tools/clippy/clippy_lints/src/mut_key.rs @@ -76,7 +76,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MutableKeyType { if let hir::PatKind::Wild = local.pat.kind { return; } - check_ty(cx, local.span, cx.tables.pat_ty(&*local.pat)); + check_ty(cx, local.span, cx.tables().pat_ty(&*local.pat)); } } diff --git a/src/tools/clippy/clippy_lints/src/mut_mut.rs b/src/tools/clippy/clippy_lints/src/mut_mut.rs index f7a20a74b85e2..6aa77b4df83aa 100644 --- a/src/tools/clippy/clippy_lints/src/mut_mut.rs +++ b/src/tools/clippy/clippy_lints/src/mut_mut.rs @@ -69,7 +69,7 @@ impl<'a, 'tcx> intravisit::Visitor<'tcx> for MutVisitor<'a, 'tcx> { expr.span, "generally you want to avoid `&mut &mut _` if possible", ); - } else if let ty::Ref(_, _, hir::Mutability::Mut) = self.cx.tables.expr_ty(e).kind { + } else if let ty::Ref(_, _, hir::Mutability::Mut) = self.cx.tables().expr_ty(e).kind { span_lint( self.cx, MUT_MUT, diff --git a/src/tools/clippy/clippy_lints/src/mut_reference.rs b/src/tools/clippy/clippy_lints/src/mut_reference.rs index 7fcf15f8acbe8..dbe257069c3e2 100644 --- a/src/tools/clippy/clippy_lints/src/mut_reference.rs +++ b/src/tools/clippy/clippy_lints/src/mut_reference.rs @@ -37,14 +37,14 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnnecessaryMutPassed { check_arguments( cx, arguments, - cx.tables.expr_ty(fn_expr), + cx.tables().expr_ty(fn_expr), &rustc_hir_pretty::to_string(rustc_hir_pretty::NO_ANN, |s| s.print_qpath(path, false)), ); } }, ExprKind::MethodCall(ref path, _, ref arguments, _) => { - let def_id = cx.tables.type_dependent_def_id(e.hir_id).unwrap(); - let substs = cx.tables.node_substs(e.hir_id); + let def_id = cx.tables().type_dependent_def_id(e.hir_id).unwrap(); + let substs = cx.tables().node_substs(e.hir_id); let method_type = cx.tcx.type_of(def_id).subst(cx.tcx, substs); check_arguments(cx, arguments, method_type, &path.ident.as_str()) }, diff --git a/src/tools/clippy/clippy_lints/src/mutable_debug_assertion.rs b/src/tools/clippy/clippy_lints/src/mutable_debug_assertion.rs index 119e0905ff442..45db5140711ad 100644 --- a/src/tools/clippy/clippy_lints/src/mutable_debug_assertion.rs +++ b/src/tools/clippy/clippy_lints/src/mutable_debug_assertion.rs @@ -135,7 +135,7 @@ impl<'a, 'tcx> Visitor<'tcx> for MutArgVisitor<'a, 'tcx> { return; }, ExprKind::Path(_) => { - if let Some(adj) = self.cx.tables.adjustments().get(expr.hir_id) { + if let Some(adj) = self.cx.tables().adjustments().get(expr.hir_id) { if adj .iter() .any(|a| matches!(a.target.kind, ty::Ref(_, _, Mutability::Mut))) diff --git a/src/tools/clippy/clippy_lints/src/mutex_atomic.rs b/src/tools/clippy/clippy_lints/src/mutex_atomic.rs index 78b15afc5a7fa..c227dc54f2939 100644 --- a/src/tools/clippy/clippy_lints/src/mutex_atomic.rs +++ b/src/tools/clippy/clippy_lints/src/mutex_atomic.rs @@ -66,7 +66,7 @@ declare_lint_pass!(Mutex => [MUTEX_ATOMIC, MUTEX_INTEGER]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Mutex { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) { - let ty = cx.tables.expr_ty(expr); + let ty = cx.tables().expr_ty(expr); if let ty::Adt(_, subst) = ty.kind { if is_type_diagnostic_item(cx, ty, sym!(mutex_type)) { let mutex_param = subst.type_at(0); diff --git a/src/tools/clippy/clippy_lints/src/needless_bool.rs b/src/tools/clippy/clippy_lints/src/needless_bool.rs index 15b129fa09802..653f9e2ae8625 100644 --- a/src/tools/clippy/clippy_lints/src/needless_bool.rs +++ b/src/tools/clippy/clippy_lints/src/needless_bool.rs @@ -229,7 +229,7 @@ fn check_comparison<'a, 'tcx>( use self::Expression::{Bool, Other}; if let ExprKind::Binary(op, ref left_side, ref right_side) = e.kind { - let (l_ty, r_ty) = (cx.tables.expr_ty(left_side), cx.tables.expr_ty(right_side)); + let (l_ty, r_ty) = (cx.tables().expr_ty(left_side), cx.tables().expr_ty(right_side)); if l_ty.is_bool() && r_ty.is_bool() { let mut applicability = Applicability::MachineApplicable; diff --git a/src/tools/clippy/clippy_lints/src/needless_borrow.rs b/src/tools/clippy/clippy_lints/src/needless_borrow.rs index 5880d1d610206..6bb06defb7034 100644 --- a/src/tools/clippy/clippy_lints/src/needless_borrow.rs +++ b/src/tools/clippy/clippy_lints/src/needless_borrow.rs @@ -46,8 +46,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NeedlessBorrow { return; } if let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, ref inner) = e.kind { - if let ty::Ref(..) = cx.tables.expr_ty(inner).kind { - for adj3 in cx.tables.expr_adjustments(e).windows(3) { + if let ty::Ref(..) = cx.tables().expr_ty(inner).kind { + for adj3 in cx.tables().expr_adjustments(e).windows(3) { if let [Adjustment { kind: Adjust::Deref(_), .. }, Adjustment { @@ -85,7 +85,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NeedlessBorrow { } if_chain! { if let PatKind::Binding(BindingAnnotation::Ref, .., name, _) = pat.kind; - if let ty::Ref(_, tam, mutbl) = cx.tables.pat_ty(pat).kind; + if let ty::Ref(_, tam, mutbl) = cx.tables().pat_ty(pat).kind; if mutbl == Mutability::Not; if let ty::Ref(_, _, mutbl) = tam.kind; // only lint immutable refs, because borrowed `&mut T` cannot be moved out diff --git a/src/tools/clippy/clippy_lints/src/needless_pass_by_value.rs b/src/tools/clippy/clippy_lints/src/needless_pass_by_value.rs index ca87deac9891c..6954f0cc683f1 100644 --- a/src/tools/clippy/clippy_lints/src/needless_pass_by_value.rs +++ b/src/tools/clippy/clippy_lints/src/needless_pass_by_value.rs @@ -135,7 +135,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NeedlessPassByValue { } = { let mut ctx = MovedVariablesCtxt::default(); cx.tcx.infer_ctxt().enter(|infcx| { - euv::ExprUseVisitor::new(&mut ctx, &infcx, fn_def_id, cx.param_env, cx.tables).consume_body(body); + euv::ExprUseVisitor::new(&mut ctx, &infcx, fn_def_id, cx.param_env, cx.tables()).consume_body(body); }); ctx }; @@ -173,13 +173,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NeedlessPassByValue { !preds.is_empty() && { let ty_empty_region = cx.tcx.mk_imm_ref(cx.tcx.lifetimes.re_root_empty, ty); preds.iter().all(|t| { - let ty_params = &t - .skip_binder() - .trait_ref - .substs - .iter() - .skip(1) - .collect::>(); + let ty_params = &t.skip_binder().trait_ref.substs.iter().skip(1).collect::>(); implements_trait(cx, ty_empty_region, t.def_id(), ty_params) }) }, diff --git a/src/tools/clippy/clippy_lints/src/needless_update.rs b/src/tools/clippy/clippy_lints/src/needless_update.rs index d866bab2f642c..9b556dbb8540e 100644 --- a/src/tools/clippy/clippy_lints/src/needless_update.rs +++ b/src/tools/clippy/clippy_lints/src/needless_update.rs @@ -47,7 +47,7 @@ declare_lint_pass!(NeedlessUpdate => [NEEDLESS_UPDATE]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NeedlessUpdate { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) { if let ExprKind::Struct(_, ref fields, Some(ref base)) = expr.kind { - let ty = cx.tables.expr_ty(expr); + let ty = cx.tables().expr_ty(expr); if let ty::Adt(def, _) = ty.kind { if fields.len() == def.non_enum_variant().fields.len() { span_lint( diff --git a/src/tools/clippy/clippy_lints/src/neg_cmp_op_on_partial_ord.rs b/src/tools/clippy/clippy_lints/src/neg_cmp_op_on_partial_ord.rs index 54536ed57d3e9..0f56daa3659e8 100644 --- a/src/tools/clippy/clippy_lints/src/neg_cmp_op_on_partial_ord.rs +++ b/src/tools/clippy/clippy_lints/src/neg_cmp_op_on_partial_ord.rs @@ -56,7 +56,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NoNegCompOpForPartialOrd { then { - let ty = cx.tables.expr_ty(left); + let ty = cx.tables().expr_ty(left); let implements_ord = { if let Some(id) = utils::get_trait_def_id(cx, &paths::ORD) { diff --git a/src/tools/clippy/clippy_lints/src/neg_multiply.rs b/src/tools/clippy/clippy_lints/src/neg_multiply.rs index 4681e990df88a..a9ce01b67b097 100644 --- a/src/tools/clippy/clippy_lints/src/neg_multiply.rs +++ b/src/tools/clippy/clippy_lints/src/neg_multiply.rs @@ -44,8 +44,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NegMultiply { fn check_mul(cx: &LateContext<'_, '_>, span: Span, lit: &Expr<'_>, exp: &Expr<'_>) { if_chain! { if let ExprKind::Lit(ref l) = lit.kind; - if let Constant::Int(1) = consts::lit_to_constant(&l.node, cx.tables.expr_ty_opt(lit)); - if cx.tables.expr_ty(exp).is_integral(); + if let Constant::Int(1) = consts::lit_to_constant(&l.node, cx.tables().expr_ty_opt(lit)); + if cx.tables().expr_ty(exp).is_integral(); then { span_lint(cx, NEG_MULTIPLY, span, "Negation by multiplying with `-1`"); } diff --git a/src/tools/clippy/clippy_lints/src/no_effect.rs b/src/tools/clippy/clippy_lints/src/no_effect.rs index 2eacd3c80c486..5fdc656580f29 100644 --- a/src/tools/clippy/clippy_lints/src/no_effect.rs +++ b/src/tools/clippy/clippy_lints/src/no_effect.rs @@ -48,7 +48,7 @@ fn has_no_effect(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { } match expr.kind { ExprKind::Lit(..) | ExprKind::Closure(..) => true, - ExprKind::Path(..) => !has_drop(cx, cx.tables.expr_ty(expr)), + ExprKind::Path(..) => !has_drop(cx, cx.tables().expr_ty(expr)), ExprKind::Index(ref a, ref b) | ExprKind::Binary(_, ref a, ref b) => { has_no_effect(cx, a) && has_no_effect(cx, b) }, @@ -61,7 +61,7 @@ fn has_no_effect(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { | ExprKind::AddrOf(_, _, ref inner) | ExprKind::Box(ref inner) => has_no_effect(cx, inner), ExprKind::Struct(_, ref fields, ref base) => { - !has_drop(cx, cx.tables.expr_ty(expr)) + !has_drop(cx, cx.tables().expr_ty(expr)) && fields.iter().all(|field| has_no_effect(cx, &field.expr)) && base.as_ref().map_or(true, |base| has_no_effect(cx, base)) }, @@ -70,7 +70,7 @@ fn has_no_effect(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { let res = qpath_res(cx, qpath, callee.hir_id); match res { Res::Def(DefKind::Struct | DefKind::Variant | DefKind::Ctor(..), ..) => { - !has_drop(cx, cx.tables.expr_ty(expr)) && args.iter().all(|arg| has_no_effect(cx, arg)) + !has_drop(cx, cx.tables().expr_ty(expr)) && args.iter().all(|arg| has_no_effect(cx, arg)) }, _ => false, } @@ -137,7 +137,7 @@ fn reduce_expression<'a>(cx: &LateContext<'_, '_>, expr: &'a Expr<'a>) -> Option | ExprKind::AddrOf(_, _, ref inner) | ExprKind::Box(ref inner) => reduce_expression(cx, inner).or_else(|| Some(vec![inner])), ExprKind::Struct(_, ref fields, ref base) => { - if has_drop(cx, cx.tables.expr_ty(expr)) { + if has_drop(cx, cx.tables().expr_ty(expr)) { None } else { Some(fields.iter().map(|f| &f.expr).chain(base).map(Deref::deref).collect()) @@ -148,7 +148,7 @@ fn reduce_expression<'a>(cx: &LateContext<'_, '_>, expr: &'a Expr<'a>) -> Option let res = qpath_res(cx, qpath, callee.hir_id); match res { Res::Def(DefKind::Struct | DefKind::Variant | DefKind::Ctor(..), ..) - if !has_drop(cx, cx.tables.expr_ty(expr)) => + if !has_drop(cx, cx.tables().expr_ty(expr)) => { Some(args.iter().collect()) }, diff --git a/src/tools/clippy/clippy_lints/src/non_copy_const.rs b/src/tools/clippy/clippy_lints/src/non_copy_const.rs index 230dfd2ebf566..21d7a7439f25c 100644 --- a/src/tools/clippy/clippy_lints/src/non_copy_const.rs +++ b/src/tools/clippy/clippy_lints/src/non_copy_const.rs @@ -237,13 +237,13 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonCopyConst { } let ty = if needs_check_adjustment { - let adjustments = cx.tables.expr_adjustments(dereferenced_expr); + let adjustments = cx.tables().expr_adjustments(dereferenced_expr); if let Some(i) = adjustments.iter().position(|adj| match adj.kind { Adjust::Borrow(_) | Adjust::Deref(_) => true, _ => false, }) { if i == 0 { - cx.tables.expr_ty(dereferenced_expr) + cx.tables().expr_ty(dereferenced_expr) } else { adjustments[i - 1].target } @@ -252,7 +252,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonCopyConst { return; } } else { - cx.tables.expr_ty(dereferenced_expr) + cx.tables().expr_ty(dereferenced_expr) }; verify_ty_bound(cx, ty, Source::Expr { expr: expr.span }); diff --git a/src/tools/clippy/clippy_lints/src/open_options.rs b/src/tools/clippy/clippy_lints/src/open_options.rs index 2d4629b683f05..2467a14cea12f 100644 --- a/src/tools/clippy/clippy_lints/src/open_options.rs +++ b/src/tools/clippy/clippy_lints/src/open_options.rs @@ -30,7 +30,7 @@ declare_lint_pass!(OpenOptions => [NONSENSICAL_OPEN_OPTIONS]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for OpenOptions { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr<'_>) { if let ExprKind::MethodCall(ref path, _, ref arguments, _) = e.kind { - let obj_ty = walk_ptrs_ty(cx.tables.expr_ty(&arguments[0])); + let obj_ty = walk_ptrs_ty(cx.tables().expr_ty(&arguments[0])); if path.ident.name == sym!(open) && match_type(cx, obj_ty, &paths::OPEN_OPTIONS) { let mut options = Vec::new(); get_open_options(cx, &arguments[0], &mut options); @@ -58,7 +58,7 @@ enum OpenOption { fn get_open_options(cx: &LateContext<'_, '_>, argument: &Expr<'_>, options: &mut Vec<(OpenOption, Argument)>) { if let ExprKind::MethodCall(ref path, _, ref arguments, _) = argument.kind { - let obj_ty = walk_ptrs_ty(cx.tables.expr_ty(&arguments[0])); + let obj_ty = walk_ptrs_ty(cx.tables().expr_ty(&arguments[0])); // Only proceed if this is a call on some object of type std::fs::OpenOptions if match_type(cx, obj_ty, &paths::OPEN_OPTIONS) && arguments.len() >= 2 { diff --git a/src/tools/clippy/clippy_lints/src/overflow_check_conditional.rs b/src/tools/clippy/clippy_lints/src/overflow_check_conditional.rs index b90fdc232e72c..5984b09120d0e 100644 --- a/src/tools/clippy/clippy_lints/src/overflow_check_conditional.rs +++ b/src/tools/clippy/clippy_lints/src/overflow_check_conditional.rs @@ -36,8 +36,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for OverflowCheckConditional { if let ExprKind::Path(QPath::Resolved(_, ref path2)) = ident2.kind; if let ExprKind::Path(QPath::Resolved(_, ref path3)) = second.kind; if eq(&path1.segments[0], &path3.segments[0]) || eq(&path2.segments[0], &path3.segments[0]); - if cx.tables.expr_ty(ident1).is_integral(); - if cx.tables.expr_ty(ident2).is_integral(); + if cx.tables().expr_ty(ident1).is_integral(); + if cx.tables().expr_ty(ident2).is_integral(); then { if let BinOpKind::Lt = op.node { if let BinOpKind::Add = op2.node { @@ -61,8 +61,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for OverflowCheckConditional { if let ExprKind::Path(QPath::Resolved(_, ref path2)) = ident2.kind; if let ExprKind::Path(QPath::Resolved(_, ref path3)) = first.kind; if eq(&path1.segments[0], &path3.segments[0]) || eq(&path2.segments[0], &path3.segments[0]); - if cx.tables.expr_ty(ident1).is_integral(); - if cx.tables.expr_ty(ident2).is_integral(); + if cx.tables().expr_ty(ident1).is_integral(); + if cx.tables().expr_ty(ident2).is_integral(); then { if let BinOpKind::Gt = op.node { if let BinOpKind::Add = op2.node { diff --git a/src/tools/clippy/clippy_lints/src/path_buf_push_overwrite.rs b/src/tools/clippy/clippy_lints/src/path_buf_push_overwrite.rs index 88ad1e0914f25..f26a5258782a7 100644 --- a/src/tools/clippy/clippy_lints/src/path_buf_push_overwrite.rs +++ b/src/tools/clippy/clippy_lints/src/path_buf_push_overwrite.rs @@ -46,7 +46,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for PathBufPushOverwrite { if let ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind; if path.ident.name == sym!(push); if args.len() == 2; - if match_type(cx, walk_ptrs_ty(cx.tables.expr_ty(&args[0])), &paths::PATH_BUF); + if match_type(cx, walk_ptrs_ty(cx.tables().expr_ty(&args[0])), &paths::PATH_BUF); if let Some(get_index_arg) = args.get(1); if let ExprKind::Lit(ref lit) = get_index_arg.kind; if let LitKind::Str(ref path_lit, _) = lit.node; diff --git a/src/tools/clippy/clippy_lints/src/ptr_offset_with_cast.rs b/src/tools/clippy/clippy_lints/src/ptr_offset_with_cast.rs index d23d7e59b73fc..b35a7e64bff27 100644 --- a/src/tools/clippy/clippy_lints/src/ptr_offset_with_cast.rs +++ b/src/tools/clippy/clippy_lints/src/ptr_offset_with_cast.rs @@ -105,12 +105,12 @@ fn expr_as_ptr_offset_call<'a, 'tcx>( // Is the type of the expression a usize? fn is_expr_ty_usize<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &Expr<'_>) -> bool { - cx.tables.expr_ty(expr) == cx.tcx.types.usize + cx.tables().expr_ty(expr) == cx.tcx.types.usize } // Is the type of the expression a raw pointer? fn is_expr_ty_raw_ptr<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &Expr<'_>) -> bool { - cx.tables.expr_ty(expr).is_unsafe_ptr() + cx.tables().expr_ty(expr).is_unsafe_ptr() } fn build_suggestion<'a, 'tcx>( diff --git a/src/tools/clippy/clippy_lints/src/question_mark.rs b/src/tools/clippy/clippy_lints/src/question_mark.rs index d8a73f8054bca..4a6395da01c99 100644 --- a/src/tools/clippy/clippy_lints/src/question_mark.rs +++ b/src/tools/clippy/clippy_lints/src/question_mark.rs @@ -135,13 +135,13 @@ impl QuestionMark { } fn moves_by_default(cx: &LateContext<'_, '_>, expression: &Expr<'_>) -> bool { - let expr_ty = cx.tables.expr_ty(expression); + let expr_ty = cx.tables().expr_ty(expression); !expr_ty.is_copy_modulo_regions(cx.tcx.at(expression.span), cx.param_env) } fn is_option(cx: &LateContext<'_, '_>, expression: &Expr<'_>) -> bool { - let expr_ty = cx.tables.expr_ty(expression); + let expr_ty = cx.tables().expr_ty(expression); is_type_diagnostic_item(cx, expr_ty, sym!(option_type)) } @@ -158,7 +158,7 @@ impl QuestionMark { ExprKind::Ret(Some(ref expr)) => Self::expression_returns_none(cx, expr), ExprKind::Path(ref qp) => { if let Res::Def(DefKind::Ctor(def::CtorOf::Variant, def::CtorKind::Const), def_id) = - cx.tables.qpath_res(qp, expression.hir_id) + cx.tables().qpath_res(qp, expression.hir_id) { return match_def_path(cx, def_id, &paths::OPTION_NONE); } diff --git a/src/tools/clippy/clippy_lints/src/ranges.rs b/src/tools/clippy/clippy_lints/src/ranges.rs index fcd02a196e7bf..43ef236a92420 100644 --- a/src/tools/clippy/clippy_lints/src/ranges.rs +++ b/src/tools/clippy/clippy_lints/src/ranges.rs @@ -272,10 +272,10 @@ fn check_reversed_empty_range(cx: &LateContext<'_, '_>, expr: &Expr<'_>) { if_chain! { if let Some(higher::Range { start: Some(start), end: Some(end), limits }) = higher::range(cx, expr); - let ty = cx.tables.expr_ty(start); + let ty = cx.tables().expr_ty(start); if let ty::Int(_) | ty::Uint(_) = ty.kind; - if let Some((start_idx, _)) = constant(cx, cx.tables, start); - if let Some((end_idx, _)) = constant(cx, cx.tables, end); + if let Some((start_idx, _)) = constant(cx, cx.tables(), start); + if let Some((end_idx, _)) = constant(cx, cx.tables(), end); if let Some(ordering) = Constant::partial_cmp(cx.tcx, ty, &start_idx, &end_idx); if is_empty_range(limits, ordering); then { diff --git a/src/tools/clippy/clippy_lints/src/regex.rs b/src/tools/clippy/clippy_lints/src/regex.rs index a2c35c4267344..9c54c3cbac02b 100644 --- a/src/tools/clippy/clippy_lints/src/regex.rs +++ b/src/tools/clippy/clippy_lints/src/regex.rs @@ -82,7 +82,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Regex { if_chain! { if self.last.is_none(); if let Some(ref expr) = block.expr; - if match_type(cx, cx.tables.expr_ty(expr), &paths::REGEX); + if match_type(cx, cx.tables().expr_ty(expr), &paths::REGEX); if let Some(span) = is_expn_of(expr.span, "regex"); then { if !self.spans.contains(&span) { @@ -111,7 +111,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Regex { if let ExprKind::Call(ref fun, ref args) = expr.kind; if let ExprKind::Path(ref qpath) = fun.kind; if args.len() == 1; - if let Some(def_id) = cx.tables.qpath_res(qpath, fun.hir_id).opt_def_id(); + if let Some(def_id) = cx.tables().qpath_res(qpath, fun.hir_id).opt_def_id(); then { if match_def_path(cx, def_id, &paths::REGEX_NEW) || match_def_path(cx, def_id, &paths::REGEX_BUILDER_NEW) { @@ -140,7 +140,7 @@ fn str_span(base: Span, c: regex_syntax::ast::Span, offset: u16) -> Span { } fn const_str<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, e: &'tcx Expr<'_>) -> Option { - constant(cx, cx.tables, e).and_then(|(c, _)| match c { + constant(cx, cx.tables(), e).and_then(|(c, _)| match c { Constant::Str(s) => Some(s), _ => None, }) diff --git a/src/tools/clippy/clippy_lints/src/shadow.rs b/src/tools/clippy/clippy_lints/src/shadow.rs index 68c36f9189184..4780249bcb8e3 100644 --- a/src/tools/clippy/clippy_lints/src/shadow.rs +++ b/src/tools/clippy/clippy_lints/src/shadow.rs @@ -164,7 +164,7 @@ fn check_local<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, local: &'tcx Local<'_>, bin } fn is_binding(cx: &LateContext<'_, '_>, pat_id: HirId) -> bool { - let var_ty = cx.tables.node_type_opt(pat_id); + let var_ty = cx.tables().node_type_opt(pat_id); if let Some(var_ty) = var_ty { match var_ty.kind { ty::Adt(..) => false, diff --git a/src/tools/clippy/clippy_lints/src/strings.rs b/src/tools/clippy/clippy_lints/src/strings.rs index d8e4bff3d702a..ef66850358e57 100644 --- a/src/tools/clippy/clippy_lints/src/strings.rs +++ b/src/tools/clippy/clippy_lints/src/strings.rs @@ -134,7 +134,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for StringAdd { } fn is_string(cx: &LateContext<'_, '_>, e: &Expr<'_>) -> bool { - is_type_diagnostic_item(cx, walk_ptrs_ty(cx.tables.expr_ty(e)), sym!(string_type)) + is_type_diagnostic_item(cx, walk_ptrs_ty(cx.tables().expr_ty(e)), sym!(string_type)) } fn is_add(cx: &LateContext<'_, '_>, src: &Expr<'_>, target: &Expr<'_>) -> bool { diff --git a/src/tools/clippy/clippy_lints/src/swap.rs b/src/tools/clippy/clippy_lints/src/swap.rs index c52e6a643f2a2..7fdc872c01f54 100644 --- a/src/tools/clippy/clippy_lints/src/swap.rs +++ b/src/tools/clippy/clippy_lints/src/swap.rs @@ -194,7 +194,7 @@ fn check_for_slice<'a>(cx: &LateContext<'_, '_>, lhs1: &'a Expr<'_>, lhs2: &'a E if let ExprKind::Index(ref lhs1, ref idx1) = lhs1.kind { if let ExprKind::Index(ref lhs2, ref idx2) = lhs2.kind { if SpanlessEq::new(cx).ignore_fn().eq_expr(lhs1, lhs2) { - let ty = walk_ptrs_ty(cx.tables.expr_ty(lhs1)); + let ty = walk_ptrs_ty(cx.tables().expr_ty(lhs1)); if matches!(ty.kind, ty::Slice(_)) || matches!(ty.kind, ty::Array(_, _)) diff --git a/src/tools/clippy/clippy_lints/src/temporary_assignment.rs b/src/tools/clippy/clippy_lints/src/temporary_assignment.rs index bbb883aaf3287..f2bbf19bea92f 100644 --- a/src/tools/clippy/clippy_lints/src/temporary_assignment.rs +++ b/src/tools/clippy/clippy_lints/src/temporary_assignment.rs @@ -26,7 +26,7 @@ fn is_temporary(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { match &expr.kind { ExprKind::Struct(..) | ExprKind::Tup(..) => true, ExprKind::Path(qpath) => { - if let Res::Def(DefKind::Const, ..) = cx.tables.qpath_res(qpath, expr.hir_id) { + if let Res::Def(DefKind::Const, ..) = cx.tables().qpath_res(qpath, expr.hir_id) { true } else { false diff --git a/src/tools/clippy/clippy_lints/src/to_digit_is_some.rs b/src/tools/clippy/clippy_lints/src/to_digit_is_some.rs index 4f132c6db76fa..1efba3580fef0 100644 --- a/src/tools/clippy/clippy_lints/src/to_digit_is_some.rs +++ b/src/tools/clippy/clippy_lints/src/to_digit_is_some.rs @@ -43,7 +43,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ToDigitIsSome { if_chain! { if let [char_arg, radix_arg] = &**to_digit_args; if to_digits_path.ident.name.as_str() == "to_digit"; - let char_arg_ty = cx.tables.expr_ty_adjusted(char_arg); + let char_arg_ty = cx.tables().expr_ty_adjusted(char_arg); if char_arg_ty.kind == ty::Char; then { Some((true, char_arg, radix_arg)) @@ -56,7 +56,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ToDigitIsSome { if_chain! { if let [char_arg, radix_arg] = &**to_digit_args; if let hir::ExprKind::Path(to_digits_path) = &to_digits_call.kind; - if let to_digits_call_res = cx.tables.qpath_res(to_digits_path, to_digits_call.hir_id); + if let to_digits_call_res = cx.tables().qpath_res(to_digits_path, to_digits_call.hir_id); if let Some(to_digits_def_id) = to_digits_call_res.opt_def_id(); if match_def_path(cx, to_digits_def_id, &["core", "char", "methods", "", "to_digit"]); then { diff --git a/src/tools/clippy/clippy_lints/src/trait_bounds.rs b/src/tools/clippy/clippy_lints/src/trait_bounds.rs index 67121729663c6..1b233b8302f93 100644 --- a/src/tools/clippy/clippy_lints/src/trait_bounds.rs +++ b/src/tools/clippy/clippy_lints/src/trait_bounds.rs @@ -37,7 +37,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TraitBounds { return; } let hash = |ty| -> u64 { - let mut hasher = SpanlessHash::new(cx, cx.tables); + let mut hasher = SpanlessHash::new(cx, cx.tables()); hasher.hash_ty(ty); hasher.finish() }; diff --git a/src/tools/clippy/clippy_lints/src/transmute.rs b/src/tools/clippy/clippy_lints/src/transmute.rs index 1869638f6ffb1..9b1344949470a 100644 --- a/src/tools/clippy/clippy_lints/src/transmute.rs +++ b/src/tools/clippy/clippy_lints/src/transmute.rs @@ -299,11 +299,11 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Transmute { if_chain! { if let ExprKind::Call(ref path_expr, ref args) = e.kind; if let ExprKind::Path(ref qpath) = path_expr.kind; - if let Some(def_id) = cx.tables.qpath_res(qpath, path_expr.hir_id).opt_def_id(); + if let Some(def_id) = cx.tables().qpath_res(qpath, path_expr.hir_id).opt_def_id(); if match_def_path(cx, def_id, &paths::TRANSMUTE); then { - let from_ty = cx.tables.expr_ty(&args[0]); - let to_ty = cx.tables.expr_ty(e); + let from_ty = cx.tables().expr_ty(&args[0]); + let to_ty = cx.tables().expr_ty(e); match (&from_ty.kind, &to_ty.kind) { _ if from_ty == to_ty => span_lint( diff --git a/src/tools/clippy/clippy_lints/src/transmuting_null.rs b/src/tools/clippy/clippy_lints/src/transmuting_null.rs index 1d0332c580500..3351488a45c4d 100644 --- a/src/tools/clippy/clippy_lints/src/transmuting_null.rs +++ b/src/tools/clippy/clippy_lints/src/transmuting_null.rs @@ -44,7 +44,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TransmutingNull { then { // Catching transmute over constants that resolve to `null`. - let mut const_eval_context = constant_context(cx, cx.tables); + let mut const_eval_context = constant_context(cx, cx.tables()); if_chain! { if let ExprKind::Path(ref _qpath) = args[0].kind; let x = const_eval_context.expr(&args[0]); diff --git a/src/tools/clippy/clippy_lints/src/try_err.rs b/src/tools/clippy/clippy_lints/src/try_err.rs index 7018fa6804ba7..e129dd84d15a6 100644 --- a/src/tools/clippy/clippy_lints/src/try_err.rs +++ b/src/tools/clippy/clippy_lints/src/try_err.rs @@ -68,7 +68,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TryErr { if let Some(return_type) = find_err_return_type(cx, &expr.kind); then { - let err_type = cx.tables.expr_ty(err_arg); + let err_type = cx.tables().expr_ty(err_arg); let origin_snippet = if err_arg.span.from_expansion() { snippet_with_macro_callsite(cx, err_arg.span, "_") } else { @@ -114,7 +114,7 @@ fn find_err_return_type_arm<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, arm: &'tcx Arm if match_qpath(from_error_fn, &paths::TRY_FROM_ERROR); if let Some(from_error_arg) = from_error_args.get(0); then { - Some(cx.tables.expr_ty(from_error_arg)) + Some(cx.tables().expr_ty(from_error_arg)) } else { None } diff --git a/src/tools/clippy/clippy_lints/src/types.rs b/src/tools/clippy/clippy_lints/src/types.rs index 98de08f79f3d7..ecfb6ee2a7de9 100644 --- a/src/tools/clippy/clippy_lints/src/types.rs +++ b/src/tools/clippy/clippy_lints/src/types.rs @@ -603,7 +603,7 @@ declare_lint_pass!(LetUnitValue => [LET_UNIT_VALUE]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for LetUnitValue { fn check_stmt(&mut self, cx: &LateContext<'a, 'tcx>, stmt: &'tcx Stmt<'_>) { if let StmtKind::Local(ref local) = stmt.kind { - if is_unit(cx.tables.pat_ty(&local.pat)) { + if is_unit(cx.tables().pat_ty(&local.pat)) { if in_external_macro(cx.sess(), stmt.span) || local.pat.span.from_expansion() { return; } @@ -688,7 +688,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnitCmp { if let ExpnKind::Macro(MacroKind::Bang, symbol) = callee.kind { if let ExprKind::Binary(ref cmp, ref left, _) = expr.kind { let op = cmp.node; - if op.is_comparison() && is_unit(cx.tables.expr_ty(left)) { + if op.is_comparison() && is_unit(cx.tables().expr_ty(left)) { let result = match &*symbol.as_str() { "assert_eq" | "debug_assert_eq" => "succeed", "assert_ne" | "debug_assert_ne" => "fail", @@ -712,7 +712,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnitCmp { } if let ExprKind::Binary(ref cmp, ref left, _) = expr.kind { let op = cmp.node; - if op.is_comparison() && is_unit(cx.tables.expr_ty(left)) { + if op.is_comparison() && is_unit(cx.tables().expr_ty(left)) { let result = match op { BinOpKind::Eq | BinOpKind::Le | BinOpKind::Ge => "true", _ => "false", @@ -782,7 +782,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnitArg { let args_to_recover = args .iter() .filter(|arg| { - if is_unit(cx.tables.expr_ty(arg)) && !is_unit_literal(arg) { + if is_unit(cx.tables().expr_ty(arg)) && !is_unit_literal(arg) { if let ExprKind::Match(.., MatchSource::TryDesugar) = &arg.kind { false } else { @@ -1250,7 +1250,7 @@ fn check_loss_of_sign(cx: &LateContext<'_, '_>, expr: &Expr<'_>, op: &Expr<'_>, } // don't lint for positive constants - let const_val = constant(cx, &cx.tables, op); + let const_val = constant(cx, &cx.tables(), op); if_chain! { if let Some((const_val, _)) = const_val; if let Constant::Int(n) = const_val; @@ -1416,7 +1416,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Casts { return; } if let ExprKind::Cast(ref ex, _) = expr.kind { - let (cast_from, cast_to) = (cx.tables.expr_ty(ex), cx.tables.expr_ty(expr)); + let (cast_from, cast_to) = (cx.tables().expr_ty(ex), cx.tables().expr_ty(expr)); lint_fn_to_numeric_cast(cx, expr, ex, cast_from, cast_to); if let ExprKind::Lit(ref lit) = ex.kind { if_chain! { @@ -1804,7 +1804,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for CharLitAsU8 { if let ExprKind::Cast(e, _) = &expr.kind; if let ExprKind::Lit(l) = &e.kind; if let LitKind::Char(c) = l.node; - if ty::Uint(UintTy::U8) == cx.tables.expr_ty(expr).kind; + if ty::Uint(UintTy::U8) == cx.tables().expr_ty(expr).kind; then { let mut applicability = Applicability::MachineApplicable; let snippet = snippet_with_applicability(cx, e.span, "'x'", &mut applicability); @@ -1880,8 +1880,8 @@ enum AbsurdComparisonResult { fn is_cast_between_fixed_and_target<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'tcx>) -> bool { if let ExprKind::Cast(ref cast_exp, _) = expr.kind { - let precast_ty = cx.tables.expr_ty(cast_exp); - let cast_ty = cx.tables.expr_ty(expr); + let precast_ty = cx.tables().expr_ty(cast_exp); + let cast_ty = cx.tables().expr_ty(expr); return is_isize_or_usize(precast_ty) != is_isize_or_usize(cast_ty); } @@ -1901,7 +1901,7 @@ fn detect_absurd_comparison<'a, 'tcx>( // absurd comparison only makes sense on primitive types // primitive types don't implement comparison operators with each other - if cx.tables.expr_ty(lhs) != cx.tables.expr_ty(rhs) { + if cx.tables().expr_ty(lhs) != cx.tables().expr_ty(rhs) { return None; } @@ -1939,9 +1939,9 @@ fn detect_absurd_comparison<'a, 'tcx>( fn detect_extreme_expr<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) -> Option> { use crate::types::ExtremeType::{Maximum, Minimum}; - let ty = cx.tables.expr_ty(expr); + let ty = cx.tables().expr_ty(expr); - let cv = constant(cx, cx.tables, expr)?.0; + let cv = constant(cx, cx.tables(), expr)?.0; let which = match (&ty.kind, cv) { (&ty::Bool, Constant::Bool(false)) | (&ty::Uint(_), Constant::Int(0)) => Minimum, @@ -2071,8 +2071,8 @@ impl Ord for FullInt { fn numeric_cast_precast_bounds<'a>(cx: &LateContext<'_, '_>, expr: &'a Expr<'_>) -> Option<(FullInt, FullInt)> { if let ExprKind::Cast(ref cast_exp, _) = expr.kind { - let pre_cast_ty = cx.tables.expr_ty(cast_exp); - let cast_ty = cx.tables.expr_ty(expr); + let pre_cast_ty = cx.tables().expr_ty(cast_exp); + let cast_ty = cx.tables().expr_ty(expr); // if it's a cast from i32 to u32 wrapping will invalidate all these checks if cx.layout_of(pre_cast_ty).ok().map(|l| l.size) == cx.layout_of(cast_ty).ok().map(|l| l.size) { return None; @@ -2102,9 +2102,9 @@ fn numeric_cast_precast_bounds<'a>(cx: &LateContext<'_, '_>, expr: &'a Expr<'_>) } fn node_as_const_fullint<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) -> Option { - let val = constant(cx, cx.tables, expr)?.0; + let val = constant(cx, cx.tables(), expr)?.0; if let Constant::Int(const_int) = val { - match cx.tables.expr_ty(expr).kind { + match cx.tables().expr_ty(expr).kind { ty::Int(ity) => Some(FullInt::S(sext(cx.tcx, const_int, ity))), ty::Uint(_) => Some(FullInt::U(const_int)), _ => None, @@ -2499,7 +2499,7 @@ impl<'a, 'b, 'tcx> ImplicitHasherConstructorVisitor<'a, 'b, 'tcx> { fn new(cx: &'a LateContext<'a, 'tcx>, target: &'b ImplicitHasherType<'tcx>) -> Self { Self { cx, - body: cx.tables, + body: cx.tables(), target, suggestions: BTreeMap::new(), } @@ -2608,7 +2608,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for RefToMut { if let TyKind::Ptr(MutTy { mutbl: Mutability::Mut, .. }) = t.kind; if let ExprKind::Cast(e, t) = &e.kind; if let TyKind::Ptr(MutTy { mutbl: Mutability::Not, .. }) = t.kind; - if let ty::Ref(..) = cx.tables.node_type(e.hir_id).kind; + if let ty::Ref(..) = cx.tables().node_type(e.hir_id).kind; then { span_lint( cx, diff --git a/src/tools/clippy/clippy_lints/src/unnamed_address.rs b/src/tools/clippy/clippy_lints/src/unnamed_address.rs index 4e077b95b5c68..53e47f09ae55c 100644 --- a/src/tools/clippy/clippy_lints/src/unnamed_address.rs +++ b/src/tools/clippy/clippy_lints/src/unnamed_address.rs @@ -65,14 +65,14 @@ impl LateLintPass<'_, '_> for UnnamedAddress { } fn is_trait_ptr(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { - match cx.tables.expr_ty_adjusted(expr).kind { + match cx.tables().expr_ty_adjusted(expr).kind { ty::RawPtr(ty::TypeAndMut { ty, .. }) => ty.is_trait(), _ => false, } } fn is_fn_def(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { - if let ty::FnDef(..) = cx.tables.expr_ty(expr).kind { + if let ty::FnDef(..) = cx.tables().expr_ty(expr).kind { true } else { false @@ -98,11 +98,11 @@ impl LateLintPass<'_, '_> for UnnamedAddress { if_chain! { if let ExprKind::Call(ref func, [ref _left, ref _right]) = expr.kind; if let ExprKind::Path(ref func_qpath) = func.kind; - if let Some(def_id) = cx.tables.qpath_res(func_qpath, func.hir_id).opt_def_id(); + if let Some(def_id) = cx.tables().qpath_res(func_qpath, func.hir_id).opt_def_id(); if match_def_path(cx, def_id, &paths::PTR_EQ) || match_def_path(cx, def_id, &paths::RC_PTR_EQ) || match_def_path(cx, def_id, &paths::ARC_PTR_EQ); - let ty_param = cx.tables.node_substs(func.hir_id).type_at(0); + let ty_param = cx.tables().node_substs(func.hir_id).type_at(0); if ty_param.is_trait(); then { span_lint_and_help( @@ -119,8 +119,8 @@ impl LateLintPass<'_, '_> for UnnamedAddress { if_chain! { if let ExprKind::Binary(binop, ref left, ref right) = expr.kind; if is_comparison(binop.node); - if cx.tables.expr_ty_adjusted(left).is_fn_ptr() && - cx.tables.expr_ty_adjusted(right).is_fn_ptr(); + if cx.tables().expr_ty_adjusted(left).is_fn_ptr() && + cx.tables().expr_ty_adjusted(right).is_fn_ptr(); if is_fn_def(cx, left) || is_fn_def(cx, right); then { span_lint( diff --git a/src/tools/clippy/clippy_lints/src/unnecessary_sort_by.rs b/src/tools/clippy/clippy_lints/src/unnecessary_sort_by.rs index 6ac6a12529c86..bb68e50b33195 100644 --- a/src/tools/clippy/clippy_lints/src/unnecessary_sort_by.rs +++ b/src/tools/clippy/clippy_lints/src/unnecessary_sort_by.rs @@ -177,7 +177,7 @@ fn detect_lint(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> Option if let name = name_ident.ident.name.to_ident_string(); if name == "sort_by" || name == "sort_unstable_by"; if let [vec, Expr { kind: ExprKind::Closure(_, _, closure_body_id, _, _), .. }] = args; - if utils::match_type(cx, &cx.tables.expr_ty(vec), &paths::VEC); + if utils::match_type(cx, &cx.tables().expr_ty(vec), &paths::VEC); if let closure_body = cx.tcx.hir().body(*closure_body_id); if let &[ Param { pat: Pat { kind: PatKind::Binding(_, _, left_ident, _), .. }, ..}, diff --git a/src/tools/clippy/clippy_lints/src/unwrap.rs b/src/tools/clippy/clippy_lints/src/unwrap.rs index a6c7b5d405cda..be55982f90556 100644 --- a/src/tools/clippy/clippy_lints/src/unwrap.rs +++ b/src/tools/clippy/clippy_lints/src/unwrap.rs @@ -114,7 +114,7 @@ fn collect_unwrap_info<'a, 'tcx>( if_chain! { if let ExprKind::MethodCall(method_name, _, args, _) = &expr.kind; if let ExprKind::Path(QPath::Resolved(None, path)) = &args[0].kind; - let ty = cx.tables.expr_ty(&args[0]); + let ty = cx.tables().expr_ty(&args[0]); let name = method_name.ident.as_str(); if is_relevant_option_call(cx, ty, &name) || is_relevant_result_call(cx, ty, &name); then { diff --git a/src/tools/clippy/clippy_lints/src/useless_conversion.rs b/src/tools/clippy/clippy_lints/src/useless_conversion.rs index 78d249482d53d..5d150ad4f03e4 100644 --- a/src/tools/clippy/clippy_lints/src/useless_conversion.rs +++ b/src/tools/clippy/clippy_lints/src/useless_conversion.rs @@ -63,8 +63,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UselessConversion { ExprKind::MethodCall(ref name, .., ref args, _) => { if match_trait_method(cx, e, &paths::INTO) && &*name.ident.as_str() == "into" { - let a = cx.tables.expr_ty(e); - let b = cx.tables.expr_ty(&args[0]); + let a = cx.tables().expr_ty(e); + let b = cx.tables().expr_ty(&args[0]); if TyS::same_type(a, b) { let sugg = snippet_with_macro_callsite(cx, args[0].span, "").to_string(); span_lint_and_sugg( @@ -79,8 +79,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UselessConversion { } } if match_trait_method(cx, e, &paths::INTO_ITERATOR) && &*name.ident.as_str() == "into_iter" { - let a = cx.tables.expr_ty(e); - let b = cx.tables.expr_ty(&args[0]); + let a = cx.tables().expr_ty(e); + let b = cx.tables().expr_ty(&args[0]); if TyS::same_type(a, b) { let sugg = snippet(cx, args[0].span, "").into_owned(); span_lint_and_sugg( @@ -96,8 +96,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UselessConversion { } if match_trait_method(cx, e, &paths::TRY_INTO_TRAIT) && &*name.ident.as_str() == "try_into" { if_chain! { - let a = cx.tables.expr_ty(e); - let b = cx.tables.expr_ty(&args[0]); + let a = cx.tables().expr_ty(e); + let b = cx.tables().expr_ty(&args[0]); if is_type_diagnostic_item(cx, a, sym!(result_type)); if let ty::Adt(_, substs) = a.kind; if let Some(a_type) = substs.types().next(); @@ -121,9 +121,9 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UselessConversion { if_chain! { if args.len() == 1; if let ExprKind::Path(ref qpath) = path.kind; - if let Some(def_id) = cx.tables.qpath_res(qpath, path.hir_id).opt_def_id(); - let a = cx.tables.expr_ty(e); - let b = cx.tables.expr_ty(&args[0]); + if let Some(def_id) = cx.tables().qpath_res(qpath, path.hir_id).opt_def_id(); + let a = cx.tables().expr_ty(e); + let b = cx.tables().expr_ty(&args[0]); then { if_chain! { diff --git a/src/tools/clippy/clippy_lints/src/utils/higher.rs b/src/tools/clippy/clippy_lints/src/utils/higher.rs index 33fba7df8d336..0e78f35a1290a 100644 --- a/src/tools/clippy/clippy_lints/src/utils/higher.rs +++ b/src/tools/clippy/clippy_lints/src/utils/higher.rs @@ -56,7 +56,7 @@ pub fn range<'a, 'b, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'b hir::Expr<'_>) Some(expr) } - let def_path = match cx.tables.expr_ty(expr).kind { + let def_path = match cx.tables().expr_ty(expr).kind { ty::Adt(def, _) => cx.tcx.def_path(def.did), _ => return None, }; @@ -262,7 +262,7 @@ pub fn vec_macro<'e>(cx: &LateContext<'_, '_>, expr: &'e hir::Expr<'_>) -> Optio if let hir::ExprKind::Call(ref fun, ref args) = expr.kind; if let hir::ExprKind::Path(ref qpath) = fun.kind; if is_expn_of(fun.span, "vec").is_some(); - if let Some(fun_def_id) = cx.tables.qpath_res(qpath, fun.hir_id).opt_def_id(); + if let Some(fun_def_id) = cx.tables().qpath_res(qpath, fun.hir_id).opt_def_id(); then { return if match_def_path(cx, fun_def_id, &paths::VEC_FROM_ELEM) && args.len() == 2 { // `vec![elem; size]` case diff --git a/src/tools/clippy/clippy_lints/src/utils/hir_utils.rs b/src/tools/clippy/clippy_lints/src/utils/hir_utils.rs index 9a9aa3f94eb4b..a74ab18a063b2 100644 --- a/src/tools/clippy/clippy_lints/src/utils/hir_utils.rs +++ b/src/tools/clippy/clippy_lints/src/utils/hir_utils.rs @@ -32,7 +32,7 @@ impl<'a, 'tcx> SpanlessEq<'a, 'tcx> { pub fn new(cx: &'a LateContext<'a, 'tcx>) -> Self { Self { cx, - tables: cx.tables, + tables: cx.tables(), ignore_fn: false, } } @@ -40,7 +40,7 @@ impl<'a, 'tcx> SpanlessEq<'a, 'tcx> { pub fn ignore_fn(self) -> Self { Self { cx: self.cx, - tables: self.cx.tables, + tables: self.cx.tables(), ignore_fn: true, } } diff --git a/src/tools/clippy/clippy_lints/src/utils/inspector.rs b/src/tools/clippy/clippy_lints/src/utils/inspector.rs index afde971f9df4e..3f5659c3d8c0f 100644 --- a/src/tools/clippy/clippy_lints/src/utils/inspector.rs +++ b/src/tools/clippy/clippy_lints/src/utils/inspector.rs @@ -114,7 +114,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for DeepCodeInspector { } match stmt.kind { hir::StmtKind::Local(ref local) => { - println!("local variable of type {}", cx.tables.node_type(local.hir_id)); + println!("local variable of type {}", cx.tables().node_type(local.hir_id)); println!("pattern:"); print_pat(cx, &local.pat, 0); if let Some(ref e) = local.init { @@ -144,8 +144,8 @@ fn has_attr(sess: &Session, attrs: &[Attribute]) -> bool { fn print_expr(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>, indent: usize) { let ind = " ".repeat(indent); println!("{}+", ind); - println!("{}ty: {}", ind, cx.tables.expr_ty(expr)); - println!("{}adjustments: {:?}", ind, cx.tables.adjustments().get(expr.hir_id)); + println!("{}ty: {}", ind, cx.tables().expr_ty(expr)); + println!("{}adjustments: {:?}", ind, cx.tables().adjustments().get(expr.hir_id)); match expr.kind { hir::ExprKind::Box(ref e) => { println!("{}Box", ind); diff --git a/src/tools/clippy/clippy_lints/src/utils/internal_lints.rs b/src/tools/clippy/clippy_lints/src/utils/internal_lints.rs index 89e2bcdd7935d..38468181d0261 100644 --- a/src/tools/clippy/clippy_lints/src/utils/internal_lints.rs +++ b/src/tools/clippy/clippy_lints/src/utils/internal_lints.rs @@ -347,7 +347,7 @@ fn is_lint_ref_type<'tcx>(cx: &LateContext<'_, 'tcx>, ty: &Ty<'_>) -> bool { ) = ty.kind { if let TyKind::Path(ref path) = inner.kind { - if let Res::Def(DefKind::Struct, def_id) = cx.tables.qpath_res(path, inner.hir_id) { + if let Res::Def(DefKind::Struct, def_id) = cx.tables().qpath_res(path, inner.hir_id) { return match_def_path(cx, def_id, &paths::LINT); } } @@ -405,7 +405,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for CompilerLintFunctions { if let ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind; let fn_name = path.ident; if let Some(sugg) = self.map.get(&*fn_name.as_str()); - let ty = walk_ptrs_ty(cx.tables.expr_ty(&args[0])); + let ty = walk_ptrs_ty(cx.tables().expr_ty(&args[0])); if match_type(cx, ty, &paths::EARLY_CONTEXT) || match_type(cx, ty, &paths::LATE_CONTEXT); then { @@ -438,7 +438,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for OuterExpnDataPass { let args = arg_lists[1]; if args.len() == 1; let self_arg = &args[0]; - let self_ty = walk_ptrs_ty(cx.tables.expr_ty(self_arg)); + let self_ty = walk_ptrs_ty(cx.tables().expr_ty(self_arg)); if match_type(cx, self_ty, &paths::SYNTAX_CONTEXT); then { span_lint_and_sugg( diff --git a/src/tools/clippy/clippy_lints/src/utils/mod.rs b/src/tools/clippy/clippy_lints/src/utils/mod.rs index 6d4c6c6ce1cea..69ec4b7ad6d18 100644 --- a/src/tools/clippy/clippy_lints/src/utils/mod.rs +++ b/src/tools/clippy/clippy_lints/src/utils/mod.rs @@ -151,7 +151,7 @@ pub fn is_type_diagnostic_item(cx: &LateContext<'_, '_>, ty: Ty<'_>, diag_item: /// Checks if the method call given in `expr` belongs to the given trait. pub fn match_trait_method(cx: &LateContext<'_, '_>, expr: &Expr<'_>, path: &[&str]) -> bool { - let def_id = cx.tables.type_dependent_def_id(expr.hir_id).unwrap(); + let def_id = cx.tables().type_dependent_def_id(expr.hir_id).unwrap(); let trt_id = cx.tcx.trait_of_item(def_id); if let Some(trt_id) = trt_id { match_def_path(cx, trt_id, path) @@ -824,7 +824,7 @@ pub fn is_integer_literal(expr: &Expr<'_>, value: u128) -> bool { /// See `rustc_middle::ty::adjustment::Adjustment` and `rustc_typeck::check::coercion` for more /// information on adjustments and coercions. pub fn is_adjusted(cx: &LateContext<'_, '_>, e: &Expr<'_>) -> bool { - cx.tables.adjustments().get(e.hir_id).is_some() + cx.tables().adjustments().get(e.hir_id).is_some() } /// Returns the pre-expansion span if is this comes from an expansion of the @@ -898,7 +898,7 @@ pub fn is_copy<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, ty: Ty<'tcx>) -> bool { pub fn is_ctor_or_promotable_const_function(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool { if let ExprKind::Call(ref fun, _) = expr.kind { if let ExprKind::Path(ref qp) = fun.kind { - let res = cx.tables.qpath_res(qp, fun.hir_id); + let res = cx.tables().qpath_res(qp, fun.hir_id); return match res { def::Res::Def(DefKind::Variant | DefKind::Ctor(..), ..) => true, def::Res::Def(_, def_id) => cx.tcx.is_promotable_const_fn(def_id), @@ -914,7 +914,7 @@ pub fn is_ctor_or_promotable_const_function(cx: &LateContext<'_, '_>, expr: &Exp pub fn is_refutable(cx: &LateContext<'_, '_>, pat: &Pat<'_>) -> bool { fn is_enum_variant(cx: &LateContext<'_, '_>, qpath: &QPath<'_>, id: HirId) -> bool { matches!( - cx.tables.qpath_res(qpath, id), + cx.tables().qpath_res(qpath, id), def::Res::Def(DefKind::Variant, ..) | Res::Def(DefKind::Ctor(def::CtorOf::Variant, _), _) ) } @@ -941,7 +941,7 @@ pub fn is_refutable(cx: &LateContext<'_, '_>, pat: &Pat<'_>) -> bool { is_enum_variant(cx, qpath, pat.hir_id) || are_refutable(cx, pats.iter().map(|pat| &**pat)) }, PatKind::Slice(ref head, ref middle, ref tail) => { - match &cx.tables.node_type(pat.hir_id).kind { + match &cx.tables().node_type(pat.hir_id).kind { ty::Slice(..) => { // [..] is the only irrefutable slice pattern. !head.is_empty() || middle.is_none() || !tail.is_empty() @@ -1190,7 +1190,7 @@ pub fn match_function_call<'a, 'tcx>( if_chain! { if let ExprKind::Call(ref fun, ref args) = expr.kind; if let ExprKind::Path(ref qpath) = fun.kind; - if let Some(fun_def_id) = cx.tables.qpath_res(qpath, fun.hir_id).opt_def_id(); + if let Some(fun_def_id) = cx.tables().qpath_res(qpath, fun.hir_id).opt_def_id(); if match_def_path(cx, fun_def_id, path); then { return Some(&args) @@ -1317,14 +1317,14 @@ pub fn is_must_use_func_call(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool let did = match expr.kind { ExprKind::Call(ref path, _) => if_chain! { if let ExprKind::Path(ref qpath) = path.kind; - if let def::Res::Def(_, did) = cx.tables.qpath_res(qpath, path.hir_id); + if let def::Res::Def(_, did) = cx.tables().qpath_res(qpath, path.hir_id); then { Some(did) } else { None } }, - ExprKind::MethodCall(_, _, _, _) => cx.tables.type_dependent_def_id(expr.hir_id), + ExprKind::MethodCall(_, _, _, _) => cx.tables().type_dependent_def_id(expr.hir_id), _ => None, }; diff --git a/src/tools/clippy/clippy_lints/src/utils/usage.rs b/src/tools/clippy/clippy_lints/src/utils/usage.rs index 0492878fc272f..d280fe4ab4e02 100644 --- a/src/tools/clippy/clippy_lints/src/utils/usage.rs +++ b/src/tools/clippy/clippy_lints/src/utils/usage.rs @@ -18,7 +18,7 @@ pub fn mutated_variables<'a, 'tcx>(expr: &'tcx Expr<'_>, cx: &'a LateContext<'a, }; let def_id = expr.hir_id.owner.to_def_id(); cx.tcx.infer_ctxt().enter(|infcx| { - ExprUseVisitor::new(&mut delegate, &infcx, def_id.expect_local(), cx.param_env, cx.tables).walk_expr(expr); + ExprUseVisitor::new(&mut delegate, &infcx, def_id.expect_local(), cx.param_env, cx.tables()).walk_expr(expr); }); if delegate.skip { diff --git a/src/tools/clippy/clippy_lints/src/vec.rs b/src/tools/clippy/clippy_lints/src/vec.rs index a8d4c7620b1ef..080785b177d65 100644 --- a/src/tools/clippy/clippy_lints/src/vec.rs +++ b/src/tools/clippy/clippy_lints/src/vec.rs @@ -37,7 +37,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UselessVec { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) { // search for `&vec![_]` expressions where the adjusted type is `&[_]` if_chain! { - if let ty::Ref(_, ty, _) = cx.tables.expr_ty_adjusted(expr).kind; + if let ty::Ref(_, ty, _) = cx.tables().expr_ty_adjusted(expr).kind; if let ty::Slice(..) = ty.kind; if let ExprKind::AddrOf(BorrowKind::Ref, _, ref addressee) = expr.kind; if let Some(vec_args) = higher::vec_macro(cx, addressee); @@ -50,7 +50,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UselessVec { if_chain! { if let Some((_, arg, _)) = higher::for_loop(expr); if let Some(vec_args) = higher::vec_macro(cx, arg); - if is_copy(cx, vec_type(cx.tables.expr_ty_adjusted(arg))); + if is_copy(cx, vec_type(cx.tables().expr_ty_adjusted(arg))); then { // report the error around the `vec!` not inside `:` let span = arg.span @@ -70,7 +70,7 @@ fn check_vec_macro<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, vec_args: &higher::VecA let mut applicability = Applicability::MachineApplicable; let snippet = match *vec_args { higher::VecArgs::Repeat(elem, len) => { - if constant(cx, cx.tables, len).is_some() { + if constant(cx, cx.tables(), len).is_some() { format!( "&[{}; {}]", snippet_with_applicability(cx, elem.span, "elem", &mut applicability), diff --git a/src/tools/clippy/clippy_lints/src/vec_resize_to_zero.rs b/src/tools/clippy/clippy_lints/src/vec_resize_to_zero.rs index 55758efa32e67..bb315e64e5de1 100644 --- a/src/tools/clippy/clippy_lints/src/vec_resize_to_zero.rs +++ b/src/tools/clippy/clippy_lints/src/vec_resize_to_zero.rs @@ -32,7 +32,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for VecResizeToZero { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'_>) { if_chain! { if let hir::ExprKind::MethodCall(path_segment, _, ref args, _) = expr.kind; - if let Some(method_def_id) = cx.tables.type_dependent_def_id(expr.hir_id); + if let Some(method_def_id) = cx.tables().type_dependent_def_id(expr.hir_id); if match_def_path(cx, method_def_id, &paths::VEC_RESIZE) && args.len() == 3; if let ExprKind::Lit(Spanned { node: LitKind::Int(0, _), .. }) = args[1].kind; if let ExprKind::Lit(Spanned { node: LitKind::Int(..), .. }) = args[2].kind; diff --git a/src/tools/clippy/clippy_lints/src/verbose_file_reads.rs b/src/tools/clippy/clippy_lints/src/verbose_file_reads.rs index 6d420d491c50f..85f9208457448 100644 --- a/src/tools/clippy/clippy_lints/src/verbose_file_reads.rs +++ b/src/tools/clippy/clippy_lints/src/verbose_file_reads.rs @@ -62,7 +62,7 @@ fn is_file_read_to_end<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'t if let ExprKind::MethodCall(method_name, _, exprs, _) = expr.kind; if method_name.ident.as_str() == "read_to_end"; if let ExprKind::Path(QPath::Resolved(None, _)) = &exprs[0].kind; - let ty = cx.tables.expr_ty(&exprs[0]); + let ty = cx.tables().expr_ty(&exprs[0]); if match_type(cx, ty, &paths::FILE); then { return true @@ -76,7 +76,7 @@ fn is_file_read_to_string<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr if let ExprKind::MethodCall(method_name, _, exprs, _) = expr.kind; if method_name.ident.as_str() == "read_to_string"; if let ExprKind::Path(QPath::Resolved(None, _)) = &exprs[0].kind; - let ty = cx.tables.expr_ty(&exprs[0]); + let ty = cx.tables().expr_ty(&exprs[0]); if match_type(cx, ty, &paths::FILE); then { return true diff --git a/src/tools/clippy/clippy_lints/src/zero_div_zero.rs b/src/tools/clippy/clippy_lints/src/zero_div_zero.rs index 0820385e01bb5..f0cf17c3b9549 100644 --- a/src/tools/clippy/clippy_lints/src/zero_div_zero.rs +++ b/src/tools/clippy/clippy_lints/src/zero_div_zero.rs @@ -36,8 +36,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ZeroDiv { // TODO - constant_simple does not fold many operations involving floats. // That's probably fine for this lint - it's pretty unlikely that someone would // do something like 0.0/(2.0 - 2.0), but it would be nice to warn on that case too. - if let Some(lhs_value) = constant_simple(cx, cx.tables, left); - if let Some(rhs_value) = constant_simple(cx, cx.tables, right); + if let Some(lhs_value) = constant_simple(cx, cx.tables(), left); + if let Some(rhs_value) = constant_simple(cx, cx.tables(), right); if Constant::F32(0.0) == lhs_value || Constant::F64(0.0) == lhs_value; if Constant::F32(0.0) == rhs_value || Constant::F64(0.0) == rhs_value; then { diff --git a/src/tools/clippy/doc/common_tools_writing_lints.md b/src/tools/clippy/doc/common_tools_writing_lints.md index dbc434505947d..d06e359bc7aa5 100644 --- a/src/tools/clippy/doc/common_tools_writing_lints.md +++ b/src/tools/clippy/doc/common_tools_writing_lints.md @@ -19,11 +19,11 @@ Useful Rustc dev guide links: Sometimes you may want to retrieve the type `Ty` of an expression `Expr`, for example to answer following questions: - which type does this expression correspond to (using its [`TyKind`][TyKind])? -- is it a sized type? +- is it a sized type? - is it a primitive type? - does it implement a trait? -This operation is performed using the [`expr_ty()`][expr_ty] method from the [`TypeckTables`][TypeckTables] struct, +This operation is performed using the [`expr_ty()`][expr_ty] method from the [`TypeckTables`][TypeckTables] struct, that gives you access to the underlying structure [`TyS`][TyS]. Example of use: @@ -31,7 +31,7 @@ Example of use: impl LateLintPass<'_, '_> for MyStructLint { fn check_expr(&mut self, cx: &LateContext<'_, '_>, expr: &Expr<'_>) { // Get type of `expr` - let ty = cx.tables.expr_ty(expr); + let ty = cx.tables().expr_ty(expr); // Match its kind to enter its type match ty.kind { ty::Adt(adt_def, _) if adt_def.is_struct() => println!("Our `expr` is a struct!"), @@ -41,14 +41,14 @@ impl LateLintPass<'_, '_> for MyStructLint { } ``` -Similarly in [`TypeckTables`][TypeckTables] methods, you have the [`pat_ty()`][pat_ty] method +Similarly in [`TypeckTables`][TypeckTables] methods, you have the [`pat_ty()`][pat_ty] method to retrieve a type from a pattern. Two noticeable items here: -- `cx` is the lint context [`LateContext`][LateContext]. - The two most useful data structures in this context are `tcx` and `tables`, +- `cx` is the lint context [`LateContext`][LateContext]. + The two most useful data structures in this context are `tcx` and `tables`, allowing us to jump to type definitions and other compilation stages such as HIR. -- `tables` is [`TypeckTables`][TypeckTables] and is created by type checking step, +- `tables` is [`TypeckTables`][TypeckTables] and is created by type checking step, it includes useful information such as types of expressions, ways to resolve methods and so on. # Checking if an expr is calling a specific method @@ -87,7 +87,7 @@ impl LateLintPass<'_, '_> for MyStructLint { } // 2. Using type context `TyCtxt` - let ty = cx.tables.expr_ty(expr); + let ty = cx.tables().expr_ty(expr); if cx.tcx.lang_items() // we are looking for the `DefId` of `Drop` trait in lang items .drop_trait() From d279b3c260875fcb7962c4bb7ba2e90b748476e8 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Thu, 25 Jun 2020 22:03:31 -0400 Subject: [PATCH 134/142] Add code block to code in documentation of `List::rebase_onto` --- src/librustc_middle/ty/subst.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/librustc_middle/ty/subst.rs b/src/librustc_middle/ty/subst.rs index fd31adae499fe..e9fd67a748c85 100644 --- a/src/librustc_middle/ty/subst.rs +++ b/src/librustc_middle/ty/subst.rs @@ -336,8 +336,10 @@ impl<'a, 'tcx> InternalSubsts<'tcx> { /// /// For example given: /// + /// ```no_run /// trait X { fn f(); } /// impl X for U { fn f() {} } + /// ``` /// /// * If `self` is `[Self, S, T]`: the identity substs of `f` in the trait. /// * If `source_ancestor` is the def_id of the trait. From 75983e137eeae5e9b210c2e97e6239bf888d9620 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Fri, 12 Jun 2020 15:44:56 -0700 Subject: [PATCH 135/142] Support configurable deny-warnings for all in-tree crates. --- src/bootstrap/builder.rs | 5 +-- src/bootstrap/check.rs | 29 +++++++++++---- src/bootstrap/compile.rs | 10 +++--- src/bootstrap/doc.rs | 5 +-- src/bootstrap/lib.rs | 19 ++++++---- src/bootstrap/test.rs | 6 ++-- src/bootstrap/tool.rs | 19 +++++----- src/librustdoc/clean/inline.rs | 2 +- src/librustdoc/clean/utils.rs | 4 +-- src/librustdoc/doctree.rs | 2 +- src/librustdoc/test.rs | 18 +++++----- src/librustdoc/visit_ast.rs | 43 ++++++++++++++--------- src/tools/build-manifest/src/main.rs | 2 -- src/tools/cargotest/main.rs | 2 -- src/tools/compiletest/src/main.rs | 1 - src/tools/error_index_generator/main.rs | 1 - src/tools/expand-yaml-anchors/src/main.rs | 4 +-- src/tools/linkchecker/main.rs | 2 -- src/tools/remote-test-client/src/main.rs | 2 -- src/tools/remote-test-server/src/main.rs | 2 -- src/tools/tidy/src/main.rs | 2 -- src/tools/unstable-book-gen/src/main.rs | 2 -- 22 files changed, 100 insertions(+), 82 deletions(-) diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs index 8f0a245a5658a..0735ba8869add 100644 --- a/src/bootstrap/builder.rs +++ b/src/bootstrap/builder.rs @@ -23,7 +23,7 @@ use crate::install; use crate::native; use crate::run; use crate::test; -use crate::tool; +use crate::tool::{self, SourceType}; use crate::util::{self, add_dylib_path, add_link_lib_path, exe, libdir}; use crate::{Build, DocTests, GitRepo, Mode}; @@ -759,6 +759,7 @@ impl<'a> Builder<'a> { &self, compiler: Compiler, mode: Mode, + source_type: SourceType, target: Interned, cmd: &str, ) -> Cargo { @@ -1125,7 +1126,7 @@ impl<'a> Builder<'a> { cargo.env("RUSTC_VERBOSE", self.verbosity.to_string()); - if !mode.is_tool() { + if source_type == SourceType::InTree { // When extending this list, add the new lints to the RUSTFLAGS of the // build_bootstrap function of src/bootstrap/bootstrap.py as well as // some code doesn't go through this `rustc` wrapper. diff --git a/src/bootstrap/check.rs b/src/bootstrap/check.rs index 7a8bfb2d5d877..0d38d2eebe793 100644 --- a/src/bootstrap/check.rs +++ b/src/bootstrap/check.rs @@ -44,7 +44,13 @@ impl Step for Std { let target = self.target; let compiler = builder.compiler(0, builder.config.build); - let mut cargo = builder.cargo(compiler, Mode::Std, target, cargo_subcommand(builder.kind)); + let mut cargo = builder.cargo( + compiler, + Mode::Std, + SourceType::InTree, + target, + cargo_subcommand(builder.kind), + ); std_cargo(builder, target, compiler.stage, &mut cargo); builder.info(&format!("Checking std artifacts ({} -> {})", &compiler.host, target)); @@ -92,8 +98,13 @@ impl Step for Rustc { builder.ensure(Std { target }); - let mut cargo = - builder.cargo(compiler, Mode::Rustc, target, cargo_subcommand(builder.kind)); + let mut cargo = builder.cargo( + compiler, + Mode::Rustc, + SourceType::InTree, + target, + cargo_subcommand(builder.kind), + ); rustc_cargo(builder, &mut cargo, target); builder.info(&format!("Checking compiler artifacts ({} -> {})", &compiler.host, target)); @@ -113,7 +124,7 @@ impl Step for Rustc { } macro_rules! tool_check_step { - ($name:ident, $path:expr) => { + ($name:ident, $path:expr, $source_type:expr) => { #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub struct $name { pub target: Interned, @@ -145,7 +156,7 @@ macro_rules! tool_check_step { target, cargo_subcommand(builder.kind), $path, - SourceType::InTree, + $source_type, &[], ); @@ -184,8 +195,12 @@ macro_rules! tool_check_step { }; } -tool_check_step!(Rustdoc, "src/tools/rustdoc"); -tool_check_step!(Clippy, "src/tools/clippy"); +tool_check_step!(Rustdoc, "src/tools/rustdoc", SourceType::InTree); +// Clippy is a hybrid. It is an external tool, but uses a git subtree instead +// of a submodule. Since the SourceType only drives the deny-warnings +// behavior, treat it as in-tree so that any new warnings in clippy will be +// rejected. +tool_check_step!(Clippy, "src/tools/clippy", SourceType::InTree); /// Cargo's output path for the standard library in a given stage, compiled /// by a particular compiler for the specified target. diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index afcf0dcac7e55..0208dc8ba5eb6 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -20,14 +20,14 @@ use filetime::FileTime; use serde::Deserialize; use crate::builder::Cargo; +use crate::builder::{Builder, Kind, RunConfig, ShouldRun, Step}; +use crate::cache::{Interned, INTERNER}; use crate::dist; use crate::native; +use crate::tool::SourceType; use crate::util::{exe, is_dylib, symlink_dir}; use crate::{Compiler, DependencyType, GitRepo, Mode}; -use crate::builder::{Builder, Kind, RunConfig, ShouldRun, Step}; -use crate::cache::{Interned, INTERNER}; - #[derive(Debug, PartialOrd, Ord, Copy, Clone, PartialEq, Eq, Hash)] pub struct Std { pub target: Interned, @@ -87,7 +87,7 @@ impl Step for Std { target_deps.extend(copy_third_party_objects(builder, &compiler, target)); target_deps.extend(copy_self_contained_objects(builder, &compiler, target)); - let mut cargo = builder.cargo(compiler, Mode::Std, target, "build"); + let mut cargo = builder.cargo(compiler, Mode::Std, SourceType::InTree, target, "build"); std_cargo(builder, target, compiler.stage, &mut cargo); builder.info(&format!( @@ -513,7 +513,7 @@ impl Step for Rustc { target: builder.config.build, }); - let mut cargo = builder.cargo(compiler, Mode::Rustc, target, "build"); + let mut cargo = builder.cargo(compiler, Mode::Rustc, SourceType::InTree, target, "build"); rustc_cargo(builder, &mut cargo, target); builder.info(&format!( diff --git a/src/bootstrap/doc.rs b/src/bootstrap/doc.rs index 6d7fb7acfcb04..8b76158f9e564 100644 --- a/src/bootstrap/doc.rs +++ b/src/bootstrap/doc.rs @@ -435,7 +435,8 @@ impl Step for Std { t!(fs::copy(builder.src.join("src/doc/rust.css"), out.join("rust.css"))); let run_cargo_rustdoc_for = |package: &str| { - let mut cargo = builder.cargo(compiler, Mode::Std, target, "rustdoc"); + let mut cargo = + builder.cargo(compiler, Mode::Std, SourceType::InTree, target, "rustdoc"); compile::std_cargo(builder, target, compiler.stage, &mut cargo); // Keep a whitelist so we do not build internal stdlib crates, these will be @@ -534,7 +535,7 @@ impl Step for Rustc { t!(symlink_dir_force(&builder.config, &out, &out_dir)); // Build cargo command. - let mut cargo = builder.cargo(compiler, Mode::Rustc, target, "doc"); + let mut cargo = builder.cargo(compiler, Mode::Rustc, SourceType::InTree, target, "doc"); cargo.env( "RUSTDOCFLAGS", "--document-private-items \ diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index e7aeb08643c29..5728b9d24de99 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -301,16 +301,21 @@ pub enum Mode { /// Build codegen libraries, placing output in the "stageN-codegen" directory Codegen, - /// Build some tools, placing output in the "stageN-tools" directory. The - /// "other" here is for miscellaneous sets of tools that are built using the - /// bootstrap compiler in its entirety (target libraries and all). - /// Typically these tools compile with stable Rust. + /// Build a tool, placing output in the "stage0-bootstrap-tools" + /// directory. This is for miscellaneous sets of tools that are built + /// using the bootstrap stage0 compiler in its entirety (target libraries + /// and all). Typically these tools compile with stable Rust. ToolBootstrap, - /// Compile a tool which uses all libraries we compile (up to rustc). - /// Doesn't use the stage0 compiler libraries like "other", and includes - /// tools like rustdoc, cargo, rls, etc. + /// Build a tool which uses the locally built std, placing output in the + /// "stageN-tools" directory. Its usage is quite rare, mainly used by + /// compiletest which needs libtest. ToolStd, + + /// Build a tool which uses the locally built rustc and the target std, + /// placing the output in the "stageN-tools" directory. This is used for + /// anything that needs a fully functional rustc, such as rustdoc, clippy, + /// cargo, rls, rustfmt, miri, etc. ToolRustc, } diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs index bb35203c82604..12ab6b1636cc1 100644 --- a/src/bootstrap/test.rs +++ b/src/bootstrap/test.rs @@ -367,7 +367,8 @@ impl Step for Miri { extra_features: Vec::new(), }); if let (Some(miri), Some(_cargo_miri)) = (miri, cargo_miri) { - let mut cargo = builder.cargo(compiler, Mode::ToolRustc, host, "install"); + let mut cargo = + builder.cargo(compiler, Mode::ToolRustc, SourceType::Submodule, host, "install"); cargo.arg("xargo"); // Configure `cargo install` path. cargo adds a `bin/`. cargo.env("CARGO_INSTALL_ROOT", &builder.out); @@ -1696,7 +1697,8 @@ impl Step for Crate { // we're working with automatically. let compiler = builder.compiler_for(compiler.stage, compiler.host, target); - let mut cargo = builder.cargo(compiler, mode, target, test_kind.subcommand()); + let mut cargo = + builder.cargo(compiler, mode, SourceType::InTree, target, test_kind.subcommand()); match mode { Mode::Std => { compile::std_cargo(builder, target, compiler.stage, &mut cargo); diff --git a/src/bootstrap/tool.rs b/src/bootstrap/tool.rs index c92082a942316..0055dee609204 100644 --- a/src/bootstrap/tool.rs +++ b/src/bootstrap/tool.rs @@ -16,7 +16,7 @@ use crate::util::{add_dylib_path, exe, CiEnv}; use crate::Compiler; use crate::Mode; -#[derive(Debug, Clone, Hash, PartialEq, Eq)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub enum SourceType { InTree, Submodule, @@ -226,14 +226,10 @@ pub fn prepare_tool_cargo( source_type: SourceType, extra_features: &[String], ) -> CargoCommand { - let mut cargo = builder.cargo(compiler, mode, target, command); + let mut cargo = builder.cargo(compiler, mode, source_type, target, command); let dir = builder.src.join(path); cargo.arg("--manifest-path").arg(dir.join("Cargo.toml")); - if source_type == SourceType::Submodule { - cargo.env("RUSTC_EXTERNAL_TOOL", "1"); - } - let mut features = extra_features.to_vec(); if builder.build.config.cargo_native_static { if path.ends_with("cargo") @@ -596,6 +592,7 @@ macro_rules! tool_extended { $path:expr, $tool_name:expr, stable = $stable:expr, + $(in_tree = $in_tree:expr,)* $extra_deps:block;)+) => { $( #[derive(Debug, Clone, Hash, PartialEq, Eq)] @@ -647,7 +644,11 @@ macro_rules! tool_extended { path: $path, extra_features: $sel.extra_features, is_optional_tool: true, - source_type: SourceType::Submodule, + source_type: if false $(|| $in_tree)* { + SourceType::InTree + } else { + SourceType::Submodule + }, }) } } @@ -659,8 +660,8 @@ macro_rules! tool_extended { // to make `./x.py build ` work. tool_extended!((self, builder), Cargofmt, rustfmt, "src/tools/rustfmt", "cargo-fmt", stable=true, {}; - CargoClippy, clippy, "src/tools/clippy", "cargo-clippy", stable=true, {}; - Clippy, clippy, "src/tools/clippy", "clippy-driver", stable=true, {}; + CargoClippy, clippy, "src/tools/clippy", "cargo-clippy", stable=true, in_tree=true, {}; + Clippy, clippy, "src/tools/clippy", "clippy-driver", stable=true, in_tree=true, {}; Miri, miri, "src/tools/miri", "miri", stable=false, {}; CargoMiri, miri, "src/tools/miri/cargo-miri", "cargo-miri", stable=false, {}; Rls, rls, "src/tools/rls", "rls", stable=true, { diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 08e04f719e9ba..78628b198a3c3 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -278,7 +278,7 @@ fn build_type_alias_type(cx: &DocContext<'_>, did: DefId) -> Option type_.def_id().and_then(|did| build_ty(cx, did)) } -pub fn build_ty(cx: &DocContext, did: DefId) -> Option { +pub fn build_ty(cx: &DocContext<'_>, did: DefId) -> Option { match cx.tcx.def_kind(did) { DefKind::Struct | DefKind::Union | DefKind::Enum | DefKind::Const | DefKind::Static => { Some(cx.tcx.type_of(did).clean(cx)) diff --git a/src/librustdoc/clean/utils.rs b/src/librustdoc/clean/utils.rs index c4e4802db6c07..2d99b2fd13419 100644 --- a/src/librustdoc/clean/utils.rs +++ b/src/librustdoc/clean/utils.rs @@ -328,7 +328,7 @@ pub fn strip_path(path: &Path) -> Path { Path { global: path.global, res: path.res, segments } } -pub fn qpath_to_string(p: &hir::QPath) -> String { +pub fn qpath_to_string(p: &hir::QPath<'_>) -> String { let segments = match *p { hir::QPath::Resolved(_, ref path) => &path.segments, hir::QPath::TypeRelative(_, ref segment) => return segment.ident.to_string(), @@ -417,7 +417,7 @@ impl ToSource for rustc_span::Span { } } -pub fn name_from_pat(p: &hir::Pat) -> String { +pub fn name_from_pat(p: &hir::Pat<'_>) -> String { use rustc_hir::*; debug!("trying to get a name from pattern: {:?}", p); diff --git a/src/librustdoc/doctree.rs b/src/librustdoc/doctree.rs index 5b13832742770..943729a74ab2d 100644 --- a/src/librustdoc/doctree.rs +++ b/src/librustdoc/doctree.rs @@ -262,7 +262,7 @@ pub struct ProcMacro<'hir> { pub whence: Span, } -pub fn struct_type_from_def(vdata: &hir::VariantData) -> StructType { +pub fn struct_type_from_def(vdata: &hir::VariantData<'_>) -> StructType { match *vdata { hir::VariantData::Struct(..) => Plain, hir::VariantData::Tuple(..) => Tuple, diff --git a/src/librustdoc/test.rs b/src/librustdoc/test.rs index 21aa0ded5a4b2..e9504aa3af123 100644 --- a/src/librustdoc/test.rs +++ b/src/librustdoc/test.rs @@ -166,7 +166,7 @@ pub fn run(options: Options) -> Result<(), String> { } // Look for `#![doc(test(no_crate_inject))]`, used by crates in the std facade. -fn scrape_test_config(krate: &::rustc_hir::Crate) -> TestOptions { +fn scrape_test_config(krate: &::rustc_hir::Crate<'_>) -> TestOptions { use rustc_ast_pretty::pprust; let mut opts = @@ -973,7 +973,7 @@ impl<'a, 'hir, 'tcx> intravisit::Visitor<'hir> for HirCollector<'a, 'hir, 'tcx> intravisit::NestedVisitorMap::All(self.map) } - fn visit_item(&mut self, item: &'hir hir::Item) { + fn visit_item(&mut self, item: &'hir hir::Item<'_>) { let name = if let hir::ItemKind::Impl { ref self_ty, .. } = item.kind { rustc_hir_pretty::id_to_string(&self.map, self_ty.hir_id) } else { @@ -985,19 +985,19 @@ impl<'a, 'hir, 'tcx> intravisit::Visitor<'hir> for HirCollector<'a, 'hir, 'tcx> }); } - fn visit_trait_item(&mut self, item: &'hir hir::TraitItem) { + fn visit_trait_item(&mut self, item: &'hir hir::TraitItem<'_>) { self.visit_testable(item.ident.to_string(), &item.attrs, item.hir_id, item.span, |this| { intravisit::walk_trait_item(this, item); }); } - fn visit_impl_item(&mut self, item: &'hir hir::ImplItem) { + fn visit_impl_item(&mut self, item: &'hir hir::ImplItem<'_>) { self.visit_testable(item.ident.to_string(), &item.attrs, item.hir_id, item.span, |this| { intravisit::walk_impl_item(this, item); }); } - fn visit_foreign_item(&mut self, item: &'hir hir::ForeignItem) { + fn visit_foreign_item(&mut self, item: &'hir hir::ForeignItem<'_>) { self.visit_testable(item.ident.to_string(), &item.attrs, item.hir_id, item.span, |this| { intravisit::walk_foreign_item(this, item); }); @@ -1005,8 +1005,8 @@ impl<'a, 'hir, 'tcx> intravisit::Visitor<'hir> for HirCollector<'a, 'hir, 'tcx> fn visit_variant( &mut self, - v: &'hir hir::Variant, - g: &'hir hir::Generics, + v: &'hir hir::Variant<'_>, + g: &'hir hir::Generics<'_>, item_id: hir::HirId, ) { self.visit_testable(v.ident.to_string(), &v.attrs, v.id, v.span, |this| { @@ -1014,13 +1014,13 @@ impl<'a, 'hir, 'tcx> intravisit::Visitor<'hir> for HirCollector<'a, 'hir, 'tcx> }); } - fn visit_struct_field(&mut self, f: &'hir hir::StructField) { + fn visit_struct_field(&mut self, f: &'hir hir::StructField<'_>) { self.visit_testable(f.ident.to_string(), &f.attrs, f.hir_id, f.span, |this| { intravisit::walk_struct_field(this, f); }); } - fn visit_macro_def(&mut self, macro_def: &'hir hir::MacroDef) { + fn visit_macro_def(&mut self, macro_def: &'hir hir::MacroDef<'_>) { self.visit_testable( macro_def.ident.to_string(), ¯o_def.attrs, diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index d2a950027cf87..c18f417e4f8e1 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -62,7 +62,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { self.exact_paths.entry(did).or_insert_with(|| def_id_to_path(tcx, did)); } - pub fn visit(mut self, krate: &'tcx hir::Crate) -> Module<'tcx> { + pub fn visit(mut self, krate: &'tcx hir::Crate<'_>) -> Module<'tcx> { let mut module = self.visit_mod_contents( krate.item.span, krate.item.attrs, @@ -84,10 +84,10 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { fn visit_variant_data( &mut self, - item: &'tcx hir::Item, + item: &'tcx hir::Item<'_>, name: Symbol, - sd: &'tcx hir::VariantData, - generics: &'tcx hir::Generics, + sd: &'tcx hir::VariantData<'_>, + generics: &'tcx hir::Generics<'_>, ) -> Struct<'tcx> { debug!("visiting struct"); let struct_type = struct_type_from_def(&*sd); @@ -105,10 +105,10 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { fn visit_union_data( &mut self, - item: &'tcx hir::Item, + item: &'tcx hir::Item<'_>, name: Symbol, - sd: &'tcx hir::VariantData, - generics: &'tcx hir::Generics, + sd: &'tcx hir::VariantData<'_>, + generics: &'tcx hir::Generics<'_>, ) -> Union<'tcx> { debug!("visiting union"); let struct_type = struct_type_from_def(&*sd); @@ -126,10 +126,10 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { fn visit_enum_def( &mut self, - it: &'tcx hir::Item, + it: &'tcx hir::Item<'_>, name: Symbol, - def: &'tcx hir::EnumDef, - generics: &'tcx hir::Generics, + def: &'tcx hir::EnumDef<'_>, + generics: &'tcx hir::Generics<'_>, ) -> Enum<'tcx> { debug!("visiting enum"); Enum { @@ -156,11 +156,11 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { fn visit_fn( &mut self, om: &mut Module<'tcx>, - item: &'tcx hir::Item, + item: &'tcx hir::Item<'_>, name: Symbol, - decl: &'tcx hir::FnDecl, + decl: &'tcx hir::FnDecl<'_>, header: hir::FnHeader, - generics: &'tcx hir::Generics, + generics: &'tcx hir::Generics<'_>, body: hir::BodyId, ) { debug!("visiting fn"); @@ -231,7 +231,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { &mut self, span: Span, attrs: &'tcx [ast::Attribute], - vis: &'tcx hir::Visibility, + vis: &'tcx hir::Visibility<'_>, id: hir::HirId, m: &'tcx hir::Mod<'tcx>, name: Option, @@ -375,7 +375,12 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { ret } - fn visit_item(&mut self, item: &'tcx hir::Item, renamed: Option, om: &mut Module<'tcx>) { + fn visit_item( + &mut self, + item: &'tcx hir::Item<'_>, + renamed: Option, + om: &mut Module<'tcx>, + ) { debug!("visiting item {:?}", item); let ident = renamed.unwrap_or(item.ident); @@ -587,7 +592,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { fn visit_foreign_item( &mut self, - item: &'tcx hir::ForeignItem, + item: &'tcx hir::ForeignItem<'_>, renamed: Option, om: &mut Module<'tcx>, ) { @@ -607,7 +612,11 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { } // Convert each `exported_macro` into a doc item. - fn visit_local_macro(&self, def: &'tcx hir::MacroDef, renamed: Option) -> Macro<'tcx> { + fn visit_local_macro( + &self, + def: &'tcx hir::MacroDef<'_>, + renamed: Option, + ) -> Macro<'tcx> { debug!("visit_local_macro: {}", def.ident); let tts = def.ast.body.inner_tokens().trees().collect::>(); // Extract the spans of all matchers. They represent the "interface" of the macro. diff --git a/src/tools/build-manifest/src/main.rs b/src/tools/build-manifest/src/main.rs index 9eb43eb2df43f..614e25589601e 100644 --- a/src/tools/build-manifest/src/main.rs +++ b/src/tools/build-manifest/src/main.rs @@ -4,8 +4,6 @@ //! via `x.py dist hash-and-sign`; the cmdline arguments are set up //! by rustbuild (in `src/bootstrap/dist.rs`). -#![deny(warnings)] - use serde::Serialize; use std::collections::BTreeMap; diff --git a/src/tools/cargotest/main.rs b/src/tools/cargotest/main.rs index 6968822c1b8ae..ecaeda68695a7 100644 --- a/src/tools/cargotest/main.rs +++ b/src/tools/cargotest/main.rs @@ -1,5 +1,3 @@ -#![deny(warnings)] - use std::env; use std::fs; use std::path::{Path, PathBuf}; diff --git a/src/tools/compiletest/src/main.rs b/src/tools/compiletest/src/main.rs index 134ac66b7d15b..2aea4d22700f3 100644 --- a/src/tools/compiletest/src/main.rs +++ b/src/tools/compiletest/src/main.rs @@ -1,5 +1,4 @@ #![crate_name = "compiletest"] -#![deny(warnings)] // The `test` crate is the only unstable feature // allowed here, just to share similar code. #![feature(test)] diff --git a/src/tools/error_index_generator/main.rs b/src/tools/error_index_generator/main.rs index 3335816f09f0e..097fb1f985a74 100644 --- a/src/tools/error_index_generator/main.rs +++ b/src/tools/error_index_generator/main.rs @@ -1,5 +1,4 @@ #![feature(rustc_private)] -#![deny(warnings)] extern crate env_logger; extern crate rustc_ast; diff --git a/src/tools/expand-yaml-anchors/src/main.rs b/src/tools/expand-yaml-anchors/src/main.rs index f2ed8aa409a36..d8dad8fc789e9 100644 --- a/src/tools/expand-yaml-anchors/src/main.rs +++ b/src/tools/expand-yaml-anchors/src/main.rs @@ -165,7 +165,7 @@ struct StrError(String); impl Error for StrError {} impl std::fmt::Display for StrError { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { std::fmt::Display::fmt(&self.0, f) } } @@ -177,7 +177,7 @@ struct WithContext { } impl std::fmt::Display for WithContext { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.context) } } diff --git a/src/tools/linkchecker/main.rs b/src/tools/linkchecker/main.rs index 570ffd5d30622..9e4e2c433fbed 100644 --- a/src/tools/linkchecker/main.rs +++ b/src/tools/linkchecker/main.rs @@ -14,8 +14,6 @@ //! A few whitelisted exceptions are allowed as there's known bugs in rustdoc, //! but this should catch the majority of "broken link" cases. -#![deny(warnings)] - use std::collections::hash_map::Entry; use std::collections::{HashMap, HashSet}; use std::env; diff --git a/src/tools/remote-test-client/src/main.rs b/src/tools/remote-test-client/src/main.rs index 1fafe109d34e1..6245b76fd6e84 100644 --- a/src/tools/remote-test-client/src/main.rs +++ b/src/tools/remote-test-client/src/main.rs @@ -5,8 +5,6 @@ //! Here is also where we bake in the support to spawn the QEMU emulator as //! well. -#![deny(warnings)] - use std::env; use std::fs::{self, File}; use std::io::prelude::*; diff --git a/src/tools/remote-test-server/src/main.rs b/src/tools/remote-test-server/src/main.rs index 8c56910e2dfad..d92758eb7474c 100644 --- a/src/tools/remote-test-server/src/main.rs +++ b/src/tools/remote-test-server/src/main.rs @@ -10,8 +10,6 @@ //! themselves having support libraries. All data over the TCP sockets is in a //! basically custom format suiting our needs. -#![deny(warnings)] - #[cfg(not(windows))] use std::fs::Permissions; #[cfg(not(windows))] diff --git a/src/tools/tidy/src/main.rs b/src/tools/tidy/src/main.rs index e2856c690550a..2d105c7f33a2b 100644 --- a/src/tools/tidy/src/main.rs +++ b/src/tools/tidy/src/main.rs @@ -4,8 +4,6 @@ //! etc. This is run by default on `./x.py test` and as part of the auto //! builders. The tidy checks can be executed with `./x.py test tidy`. -#![deny(warnings)] - use tidy::*; use std::env; diff --git a/src/tools/unstable-book-gen/src/main.rs b/src/tools/unstable-book-gen/src/main.rs index c9d1561a9d3d8..aa24881ac6bd7 100644 --- a/src/tools/unstable-book-gen/src/main.rs +++ b/src/tools/unstable-book-gen/src/main.rs @@ -1,7 +1,5 @@ //! Auto-generate stub docs for the unstable book -#![deny(warnings)] - use std::collections::BTreeSet; use std::env; use std::fs::{self, File}; From 42062a58026cdb245e3eb365af726f2d9f4946af Mon Sep 17 00:00:00 2001 From: Stein Somers Date: Mon, 22 Jun 2020 20:12:11 +0200 Subject: [PATCH 136/142] Shortcuts for min/max on ordinary BTreeMap/BTreeSet iterators --- src/liballoc/collections/btree/map.rs | 40 +++++++++++++++++++++++++++ src/liballoc/collections/btree/set.rs | 35 +++++++++++++++++++++++ src/liballoc/tests/btree/map.rs | 35 +++++++++++++++++++++++ src/liballoc/tests/btree/set.rs | 31 +++++++++++++++++++++ 4 files changed, 141 insertions(+) diff --git a/src/liballoc/collections/btree/map.rs b/src/liballoc/collections/btree/map.rs index 34cacebe79636..bb9091a66594b 100644 --- a/src/liballoc/collections/btree/map.rs +++ b/src/liballoc/collections/btree/map.rs @@ -1396,6 +1396,14 @@ impl<'a, K: 'a, V: 'a> Iterator for Iter<'a, K, V> { fn last(mut self) -> Option<(&'a K, &'a V)> { self.next_back() } + + fn min(mut self) -> Option<(&'a K, &'a V)> { + self.next() + } + + fn max(mut self) -> Option<(&'a K, &'a V)> { + self.next_back() + } } #[stable(feature = "fused", since = "1.26.0")] @@ -1458,6 +1466,14 @@ impl<'a, K: 'a, V: 'a> Iterator for IterMut<'a, K, V> { fn last(mut self) -> Option<(&'a K, &'a mut V)> { self.next_back() } + + fn min(mut self) -> Option<(&'a K, &'a mut V)> { + self.next() + } + + fn max(mut self) -> Option<(&'a K, &'a mut V)> { + self.next_back() + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -1595,6 +1611,14 @@ impl<'a, K, V> Iterator for Keys<'a, K, V> { fn last(mut self) -> Option<&'a K> { self.next_back() } + + fn min(mut self) -> Option<&'a K> { + self.next() + } + + fn max(mut self) -> Option<&'a K> { + self.next_back() + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -1768,6 +1792,14 @@ impl<'a, K, V> Iterator for Range<'a, K, V> { fn last(mut self) -> Option<(&'a K, &'a V)> { self.next_back() } + + fn min(mut self) -> Option<(&'a K, &'a V)> { + self.next() + } + + fn max(mut self) -> Option<(&'a K, &'a V)> { + self.next_back() + } } #[stable(feature = "map_values_mut", since = "1.10.0")] @@ -1853,6 +1885,14 @@ impl<'a, K, V> Iterator for RangeMut<'a, K, V> { fn last(mut self) -> Option<(&'a K, &'a mut V)> { self.next_back() } + + fn min(mut self) -> Option<(&'a K, &'a mut V)> { + self.next() + } + + fn max(mut self) -> Option<(&'a K, &'a mut V)> { + self.next_back() + } } impl<'a, K, V> RangeMut<'a, K, V> { diff --git a/src/liballoc/collections/btree/set.rs b/src/liballoc/collections/btree/set.rs index 525ef38c32fa2..d8959966fe5ad 100644 --- a/src/liballoc/collections/btree/set.rs +++ b/src/liballoc/collections/btree/set.rs @@ -1291,12 +1291,22 @@ impl<'a, T> Iterator for Iter<'a, T> { fn next(&mut self) -> Option<&'a T> { self.iter.next() } + fn size_hint(&self) -> (usize, Option) { self.iter.size_hint() } + fn last(mut self) -> Option<&'a T> { self.next_back() } + + fn min(mut self) -> Option<&'a T> { + self.next() + } + + fn max(mut self) -> Option<&'a T> { + self.next_back() + } } #[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> DoubleEndedIterator for Iter<'a, T> { @@ -1321,6 +1331,7 @@ impl Iterator for IntoIter { fn next(&mut self) -> Option { self.iter.next().map(|(k, _)| k) } + fn size_hint(&self) -> (usize, Option) { self.iter.size_hint() } @@ -1359,6 +1370,14 @@ impl<'a, T> Iterator for Range<'a, T> { fn last(mut self) -> Option<&'a T> { self.next_back() } + + fn min(mut self) -> Option<&'a T> { + self.next() + } + + fn max(mut self) -> Option<&'a T> { + self.next_back() + } } #[stable(feature = "btree_range", since = "1.17.0")] @@ -1429,6 +1448,10 @@ impl<'a, T: Ord> Iterator for Difference<'a, T> { }; (self_len.saturating_sub(other_len), Some(self_len)) } + + fn min(mut self) -> Option<&'a T> { + self.next() + } } #[stable(feature = "fused", since = "1.26.0")] @@ -1460,6 +1483,10 @@ impl<'a, T: Ord> Iterator for SymmetricDifference<'a, T> { // the number of elements to less than half the range of usize. (0, Some(a_len + b_len)) } + + fn min(mut self) -> Option<&'a T> { + self.next() + } } #[stable(feature = "fused", since = "1.26.0")] @@ -1516,6 +1543,10 @@ impl<'a, T: Ord> Iterator for Intersection<'a, T> { IntersectionInner::Answer(Some(_)) => (1, Some(1)), } } + + fn min(mut self) -> Option<&'a T> { + self.next() + } } #[stable(feature = "fused", since = "1.26.0")] @@ -1541,6 +1572,10 @@ impl<'a, T: Ord> Iterator for Union<'a, T> { // No checked_add - see SymmetricDifference::size_hint. (max(a_len, b_len), Some(a_len + b_len)) } + + fn min(mut self) -> Option<&'a T> { + self.next() + } } #[stable(feature = "fused", since = "1.26.0")] diff --git a/src/liballoc/tests/btree/map.rs b/src/liballoc/tests/btree/map.rs index 731a1b5f875b7..682d829d219f3 100644 --- a/src/liballoc/tests/btree/map.rs +++ b/src/liballoc/tests/btree/map.rs @@ -309,6 +309,41 @@ fn test_iter_mixed() { test(size, map.into_iter()); } +#[test] +fn test_iter_min_max() { + let mut a = BTreeMap::new(); + assert_eq!(a.iter().min(), None); + assert_eq!(a.iter().max(), None); + assert_eq!(a.iter_mut().min(), None); + assert_eq!(a.iter_mut().max(), None); + assert_eq!(a.range(..).min(), None); + assert_eq!(a.range(..).max(), None); + assert_eq!(a.range_mut(..).min(), None); + assert_eq!(a.range_mut(..).max(), None); + assert_eq!(a.keys().min(), None); + assert_eq!(a.keys().max(), None); + assert_eq!(a.values().min(), None); + assert_eq!(a.values().max(), None); + assert_eq!(a.values_mut().min(), None); + assert_eq!(a.values_mut().max(), None); + a.insert(1, 42); + a.insert(2, 24); + assert_eq!(a.iter().min(), Some((&1, &42))); + assert_eq!(a.iter().max(), Some((&2, &24))); + assert_eq!(a.iter_mut().min(), Some((&1, &mut 42))); + assert_eq!(a.iter_mut().max(), Some((&2, &mut 24))); + assert_eq!(a.range(..).min(), Some((&1, &42))); + assert_eq!(a.range(..).max(), Some((&2, &24))); + assert_eq!(a.range_mut(..).min(), Some((&1, &mut 42))); + assert_eq!(a.range_mut(..).max(), Some((&2, &mut 24))); + assert_eq!(a.keys().min(), Some(&1)); + assert_eq!(a.keys().max(), Some(&2)); + assert_eq!(a.values().min(), Some(&24)); + assert_eq!(a.values().max(), Some(&42)); + assert_eq!(a.values_mut().min(), Some(&mut 24)); + assert_eq!(a.values_mut().max(), Some(&mut 42)); +} + fn range_keys(map: &BTreeMap, range: impl RangeBounds) -> Vec { map.range(range) .map(|(&k, &v)| { diff --git a/src/liballoc/tests/btree/set.rs b/src/liballoc/tests/btree/set.rs index 75251ca0d51e9..b6c34b7c6c346 100644 --- a/src/liballoc/tests/btree/set.rs +++ b/src/liballoc/tests/btree/set.rs @@ -33,6 +33,37 @@ fn test_hash() { assert_eq!(hash(&x), hash(&y)); } +#[test] +fn test_iter_min_max() { + let mut a = BTreeSet::new(); + assert_eq!(a.iter().min(), None); + assert_eq!(a.iter().max(), None); + assert_eq!(a.range(..).min(), None); + assert_eq!(a.range(..).max(), None); + assert_eq!(a.difference(&BTreeSet::new()).min(), None); + assert_eq!(a.difference(&BTreeSet::new()).max(), None); + assert_eq!(a.intersection(&a).min(), None); + assert_eq!(a.intersection(&a).max(), None); + assert_eq!(a.symmetric_difference(&BTreeSet::new()).min(), None); + assert_eq!(a.symmetric_difference(&BTreeSet::new()).max(), None); + assert_eq!(a.union(&a).min(), None); + assert_eq!(a.union(&a).max(), None); + a.insert(1); + a.insert(2); + assert_eq!(a.iter().min(), Some(&1)); + assert_eq!(a.iter().max(), Some(&2)); + assert_eq!(a.range(..).min(), Some(&1)); + assert_eq!(a.range(..).max(), Some(&2)); + assert_eq!(a.difference(&BTreeSet::new()).min(), Some(&1)); + assert_eq!(a.difference(&BTreeSet::new()).max(), Some(&2)); + assert_eq!(a.intersection(&a).min(), Some(&1)); + assert_eq!(a.intersection(&a).max(), Some(&2)); + assert_eq!(a.symmetric_difference(&BTreeSet::new()).min(), Some(&1)); + assert_eq!(a.symmetric_difference(&BTreeSet::new()).max(), Some(&2)); + assert_eq!(a.union(&a).min(), Some(&1)); + assert_eq!(a.union(&a).max(), Some(&2)); +} + fn check(a: &[i32], b: &[i32], expected: &[i32], f: F) where F: FnOnce(&BTreeSet, &BTreeSet, &mut dyn FnMut(&i32) -> bool) -> bool, From 819cde5dabd90dab1fb462cd713457421d0ebd36 Mon Sep 17 00:00:00 2001 From: Oliver Scherer Date: Fri, 19 Jun 2020 18:57:15 +0200 Subject: [PATCH 137/142] Show the values and computation that would overflow a const evaluation or propagation --- src/librustc_codegen_ssa/mir/block.rs | 2 +- src/librustc_middle/mir/mod.rs | 104 +++++++++++-- src/librustc_middle/mir/type_foldable.rs | 24 ++- src/librustc_middle/mir/visit.rs | 8 +- src/librustc_middle/ty/consts.rs | 111 ++++++++++++++ src/librustc_middle/ty/mod.rs | 3 + src/librustc_middle/ty/print/pretty.rs | 37 +---- src/librustc_mir/const_eval/error.rs | 3 +- src/librustc_mir/const_eval/machine.rs | 24 ++- src/librustc_mir/interpret/operand.rs | 15 +- src/librustc_mir/transform/const_prop.rs | 70 +++++---- .../build/expr/as_rvalue.rs | 12 +- src/librustdoc/clean/utils.rs | 4 +- ..._of_reborrow.SimplifyCfg-initial.after.mir | 4 +- ...main.SimplifyCfg-elaborate-drops.after.mir | 4 +- ...main.SimplifyCfg-elaborate-drops.after.mir | 4 +- ...main.SimplifyCfg-elaborate-drops.after.mir | 2 +- .../32bit/rustc.norm2.InstCombine.diff | 8 +- .../64bit/rustc.norm2.InstCombine.diff | 8 +- .../aggregate/rustc.main.ConstProp.diff | 8 +- .../32bit/rustc.main.ConstProp.diff | 8 +- .../64bit/rustc.main.ConstProp.diff | 8 +- .../rustc.main.ConstProp.diff | 30 ++-- .../rustc.main.ConstProp.diff | 30 ++-- .../32bit/rustc.main.ConstProp.diff | 2 +- .../64bit/rustc.main.ConstProp.diff | 2 +- .../boxes/rustc.main.ConstProp.diff | 4 +- .../const_prop/cast/rustc.main.ConstProp.diff | 8 +- .../checked_add/rustc.main.ConstProp.diff | 24 ++- .../32bit/rustc.main.ConstProp.diff | 12 +- .../64bit/rustc.main.ConstProp.diff | 12 +- .../indirect/rustc.main.ConstProp.diff | 22 ++- .../issue-66971/rustc.main.ConstProp.diff | 2 +- .../issue-67019/rustc.main.ConstProp.diff | 2 +- .../rustc.main.ConstProp.diff | 6 +- .../rustc.main.ConstProp.diff | 6 +- .../rustc.main.ConstProp.diff | 4 +- .../rustc.main.ConstProp.diff | 6 +- .../rustc.main.ConstProp.diff | 2 +- .../rustc.main.ConstProp.diff | 2 +- .../32bit/rustc.main.ConstProp.diff | 36 +++-- .../32bit/rustc.main.SimplifyLocals.after.mir | 6 +- .../64bit/rustc.main.ConstProp.diff | 36 +++-- .../64bit/rustc.main.SimplifyLocals.after.mir | 6 +- .../rustc.main.ConstProp.diff | 6 +- .../ref_deref/rustc.main.ConstProp.diff | 2 +- .../ref_deref/rustc.main.PromoteTemps.diff | 2 +- .../rustc.main.PromoteTemps.diff | 2 +- .../repeat/32bit/rustc.main.ConstProp.diff | 12 +- .../repeat/64bit/rustc.main.ConstProp.diff | 12 +- .../return_place/rustc.add.ConstProp.diff | 24 ++- .../rustc.add.PreCodegen.before.mir | 2 +- .../rustc.main.ConstProp.diff | 6 +- .../slice_len/32bit/rustc.main.ConstProp.diff | 6 +- .../slice_len/64bit/rustc.main.ConstProp.diff | 6 +- .../switch_int/rustc.main.ConstProp.diff | 10 +- ...ain.SimplifyBranches-after-const-prop.diff | 8 +- .../rustc.main.ConstProp.diff | 4 +- .../rustc.bar.ConstProp.diff | 8 +- .../rustc.foo.ConstProp.diff | 8 +- .../rustc.arg_src.CopyPropagation.diff | 2 +- .../rustc.bar.CopyPropagation.diff | 2 +- ....match_tuple.SimplifyCfg-initial.after.mir | 16 +- ...ustc.main-{{closure}}.generator_drop.0.mir | 2 +- ...main-{{closure}}.StateTransform.before.mir | 4 +- ...tc.main-{{closure}}.generator_resume.0.mir | 2 +- .../rustc.bar.Inline.after.mir | 4 +- .../32bit/rustc.main.Inline.diff | 4 +- .../64bit/rustc.main.Inline.diff | 4 +- .../rustc.main.Inline.diff | 2 +- .../rustc.bar.InstrumentCoverage.diff | 2 +- .../rustc.main.InstrumentCoverage.diff | 2 +- ...ant}}.SimplifyCfg-qualify-consts.after.mir | 16 +- ...ant}}.SimplifyCfg-qualify-consts.after.mir | 16 +- .../rustc.main.ElaborateDrops.after.mir | 6 +- .../issue-49232/rustc.main.mir_map.0.mir | 2 +- .../rustc.test.ElaborateDrops.before.mir | 2 +- .../issue-72181/32bit/rustc.foo.mir_map.0.mir | 2 +- .../32bit/rustc.main.mir_map.0.mir | 6 +- .../issue-72181/64bit/rustc.foo.mir_map.0.mir | 2 +- .../64bit/rustc.main.mir_map.0.mir | 6 +- ....main.SimplifyCfg-qualify-consts.after.mir | 2 +- ...complicated_match.ElaborateDrops.after.mir | 8 +- ...icated_match.SimplifyCfg-initial.after.mir | 8 +- ...c.full_tested_match.PromoteTemps.after.mir | 10 +- ...full_tested_match2.PromoteTemps.before.mir | 10 +- .../rustc.main.PromoteTemps.before.mir | 12 +- .../rustc.main.SimplifyCfg-initial.after.mir | 20 +-- ...wrap.SimplifyCfg-elaborate-drops.after.mir | 2 +- .../rustc.nrvo.RenameReturnPlace.diff | 4 +- ...main.SimplifyCfg-elaborate-drops.after.mir | 4 +- ...main.SimplifyCfg-elaborate-drops.after.mir | 4 +- ...tch_guard.CleanupNonCodegenStatements.diff | 8 +- ...main.SimplifyCfg-elaborate-drops.after.mir | 6 +- .../32bit/rustc.match_bool.mir_map.0.mir | 4 +- .../64bit/rustc.match_bool.mir_map.0.mir | 4 +- .../32bit/rustc.main.SimplifyArmIdentity.diff | 6 +- .../64bit/rustc.main.SimplifyArmIdentity.diff | 6 +- .../rustc.id.SimplifyArmIdentity.diff | 2 +- .../rustc.id.SimplifyBranchSame.diff | 2 +- .../rustc.id_result.SimplifyArmIdentity.diff | 2 +- .../rustc.id_result.SimplifyBranchSame.diff | 2 +- .../rustc.id_try.SimplifyArmIdentity.diff | 2 +- .../rustc.id_try.SimplifyBranchSame.diff | 2 +- .../rustc.foo.SimplifyLocals.diff | 6 +- .../rustc.main.SimplifyLocals.diff | 10 +- .../32bit/rustc.map.SimplifyLocals.diff | 2 +- .../64bit/rustc.map.SimplifyLocals.diff | 2 +- ...ustc.try_identity.SimplifyArmIdentity.diff | 2 +- ...c.{{impl}}-append.SimplifyArmIdentity.diff | 4 +- ..._String].AddMovesForPackedDrops.before.mir | 12 +- ..._String].AddMovesForPackedDrops.before.mir | 12 +- .../rustc.XXX.mir_map.0.mir | 84 +++++------ .../storage_ranges/rustc.main.nll.0.mir | 4 +- .../rustc.main.SimplifyCfg-final.after.mir | 2 +- .../rustc.move_out_by_subslice.mir_map.0.mir | 4 +- .../rustc.move_out_from_end.mir_map.0.mir | 4 +- ...after-uninhabited-enum-branching.after.mir | 2 +- .../rustc.main.UninhabitedEnumBranching.diff | 4 +- .../rustc.main.UnreachablePropagation.diff | 6 +- .../rustc.main.UnreachablePropagation.diff | 6 +- .../rustc.main.UnreachablePropagation.diff | 6 +- .../rustc.main.UnreachablePropagation.diff | 2 +- .../rustc.E-V-{{constant}}.mir_map.0.mir | 2 +- ...{{impl}}-ASSOCIATED_CONSTANT.mir_map.0.mir | 2 +- .../rustc.E-V-{{constant}}.mir_map.0.mir | 2 +- ...{{impl}}-ASSOCIATED_CONSTANT.mir_map.0.mir | 2 +- src/test/rustdoc/const-generics/add-impl.rs | 3 +- .../match_arr_unknown_len.stderr | 2 +- .../defaults-not-assumed-fail.stderr | 2 +- ...20-assoc-const-arith-overflow.noopt.stderr | 12 +- ...9020-assoc-const-arith-overflow.opt.stderr | 12 +- ...h-overflow.opt_with_overflow_checks.stderr | 12 +- .../into-iter-no-impls-length-33.stderr | 28 ++-- .../ui/const-generics/different_byref.stderr | 6 +- .../types-mismatch-const-args.stderr | 6 +- src/test/ui/consts/const-err-early.stderr | 8 +- src/test/ui/consts/const-err-multi.stderr | 2 +- src/test/ui/consts/const-err2.noopt.stderr | 12 +- src/test/ui/consts/const-err2.opt.stderr | 12 +- ...const-err2.opt_with_overflow_checks.stderr | 12 +- .../conditional_array_execution.stderr | 2 +- .../const-eval/const-eval-overflow-3.stderr | 2 +- .../const-eval/const-eval-overflow-4.stderr | 2 +- .../const-eval/const-eval-overflow2.stderr | 16 +- .../const-eval/const-eval-overflow2b.stderr | 16 +- .../const-eval/const-eval-overflow2c.stderr | 16 +- .../ui/consts/const-eval/issue-43197.stderr | 4 +- .../ui/consts/const-eval/issue-50814.stderr | 2 +- .../const-eval/promoted_errors.noopt.stderr | 12 +- .../const-eval/promoted_errors.opt.stderr | 10 +- ...ted_errors.opt_with_overflow_checks.stderr | 12 +- .../ui/consts/const-eval/pub_const_err.stderr | 2 +- .../const-eval/pub_const_err_bin.stderr | 2 +- .../consts/const-eval/shift_overflow.stderr | 2 +- .../const-len-underflow-separate-spans.stderr | 2 +- .../ui/consts/const-len-underflow-subspans.rs | 2 +- .../const-len-underflow-subspans.stderr | 2 +- .../ui/consts/const-match-check.eval1.stderr | 4 +- .../ui/consts/const-match-check.eval2.stderr | 4 +- .../consts/const-match-check.matchck.stderr | 16 +- .../ui/consts/const-pattern-irrefutable.rs | 6 +- .../consts/const-pattern-irrefutable.stderr | 6 +- src/test/ui/consts/offset_from_ub.stderr | 2 +- src/test/ui/error-codes/E0080.rs | 2 +- src/test/ui/error-codes/E0080.stderr | 4 +- src/test/ui/eval-enum.rs | 4 +- src/test/ui/eval-enum.stderr | 4 +- ...oop-refutable-pattern-error-message.stderr | 4 +- ...alf-open-range-pats-exhaustive-fail.stderr | 140 +++++++++--------- .../ui/issues/issue-8460-const.noopt.stderr | 48 +++--- .../ui/issues/issue-8460-const.opt.stderr | 48 +++--- ...8460-const.opt_with_overflow_checks.stderr | 48 +++--- .../lint-exceeding-bitshifts.noopt.stderr | 98 ++++++------ .../lint/lint-exceeding-bitshifts.opt.stderr | 98 ++++++------ ...-bitshifts.opt_with_overflow_checks.stderr | 98 ++++++------ src/test/ui/lint/lint-exceeding-bitshifts.rs | 1 + .../ui/mir/mir_detects_invalid_ops.stderr | 4 +- .../overflowing-lsh-1.stderr | 2 +- .../overflowing-lsh-2.stderr | 2 +- .../overflowing-lsh-3.stderr | 2 +- .../overflowing-lsh-4.stderr | 2 +- .../overflowing-rsh-1.stderr | 2 +- .../overflowing-rsh-2.stderr | 2 +- .../overflowing-rsh-3.stderr | 2 +- .../overflowing-rsh-4.stderr | 2 +- .../overflowing-rsh-5.stderr | 2 +- .../overflowing-rsh-6.stderr | 2 +- .../exhaustiveness-non-exhaustive.rs | 6 +- .../exhaustiveness-non-exhaustive.stderr | 12 +- ...een-expanded-earlier-non-exhaustive.stderr | 8 +- .../exhaustive_integer_patterns.stderr | 38 ++--- .../ui/pattern/usefulness/issue-43253.stderr | 2 +- .../match-byte-array-patterns-2.stderr | 4 +- .../usefulness/match-non-exhaustive.stderr | 4 +- .../usefulness/non-exhaustive-match.rs | 4 +- .../usefulness/non-exhaustive-match.stderr | 4 +- .../usefulness/refutable-pattern-errors.rs | 2 +- .../refutable-pattern-errors.stderr | 4 +- .../ui/precise_pointer_size_matching.stderr | 8 +- .../const-pat-non-exaustive-let-new-var.rs | 2 +- ...const-pat-non-exaustive-let-new-var.stderr | 2 +- 202 files changed, 1273 insertions(+), 986 deletions(-) create mode 100644 src/librustc_middle/ty/consts.rs diff --git a/src/librustc_codegen_ssa/mir/block.rs b/src/librustc_codegen_ssa/mir/block.rs index 5125ce779ed8e..480f9a5032087 100644 --- a/src/librustc_codegen_ssa/mir/block.rs +++ b/src/librustc_codegen_ssa/mir/block.rs @@ -380,7 +380,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { // checked operation, just a comparison with the minimum // value, so we have to check for the assert message. if !bx.check_overflow() { - if let AssertKind::OverflowNeg = *msg { + if let AssertKind::OverflowNeg(_) = *msg { const_cond = Some(expected); } } diff --git a/src/librustc_middle/mir/mod.rs b/src/librustc_middle/mir/mod.rs index d89c35d313ca3..b3e410f362d68 100644 --- a/src/librustc_middle/mir/mod.rs +++ b/src/librustc_middle/mir/mod.rs @@ -2,6 +2,8 @@ //! //! [rustc dev guide]: https://rustc-dev-guide.rust-lang.org/mir/index.html +// ignore-tidy-filelength + use crate::mir::interpret::{GlobalAlloc, Scalar}; use crate::mir::visit::MirVisitable; use crate::ty::adjustment::PointerCast; @@ -1246,10 +1248,10 @@ pub enum TerminatorKind<'tcx> { #[derive(Clone, RustcEncodable, RustcDecodable, HashStable, PartialEq)] pub enum AssertKind { BoundsCheck { len: O, index: O }, - Overflow(BinOp), - OverflowNeg, - DivisionByZero, - RemainderByZero, + Overflow(BinOp, O, O), + OverflowNeg(O), + DivisionByZero(O), + RemainderByZero(O), ResumedAfterReturn(GeneratorKind), ResumedAfterPanic(GeneratorKind), } @@ -1522,17 +1524,17 @@ impl AssertKind { pub fn description(&self) -> &'static str { use AssertKind::*; match self { - Overflow(BinOp::Add) => "attempt to add with overflow", - Overflow(BinOp::Sub) => "attempt to subtract with overflow", - Overflow(BinOp::Mul) => "attempt to multiply with overflow", - Overflow(BinOp::Div) => "attempt to divide with overflow", - Overflow(BinOp::Rem) => "attempt to calculate the remainder with overflow", - OverflowNeg => "attempt to negate with overflow", - Overflow(BinOp::Shr) => "attempt to shift right with overflow", - Overflow(BinOp::Shl) => "attempt to shift left with overflow", - Overflow(op) => bug!("{:?} cannot overflow", op), - DivisionByZero => "attempt to divide by zero", - RemainderByZero => "attempt to calculate the remainder with a divisor of zero", + Overflow(BinOp::Add, _, _) => "attempt to add with overflow", + Overflow(BinOp::Sub, _, _) => "attempt to subtract with overflow", + Overflow(BinOp::Mul, _, _) => "attempt to multiply with overflow", + Overflow(BinOp::Div, _, _) => "attempt to divide with overflow", + Overflow(BinOp::Rem, _, _) => "attempt to calculate the remainder with overflow", + OverflowNeg(_) => "attempt to negate with overflow", + Overflow(BinOp::Shr, _, _) => "attempt to shift right with overflow", + Overflow(BinOp::Shl, _, _) => "attempt to shift left with overflow", + Overflow(op, _, _) => bug!("{:?} cannot overflow", op), + DivisionByZero(_) => "attempt to divide by zero", + RemainderByZero(_) => "attempt to calculate the remainder with a divisor of zero", ResumedAfterReturn(GeneratorKind::Gen) => "generator resumed after completion", ResumedAfterReturn(GeneratorKind::Async(_)) => "`async fn` resumed after completion", ResumedAfterPanic(GeneratorKind::Gen) => "generator resumed after panicking", @@ -1546,12 +1548,54 @@ impl AssertKind { where O: Debug, { + use AssertKind::*; match self { - AssertKind::BoundsCheck { ref len, ref index } => write!( + BoundsCheck { ref len, ref index } => write!( f, "\"index out of bounds: the len is {{}} but the index is {{}}\", {:?}, {:?}", len, index ), + + OverflowNeg(op) => { + write!(f, "\"attempt to negate {{}} which would overflow\", {:?}", op) + } + DivisionByZero(op) => write!(f, "\"attempt to divide {{}} by zero\", {:?}", op), + RemainderByZero(op) => write!( + f, + "\"attempt to calculate the remainder of {{}} with a divisor of zero\", {:?}", + op + ), + Overflow(BinOp::Add, l, r) => write!( + f, + "\"attempt to compute `{{}} + {{}}` which would overflow\", {:?}, {:?}", + l, r + ), + Overflow(BinOp::Sub, l, r) => write!( + f, + "\"attempt to compute `{{}} - {{}}` which would overflow\", {:?}, {:?}", + l, r + ), + Overflow(BinOp::Mul, l, r) => write!( + f, + "\"attempt to compute `{{}} * {{}}` which would overflow\", {:?}, {:?}", + l, r + ), + Overflow(BinOp::Div, l, r) => write!( + f, + "\"attempt to compute `{{}} / {{}}` which would overflow\", {:?}, {:?}", + l, r + ), + Overflow(BinOp::Rem, l, r) => write!( + f, + "\"attempt to compute the remainder of `{{}} % {{}}` which would overflow\", {:?}, {:?}", + l, r + ), + Overflow(BinOp::Shr, _, r) => { + write!(f, "\"attempt to shift right by {{}} which would overflow\", {:?}", r) + } + Overflow(BinOp::Shl, _, r) => { + write!(f, "\"attempt to shift left by {{}} which would overflow\", {:?}", r) + } _ => write!(f, "\"{}\"", self.description()), } } @@ -1564,6 +1608,34 @@ impl fmt::Debug for AssertKind { BoundsCheck { ref len, ref index } => { write!(f, "index out of bounds: the len is {:?} but the index is {:?}", len, index) } + OverflowNeg(op) => write!(f, "attempt to negate {:#?} which would overflow", op), + DivisionByZero(op) => write!(f, "attempt to divide {:#?} by zero", op), + RemainderByZero(op) => { + write!(f, "attempt to calculate the remainder of {:#?} with a divisor of zero", op) + } + Overflow(BinOp::Add, l, r) => { + write!(f, "attempt to compute `{:#?} + {:#?}` which would overflow", l, r) + } + Overflow(BinOp::Sub, l, r) => { + write!(f, "attempt to compute `{:#?} - {:#?}` which would overflow", l, r) + } + Overflow(BinOp::Mul, l, r) => { + write!(f, "attempt to compute `{:#?} * {:#?}` which would overflow", l, r) + } + Overflow(BinOp::Div, l, r) => { + write!(f, "attempt to compute `{:#?} / {:#?}` which would overflow", l, r) + } + Overflow(BinOp::Rem, l, r) => write!( + f, + "attempt to compute the remainder of `{:#?} % {:#?}` which would overflow", + l, r + ), + Overflow(BinOp::Shr, _, r) => { + write!(f, "attempt to shift right by {:#?} which would overflow", r) + } + Overflow(BinOp::Shl, _, r) => { + write!(f, "attempt to shift left by {:#?} which would overflow", r) + } _ => write!(f, "{}", self.description()), } } diff --git a/src/librustc_middle/mir/type_foldable.rs b/src/librustc_middle/mir/type_foldable.rs index 89f8f10449e2d..6bb6abe028910 100644 --- a/src/librustc_middle/mir/type_foldable.rs +++ b/src/librustc_middle/mir/type_foldable.rs @@ -58,15 +58,14 @@ impl<'tcx> TypeFoldable<'tcx> for Terminator<'tcx> { Assert { ref cond, expected, ref msg, target, cleanup } => { use AssertKind::*; let msg = match msg { - BoundsCheck { ref len, ref index } => { + BoundsCheck { len, index } => { BoundsCheck { len: len.fold_with(folder), index: index.fold_with(folder) } } - Overflow(_) - | OverflowNeg - | DivisionByZero - | RemainderByZero - | ResumedAfterReturn(_) - | ResumedAfterPanic(_) => msg.clone(), + Overflow(op, l, r) => Overflow(*op, l.fold_with(folder), r.fold_with(folder)), + OverflowNeg(op) => OverflowNeg(op.fold_with(folder)), + DivisionByZero(op) => DivisionByZero(op.fold_with(folder)), + RemainderByZero(op) => RemainderByZero(op.fold_with(folder)), + ResumedAfterReturn(_) | ResumedAfterPanic(_) => msg.clone(), }; Assert { cond: cond.fold_with(folder), expected, msg, target, cleanup } } @@ -117,12 +116,11 @@ impl<'tcx> TypeFoldable<'tcx> for Terminator<'tcx> { BoundsCheck { ref len, ref index } => { len.visit_with(visitor) || index.visit_with(visitor) } - Overflow(_) - | OverflowNeg - | DivisionByZero - | RemainderByZero - | ResumedAfterReturn(_) - | ResumedAfterPanic(_) => false, + Overflow(_, l, r) => l.visit_with(visitor) || r.visit_with(visitor), + OverflowNeg(op) | DivisionByZero(op) | RemainderByZero(op) => { + op.visit_with(visitor) + } + ResumedAfterReturn(_) | ResumedAfterPanic(_) => false, } } else { false diff --git a/src/librustc_middle/mir/visit.rs b/src/librustc_middle/mir/visit.rs index 2efc5f1dabedc..c6ace5bbf6685 100644 --- a/src/librustc_middle/mir/visit.rs +++ b/src/librustc_middle/mir/visit.rs @@ -571,7 +571,13 @@ macro_rules! make_mir_visitor { self.visit_operand(len, location); self.visit_operand(index, location); } - Overflow(_) | OverflowNeg | DivisionByZero | RemainderByZero | + Overflow(_, l, r) => { + self.visit_operand(l, location); + self.visit_operand(r, location); + } + OverflowNeg(op) | DivisionByZero(op) | RemainderByZero(op) => { + self.visit_operand(op, location); + } ResumedAfterReturn(_) | ResumedAfterPanic(_) => { // Nothing to visit } diff --git a/src/librustc_middle/ty/consts.rs b/src/librustc_middle/ty/consts.rs new file mode 100644 index 0000000000000..ced0429deab93 --- /dev/null +++ b/src/librustc_middle/ty/consts.rs @@ -0,0 +1,111 @@ +use crate::mir::interpret::truncate; +use rustc_target::abi::Size; + +#[derive(Copy, Clone)] +/// A type for representing any integer. Only used for printing. +// FIXME: Use this for the integer-tree representation needed for type level ints and +// const generics? +pub struct ConstInt { + /// Number of bytes of the integer. Only 1, 2, 4, 8, 16 are legal values. + size: u8, + /// Whether the value is of a signed integer type. + signed: bool, + /// Whether the value is a `usize` or `isize` type. + is_ptr_sized_integral: bool, + /// Raw memory of the integer. All bytes beyond the `size` are unused and must be zero. + raw: u128, +} + +impl ConstInt { + pub fn new(raw: u128, size: Size, signed: bool, is_ptr_sized_integral: bool) -> Self { + assert!(raw <= truncate(u128::MAX, size)); + Self { raw, size: size.bytes() as u8, signed, is_ptr_sized_integral } + } +} + +impl std::fmt::Debug for ConstInt { + fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let Self { size, signed, raw, is_ptr_sized_integral } = *self; + if signed { + let bit_size = size * 8; + let min = 1u128 << (bit_size - 1); + let max = min - 1; + if raw == min { + match (size, is_ptr_sized_integral) { + (_, true) => write!(fmt, "isize::MIN"), + (1, _) => write!(fmt, "i8::MIN"), + (2, _) => write!(fmt, "i16::MIN"), + (4, _) => write!(fmt, "i32::MIN"), + (8, _) => write!(fmt, "i64::MIN"), + (16, _) => write!(fmt, "i128::MIN"), + _ => bug!("ConstInt 0x{:x} with size = {} and signed = {}", raw, size, signed), + } + } else if raw == max { + match (size, is_ptr_sized_integral) { + (_, true) => write!(fmt, "isize::MAX"), + (1, _) => write!(fmt, "i8::MAX"), + (2, _) => write!(fmt, "i16::MAX"), + (4, _) => write!(fmt, "i32::MAX"), + (8, _) => write!(fmt, "i64::MAX"), + (16, _) => write!(fmt, "i128::MAX"), + _ => bug!("ConstInt 0x{:x} with size = {} and signed = {}", raw, size, signed), + } + } else { + match size { + 1 => write!(fmt, "{}", raw as i8)?, + 2 => write!(fmt, "{}", raw as i16)?, + 4 => write!(fmt, "{}", raw as i32)?, + 8 => write!(fmt, "{}", raw as i64)?, + 16 => write!(fmt, "{}", raw as i128)?, + _ => bug!("ConstInt 0x{:x} with size = {} and signed = {}", raw, size, signed), + } + if fmt.alternate() { + match (size, is_ptr_sized_integral) { + (_, true) => write!(fmt, "_isize")?, + (1, _) => write!(fmt, "_i8")?, + (2, _) => write!(fmt, "_i16")?, + (4, _) => write!(fmt, "_i32")?, + (8, _) => write!(fmt, "_i64")?, + (16, _) => write!(fmt, "_i128")?, + _ => bug!(), + } + } + Ok(()) + } + } else { + let max = truncate(u128::MAX, Size::from_bytes(size)); + if raw == max { + match (size, is_ptr_sized_integral) { + (_, true) => write!(fmt, "usize::MAX"), + (1, _) => write!(fmt, "u8::MAX"), + (2, _) => write!(fmt, "u16::MAX"), + (4, _) => write!(fmt, "u32::MAX"), + (8, _) => write!(fmt, "u64::MAX"), + (16, _) => write!(fmt, "u128::MAX"), + _ => bug!("ConstInt 0x{:x} with size = {} and signed = {}", raw, size, signed), + } + } else { + match size { + 1 => write!(fmt, "{}", raw as u8)?, + 2 => write!(fmt, "{}", raw as u16)?, + 4 => write!(fmt, "{}", raw as u32)?, + 8 => write!(fmt, "{}", raw as u64)?, + 16 => write!(fmt, "{}", raw as u128)?, + _ => bug!("ConstInt 0x{:x} with size = {} and signed = {}", raw, size, signed), + } + if fmt.alternate() { + match (size, is_ptr_sized_integral) { + (_, true) => write!(fmt, "_usize")?, + (1, _) => write!(fmt, "_u8")?, + (2, _) => write!(fmt, "_u16")?, + (4, _) => write!(fmt, "_u32")?, + (8, _) => write!(fmt, "_u64")?, + (16, _) => write!(fmt, "_u128")?, + _ => bug!(), + } + } + Ok(()) + } + } + } +} diff --git a/src/librustc_middle/ty/mod.rs b/src/librustc_middle/ty/mod.rs index 6b7940ed7abcc..03aab2c0f9f2c 100644 --- a/src/librustc_middle/ty/mod.rs +++ b/src/librustc_middle/ty/mod.rs @@ -84,6 +84,8 @@ pub use self::trait_def::TraitDef; pub use self::query::queries; +pub use self::consts::ConstInt; + pub mod adjustment; pub mod binding; pub mod cast; @@ -108,6 +110,7 @@ pub mod trait_def; pub mod util; pub mod walk; +mod consts; mod context; mod diagnostics; mod instance; diff --git a/src/librustc_middle/ty/print/pretty.rs b/src/librustc_middle/ty/print/pretty.rs index 1a08639a533d5..061214249713d 100644 --- a/src/librustc_middle/ty/print/pretty.rs +++ b/src/librustc_middle/ty/print/pretty.rs @@ -1,10 +1,8 @@ use crate::middle::cstore::{ExternCrate, ExternCrateSource}; -use crate::mir::interpret::{ - sign_extend, truncate, AllocId, ConstValue, GlobalAlloc, Pointer, Scalar, -}; +use crate::mir::interpret::{AllocId, ConstValue, GlobalAlloc, Pointer, Scalar}; use crate::ty::layout::IntegerExt; use crate::ty::subst::{GenericArg, GenericArgKind, Subst}; -use crate::ty::{self, DefIdTree, ParamConst, Ty, TyCtxt, TypeFoldable}; +use crate::ty::{self, ConstInt, DefIdTree, ParamConst, Ty, TyCtxt, TypeFoldable}; use rustc_apfloat::ieee::{Double, Single}; use rustc_apfloat::Float; use rustc_ast::ast; @@ -981,35 +979,14 @@ pub trait PrettyPrinter<'tcx>: } // Int (Scalar::Raw { data, .. }, ty::Uint(ui)) => { - let bit_size = Integer::from_attr(&self.tcx(), UnsignedInt(*ui)).size(); - let max = truncate(u128::MAX, bit_size); - - let ui_str = ui.name_str(); - if data == max { - p!(write("{}::MAX", ui_str)) - } else { - if print_ty { p!(write("{}{}", data, ui_str)) } else { p!(write("{}", data)) } - }; + let size = Integer::from_attr(&self.tcx(), UnsignedInt(*ui)).size(); + let int = ConstInt::new(data, size, false, ty.is_ptr_sized_integral()); + if print_ty { p!(write("{:#?}", int)) } else { p!(write("{:?}", int)) } } (Scalar::Raw { data, .. }, ty::Int(i)) => { let size = Integer::from_attr(&self.tcx(), SignedInt(*i)).size(); - let bit_size = size.bits() as u128; - let min = 1u128 << (bit_size - 1); - let max = min - 1; - - let i_str = i.name_str(); - match data { - d if d == min => p!(write("{}::MIN", i_str)), - d if d == max => p!(write("{}::MAX", i_str)), - _ => { - let data = sign_extend(data, size) as i128; - if print_ty { - p!(write("{}{}", data, i_str)) - } else { - p!(write("{}", data)) - } - } - } + let int = ConstInt::new(data, size, true, ty.is_ptr_sized_integral()); + if print_ty { p!(write("{:#?}", int)) } else { p!(write("{:?}", int)) } } // Char (Scalar::Raw { data, .. }, ty::Char) if char::from_u32(data as u32).is_some() => { diff --git a/src/librustc_mir/const_eval/error.rs b/src/librustc_mir/const_eval/error.rs index 5deae94fe0c8e..8a72be33b8429 100644 --- a/src/librustc_mir/const_eval/error.rs +++ b/src/librustc_mir/const_eval/error.rs @@ -2,6 +2,7 @@ use std::error::Error; use std::fmt; use rustc_middle::mir::AssertKind; +use rustc_middle::ty::ConstInt; use rustc_span::{Span, Symbol}; use super::InterpCx; @@ -13,7 +14,7 @@ pub enum ConstEvalErrKind { NeedsRfc(String), ConstAccessesStatic, ModifiedGlobal, - AssertFailure(AssertKind), + AssertFailure(AssertKind), Panic { msg: Symbol, line: u32, col: u32, file: Symbol }, } diff --git a/src/librustc_mir/const_eval/machine.rs b/src/librustc_mir/const_eval/machine.rs index dc13126df0e4c..8be0ab9019fe2 100644 --- a/src/librustc_mir/const_eval/machine.rs +++ b/src/librustc_mir/const_eval/machine.rs @@ -248,25 +248,19 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir, _unwind: Option, ) -> InterpResult<'tcx> { use rustc_middle::mir::AssertKind::*; - // Convert `AssertKind` to `AssertKind`. + // Convert `AssertKind` to `AssertKind`. + let eval_to_int = + |op| ecx.read_immediate(ecx.eval_operand(op, None)?).map(|x| x.to_const_int()); let err = match msg { BoundsCheck { ref len, ref index } => { - let len = ecx - .read_immediate(ecx.eval_operand(len, None)?) - .expect("can't eval len") - .to_scalar()? - .to_machine_usize(&*ecx)?; - let index = ecx - .read_immediate(ecx.eval_operand(index, None)?) - .expect("can't eval index") - .to_scalar()? - .to_machine_usize(&*ecx)?; + let len = eval_to_int(len)?; + let index = eval_to_int(index)?; BoundsCheck { len, index } } - Overflow(op) => Overflow(*op), - OverflowNeg => OverflowNeg, - DivisionByZero => DivisionByZero, - RemainderByZero => RemainderByZero, + Overflow(op, l, r) => Overflow(*op, eval_to_int(l)?, eval_to_int(r)?), + OverflowNeg(op) => OverflowNeg(eval_to_int(op)?), + DivisionByZero(op) => DivisionByZero(eval_to_int(op)?), + RemainderByZero(op) => RemainderByZero(eval_to_int(op)?), ResumedAfterReturn(generator_kind) => ResumedAfterReturn(*generator_kind), ResumedAfterPanic(generator_kind) => ResumedAfterPanic(*generator_kind), }; diff --git a/src/librustc_mir/interpret/operand.rs b/src/librustc_mir/interpret/operand.rs index 38948ee53846a..dd746f5cfb409 100644 --- a/src/librustc_mir/interpret/operand.rs +++ b/src/librustc_mir/interpret/operand.rs @@ -9,7 +9,7 @@ use rustc_hir::def::Namespace; use rustc_macros::HashStable; use rustc_middle::ty::layout::{PrimitiveExt, TyAndLayout}; use rustc_middle::ty::print::{FmtPrinter, PrettyPrinter, Printer}; -use rustc_middle::ty::Ty; +use rustc_middle::ty::{ConstInt, Ty}; use rustc_middle::{mir, ty}; use rustc_target::abi::{Abi, HasDataLayout, LayoutOf, Size, TagEncoding}; use rustc_target::abi::{VariantIdx, Variants}; @@ -207,6 +207,19 @@ impl<'tcx, Tag: Copy> ImmTy<'tcx, Tag> { pub fn from_int(i: impl Into, layout: TyAndLayout<'tcx>) -> Self { Self::from_scalar(Scalar::from_int(i, layout.size), layout) } + + #[inline] + pub fn to_const_int(self) -> ConstInt { + assert!(self.layout.ty.is_integral()); + ConstInt::new( + self.to_scalar() + .expect("to_const_int doesn't work on scalar pairs") + .assert_bits(self.layout.size), + self.layout.size, + self.layout.ty.is_signed(), + self.layout.ty.is_ptr_sized_integral(), + ) + } } impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { diff --git a/src/librustc_mir/transform/const_prop.rs b/src/librustc_mir/transform/const_prop.rs index eb614170baae5..19337c520f907 100644 --- a/src/librustc_mir/transform/const_prop.rs +++ b/src/librustc_mir/transform/const_prop.rs @@ -19,7 +19,7 @@ use rustc_middle::mir::{ }; use rustc_middle::ty::layout::{HasTyCtxt, LayoutError, TyAndLayout}; use rustc_middle::ty::subst::{InternalSubsts, Subst}; -use rustc_middle::ty::{self, ConstKind, Instance, ParamEnv, Ty, TyCtxt, TypeFoldable}; +use rustc_middle::ty::{self, ConstInt, ConstKind, Instance, ParamEnv, Ty, TyCtxt, TypeFoldable}; use rustc_session::lint; use rustc_span::{def_id::DefId, Span}; use rustc_target::abi::{HasDataLayout, LayoutOf, Size, TargetDataLayout}; @@ -449,7 +449,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { lint: &'static lint::Lint, source_info: SourceInfo, message: &'static str, - panic: AssertKind, + panic: AssertKind, ) -> Option<()> { let lint_root = self.lint_root(source_info)?; self.tcx.struct_span_lint_hir(lint, lint_root, source_info.span, |lint| { @@ -466,10 +466,10 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { arg: &Operand<'tcx>, source_info: SourceInfo, ) -> Option<()> { - if self.use_ecx(|this| { + if let (val, true) = self.use_ecx(|this| { let val = this.ecx.read_immediate(this.ecx.eval_operand(arg, None)?)?; let (_res, overflow, _ty) = this.ecx.overflowing_unary_op(op, val)?; - Ok(overflow) + Ok((val, overflow)) })? { // `AssertKind` only has an `OverflowNeg` variant, so make sure that is // appropriate to use. @@ -478,7 +478,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { lint::builtin::ARITHMETIC_OVERFLOW, source_info, "this arithmetic operation will overflow", - AssertKind::OverflowNeg, + AssertKind::OverflowNeg(val.to_const_int()), )?; } @@ -494,29 +494,44 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { ) -> Option<()> { 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 { // 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! let left_ty = left.ty(&self.local_decls, self.tcx); - let left_size_bits = self.ecx.layout_of(left_ty).ok()?.size.bits(); + let left_size = self.ecx.layout_of(left_ty).ok()?.size; let right_size = r.layout.size; let r_bits = r.to_scalar().ok(); // This is basically `force_bits`. let r_bits = r_bits.and_then(|r| r.to_bits_or_ptr(right_size, &self.tcx).ok()); - if r_bits.map_or(false, |b| b >= left_size_bits as u128) { + if r_bits.map_or(false, |b| b >= left_size.bits() as u128) { self.report_assert_as_lint( lint::builtin::ARITHMETIC_OVERFLOW, source_info, "this arithmetic operation will overflow", - AssertKind::Overflow(op), + AssertKind::Overflow( + op, + match l { + Some(l) => l.to_const_int(), + // Invent a dummy value, the diagnostic ignores it anyway + None => ConstInt::new( + 1, + left_size, + left_ty.is_signed(), + left_ty.is_ptr_sized_integral(), + ), + }, + r.to_const_int(), + ), )?; } } + let l = l?; + // The remaining operators are handled through `overflowing_binary_op`. if self.use_ecx(|this| { - let l = this.ecx.read_immediate(this.ecx.eval_operand(left, None)?)?; let (_res, overflow, _ty) = this.ecx.overflowing_binary_op(op, l, r)?; Ok(overflow) })? { @@ -524,7 +539,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { lint::builtin::ARITHMETIC_OVERFLOW, source_info, "this arithmetic operation will overflow", - AssertKind::Overflow(op), + AssertKind::Overflow(op, l.to_const_int(), r.to_const_int()), )?; } @@ -949,31 +964,26 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> { } Operand::Constant(_) => {} } + let mut eval_to_int = |op| { + let op = self + .eval_operand(op, source_info) + .expect("if we got here, it must be const"); + self.ecx.read_immediate(op).unwrap().to_const_int() + }; let msg = match msg { - AssertKind::DivisionByZero => AssertKind::DivisionByZero, - AssertKind::RemainderByZero => AssertKind::RemainderByZero, + AssertKind::DivisionByZero(op) => { + AssertKind::DivisionByZero(eval_to_int(op)) + } + AssertKind::RemainderByZero(op) => { + AssertKind::RemainderByZero(eval_to_int(op)) + } AssertKind::BoundsCheck { ref len, ref index } => { - let len = - self.eval_operand(len, source_info).expect("len must be const"); - let len = self - .ecx - .read_scalar(len) - .unwrap() - .to_machine_usize(&self.tcx) - .unwrap(); - let index = self - .eval_operand(index, source_info) - .expect("index must be const"); - let index = self - .ecx - .read_scalar(index) - .unwrap() - .to_machine_usize(&self.tcx) - .unwrap(); + let len = eval_to_int(len); + let index = eval_to_int(index); AssertKind::BoundsCheck { len, index } } // Overflow is are already covered by checks on the binary operators. - AssertKind::Overflow(_) | AssertKind::OverflowNeg => return, + AssertKind::Overflow(..) | AssertKind::OverflowNeg(_) => return, // Need proper const propagator for these. _ => return, }; diff --git a/src/librustc_mir_build/build/expr/as_rvalue.rs b/src/librustc_mir_build/build/expr/as_rvalue.rs index 9531ff0a9071f..e2217fdfac036 100644 --- a/src/librustc_mir_build/build/expr/as_rvalue.rs +++ b/src/librustc_mir_build/build/expr/as_rvalue.rs @@ -87,7 +87,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { block, Operand::Move(is_min), false, - AssertKind::OverflowNeg, + AssertKind::OverflowNeg(arg.to_copy()), expr_span, ); } @@ -288,7 +288,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { block, source_info, result_value, - Rvalue::CheckedBinaryOp(op, lhs, rhs), + Rvalue::CheckedBinaryOp(op, lhs.to_copy(), rhs.to_copy()), ); let val_fld = Field::new(0); let of_fld = Field::new(1); @@ -297,7 +297,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let val = tcx.mk_place_field(result_value, val_fld, ty); let of = tcx.mk_place_field(result_value, of_fld, bool_ty); - let err = AssertKind::Overflow(op); + let err = AssertKind::Overflow(op, lhs, rhs); block = self.assert(block, Operand::Move(of), false, err, span); @@ -308,11 +308,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // and 2. there are two possible failure cases, divide-by-zero and overflow. let zero_err = if op == BinOp::Div { - AssertKind::DivisionByZero + AssertKind::DivisionByZero(lhs.to_copy()) } else { - AssertKind::RemainderByZero + AssertKind::RemainderByZero(lhs.to_copy()) }; - let overflow_err = AssertKind::Overflow(op); + let overflow_err = AssertKind::Overflow(op, lhs.to_copy(), rhs.to_copy()); // Check for / 0 let is_zero = self.temp(bool_ty, span); diff --git a/src/librustdoc/clean/utils.rs b/src/librustdoc/clean/utils.rs index c4e4802db6c07..8c5d04ff58b25 100644 --- a/src/librustdoc/clean/utils.rs +++ b/src/librustdoc/clean/utils.rs @@ -481,8 +481,8 @@ pub fn print_const(cx: &DocContext<'_>, n: &'tcx ty::Const<'_>) -> String { _ => { let mut s = n.to_string(); // array lengths are obviously usize - if s.ends_with("usize") { - let n = s.len() - "usize".len(); + if s.ends_with("_usize") { + let n = s.len() - "_usize".len(); s.truncate(n); if s.ends_with(": ") { let n = s.len() - ": ".len(); diff --git a/src/test/mir-opt/address-of/rustc.address_of_reborrow.SimplifyCfg-initial.after.mir b/src/test/mir-opt/address-of/rustc.address_of_reborrow.SimplifyCfg-initial.after.mir index aeb38f3f91068..07793b3598f9e 100644 --- a/src/test/mir-opt/address-of/rustc.address_of_reborrow.SimplifyCfg-initial.after.mir +++ b/src/test/mir-opt/address-of/rustc.address_of_reborrow.SimplifyCfg-initial.after.mir @@ -128,7 +128,7 @@ fn address_of_reborrow() -> () { bb0: { StorageLive(_1); // scope 0 at $DIR/address-of.rs:4:9: 4:10 StorageLive(_2); // scope 0 at $DIR/address-of.rs:4:14: 4:21 - _2 = [const 0i32; 10]; // scope 0 at $DIR/address-of.rs:4:14: 4:21 + _2 = [const 0_i32; 10]; // scope 0 at $DIR/address-of.rs:4:14: 4:21 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) @@ -139,7 +139,7 @@ fn address_of_reborrow() -> () { FakeRead(ForLet, _1); // scope 0 at $DIR/address-of.rs:4:9: 4:10 StorageLive(_3); // scope 1 at $DIR/address-of.rs:5:9: 5:14 StorageLive(_4); // scope 1 at $DIR/address-of.rs:5:22: 5:29 - _4 = [const 0i32; 10]; // scope 1 at $DIR/address-of.rs:5:22: 5:29 + _4 = [const 0_i32; 10]; // scope 1 at $DIR/address-of.rs:5:22: 5:29 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) diff --git a/src/test/mir-opt/array-index-is-temporary/32bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir b/src/test/mir-opt/array-index-is-temporary/32bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir index d39b9b8a3b444..2a3a18d6c5b5d 100644 --- a/src/test/mir-opt/array-index-is-temporary/32bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir +++ b/src/test/mir-opt/array-index-is-temporary/32bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir @@ -25,7 +25,7 @@ fn main() -> () { bb0: { StorageLive(_1); // scope 0 at $DIR/array-index-is-temporary.rs:13:9: 13:14 - _1 = [const 42u32, const 43u32, const 44u32]; // scope 0 at $DIR/array-index-is-temporary.rs:13:17: 13:29 + _1 = [const 42_u32, const 43_u32, const 44_u32]; // scope 0 at $DIR/array-index-is-temporary.rs:13:17: 13:29 // ty::Const // + ty: u32 // + val: Value(Scalar(0x0000002a)) @@ -45,7 +45,7 @@ fn main() -> () { // + span: $DIR/array-index-is-temporary.rs:13:26: 13:28 // + literal: Const { ty: u32, val: Value(Scalar(0x0000002c)) } StorageLive(_2); // scope 1 at $DIR/array-index-is-temporary.rs:14:9: 14:14 - _2 = const 1usize; // scope 1 at $DIR/array-index-is-temporary.rs:14:17: 14:18 + _2 = const 1_usize; // scope 1 at $DIR/array-index-is-temporary.rs:14:17: 14:18 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000001)) diff --git a/src/test/mir-opt/array-index-is-temporary/64bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir b/src/test/mir-opt/array-index-is-temporary/64bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir index 381c1ca6f22ef..093c170cf7a3a 100644 --- a/src/test/mir-opt/array-index-is-temporary/64bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir +++ b/src/test/mir-opt/array-index-is-temporary/64bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir @@ -25,7 +25,7 @@ fn main() -> () { bb0: { StorageLive(_1); // scope 0 at $DIR/array-index-is-temporary.rs:13:9: 13:14 - _1 = [const 42u32, const 43u32, const 44u32]; // scope 0 at $DIR/array-index-is-temporary.rs:13:17: 13:29 + _1 = [const 42_u32, const 43_u32, const 44_u32]; // scope 0 at $DIR/array-index-is-temporary.rs:13:17: 13:29 // ty::Const // + ty: u32 // + val: Value(Scalar(0x0000002a)) @@ -45,7 +45,7 @@ fn main() -> () { // + span: $DIR/array-index-is-temporary.rs:13:26: 13:28 // + literal: Const { ty: u32, val: Value(Scalar(0x0000002c)) } StorageLive(_2); // scope 1 at $DIR/array-index-is-temporary.rs:14:9: 14:14 - _2 = const 1usize; // scope 1 at $DIR/array-index-is-temporary.rs:14:17: 14:18 + _2 = const 1_usize; // scope 1 at $DIR/array-index-is-temporary.rs:14:17: 14:18 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000001)) diff --git a/src/test/mir-opt/byte_slice/rustc.main.SimplifyCfg-elaborate-drops.after.mir b/src/test/mir-opt/byte_slice/rustc.main.SimplifyCfg-elaborate-drops.after.mir index 88cb09ac15a9c..54e01dceb5099 100644 --- a/src/test/mir-opt/byte_slice/rustc.main.SimplifyCfg-elaborate-drops.after.mir +++ b/src/test/mir-opt/byte_slice/rustc.main.SimplifyCfg-elaborate-drops.after.mir @@ -21,7 +21,7 @@ fn main() -> () { // + span: $DIR/byte_slice.rs:5:13: 5:19 // + literal: Const { ty: &[u8; 3], val: Value(Scalar(alloc0)) } StorageLive(_2); // scope 1 at $DIR/byte_slice.rs:6:9: 6:10 - _2 = [const 5u8, const 120u8]; // scope 1 at $DIR/byte_slice.rs:6:13: 6:24 + _2 = [const 5_u8, const 120_u8]; // scope 1 at $DIR/byte_slice.rs:6:13: 6:24 // ty::Const // + ty: u8 // + val: Value(Scalar(0x05)) diff --git a/src/test/mir-opt/combine_array_len/32bit/rustc.norm2.InstCombine.diff b/src/test/mir-opt/combine_array_len/32bit/rustc.norm2.InstCombine.diff index e11619cf0cd0e..65db967fe5f81 100644 --- a/src/test/mir-opt/combine_array_len/32bit/rustc.norm2.InstCombine.diff +++ b/src/test/mir-opt/combine_array_len/32bit/rustc.norm2.InstCombine.diff @@ -28,7 +28,7 @@ bb0: { StorageLive(_2); // scope 0 at $DIR/combine_array_len.rs:5:9: 5:10 StorageLive(_3); // scope 0 at $DIR/combine_array_len.rs:5:15: 5:16 - _3 = const 0usize; // scope 0 at $DIR/combine_array_len.rs:5:15: 5:16 + _3 = const 0_usize; // scope 0 at $DIR/combine_array_len.rs:5:15: 5:16 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000000)) @@ -36,7 +36,7 @@ // + span: $DIR/combine_array_len.rs:5:15: 5:16 // + literal: Const { ty: usize, val: Value(Scalar(0x00000000)) } - _4 = Len(_1); // scope 0 at $DIR/combine_array_len.rs:5:13: 5:17 -+ _4 = const 2usize; // scope 0 at $DIR/combine_array_len.rs:5:13: 5:17 ++ _4 = const 2_usize; // scope 0 at $DIR/combine_array_len.rs:5:13: 5:17 + // ty::Const + // + ty: usize + // + val: Value(Scalar(0x00000002)) @@ -52,7 +52,7 @@ StorageDead(_3); // scope 0 at $DIR/combine_array_len.rs:5:17: 5:18 StorageLive(_6); // scope 1 at $DIR/combine_array_len.rs:6:9: 6:10 StorageLive(_7); // scope 1 at $DIR/combine_array_len.rs:6:15: 6:16 - _7 = const 1usize; // scope 1 at $DIR/combine_array_len.rs:6:15: 6:16 + _7 = const 1_usize; // scope 1 at $DIR/combine_array_len.rs:6:15: 6:16 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000001)) @@ -60,7 +60,7 @@ // + span: $DIR/combine_array_len.rs:6:15: 6:16 // + literal: Const { ty: usize, val: Value(Scalar(0x00000001)) } - _8 = Len(_1); // scope 1 at $DIR/combine_array_len.rs:6:13: 6:17 -+ _8 = const 2usize; // scope 1 at $DIR/combine_array_len.rs:6:13: 6:17 ++ _8 = const 2_usize; // scope 1 at $DIR/combine_array_len.rs:6:13: 6:17 + // ty::Const + // + ty: usize + // + val: Value(Scalar(0x00000002)) diff --git a/src/test/mir-opt/combine_array_len/64bit/rustc.norm2.InstCombine.diff b/src/test/mir-opt/combine_array_len/64bit/rustc.norm2.InstCombine.diff index 050cfe359a175..712c4eb230c7e 100644 --- a/src/test/mir-opt/combine_array_len/64bit/rustc.norm2.InstCombine.diff +++ b/src/test/mir-opt/combine_array_len/64bit/rustc.norm2.InstCombine.diff @@ -28,7 +28,7 @@ bb0: { StorageLive(_2); // scope 0 at $DIR/combine_array_len.rs:5:9: 5:10 StorageLive(_3); // scope 0 at $DIR/combine_array_len.rs:5:15: 5:16 - _3 = const 0usize; // scope 0 at $DIR/combine_array_len.rs:5:15: 5:16 + _3 = const 0_usize; // scope 0 at $DIR/combine_array_len.rs:5:15: 5:16 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000000)) @@ -36,7 +36,7 @@ // + span: $DIR/combine_array_len.rs:5:15: 5:16 // + literal: Const { ty: usize, val: Value(Scalar(0x0000000000000000)) } - _4 = Len(_1); // scope 0 at $DIR/combine_array_len.rs:5:13: 5:17 -+ _4 = const 2usize; // scope 0 at $DIR/combine_array_len.rs:5:13: 5:17 ++ _4 = const 2_usize; // scope 0 at $DIR/combine_array_len.rs:5:13: 5:17 + // ty::Const + // + ty: usize + // + val: Value(Scalar(0x0000000000000002)) @@ -52,7 +52,7 @@ StorageDead(_3); // scope 0 at $DIR/combine_array_len.rs:5:17: 5:18 StorageLive(_6); // scope 1 at $DIR/combine_array_len.rs:6:9: 6:10 StorageLive(_7); // scope 1 at $DIR/combine_array_len.rs:6:15: 6:16 - _7 = const 1usize; // scope 1 at $DIR/combine_array_len.rs:6:15: 6:16 + _7 = const 1_usize; // scope 1 at $DIR/combine_array_len.rs:6:15: 6:16 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000001)) @@ -60,7 +60,7 @@ // + span: $DIR/combine_array_len.rs:6:15: 6:16 // + literal: Const { ty: usize, val: Value(Scalar(0x0000000000000001)) } - _8 = Len(_1); // scope 1 at $DIR/combine_array_len.rs:6:13: 6:17 -+ _8 = const 2usize; // scope 1 at $DIR/combine_array_len.rs:6:13: 6:17 ++ _8 = const 2_usize; // scope 1 at $DIR/combine_array_len.rs:6:13: 6:17 + // ty::Const + // + ty: usize + // + val: Value(Scalar(0x0000000000000002)) diff --git a/src/test/mir-opt/const_prop/aggregate/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/aggregate/rustc.main.ConstProp.diff index f4b6c7db444e5..e84e88b93fcd8 100644 --- a/src/test/mir-opt/const_prop/aggregate/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/aggregate/rustc.main.ConstProp.diff @@ -14,7 +14,7 @@ StorageLive(_1); // scope 0 at $DIR/aggregate.rs:5:9: 5:10 StorageLive(_2); // scope 0 at $DIR/aggregate.rs:5:13: 5:24 StorageLive(_3); // scope 0 at $DIR/aggregate.rs:5:13: 5:22 - _3 = (const 0i32, const 1i32, const 2i32); // scope 0 at $DIR/aggregate.rs:5:13: 5:22 + _3 = (const 0_i32, const 1_i32, const 2_i32); // scope 0 at $DIR/aggregate.rs:5:13: 5:22 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) @@ -34,8 +34,8 @@ // + span: $DIR/aggregate.rs:5:20: 5:21 // + literal: Const { ty: i32, val: Value(Scalar(0x00000002)) } - _2 = (_3.1: i32); // scope 0 at $DIR/aggregate.rs:5:13: 5:24 -- _1 = Add(move _2, const 0i32); // scope 0 at $DIR/aggregate.rs:5:13: 5:28 -+ _2 = const 1i32; // scope 0 at $DIR/aggregate.rs:5:13: 5:24 +- _1 = Add(move _2, const 0_i32); // scope 0 at $DIR/aggregate.rs:5:13: 5:28 ++ _2 = const 1_i32; // scope 0 at $DIR/aggregate.rs:5:13: 5:24 // ty::Const // + ty: i32 - // + val: Value(Scalar(0x00000000)) @@ -45,7 +45,7 @@ - // + literal: Const { ty: i32, val: Value(Scalar(0x00000000)) } + // + span: $DIR/aggregate.rs:5:13: 5:24 + // + literal: Const { ty: i32, val: Value(Scalar(0x00000001)) } -+ _1 = const 1i32; // scope 0 at $DIR/aggregate.rs:5:13: 5:28 ++ _1 = const 1_i32; // scope 0 at $DIR/aggregate.rs:5:13: 5:28 + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000001)) diff --git a/src/test/mir-opt/const_prop/array_index/32bit/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/array_index/32bit/rustc.main.ConstProp.diff index d02906132e296..48908479935d1 100644 --- a/src/test/mir-opt/const_prop/array_index/32bit/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/array_index/32bit/rustc.main.ConstProp.diff @@ -15,7 +15,7 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/array_index.rs:5:9: 5:10 StorageLive(_2); // scope 0 at $DIR/array_index.rs:5:18: 5:30 - _2 = [const 0u32, const 1u32, const 2u32, const 3u32]; // scope 0 at $DIR/array_index.rs:5:18: 5:30 + _2 = [const 0_u32, const 1_u32, const 2_u32, const 3_u32]; // scope 0 at $DIR/array_index.rs:5:18: 5:30 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -41,14 +41,14 @@ // + span: $DIR/array_index.rs:5:28: 5:29 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_3); // scope 0 at $DIR/array_index.rs:5:31: 5:32 - _3 = const 2usize; // scope 0 at $DIR/array_index.rs:5:31: 5:32 + _3 = const 2_usize; // scope 0 at $DIR/array_index.rs:5:31: 5:32 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000002)) // mir::Constant // + span: $DIR/array_index.rs:5:31: 5:32 // + literal: Const { ty: usize, val: Value(Scalar(0x00000002)) } - _4 = const 4usize; // scope 0 at $DIR/array_index.rs:5:18: 5:33 + _4 = const 4_usize; // scope 0 at $DIR/array_index.rs:5:18: 5:33 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000004)) @@ -75,7 +75,7 @@ bb1: { - _1 = _2[_3]; // scope 0 at $DIR/array_index.rs:5:18: 5:33 -+ _1 = const 2u32; // scope 0 at $DIR/array_index.rs:5:18: 5:33 ++ _1 = const 2_u32; // scope 0 at $DIR/array_index.rs:5:18: 5:33 + // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x00000002)) diff --git a/src/test/mir-opt/const_prop/array_index/64bit/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/array_index/64bit/rustc.main.ConstProp.diff index 4fe3f08955894..fd662698a0fd4 100644 --- a/src/test/mir-opt/const_prop/array_index/64bit/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/array_index/64bit/rustc.main.ConstProp.diff @@ -15,7 +15,7 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/array_index.rs:5:9: 5:10 StorageLive(_2); // scope 0 at $DIR/array_index.rs:5:18: 5:30 - _2 = [const 0u32, const 1u32, const 2u32, const 3u32]; // scope 0 at $DIR/array_index.rs:5:18: 5:30 + _2 = [const 0_u32, const 1_u32, const 2_u32, const 3_u32]; // scope 0 at $DIR/array_index.rs:5:18: 5:30 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -41,14 +41,14 @@ // + span: $DIR/array_index.rs:5:28: 5:29 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_3); // scope 0 at $DIR/array_index.rs:5:31: 5:32 - _3 = const 2usize; // scope 0 at $DIR/array_index.rs:5:31: 5:32 + _3 = const 2_usize; // scope 0 at $DIR/array_index.rs:5:31: 5:32 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000002)) // mir::Constant // + span: $DIR/array_index.rs:5:31: 5:32 // + literal: Const { ty: usize, val: Value(Scalar(0x0000000000000002)) } - _4 = const 4usize; // scope 0 at $DIR/array_index.rs:5:18: 5:33 + _4 = const 4_usize; // scope 0 at $DIR/array_index.rs:5:18: 5:33 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000004)) @@ -75,7 +75,7 @@ bb1: { - _1 = _2[_3]; // scope 0 at $DIR/array_index.rs:5:18: 5:33 -+ _1 = const 2u32; // scope 0 at $DIR/array_index.rs:5:18: 5:33 ++ _1 = const 2_u32; // scope 0 at $DIR/array_index.rs:5:18: 5:33 + // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x00000002)) diff --git a/src/test/mir-opt/const_prop/bad_op_div_by_zero/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/bad_op_div_by_zero/rustc.main.ConstProp.diff index de06e5334e040..ed28678edb30d 100644 --- a/src/test/mir-opt/const_prop/bad_op_div_by_zero/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/bad_op_div_by_zero/rustc.main.ConstProp.diff @@ -19,7 +19,7 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/bad_op_div_by_zero.rs:4:9: 4:10 - _1 = const 0i32; // scope 0 at $DIR/bad_op_div_by_zero.rs:4:13: 4:14 + _1 = const 0_i32; // scope 0 at $DIR/bad_op_div_by_zero.rs:4:13: 4:14 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) @@ -29,8 +29,8 @@ StorageLive(_2); // scope 1 at $DIR/bad_op_div_by_zero.rs:5:9: 5:11 StorageLive(_3); // scope 1 at $DIR/bad_op_div_by_zero.rs:5:18: 5:19 - _3 = _1; // scope 1 at $DIR/bad_op_div_by_zero.rs:5:18: 5:19 -- _4 = Eq(_3, const 0i32); // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 -+ _3 = const 0i32; // scope 1 at $DIR/bad_op_div_by_zero.rs:5:18: 5:19 +- _4 = Eq(_3, const 0_i32); // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 ++ _3 = const 0_i32; // scope 1 at $DIR/bad_op_div_by_zero.rs:5:18: 5:19 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) @@ -45,11 +45,17 @@ + // mir::Constant + // + span: $DIR/bad_op_div_by_zero.rs:5:14: 5:19 + // + literal: Const { ty: bool, val: Value(Scalar(0x01)) } - assert(!move _4, "attempt to divide by zero") -> bb1; // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 + assert(!move _4, "attempt to divide {} by zero", const 1_i32) -> bb1; // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000001)) + // mir::Constant + // + span: $DIR/bad_op_div_by_zero.rs:5:14: 5:15 + // + literal: Const { ty: i32, val: Value(Scalar(0x00000001)) } } bb1: { -- _5 = Eq(_3, const -1i32); // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 +- _5 = Eq(_3, const -1_i32); // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 + _5 = const false; // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 // ty::Const - // + ty: i32 @@ -59,7 +65,7 @@ // mir::Constant // + span: $DIR/bad_op_div_by_zero.rs:5:14: 5:19 - // + literal: Const { ty: i32, val: Value(Scalar(0xffffffff)) } -- _6 = Eq(const 1i32, const i32::MIN); // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 +- _6 = Eq(const 1_i32, const i32::MIN); // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } + _6 = const false; // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 // ty::Const @@ -82,19 +88,25 @@ // + span: $DIR/bad_op_div_by_zero.rs:5:14: 5:19 - // + literal: Const { ty: i32, val: Value(Scalar(0x80000000)) } - _7 = BitAnd(move _5, move _6); // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 -- assert(!move _7, "attempt to divide with overflow") -> bb2; // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 +- assert(!move _7, "attempt to compute `{} / {}` which would overflow", const 1_i32, _3) -> bb2; // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } -+ assert(!const false, "attempt to divide with overflow") -> bb2; // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 ++ assert(!const false, "attempt to compute `{} / {}` which would overflow", const 1_i32, _3) -> bb2; // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 + // ty::Const + // + ty: bool + // + val: Value(Scalar(0x00)) + // mir::Constant + // + span: $DIR/bad_op_div_by_zero.rs:5:14: 5:19 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000001)) + // mir::Constant + // + span: $DIR/bad_op_div_by_zero.rs:5:14: 5:15 + // + literal: Const { ty: i32, val: Value(Scalar(0x00000001)) } } bb2: { - _2 = Div(const 1i32, move _3); // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 + _2 = Div(const 1_i32, move _3); // scope 1 at $DIR/bad_op_div_by_zero.rs:5:14: 5:19 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) diff --git a/src/test/mir-opt/const_prop/bad_op_mod_by_zero/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/bad_op_mod_by_zero/rustc.main.ConstProp.diff index 7052c8387041b..8855df95aeab5 100644 --- a/src/test/mir-opt/const_prop/bad_op_mod_by_zero/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/bad_op_mod_by_zero/rustc.main.ConstProp.diff @@ -19,7 +19,7 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/bad_op_mod_by_zero.rs:4:9: 4:10 - _1 = const 0i32; // scope 0 at $DIR/bad_op_mod_by_zero.rs:4:13: 4:14 + _1 = const 0_i32; // scope 0 at $DIR/bad_op_mod_by_zero.rs:4:13: 4:14 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) @@ -29,8 +29,8 @@ StorageLive(_2); // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:9: 5:11 StorageLive(_3); // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:18: 5:19 - _3 = _1; // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:18: 5:19 -- _4 = Eq(_3, const 0i32); // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 -+ _3 = const 0i32; // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:18: 5:19 +- _4 = Eq(_3, const 0_i32); // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 ++ _3 = const 0_i32; // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:18: 5:19 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) @@ -45,11 +45,17 @@ + // mir::Constant + // + span: $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 + // + literal: Const { ty: bool, val: Value(Scalar(0x01)) } - assert(!move _4, "attempt to calculate the remainder with a divisor of zero") -> bb1; // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 + assert(!move _4, "attempt to calculate the remainder of {} with a divisor of zero", const 1_i32) -> bb1; // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000001)) + // mir::Constant + // + span: $DIR/bad_op_mod_by_zero.rs:5:14: 5:15 + // + literal: Const { ty: i32, val: Value(Scalar(0x00000001)) } } bb1: { -- _5 = Eq(_3, const -1i32); // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 +- _5 = Eq(_3, const -1_i32); // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 + _5 = const false; // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 // ty::Const - // + ty: i32 @@ -59,7 +65,7 @@ // mir::Constant // + span: $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 - // + literal: Const { ty: i32, val: Value(Scalar(0xffffffff)) } -- _6 = Eq(const 1i32, const i32::MIN); // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 +- _6 = Eq(const 1_i32, const i32::MIN); // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } + _6 = const false; // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 // ty::Const @@ -82,19 +88,25 @@ // + span: $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 - // + literal: Const { ty: i32, val: Value(Scalar(0x80000000)) } - _7 = BitAnd(move _5, move _6); // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 -- assert(!move _7, "attempt to calculate the remainder with overflow") -> bb2; // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 +- assert(!move _7, "attempt to compute the remainder of `{} % {}` which would overflow", const 1_i32, _3) -> bb2; // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } -+ assert(!const false, "attempt to calculate the remainder with overflow") -> bb2; // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 ++ assert(!const false, "attempt to compute the remainder of `{} % {}` which would overflow", const 1_i32, _3) -> bb2; // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 + // ty::Const + // + ty: bool + // + val: Value(Scalar(0x00)) + // mir::Constant + // + span: $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000001)) + // mir::Constant + // + span: $DIR/bad_op_mod_by_zero.rs:5:14: 5:15 + // + literal: Const { ty: i32, val: Value(Scalar(0x00000001)) } } bb2: { - _2 = Rem(const 1i32, move _3); // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 + _2 = Rem(const 1_i32, move _3); // scope 1 at $DIR/bad_op_mod_by_zero.rs:5:14: 5:19 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) diff --git a/src/test/mir-opt/const_prop/bad_op_unsafe_oob_for_slices/32bit/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/bad_op_unsafe_oob_for_slices/32bit/rustc.main.ConstProp.diff index 7ceec94d81e76..ee4d4c39f172c 100644 --- a/src/test/mir-opt/const_prop/bad_op_unsafe_oob_for_slices/32bit/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/bad_op_unsafe_oob_for_slices/32bit/rustc.main.ConstProp.diff @@ -39,7 +39,7 @@ StorageDead(_3); // scope 0 at $DIR/bad_op_unsafe_oob_for_slices.rs:5:35: 5:36 StorageLive(_5); // scope 2 at $DIR/bad_op_unsafe_oob_for_slices.rs:7:13: 7:15 StorageLive(_6); // scope 2 at $DIR/bad_op_unsafe_oob_for_slices.rs:7:23: 7:24 - _6 = const 3usize; // scope 2 at $DIR/bad_op_unsafe_oob_for_slices.rs:7:23: 7:24 + _6 = const 3_usize; // scope 2 at $DIR/bad_op_unsafe_oob_for_slices.rs:7:23: 7:24 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000003)) diff --git a/src/test/mir-opt/const_prop/bad_op_unsafe_oob_for_slices/64bit/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/bad_op_unsafe_oob_for_slices/64bit/rustc.main.ConstProp.diff index 483a6f232ef79..3626814fa9770 100644 --- a/src/test/mir-opt/const_prop/bad_op_unsafe_oob_for_slices/64bit/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/bad_op_unsafe_oob_for_slices/64bit/rustc.main.ConstProp.diff @@ -39,7 +39,7 @@ StorageDead(_3); // scope 0 at $DIR/bad_op_unsafe_oob_for_slices.rs:5:35: 5:36 StorageLive(_5); // scope 2 at $DIR/bad_op_unsafe_oob_for_slices.rs:7:13: 7:15 StorageLive(_6); // scope 2 at $DIR/bad_op_unsafe_oob_for_slices.rs:7:23: 7:24 - _6 = const 3usize; // scope 2 at $DIR/bad_op_unsafe_oob_for_slices.rs:7:23: 7:24 + _6 = const 3_usize; // scope 2 at $DIR/bad_op_unsafe_oob_for_slices.rs:7:23: 7:24 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000003)) diff --git a/src/test/mir-opt/const_prop/boxes/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/boxes/rustc.main.ConstProp.diff index 16f937f3e7b5e..f271188ebfdb0 100644 --- a/src/test/mir-opt/const_prop/boxes/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/boxes/rustc.main.ConstProp.diff @@ -17,7 +17,7 @@ StorageLive(_3); // scope 0 at $DIR/boxes.rs:12:14: 12:22 StorageLive(_4); // scope 0 at $DIR/boxes.rs:12:14: 12:22 _4 = Box(i32); // scope 0 at $DIR/boxes.rs:12:14: 12:22 - (*_4) = const 42i32; // scope 0 at $DIR/boxes.rs:12:19: 12:21 + (*_4) = const 42_i32; // scope 0 at $DIR/boxes.rs:12:19: 12:21 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000002a)) @@ -27,7 +27,7 @@ _3 = move _4; // scope 0 at $DIR/boxes.rs:12:14: 12:22 StorageDead(_4); // scope 0 at $DIR/boxes.rs:12:21: 12:22 _2 = (*_3); // scope 0 at $DIR/boxes.rs:12:13: 12:22 - _1 = Add(move _2, const 0i32); // scope 0 at $DIR/boxes.rs:12:13: 12:26 + _1 = Add(move _2, const 0_i32); // scope 0 at $DIR/boxes.rs:12:13: 12:26 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) diff --git a/src/test/mir-opt/const_prop/cast/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/cast/rustc.main.ConstProp.diff index 58c27c5a20f8c..54af804d19b00 100644 --- a/src/test/mir-opt/const_prop/cast/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/cast/rustc.main.ConstProp.diff @@ -14,8 +14,8 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/cast.rs:4:9: 4:10 -- _1 = const 42u8 as u32 (Misc); // scope 0 at $DIR/cast.rs:4:13: 4:24 -+ _1 = const 42u32; // scope 0 at $DIR/cast.rs:4:13: 4:24 +- _1 = const 42_u8 as u32 (Misc); // scope 0 at $DIR/cast.rs:4:13: 4:24 ++ _1 = const 42_u32; // scope 0 at $DIR/cast.rs:4:13: 4:24 // ty::Const - // + ty: u8 - // + val: Value(Scalar(0x2a)) @@ -23,7 +23,7 @@ - // + span: $DIR/cast.rs:4:13: 4:17 - // + literal: Const { ty: u8, val: Value(Scalar(0x2a)) } - StorageLive(_2); // scope 1 at $DIR/cast.rs:6:9: 6:10 -- _2 = const 42u32 as u8 (Misc); // scope 1 at $DIR/cast.rs:6:13: 6:24 +- _2 = const 42_u32 as u8 (Misc); // scope 1 at $DIR/cast.rs:6:13: 6:24 - // ty::Const // + ty: u32 // + val: Value(Scalar(0x0000002a)) @@ -32,7 +32,7 @@ + // + span: $DIR/cast.rs:4:13: 4:24 // + literal: Const { ty: u32, val: Value(Scalar(0x0000002a)) } + StorageLive(_2); // scope 1 at $DIR/cast.rs:6:9: 6:10 -+ _2 = const 42u8; // scope 1 at $DIR/cast.rs:6:13: 6:24 ++ _2 = const 42_u8; // scope 1 at $DIR/cast.rs:6:13: 6:24 + // ty::Const + // + ty: u8 + // + val: Value(Scalar(0x2a)) diff --git a/src/test/mir-opt/const_prop/checked_add/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/checked_add/rustc.main.ConstProp.diff index f9f7d543d21f5..e3690d7129497 100644 --- a/src/test/mir-opt/const_prop/checked_add/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/checked_add/rustc.main.ConstProp.diff @@ -11,8 +11,8 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/checked_add.rs:5:9: 5:10 -- _2 = CheckedAdd(const 1u32, const 1u32); // scope 0 at $DIR/checked_add.rs:5:18: 5:23 -+ _2 = (const 2u32, const false); // scope 0 at $DIR/checked_add.rs:5:18: 5:23 +- _2 = CheckedAdd(const 1_u32, const 1_u32); // scope 0 at $DIR/checked_add.rs:5:18: 5:23 ++ _2 = (const 2_u32, const false); // scope 0 at $DIR/checked_add.rs:5:18: 5:23 // ty::Const // + ty: u32 - // + val: Value(Scalar(0x00000001)) @@ -30,21 +30,33 @@ // mir::Constant - // + span: $DIR/checked_add.rs:5:22: 5:23 - // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } -- assert(!move (_2.1: bool), "attempt to add with overflow") -> bb1; // scope 0 at $DIR/checked_add.rs:5:18: 5:23 +- assert(!move (_2.1: bool), "attempt to compute `{} + {}` which would overflow", const 1_u32, const 1_u32) -> bb1; // scope 0 at $DIR/checked_add.rs:5:18: 5:23 + // + span: $DIR/checked_add.rs:5:18: 5:23 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } -+ assert(!const false, "attempt to add with overflow") -> bb1; // scope 0 at $DIR/checked_add.rs:5:18: 5:23 -+ // ty::Const ++ assert(!const false, "attempt to compute `{} + {}` which would overflow", const 1_u32, const 1_u32) -> bb1; // scope 0 at $DIR/checked_add.rs:5:18: 5:23 + // ty::Const + // + ty: bool + // + val: Value(Scalar(0x00)) + // mir::Constant + // + span: $DIR/checked_add.rs:5:18: 5:23 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } ++ // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x00000001)) + // mir::Constant + // + span: $DIR/checked_add.rs:5:18: 5:19 + // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } + // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x00000001)) + // mir::Constant + // + span: $DIR/checked_add.rs:5:22: 5:23 + // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } } bb1: { - _1 = move (_2.0: u32); // scope 0 at $DIR/checked_add.rs:5:18: 5:23 -+ _1 = const 2u32; // scope 0 at $DIR/checked_add.rs:5:18: 5:23 ++ _1 = const 2_u32; // scope 0 at $DIR/checked_add.rs:5:18: 5:23 + // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x00000002)) diff --git a/src/test/mir-opt/const_prop/discriminant/32bit/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/discriminant/32bit/rustc.main.ConstProp.diff index 1c873f53f378a..26010b43c922a 100644 --- a/src/test/mir-opt/const_prop/discriminant/32bit/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/discriminant/32bit/rustc.main.ConstProp.diff @@ -25,17 +25,17 @@ - // + span: $DIR/discriminant.rs:11:39: 11:43 - // + literal: Const { ty: bool, val: Value(Scalar(0x01)) } - _4 = discriminant(_3); // scope 0 at $DIR/discriminant.rs:11:21: 11:31 -- switchInt(move _4) -> [1isize: bb2, otherwise: bb1]; // scope 0 at $DIR/discriminant.rs:11:21: 11:31 +- switchInt(move _4) -> [1_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/discriminant.rs:11:21: 11:31 + // + span: $DIR/discriminant.rs:11:34: 11:44 + // + literal: Const { ty: std::option::Option, val: Value(Scalar(0x01)) } -+ _4 = const 1isize; // scope 0 at $DIR/discriminant.rs:11:21: 11:31 ++ _4 = const 1_isize; // scope 0 at $DIR/discriminant.rs:11:21: 11:31 + // ty::Const + // + ty: isize + // + val: Value(Scalar(0x00000001)) + // mir::Constant + // + span: $DIR/discriminant.rs:11:21: 11:31 + // + literal: Const { ty: isize, val: Value(Scalar(0x00000001)) } -+ switchInt(const 1isize) -> [1isize: bb2, otherwise: bb1]; // scope 0 at $DIR/discriminant.rs:11:21: 11:31 ++ switchInt(const 1_isize) -> [1_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/discriminant.rs:11:21: 11:31 + // ty::Const + // + ty: isize + // + val: Value(Scalar(0x00000001)) @@ -45,7 +45,7 @@ } bb1: { - _2 = const 10i32; // scope 0 at $DIR/discriminant.rs:11:59: 11:61 + _2 = const 10_i32; // scope 0 at $DIR/discriminant.rs:11:59: 11:61 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000000a)) @@ -60,7 +60,7 @@ } bb3: { - _2 = const 42i32; // scope 0 at $DIR/discriminant.rs:11:47: 11:49 + _2 = const 42_i32; // scope 0 at $DIR/discriminant.rs:11:47: 11:49 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000002a)) @@ -71,7 +71,7 @@ } bb4: { - _1 = Add(move _2, const 0i32); // scope 0 at $DIR/discriminant.rs:11:13: 11:68 + _1 = Add(move _2, const 0_i32); // scope 0 at $DIR/discriminant.rs:11:13: 11:68 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) diff --git a/src/test/mir-opt/const_prop/discriminant/64bit/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/discriminant/64bit/rustc.main.ConstProp.diff index 75b4b7e5a62ba..b09c9c4766116 100644 --- a/src/test/mir-opt/const_prop/discriminant/64bit/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/discriminant/64bit/rustc.main.ConstProp.diff @@ -25,17 +25,17 @@ - // + span: $DIR/discriminant.rs:11:39: 11:43 - // + literal: Const { ty: bool, val: Value(Scalar(0x01)) } - _4 = discriminant(_3); // scope 0 at $DIR/discriminant.rs:11:21: 11:31 -- switchInt(move _4) -> [1isize: bb2, otherwise: bb1]; // scope 0 at $DIR/discriminant.rs:11:21: 11:31 +- switchInt(move _4) -> [1_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/discriminant.rs:11:21: 11:31 + // + span: $DIR/discriminant.rs:11:34: 11:44 + // + literal: Const { ty: std::option::Option, val: Value(Scalar(0x01)) } -+ _4 = const 1isize; // scope 0 at $DIR/discriminant.rs:11:21: 11:31 ++ _4 = const 1_isize; // scope 0 at $DIR/discriminant.rs:11:21: 11:31 + // ty::Const + // + ty: isize + // + val: Value(Scalar(0x0000000000000001)) + // mir::Constant + // + span: $DIR/discriminant.rs:11:21: 11:31 + // + literal: Const { ty: isize, val: Value(Scalar(0x0000000000000001)) } -+ switchInt(const 1isize) -> [1isize: bb2, otherwise: bb1]; // scope 0 at $DIR/discriminant.rs:11:21: 11:31 ++ switchInt(const 1_isize) -> [1_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/discriminant.rs:11:21: 11:31 + // ty::Const + // + ty: isize + // + val: Value(Scalar(0x0000000000000001)) @@ -45,7 +45,7 @@ } bb1: { - _2 = const 10i32; // scope 0 at $DIR/discriminant.rs:11:59: 11:61 + _2 = const 10_i32; // scope 0 at $DIR/discriminant.rs:11:59: 11:61 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000000a)) @@ -60,7 +60,7 @@ } bb3: { - _2 = const 42i32; // scope 0 at $DIR/discriminant.rs:11:47: 11:49 + _2 = const 42_i32; // scope 0 at $DIR/discriminant.rs:11:47: 11:49 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000002a)) @@ -71,7 +71,7 @@ } bb4: { - _1 = Add(move _2, const 0i32); // scope 0 at $DIR/discriminant.rs:11:13: 11:68 + _1 = Add(move _2, const 0_i32); // scope 0 at $DIR/discriminant.rs:11:13: 11:68 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) diff --git a/src/test/mir-opt/const_prop/indirect/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/indirect/rustc.main.ConstProp.diff index 941cde9172a6f..71980185fd5cd 100644 --- a/src/test/mir-opt/const_prop/indirect/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/indirect/rustc.main.ConstProp.diff @@ -13,8 +13,8 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/indirect.rs:5:9: 5:10 StorageLive(_2); // scope 0 at $DIR/indirect.rs:5:13: 5:25 -- _2 = const 2u32 as u8 (Misc); // scope 0 at $DIR/indirect.rs:5:13: 5:25 -+ _2 = const 2u8; // scope 0 at $DIR/indirect.rs:5:13: 5:25 +- _2 = const 2_u32 as u8 (Misc); // scope 0 at $DIR/indirect.rs:5:13: 5:25 ++ _2 = const 2_u8; // scope 0 at $DIR/indirect.rs:5:13: 5:25 // ty::Const - // + ty: u32 - // + val: Value(Scalar(0x00000002)) @@ -23,10 +23,10 @@ // mir::Constant - // + span: $DIR/indirect.rs:5:14: 5:18 - // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } -- _3 = CheckedAdd(move _2, const 1u8); // scope 0 at $DIR/indirect.rs:5:13: 5:29 +- _3 = CheckedAdd(_2, const 1_u8); // scope 0 at $DIR/indirect.rs:5:13: 5:29 + // + span: $DIR/indirect.rs:5:13: 5:25 + // + literal: Const { ty: u8, val: Value(Scalar(0x02)) } -+ _3 = (const 3u8, const false); // scope 0 at $DIR/indirect.rs:5:13: 5:29 ++ _3 = (const 3_u8, const false); // scope 0 at $DIR/indirect.rs:5:13: 5:29 // ty::Const // + ty: u8 - // + val: Value(Scalar(0x01)) @@ -34,27 +34,33 @@ // mir::Constant - // + span: $DIR/indirect.rs:5:28: 5:29 - // + literal: Const { ty: u8, val: Value(Scalar(0x01)) } -- assert(!move (_3.1: bool), "attempt to add with overflow") -> bb1; // scope 0 at $DIR/indirect.rs:5:13: 5:29 +- assert(!move (_3.1: bool), "attempt to compute `{} + {}` which would overflow", move _2, const 1_u8) -> bb1; // scope 0 at $DIR/indirect.rs:5:13: 5:29 + // + span: $DIR/indirect.rs:5:13: 5:29 + // + literal: Const { ty: u8, val: Value(Scalar(0x03)) } -+ // ty::Const + // ty::Const + // + ty: bool + // + val: Value(Scalar(0x00)) + // mir::Constant + // + span: $DIR/indirect.rs:5:13: 5:29 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } -+ assert(!const false, "attempt to add with overflow") -> bb1; // scope 0 at $DIR/indirect.rs:5:13: 5:29 ++ assert(!const false, "attempt to compute `{} + {}` which would overflow", move _2, const 1_u8) -> bb1; // scope 0 at $DIR/indirect.rs:5:13: 5:29 + // ty::Const + // + ty: bool + // + val: Value(Scalar(0x00)) + // mir::Constant + // + span: $DIR/indirect.rs:5:13: 5:29 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } ++ // ty::Const + // + ty: u8 + // + val: Value(Scalar(0x01)) + // mir::Constant + // + span: $DIR/indirect.rs:5:28: 5:29 + // + literal: Const { ty: u8, val: Value(Scalar(0x01)) } } bb1: { - _1 = move (_3.0: u8); // scope 0 at $DIR/indirect.rs:5:13: 5:29 -+ _1 = const 3u8; // scope 0 at $DIR/indirect.rs:5:13: 5:29 ++ _1 = const 3_u8; // scope 0 at $DIR/indirect.rs:5:13: 5:29 + // ty::Const + // + ty: u8 + // + val: Value(Scalar(0x03)) diff --git a/src/test/mir-opt/const_prop/issue-66971/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/issue-66971/rustc.main.ConstProp.diff index c26494bdc1042..242907b5599d8 100644 --- a/src/test/mir-opt/const_prop/issue-66971/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/issue-66971/rustc.main.ConstProp.diff @@ -19,7 +19,7 @@ + // mir::Constant + // + span: $DIR/issue-66971.rs:16:13: 16:15 + // + literal: Const { ty: (), val: Value(Scalar()) } - _2 = (move _3, const 0u8, const 0u8); // scope 0 at $DIR/issue-66971.rs:16:12: 16:22 + _2 = (move _3, const 0_u8, const 0_u8); // scope 0 at $DIR/issue-66971.rs:16:12: 16:22 // ty::Const // + ty: u8 // + val: Value(Scalar(0x00)) diff --git a/src/test/mir-opt/const_prop/issue-67019/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/issue-67019/rustc.main.ConstProp.diff index e328febb407ae..d5c1105d7caff 100644 --- a/src/test/mir-opt/const_prop/issue-67019/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/issue-67019/rustc.main.ConstProp.diff @@ -11,7 +11,7 @@ StorageLive(_1); // scope 0 at $DIR/issue-67019.rs:11:5: 11:20 StorageLive(_2); // scope 0 at $DIR/issue-67019.rs:11:10: 11:19 StorageLive(_3); // scope 0 at $DIR/issue-67019.rs:11:11: 11:17 - _3 = (const 1u8, const 2u8); // scope 0 at $DIR/issue-67019.rs:11:11: 11:17 + _3 = (const 1_u8, const 2_u8); // scope 0 at $DIR/issue-67019.rs:11:11: 11:17 // ty::Const // + ty: u8 // + val: Value(Scalar(0x01)) diff --git a/src/test/mir-opt/const_prop/mutable_variable/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/mutable_variable/rustc.main.ConstProp.diff index 187c17454350a..3d4309a8aec54 100644 --- a/src/test/mir-opt/const_prop/mutable_variable/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/mutable_variable/rustc.main.ConstProp.diff @@ -14,14 +14,14 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/mutable_variable.rs:5:9: 5:14 - _1 = const 42i32; // scope 0 at $DIR/mutable_variable.rs:5:17: 5:19 + _1 = const 42_i32; // scope 0 at $DIR/mutable_variable.rs:5:17: 5:19 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000002a)) // mir::Constant // + span: $DIR/mutable_variable.rs:5:17: 5:19 // + literal: Const { ty: i32, val: Value(Scalar(0x0000002a)) } - _1 = const 99i32; // scope 1 at $DIR/mutable_variable.rs:6:5: 6:11 + _1 = const 99_i32; // scope 1 at $DIR/mutable_variable.rs:6:5: 6:11 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000063)) @@ -30,7 +30,7 @@ // + literal: Const { ty: i32, val: Value(Scalar(0x00000063)) } StorageLive(_2); // scope 1 at $DIR/mutable_variable.rs:7:9: 7:10 - _2 = _1; // scope 1 at $DIR/mutable_variable.rs:7:13: 7:14 -+ _2 = const 99i32; // scope 1 at $DIR/mutable_variable.rs:7:13: 7:14 ++ _2 = const 99_i32; // scope 1 at $DIR/mutable_variable.rs:7:13: 7:14 + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000063)) diff --git a/src/test/mir-opt/const_prop/mutable_variable_aggregate/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/mutable_variable_aggregate/rustc.main.ConstProp.diff index cf432b2acc1c5..f581b222c83cb 100644 --- a/src/test/mir-opt/const_prop/mutable_variable_aggregate/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/mutable_variable_aggregate/rustc.main.ConstProp.diff @@ -14,7 +14,7 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/mutable_variable_aggregate.rs:5:9: 5:14 - _1 = (const 42i32, const 43i32); // scope 0 at $DIR/mutable_variable_aggregate.rs:5:17: 5:25 + _1 = (const 42_i32, const 43_i32); // scope 0 at $DIR/mutable_variable_aggregate.rs:5:17: 5:25 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000002a)) @@ -29,7 +29,7 @@ - // + span: $DIR/mutable_variable_aggregate.rs:5:22: 5:24 + // + span: $DIR/mutable_variable_aggregate.rs:5:17: 5:25 // + literal: Const { ty: i32, val: Value(Scalar(0x0000002b)) } - (_1.1: i32) = const 99i32; // scope 1 at $DIR/mutable_variable_aggregate.rs:6:5: 6:13 + (_1.1: i32) = const 99_i32; // scope 1 at $DIR/mutable_variable_aggregate.rs:6:5: 6:13 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000063)) @@ -38,7 +38,7 @@ // + literal: Const { ty: i32, val: Value(Scalar(0x00000063)) } StorageLive(_2); // scope 1 at $DIR/mutable_variable_aggregate.rs:7:9: 7:10 - _2 = _1; // scope 1 at $DIR/mutable_variable_aggregate.rs:7:13: 7:14 -+ _2 = (const 42i32, const 99i32); // scope 1 at $DIR/mutable_variable_aggregate.rs:7:13: 7:14 ++ _2 = (const 42_i32, const 99_i32); // scope 1 at $DIR/mutable_variable_aggregate.rs:7:13: 7:14 + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x0000002a)) diff --git a/src/test/mir-opt/const_prop/mutable_variable_aggregate_mut_ref/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/mutable_variable_aggregate_mut_ref/rustc.main.ConstProp.diff index 0d703068d41f4..e78bc31b77480 100644 --- a/src/test/mir-opt/const_prop/mutable_variable_aggregate_mut_ref/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/mutable_variable_aggregate_mut_ref/rustc.main.ConstProp.diff @@ -18,7 +18,7 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/mutable_variable_aggregate_mut_ref.rs:5:9: 5:14 - _1 = (const 42i32, const 43i32); // scope 0 at $DIR/mutable_variable_aggregate_mut_ref.rs:5:17: 5:25 + _1 = (const 42_i32, const 43_i32); // scope 0 at $DIR/mutable_variable_aggregate_mut_ref.rs:5:17: 5:25 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000002a)) @@ -35,7 +35,7 @@ // + literal: Const { ty: i32, val: Value(Scalar(0x0000002b)) } StorageLive(_2); // scope 1 at $DIR/mutable_variable_aggregate_mut_ref.rs:6:9: 6:10 _2 = &mut _1; // scope 1 at $DIR/mutable_variable_aggregate_mut_ref.rs:6:13: 6:19 - ((*_2).1: i32) = const 99i32; // scope 2 at $DIR/mutable_variable_aggregate_mut_ref.rs:7:5: 7:13 + ((*_2).1: i32) = const 99_i32; // scope 2 at $DIR/mutable_variable_aggregate_mut_ref.rs:7:5: 7:13 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000063)) diff --git a/src/test/mir-opt/const_prop/mutable_variable_aggregate_partial_read/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/mutable_variable_aggregate_partial_read/rustc.main.ConstProp.diff index f6bb72baea419..b1a0ab88fccd5 100644 --- a/src/test/mir-opt/const_prop/mutable_variable_aggregate_partial_read/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/mutable_variable_aggregate_partial_read/rustc.main.ConstProp.diff @@ -24,14 +24,14 @@ } bb1: { - (_1.1: i32) = const 99i32; // scope 1 at $DIR/mutable_variable_aggregate_partial_read.rs:6:5: 6:13 + (_1.1: i32) = const 99_i32; // scope 1 at $DIR/mutable_variable_aggregate_partial_read.rs:6:5: 6:13 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000063)) // mir::Constant // + span: $DIR/mutable_variable_aggregate_partial_read.rs:6:11: 6:13 // + literal: Const { ty: i32, val: Value(Scalar(0x00000063)) } - (_1.0: i32) = const 42i32; // scope 1 at $DIR/mutable_variable_aggregate_partial_read.rs:7:5: 7:13 + (_1.0: i32) = const 42_i32; // scope 1 at $DIR/mutable_variable_aggregate_partial_read.rs:7:5: 7:13 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000002a)) @@ -40,7 +40,7 @@ // + literal: Const { ty: i32, val: Value(Scalar(0x0000002a)) } StorageLive(_2); // scope 1 at $DIR/mutable_variable_aggregate_partial_read.rs:8:9: 8:10 - _2 = (_1.1: i32); // scope 1 at $DIR/mutable_variable_aggregate_partial_read.rs:8:13: 8:16 -+ _2 = const 99i32; // scope 1 at $DIR/mutable_variable_aggregate_partial_read.rs:8:13: 8:16 ++ _2 = const 99_i32; // scope 1 at $DIR/mutable_variable_aggregate_partial_read.rs:8:13: 8:16 + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000063)) diff --git a/src/test/mir-opt/const_prop/mutable_variable_no_prop/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/mutable_variable_no_prop/rustc.main.ConstProp.diff index b7f1242d8d125..3b72af2d0b9c5 100644 --- a/src/test/mir-opt/const_prop/mutable_variable_no_prop/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/mutable_variable_no_prop/rustc.main.ConstProp.diff @@ -19,7 +19,7 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/mutable_variable_no_prop.rs:7:9: 7:14 - _1 = const 42u32; // scope 0 at $DIR/mutable_variable_no_prop.rs:7:17: 7:19 + _1 = const 42_u32; // scope 0 at $DIR/mutable_variable_no_prop.rs:7:17: 7:19 // ty::Const // + ty: u32 // + val: Value(Scalar(0x0000002a)) diff --git a/src/test/mir-opt/const_prop/mutable_variable_unprop_assign/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/mutable_variable_unprop_assign/rustc.main.ConstProp.diff index e0b9fbe04c387..b59b180b07d7f 100644 --- a/src/test/mir-opt/const_prop/mutable_variable_unprop_assign/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/mutable_variable_unprop_assign/rustc.main.ConstProp.diff @@ -34,7 +34,7 @@ bb1: { StorageLive(_2); // scope 1 at $DIR/mutable_variable_unprop_assign.rs:6:9: 6:14 - _2 = (const 1i32, const 2i32); // scope 1 at $DIR/mutable_variable_unprop_assign.rs:6:29: 6:35 + _2 = (const 1_i32, const 2_i32); // scope 1 at $DIR/mutable_variable_unprop_assign.rs:6:29: 6:35 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) diff --git a/src/test/mir-opt/const_prop/optimizes_into_variable/32bit/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/optimizes_into_variable/32bit/rustc.main.ConstProp.diff index 9bd9bfa9f2796..4bfa50e9851f4 100644 --- a/src/test/mir-opt/const_prop/optimizes_into_variable/32bit/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/optimizes_into_variable/32bit/rustc.main.ConstProp.diff @@ -24,8 +24,8 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/optimizes_into_variable.rs:12:9: 12:10 -- _2 = CheckedAdd(const 2i32, const 2i32); // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 -+ _2 = (const 4i32, const false); // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 +- _2 = CheckedAdd(const 2_i32, const 2_i32); // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 ++ _2 = (const 4_i32, const false); // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 // ty::Const // + ty: i32 - // + val: Value(Scalar(0x00000002)) @@ -43,21 +43,33 @@ // mir::Constant - // + span: $DIR/optimizes_into_variable.rs:12:17: 12:18 - // + literal: Const { ty: i32, val: Value(Scalar(0x00000002)) } -- assert(!move (_2.1: bool), "attempt to add with overflow") -> bb1; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 +- assert(!move (_2.1: bool), "attempt to compute `{} + {}` which would overflow", const 2_i32, const 2_i32) -> bb1; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 + // + span: $DIR/optimizes_into_variable.rs:12:13: 12:18 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } -+ assert(!const false, "attempt to add with overflow") -> bb1; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 -+ // ty::Const ++ assert(!const false, "attempt to compute `{} + {}` which would overflow", const 2_i32, const 2_i32) -> bb1; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 + // ty::Const + // + ty: bool + // + val: Value(Scalar(0x00)) + // mir::Constant + // + span: $DIR/optimizes_into_variable.rs:12:13: 12:18 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } ++ // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000002)) + // mir::Constant + // + span: $DIR/optimizes_into_variable.rs:12:13: 12:14 + // + literal: Const { ty: i32, val: Value(Scalar(0x00000002)) } + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000002)) + // mir::Constant + // + span: $DIR/optimizes_into_variable.rs:12:17: 12:18 + // + literal: Const { ty: i32, val: Value(Scalar(0x00000002)) } } bb1: { - _1 = move (_2.0: i32); // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 -+ _1 = const 4i32; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 ++ _1 = const 4_i32; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000004)) @@ -66,7 +78,7 @@ + // + literal: Const { ty: i32, val: Value(Scalar(0x00000004)) } StorageLive(_3); // scope 1 at $DIR/optimizes_into_variable.rs:13:9: 13:10 StorageLive(_4); // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:31 - _4 = [const 0i32, const 1i32, const 2i32, const 3i32, const 4i32, const 5i32]; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:31 + _4 = [const 0_i32, const 1_i32, const 2_i32, const 3_i32, const 4_i32, const 5_i32]; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:31 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) @@ -104,14 +116,14 @@ // + span: $DIR/optimizes_into_variable.rs:13:29: 13:30 // + literal: Const { ty: i32, val: Value(Scalar(0x00000005)) } StorageLive(_5); // scope 1 at $DIR/optimizes_into_variable.rs:13:32: 13:33 - _5 = const 3usize; // scope 1 at $DIR/optimizes_into_variable.rs:13:32: 13:33 + _5 = const 3_usize; // scope 1 at $DIR/optimizes_into_variable.rs:13:32: 13:33 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000003)) // mir::Constant // + span: $DIR/optimizes_into_variable.rs:13:32: 13:33 // + literal: Const { ty: usize, val: Value(Scalar(0x00000003)) } - _6 = const 6usize; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 + _6 = const 6_usize; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000006)) @@ -138,7 +150,7 @@ bb2: { - _3 = _4[_5]; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 -+ _3 = const 3i32; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 ++ _3 = const 3_i32; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000003)) @@ -149,7 +161,7 @@ StorageDead(_4); // scope 1 at $DIR/optimizes_into_variable.rs:13:34: 13:35 StorageLive(_8); // scope 2 at $DIR/optimizes_into_variable.rs:14:9: 14:10 StorageLive(_9); // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:36 - _9 = Point { x: const 12u32, y: const 42u32 }; // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:36 + _9 = Point { x: const 12_u32, y: const 42_u32 }; // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:36 // ty::Const // + ty: u32 // + val: Value(Scalar(0x0000000c)) @@ -163,7 +175,7 @@ // + span: $DIR/optimizes_into_variable.rs:14:32: 14:34 // + literal: Const { ty: u32, val: Value(Scalar(0x0000002a)) } - _8 = (_9.1: u32); // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:38 -+ _8 = const 42u32; // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:38 ++ _8 = const 42_u32; // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:38 + // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x0000002a)) diff --git a/src/test/mir-opt/const_prop/optimizes_into_variable/32bit/rustc.main.SimplifyLocals.after.mir b/src/test/mir-opt/const_prop/optimizes_into_variable/32bit/rustc.main.SimplifyLocals.after.mir index 8ea9316c7d49b..7b74bf81d96fe 100644 --- a/src/test/mir-opt/const_prop/optimizes_into_variable/32bit/rustc.main.SimplifyLocals.after.mir +++ b/src/test/mir-opt/const_prop/optimizes_into_variable/32bit/rustc.main.SimplifyLocals.after.mir @@ -17,7 +17,7 @@ fn main() -> () { bb0: { StorageLive(_1); // scope 0 at $DIR/optimizes_into_variable.rs:12:9: 12:10 - _1 = const 4i32; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 + _1 = const 4_i32; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000004)) @@ -25,7 +25,7 @@ fn main() -> () { // + span: $DIR/optimizes_into_variable.rs:12:13: 12:18 // + literal: Const { ty: i32, val: Value(Scalar(0x00000004)) } StorageLive(_2); // scope 1 at $DIR/optimizes_into_variable.rs:13:9: 13:10 - _2 = const 3i32; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 + _2 = const 3_i32; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000003)) @@ -33,7 +33,7 @@ fn main() -> () { // + span: $DIR/optimizes_into_variable.rs:13:13: 13:34 // + literal: Const { ty: i32, val: Value(Scalar(0x00000003)) } StorageLive(_3); // scope 2 at $DIR/optimizes_into_variable.rs:14:9: 14:10 - _3 = const 42u32; // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:38 + _3 = const 42_u32; // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:38 // ty::Const // + ty: u32 // + val: Value(Scalar(0x0000002a)) diff --git a/src/test/mir-opt/const_prop/optimizes_into_variable/64bit/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/optimizes_into_variable/64bit/rustc.main.ConstProp.diff index 1da763ec9558a..2d40567ce8da1 100644 --- a/src/test/mir-opt/const_prop/optimizes_into_variable/64bit/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/optimizes_into_variable/64bit/rustc.main.ConstProp.diff @@ -24,8 +24,8 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/optimizes_into_variable.rs:12:9: 12:10 -- _2 = CheckedAdd(const 2i32, const 2i32); // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 -+ _2 = (const 4i32, const false); // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 +- _2 = CheckedAdd(const 2_i32, const 2_i32); // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 ++ _2 = (const 4_i32, const false); // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 // ty::Const // + ty: i32 - // + val: Value(Scalar(0x00000002)) @@ -43,21 +43,33 @@ // mir::Constant - // + span: $DIR/optimizes_into_variable.rs:12:17: 12:18 - // + literal: Const { ty: i32, val: Value(Scalar(0x00000002)) } -- assert(!move (_2.1: bool), "attempt to add with overflow") -> bb1; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 +- assert(!move (_2.1: bool), "attempt to compute `{} + {}` which would overflow", const 2_i32, const 2_i32) -> bb1; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 + // + span: $DIR/optimizes_into_variable.rs:12:13: 12:18 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } -+ assert(!const false, "attempt to add with overflow") -> bb1; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 -+ // ty::Const ++ assert(!const false, "attempt to compute `{} + {}` which would overflow", const 2_i32, const 2_i32) -> bb1; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 + // ty::Const + // + ty: bool + // + val: Value(Scalar(0x00)) + // mir::Constant + // + span: $DIR/optimizes_into_variable.rs:12:13: 12:18 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } ++ // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000002)) + // mir::Constant + // + span: $DIR/optimizes_into_variable.rs:12:13: 12:14 + // + literal: Const { ty: i32, val: Value(Scalar(0x00000002)) } + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000002)) + // mir::Constant + // + span: $DIR/optimizes_into_variable.rs:12:17: 12:18 + // + literal: Const { ty: i32, val: Value(Scalar(0x00000002)) } } bb1: { - _1 = move (_2.0: i32); // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 -+ _1 = const 4i32; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 ++ _1 = const 4_i32; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000004)) @@ -66,7 +78,7 @@ + // + literal: Const { ty: i32, val: Value(Scalar(0x00000004)) } StorageLive(_3); // scope 1 at $DIR/optimizes_into_variable.rs:13:9: 13:10 StorageLive(_4); // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:31 - _4 = [const 0i32, const 1i32, const 2i32, const 3i32, const 4i32, const 5i32]; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:31 + _4 = [const 0_i32, const 1_i32, const 2_i32, const 3_i32, const 4_i32, const 5_i32]; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:31 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) @@ -104,14 +116,14 @@ // + span: $DIR/optimizes_into_variable.rs:13:29: 13:30 // + literal: Const { ty: i32, val: Value(Scalar(0x00000005)) } StorageLive(_5); // scope 1 at $DIR/optimizes_into_variable.rs:13:32: 13:33 - _5 = const 3usize; // scope 1 at $DIR/optimizes_into_variable.rs:13:32: 13:33 + _5 = const 3_usize; // scope 1 at $DIR/optimizes_into_variable.rs:13:32: 13:33 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000003)) // mir::Constant // + span: $DIR/optimizes_into_variable.rs:13:32: 13:33 // + literal: Const { ty: usize, val: Value(Scalar(0x0000000000000003)) } - _6 = const 6usize; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 + _6 = const 6_usize; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000006)) @@ -138,7 +150,7 @@ bb2: { - _3 = _4[_5]; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 -+ _3 = const 3i32; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 ++ _3 = const 3_i32; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000003)) @@ -149,7 +161,7 @@ StorageDead(_4); // scope 1 at $DIR/optimizes_into_variable.rs:13:34: 13:35 StorageLive(_8); // scope 2 at $DIR/optimizes_into_variable.rs:14:9: 14:10 StorageLive(_9); // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:36 - _9 = Point { x: const 12u32, y: const 42u32 }; // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:36 + _9 = Point { x: const 12_u32, y: const 42_u32 }; // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:36 // ty::Const // + ty: u32 // + val: Value(Scalar(0x0000000c)) @@ -163,7 +175,7 @@ // + span: $DIR/optimizes_into_variable.rs:14:32: 14:34 // + literal: Const { ty: u32, val: Value(Scalar(0x0000002a)) } - _8 = (_9.1: u32); // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:38 -+ _8 = const 42u32; // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:38 ++ _8 = const 42_u32; // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:38 + // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x0000002a)) diff --git a/src/test/mir-opt/const_prop/optimizes_into_variable/64bit/rustc.main.SimplifyLocals.after.mir b/src/test/mir-opt/const_prop/optimizes_into_variable/64bit/rustc.main.SimplifyLocals.after.mir index 8ea9316c7d49b..7b74bf81d96fe 100644 --- a/src/test/mir-opt/const_prop/optimizes_into_variable/64bit/rustc.main.SimplifyLocals.after.mir +++ b/src/test/mir-opt/const_prop/optimizes_into_variable/64bit/rustc.main.SimplifyLocals.after.mir @@ -17,7 +17,7 @@ fn main() -> () { bb0: { StorageLive(_1); // scope 0 at $DIR/optimizes_into_variable.rs:12:9: 12:10 - _1 = const 4i32; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 + _1 = const 4_i32; // scope 0 at $DIR/optimizes_into_variable.rs:12:13: 12:18 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000004)) @@ -25,7 +25,7 @@ fn main() -> () { // + span: $DIR/optimizes_into_variable.rs:12:13: 12:18 // + literal: Const { ty: i32, val: Value(Scalar(0x00000004)) } StorageLive(_2); // scope 1 at $DIR/optimizes_into_variable.rs:13:9: 13:10 - _2 = const 3i32; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 + _2 = const 3_i32; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000003)) @@ -33,7 +33,7 @@ fn main() -> () { // + span: $DIR/optimizes_into_variable.rs:13:13: 13:34 // + literal: Const { ty: i32, val: Value(Scalar(0x00000003)) } StorageLive(_3); // scope 2 at $DIR/optimizes_into_variable.rs:14:9: 14:10 - _3 = const 42u32; // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:38 + _3 = const 42_u32; // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:38 // ty::Const // + ty: u32 // + val: Value(Scalar(0x0000002a)) diff --git a/src/test/mir-opt/const_prop/read_immutable_static/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/read_immutable_static/rustc.main.ConstProp.diff index 103444f796ec6..36edfc42b9a76 100644 --- a/src/test/mir-opt/const_prop/read_immutable_static/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/read_immutable_static/rustc.main.ConstProp.diff @@ -24,7 +24,7 @@ // + span: $DIR/read_immutable_static.rs:7:13: 7:16 // + literal: Const { ty: &u8, val: Value(Scalar(alloc0)) } - _2 = (*_3); // scope 0 at $DIR/read_immutable_static.rs:7:13: 7:16 -+ _2 = const 2u8; // scope 0 at $DIR/read_immutable_static.rs:7:13: 7:16 ++ _2 = const 2_u8; // scope 0 at $DIR/read_immutable_static.rs:7:13: 7:16 + // ty::Const + // + ty: u8 + // + val: Value(Scalar(0x02)) @@ -42,14 +42,14 @@ // + literal: Const { ty: &u8, val: Value(Scalar(alloc0)) } - _4 = (*_5); // scope 0 at $DIR/read_immutable_static.rs:7:19: 7:22 - _1 = Add(move _2, move _4); // scope 0 at $DIR/read_immutable_static.rs:7:13: 7:22 -+ _4 = const 2u8; // scope 0 at $DIR/read_immutable_static.rs:7:19: 7:22 ++ _4 = const 2_u8; // scope 0 at $DIR/read_immutable_static.rs:7:19: 7:22 + // ty::Const + // + ty: u8 + // + val: Value(Scalar(0x02)) + // mir::Constant + // + span: $DIR/read_immutable_static.rs:7:19: 7:22 + // + literal: Const { ty: u8, val: Value(Scalar(0x02)) } -+ _1 = const 4u8; // scope 0 at $DIR/read_immutable_static.rs:7:13: 7:22 ++ _1 = const 4_u8; // scope 0 at $DIR/read_immutable_static.rs:7:13: 7:22 + // ty::Const + // + ty: u8 + // + val: Value(Scalar(0x04)) diff --git a/src/test/mir-opt/const_prop/ref_deref/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/ref_deref/rustc.main.ConstProp.diff index dcd3d4019811e..12e3a04d89bf2 100644 --- a/src/test/mir-opt/const_prop/ref_deref/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/ref_deref/rustc.main.ConstProp.diff @@ -20,7 +20,7 @@ // + literal: Const { ty: &i32, val: Unevaluated(DefId(0:3 ~ ref_deref[317d]::main[0]), [], Some(promoted[0])) } _2 = _4; // scope 0 at $DIR/ref_deref.rs:5:6: 5:10 - _1 = (*_2); // scope 0 at $DIR/ref_deref.rs:5:5: 5:10 -+ _1 = const 4i32; // scope 0 at $DIR/ref_deref.rs:5:5: 5:10 ++ _1 = const 4_i32; // scope 0 at $DIR/ref_deref.rs:5:5: 5:10 + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000004)) diff --git a/src/test/mir-opt/const_prop/ref_deref/rustc.main.PromoteTemps.diff b/src/test/mir-opt/const_prop/ref_deref/rustc.main.PromoteTemps.diff index ef696f1ab8052..d56f07e0f57f5 100644 --- a/src/test/mir-opt/const_prop/ref_deref/rustc.main.PromoteTemps.diff +++ b/src/test/mir-opt/const_prop/ref_deref/rustc.main.PromoteTemps.diff @@ -12,7 +12,7 @@ StorageLive(_1); // scope 0 at $DIR/ref_deref.rs:5:5: 5:10 StorageLive(_2); // scope 0 at $DIR/ref_deref.rs:5:6: 5:10 - StorageLive(_3); // scope 0 at $DIR/ref_deref.rs:5:8: 5:9 -- _3 = const 4i32; // scope 0 at $DIR/ref_deref.rs:5:8: 5:9 +- _3 = const 4_i32; // scope 0 at $DIR/ref_deref.rs:5:8: 5:9 + _4 = const main::promoted[0]; // scope 0 at $DIR/ref_deref.rs:5:6: 5:10 // ty::Const - // + ty: i32 diff --git a/src/test/mir-opt/const_prop/ref_deref_project/rustc.main.PromoteTemps.diff b/src/test/mir-opt/const_prop/ref_deref_project/rustc.main.PromoteTemps.diff index 7f23f5ea7a69a..0b9c1caa6bdae 100644 --- a/src/test/mir-opt/const_prop/ref_deref_project/rustc.main.PromoteTemps.diff +++ b/src/test/mir-opt/const_prop/ref_deref_project/rustc.main.PromoteTemps.diff @@ -12,7 +12,7 @@ StorageLive(_1); // scope 0 at $DIR/ref_deref_project.rs:5:5: 5:17 StorageLive(_2); // scope 0 at $DIR/ref_deref_project.rs:5:6: 5:17 - StorageLive(_3); // scope 0 at $DIR/ref_deref_project.rs:5:8: 5:14 -- _3 = (const 4i32, const 5i32); // scope 0 at $DIR/ref_deref_project.rs:5:8: 5:14 +- _3 = (const 4_i32, const 5_i32); // scope 0 at $DIR/ref_deref_project.rs:5:8: 5:14 + _4 = const main::promoted[0]; // scope 0 at $DIR/ref_deref_project.rs:5:6: 5:17 // ty::Const - // + ty: i32 diff --git a/src/test/mir-opt/const_prop/repeat/32bit/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/repeat/32bit/rustc.main.ConstProp.diff index b1c9e22913935..3046b2ca9b8a4 100644 --- a/src/test/mir-opt/const_prop/repeat/32bit/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/repeat/32bit/rustc.main.ConstProp.diff @@ -17,7 +17,7 @@ StorageLive(_1); // scope 0 at $DIR/repeat.rs:6:9: 6:10 StorageLive(_2); // scope 0 at $DIR/repeat.rs:6:18: 6:28 StorageLive(_3); // scope 0 at $DIR/repeat.rs:6:18: 6:25 - _3 = [const 42u32; 8]; // scope 0 at $DIR/repeat.rs:6:18: 6:25 + _3 = [const 42_u32; 8]; // scope 0 at $DIR/repeat.rs:6:18: 6:25 // ty::Const // + ty: u32 // + val: Value(Scalar(0x0000002a)) @@ -25,14 +25,14 @@ // + span: $DIR/repeat.rs:6:19: 6:21 // + literal: Const { ty: u32, val: Value(Scalar(0x0000002a)) } StorageLive(_4); // scope 0 at $DIR/repeat.rs:6:26: 6:27 - _4 = const 2usize; // scope 0 at $DIR/repeat.rs:6:26: 6:27 + _4 = const 2_usize; // scope 0 at $DIR/repeat.rs:6:26: 6:27 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000002)) // mir::Constant // + span: $DIR/repeat.rs:6:26: 6:27 // + literal: Const { ty: usize, val: Value(Scalar(0x00000002)) } - _5 = const 8usize; // scope 0 at $DIR/repeat.rs:6:18: 6:28 + _5 = const 8_usize; // scope 0 at $DIR/repeat.rs:6:18: 6:28 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000008)) @@ -59,8 +59,8 @@ bb1: { - _2 = _3[_4]; // scope 0 at $DIR/repeat.rs:6:18: 6:28 -- _1 = Add(move _2, const 0u32); // scope 0 at $DIR/repeat.rs:6:18: 6:32 -+ _2 = const 42u32; // scope 0 at $DIR/repeat.rs:6:18: 6:28 +- _1 = Add(move _2, const 0_u32); // scope 0 at $DIR/repeat.rs:6:18: 6:32 ++ _2 = const 42_u32; // scope 0 at $DIR/repeat.rs:6:18: 6:28 // ty::Const // + ty: u32 - // + val: Value(Scalar(0x00000000)) @@ -70,7 +70,7 @@ - // + literal: Const { ty: u32, val: Value(Scalar(0x00000000)) } + // + span: $DIR/repeat.rs:6:18: 6:28 + // + literal: Const { ty: u32, val: Value(Scalar(0x0000002a)) } -+ _1 = const 42u32; // scope 0 at $DIR/repeat.rs:6:18: 6:32 ++ _1 = const 42_u32; // scope 0 at $DIR/repeat.rs:6:18: 6:32 + // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x0000002a)) diff --git a/src/test/mir-opt/const_prop/repeat/64bit/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/repeat/64bit/rustc.main.ConstProp.diff index 29555b03a8b8e..c06ed33df24c1 100644 --- a/src/test/mir-opt/const_prop/repeat/64bit/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/repeat/64bit/rustc.main.ConstProp.diff @@ -17,7 +17,7 @@ StorageLive(_1); // scope 0 at $DIR/repeat.rs:6:9: 6:10 StorageLive(_2); // scope 0 at $DIR/repeat.rs:6:18: 6:28 StorageLive(_3); // scope 0 at $DIR/repeat.rs:6:18: 6:25 - _3 = [const 42u32; 8]; // scope 0 at $DIR/repeat.rs:6:18: 6:25 + _3 = [const 42_u32; 8]; // scope 0 at $DIR/repeat.rs:6:18: 6:25 // ty::Const // + ty: u32 // + val: Value(Scalar(0x0000002a)) @@ -25,14 +25,14 @@ // + span: $DIR/repeat.rs:6:19: 6:21 // + literal: Const { ty: u32, val: Value(Scalar(0x0000002a)) } StorageLive(_4); // scope 0 at $DIR/repeat.rs:6:26: 6:27 - _4 = const 2usize; // scope 0 at $DIR/repeat.rs:6:26: 6:27 + _4 = const 2_usize; // scope 0 at $DIR/repeat.rs:6:26: 6:27 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000002)) // mir::Constant // + span: $DIR/repeat.rs:6:26: 6:27 // + literal: Const { ty: usize, val: Value(Scalar(0x0000000000000002)) } - _5 = const 8usize; // scope 0 at $DIR/repeat.rs:6:18: 6:28 + _5 = const 8_usize; // scope 0 at $DIR/repeat.rs:6:18: 6:28 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000008)) @@ -59,8 +59,8 @@ bb1: { - _2 = _3[_4]; // scope 0 at $DIR/repeat.rs:6:18: 6:28 -- _1 = Add(move _2, const 0u32); // scope 0 at $DIR/repeat.rs:6:18: 6:32 -+ _2 = const 42u32; // scope 0 at $DIR/repeat.rs:6:18: 6:28 +- _1 = Add(move _2, const 0_u32); // scope 0 at $DIR/repeat.rs:6:18: 6:32 ++ _2 = const 42_u32; // scope 0 at $DIR/repeat.rs:6:18: 6:28 // ty::Const // + ty: u32 - // + val: Value(Scalar(0x00000000)) @@ -70,7 +70,7 @@ - // + literal: Const { ty: u32, val: Value(Scalar(0x00000000)) } + // + span: $DIR/repeat.rs:6:18: 6:28 + // + literal: Const { ty: u32, val: Value(Scalar(0x0000002a)) } -+ _1 = const 42u32; // scope 0 at $DIR/repeat.rs:6:18: 6:32 ++ _1 = const 42_u32; // scope 0 at $DIR/repeat.rs:6:18: 6:32 + // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x0000002a)) diff --git a/src/test/mir-opt/const_prop/return_place/rustc.add.ConstProp.diff b/src/test/mir-opt/const_prop/return_place/rustc.add.ConstProp.diff index fc7d028277bd9..5e39c8e6d523e 100644 --- a/src/test/mir-opt/const_prop/return_place/rustc.add.ConstProp.diff +++ b/src/test/mir-opt/const_prop/return_place/rustc.add.ConstProp.diff @@ -6,8 +6,8 @@ let mut _1: (u32, bool); // in scope 0 at $DIR/return_place.rs:6:5: 6:10 bb0: { -- _1 = CheckedAdd(const 2u32, const 2u32); // scope 0 at $DIR/return_place.rs:6:5: 6:10 -+ _1 = (const 4u32, const false); // scope 0 at $DIR/return_place.rs:6:5: 6:10 +- _1 = CheckedAdd(const 2_u32, const 2_u32); // scope 0 at $DIR/return_place.rs:6:5: 6:10 ++ _1 = (const 4_u32, const false); // scope 0 at $DIR/return_place.rs:6:5: 6:10 // ty::Const // + ty: u32 - // + val: Value(Scalar(0x00000002)) @@ -25,21 +25,33 @@ // mir::Constant - // + span: $DIR/return_place.rs:6:9: 6:10 - // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } -- assert(!move (_1.1: bool), "attempt to add with overflow") -> bb1; // scope 0 at $DIR/return_place.rs:6:5: 6:10 +- assert(!move (_1.1: bool), "attempt to compute `{} + {}` which would overflow", const 2_u32, const 2_u32) -> bb1; // scope 0 at $DIR/return_place.rs:6:5: 6:10 + // + span: $DIR/return_place.rs:6:5: 6:10 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } -+ assert(!const false, "attempt to add with overflow") -> bb1; // scope 0 at $DIR/return_place.rs:6:5: 6:10 -+ // ty::Const ++ assert(!const false, "attempt to compute `{} + {}` which would overflow", const 2_u32, const 2_u32) -> bb1; // scope 0 at $DIR/return_place.rs:6:5: 6:10 + // ty::Const + // + ty: bool + // + val: Value(Scalar(0x00)) + // mir::Constant + // + span: $DIR/return_place.rs:6:5: 6:10 + // + literal: Const { ty: bool, val: Value(Scalar(0x00)) } ++ // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x00000002)) + // mir::Constant + // + span: $DIR/return_place.rs:6:5: 6:6 + // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } + // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x00000002)) + // mir::Constant + // + span: $DIR/return_place.rs:6:9: 6:10 + // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } } bb1: { - _0 = move (_1.0: u32); // scope 0 at $DIR/return_place.rs:6:5: 6:10 -+ _0 = const 4u32; // scope 0 at $DIR/return_place.rs:6:5: 6:10 ++ _0 = const 4_u32; // scope 0 at $DIR/return_place.rs:6:5: 6:10 + // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x00000004)) diff --git a/src/test/mir-opt/const_prop/return_place/rustc.add.PreCodegen.before.mir b/src/test/mir-opt/const_prop/return_place/rustc.add.PreCodegen.before.mir index b741c786fb394..23ad8d057ba8d 100644 --- a/src/test/mir-opt/const_prop/return_place/rustc.add.PreCodegen.before.mir +++ b/src/test/mir-opt/const_prop/return_place/rustc.add.PreCodegen.before.mir @@ -4,7 +4,7 @@ fn add() -> u32 { let mut _0: u32; // return place in scope 0 at $DIR/return_place.rs:5:13: 5:16 bb0: { - _0 = const 4u32; // scope 0 at $DIR/return_place.rs:6:5: 6:10 + _0 = const 4_u32; // scope 0 at $DIR/return_place.rs:6:5: 6:10 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000004)) diff --git a/src/test/mir-opt/const_prop/scalar_literal_propagation/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/scalar_literal_propagation/rustc.main.ConstProp.diff index 596ddcb43533b..43e0eb09a2e5f 100644 --- a/src/test/mir-opt/const_prop/scalar_literal_propagation/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/scalar_literal_propagation/rustc.main.ConstProp.diff @@ -12,7 +12,7 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/scalar_literal_propagation.rs:3:9: 3:10 - _1 = const 1u32; // scope 0 at $DIR/scalar_literal_propagation.rs:3:13: 3:14 + _1 = const 1_u32; // scope 0 at $DIR/scalar_literal_propagation.rs:3:13: 3:14 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000001)) @@ -23,14 +23,14 @@ StorageLive(_3); // scope 1 at $DIR/scalar_literal_propagation.rs:4:13: 4:14 - _3 = _1; // scope 1 at $DIR/scalar_literal_propagation.rs:4:13: 4:14 - _2 = const consume(move _3) -> bb1; // scope 1 at $DIR/scalar_literal_propagation.rs:4:5: 4:15 -+ _3 = const 1u32; // scope 1 at $DIR/scalar_literal_propagation.rs:4:13: 4:14 ++ _3 = const 1_u32; // scope 1 at $DIR/scalar_literal_propagation.rs:4:13: 4:14 // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x00000001)) + // mir::Constant + // + span: $DIR/scalar_literal_propagation.rs:4:13: 4:14 + // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } -+ _2 = const consume(const 1u32) -> bb1; // scope 1 at $DIR/scalar_literal_propagation.rs:4:5: 4:15 ++ _2 = const consume(const 1_u32) -> bb1; // scope 1 at $DIR/scalar_literal_propagation.rs:4:5: 4:15 + // ty::Const // + ty: fn(u32) {consume} // + val: Value(Scalar()) diff --git a/src/test/mir-opt/const_prop/slice_len/32bit/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/slice_len/32bit/rustc.main.ConstProp.diff index 9471dbef410d1..70c4156488223 100644 --- a/src/test/mir-opt/const_prop/slice_len/32bit/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/slice_len/32bit/rustc.main.ConstProp.diff @@ -30,7 +30,7 @@ _2 = move _3 as &[u32] (Pointer(Unsize)); // scope 0 at $DIR/slice_len.rs:5:6: 5:19 StorageDead(_3); // scope 0 at $DIR/slice_len.rs:5:18: 5:19 StorageLive(_6); // scope 0 at $DIR/slice_len.rs:5:31: 5:32 - _6 = const 1usize; // scope 0 at $DIR/slice_len.rs:5:31: 5:32 + _6 = const 1_usize; // scope 0 at $DIR/slice_len.rs:5:31: 5:32 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000001)) @@ -40,7 +40,7 @@ - _7 = Len((*_2)); // scope 0 at $DIR/slice_len.rs:5:5: 5:33 - _8 = Lt(_6, _7); // scope 0 at $DIR/slice_len.rs:5:5: 5:33 - assert(move _8, "index out of bounds: the len is {} but the index is {}", move _7, _6) -> bb1; // scope 0 at $DIR/slice_len.rs:5:5: 5:33 -+ _7 = const 3usize; // scope 0 at $DIR/slice_len.rs:5:5: 5:33 ++ _7 = const 3_usize; // scope 0 at $DIR/slice_len.rs:5:5: 5:33 + // ty::Const + // + ty: usize + // + val: Value(Scalar(0x00000003)) @@ -65,7 +65,7 @@ bb1: { - _1 = (*_2)[_6]; // scope 0 at $DIR/slice_len.rs:5:5: 5:33 -+ _1 = const 2u32; // scope 0 at $DIR/slice_len.rs:5:5: 5:33 ++ _1 = const 2_u32; // scope 0 at $DIR/slice_len.rs:5:5: 5:33 + // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x00000002)) diff --git a/src/test/mir-opt/const_prop/slice_len/64bit/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/slice_len/64bit/rustc.main.ConstProp.diff index 3ae88e0d79863..885f28124c4b7 100644 --- a/src/test/mir-opt/const_prop/slice_len/64bit/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/slice_len/64bit/rustc.main.ConstProp.diff @@ -30,7 +30,7 @@ _2 = move _3 as &[u32] (Pointer(Unsize)); // scope 0 at $DIR/slice_len.rs:5:6: 5:19 StorageDead(_3); // scope 0 at $DIR/slice_len.rs:5:18: 5:19 StorageLive(_6); // scope 0 at $DIR/slice_len.rs:5:31: 5:32 - _6 = const 1usize; // scope 0 at $DIR/slice_len.rs:5:31: 5:32 + _6 = const 1_usize; // scope 0 at $DIR/slice_len.rs:5:31: 5:32 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000001)) @@ -40,7 +40,7 @@ - _7 = Len((*_2)); // scope 0 at $DIR/slice_len.rs:5:5: 5:33 - _8 = Lt(_6, _7); // scope 0 at $DIR/slice_len.rs:5:5: 5:33 - assert(move _8, "index out of bounds: the len is {} but the index is {}", move _7, _6) -> bb1; // scope 0 at $DIR/slice_len.rs:5:5: 5:33 -+ _7 = const 3usize; // scope 0 at $DIR/slice_len.rs:5:5: 5:33 ++ _7 = const 3_usize; // scope 0 at $DIR/slice_len.rs:5:5: 5:33 + // ty::Const + // + ty: usize + // + val: Value(Scalar(0x0000000000000003)) @@ -65,7 +65,7 @@ bb1: { - _1 = (*_2)[_6]; // scope 0 at $DIR/slice_len.rs:5:5: 5:33 -+ _1 = const 2u32; // scope 0 at $DIR/slice_len.rs:5:5: 5:33 ++ _1 = const 2_u32; // scope 0 at $DIR/slice_len.rs:5:5: 5:33 + // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x00000002)) diff --git a/src/test/mir-opt/const_prop/switch_int/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/switch_int/rustc.main.ConstProp.diff index 8072424729ab0..9580b99da9e40 100644 --- a/src/test/mir-opt/const_prop/switch_int/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/switch_int/rustc.main.ConstProp.diff @@ -7,15 +7,15 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/switch_int.rs:7:11: 7:12 - _1 = const 1i32; // scope 0 at $DIR/switch_int.rs:7:11: 7:12 + _1 = const 1_i32; // scope 0 at $DIR/switch_int.rs:7:11: 7:12 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) // mir::Constant // + span: $DIR/switch_int.rs:7:11: 7:12 // + literal: Const { ty: i32, val: Value(Scalar(0x00000001)) } -- switchInt(_1) -> [1i32: bb2, otherwise: bb1]; // scope 0 at $DIR/switch_int.rs:8:9: 8:10 -+ switchInt(const 1i32) -> [1i32: bb2, otherwise: bb1]; // scope 0 at $DIR/switch_int.rs:8:9: 8:10 +- switchInt(_1) -> [1_i32: bb2, otherwise: bb1]; // scope 0 at $DIR/switch_int.rs:8:9: 8:10 ++ switchInt(const 1_i32) -> [1_i32: bb2, otherwise: bb1]; // scope 0 at $DIR/switch_int.rs:8:9: 8:10 + // ty::Const + // + ty: i32 + // + val: Value(Scalar(0x00000001)) @@ -25,7 +25,7 @@ } bb1: { - _0 = const foo(const -1i32) -> bb3; // scope 0 at $DIR/switch_int.rs:9:14: 9:21 + _0 = const foo(const -1_i32) -> bb3; // scope 0 at $DIR/switch_int.rs:9:14: 9:21 // ty::Const // + ty: fn(i32) {foo} // + val: Value(Scalar()) @@ -41,7 +41,7 @@ } bb2: { - _0 = const foo(const 0i32) -> bb3; // scope 0 at $DIR/switch_int.rs:8:14: 8:20 + _0 = const foo(const 0_i32) -> bb3; // scope 0 at $DIR/switch_int.rs:8:14: 8:20 // ty::Const // + ty: fn(i32) {foo} // + val: Value(Scalar()) diff --git a/src/test/mir-opt/const_prop/switch_int/rustc.main.SimplifyBranches-after-const-prop.diff b/src/test/mir-opt/const_prop/switch_int/rustc.main.SimplifyBranches-after-const-prop.diff index 51f3bf20c1aea..54f37e609ec13 100644 --- a/src/test/mir-opt/const_prop/switch_int/rustc.main.SimplifyBranches-after-const-prop.diff +++ b/src/test/mir-opt/const_prop/switch_int/rustc.main.SimplifyBranches-after-const-prop.diff @@ -7,14 +7,14 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/switch_int.rs:7:11: 7:12 - _1 = const 1i32; // scope 0 at $DIR/switch_int.rs:7:11: 7:12 + _1 = const 1_i32; // scope 0 at $DIR/switch_int.rs:7:11: 7:12 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) // mir::Constant // + span: $DIR/switch_int.rs:7:11: 7:12 // + literal: Const { ty: i32, val: Value(Scalar(0x00000001)) } -- switchInt(const 1i32) -> [1i32: bb2, otherwise: bb1]; // scope 0 at $DIR/switch_int.rs:8:9: 8:10 +- switchInt(const 1_i32) -> [1_i32: bb2, otherwise: bb1]; // scope 0 at $DIR/switch_int.rs:8:9: 8:10 - // ty::Const - // + ty: i32 - // + val: Value(Scalar(0x00000001)) @@ -25,7 +25,7 @@ } bb1: { - _0 = const foo(const -1i32) -> bb3; // scope 0 at $DIR/switch_int.rs:9:14: 9:21 + _0 = const foo(const -1_i32) -> bb3; // scope 0 at $DIR/switch_int.rs:9:14: 9:21 // ty::Const // + ty: fn(i32) {foo} // + val: Value(Scalar()) @@ -41,7 +41,7 @@ } bb2: { - _0 = const foo(const 0i32) -> bb3; // scope 0 at $DIR/switch_int.rs:8:14: 8:20 + _0 = const foo(const 0_i32) -> bb3; // scope 0 at $DIR/switch_int.rs:8:14: 8:20 // ty::Const // + ty: fn(i32) {foo} // + val: Value(Scalar()) diff --git a/src/test/mir-opt/const_prop/tuple_literal_propagation/rustc.main.ConstProp.diff b/src/test/mir-opt/const_prop/tuple_literal_propagation/rustc.main.ConstProp.diff index 1511b361f587f..941ec64a3cc12 100644 --- a/src/test/mir-opt/const_prop/tuple_literal_propagation/rustc.main.ConstProp.diff +++ b/src/test/mir-opt/const_prop/tuple_literal_propagation/rustc.main.ConstProp.diff @@ -12,7 +12,7 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/tuple_literal_propagation.rs:3:9: 3:10 - _1 = (const 1u32, const 2u32); // scope 0 at $DIR/tuple_literal_propagation.rs:3:13: 3:19 + _1 = (const 1_u32, const 2_u32); // scope 0 at $DIR/tuple_literal_propagation.rs:3:13: 3:19 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000001)) @@ -30,7 +30,7 @@ StorageLive(_2); // scope 1 at $DIR/tuple_literal_propagation.rs:5:5: 5:15 StorageLive(_3); // scope 1 at $DIR/tuple_literal_propagation.rs:5:13: 5:14 - _3 = _1; // scope 1 at $DIR/tuple_literal_propagation.rs:5:13: 5:14 -+ _3 = (const 1u32, const 2u32); // scope 1 at $DIR/tuple_literal_propagation.rs:5:13: 5:14 ++ _3 = (const 1_u32, const 2_u32); // scope 1 at $DIR/tuple_literal_propagation.rs:5:13: 5:14 + // ty::Const + // + ty: u32 + // + val: Value(Scalar(0x00000001)) diff --git a/src/test/mir-opt/const_prop_miscompile/rustc.bar.ConstProp.diff b/src/test/mir-opt/const_prop_miscompile/rustc.bar.ConstProp.diff index c87f67bf9f587..5fe35b479c126 100644 --- a/src/test/mir-opt/const_prop_miscompile/rustc.bar.ConstProp.diff +++ b/src/test/mir-opt/const_prop_miscompile/rustc.bar.ConstProp.diff @@ -19,8 +19,8 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/const_prop_miscompile.rs:12:9: 12:14 -- _1 = (const 1i32,); // scope 0 at $DIR/const_prop_miscompile.rs:12:17: 12:21 -+ _1 = const (1i32,); // scope 0 at $DIR/const_prop_miscompile.rs:12:17: 12:21 +- _1 = (const 1_i32,); // scope 0 at $DIR/const_prop_miscompile.rs:12:17: 12:21 ++ _1 = const (1_i32,); // scope 0 at $DIR/const_prop_miscompile.rs:12:17: 12:21 // ty::Const - // + ty: i32 + // + ty: (i32,) @@ -33,7 +33,7 @@ StorageLive(_2); // scope 1 at $DIR/const_prop_miscompile.rs:13:5: 15:6 StorageLive(_3); // scope 2 at $DIR/const_prop_miscompile.rs:14:10: 14:22 _3 = &raw mut (_1.0: i32); // scope 2 at $DIR/const_prop_miscompile.rs:14:10: 14:22 - (*_3) = const 5i32; // scope 2 at $DIR/const_prop_miscompile.rs:14:9: 14:26 + (*_3) = const 5_i32; // scope 2 at $DIR/const_prop_miscompile.rs:14:9: 14:26 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000005)) @@ -52,7 +52,7 @@ StorageLive(_4); // scope 1 at $DIR/const_prop_miscompile.rs:16:9: 16:10 StorageLive(_5); // scope 1 at $DIR/const_prop_miscompile.rs:16:13: 16:20 _5 = (_1.0: i32); // scope 1 at $DIR/const_prop_miscompile.rs:16:15: 16:18 - _4 = Eq(move _5, const 5i32); // scope 1 at $DIR/const_prop_miscompile.rs:16:13: 16:25 + _4 = Eq(move _5, const 5_i32); // scope 1 at $DIR/const_prop_miscompile.rs:16:13: 16:25 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000005)) diff --git a/src/test/mir-opt/const_prop_miscompile/rustc.foo.ConstProp.diff b/src/test/mir-opt/const_prop_miscompile/rustc.foo.ConstProp.diff index 8a6850d2fe3ad..98e9825c1c435 100644 --- a/src/test/mir-opt/const_prop_miscompile/rustc.foo.ConstProp.diff +++ b/src/test/mir-opt/const_prop_miscompile/rustc.foo.ConstProp.diff @@ -16,8 +16,8 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/const_prop_miscompile.rs:5:9: 5:14 -- _1 = (const 1i32,); // scope 0 at $DIR/const_prop_miscompile.rs:5:17: 5:21 -+ _1 = const (1i32,); // scope 0 at $DIR/const_prop_miscompile.rs:5:17: 5:21 +- _1 = (const 1_i32,); // scope 0 at $DIR/const_prop_miscompile.rs:5:17: 5:21 ++ _1 = const (1_i32,); // scope 0 at $DIR/const_prop_miscompile.rs:5:17: 5:21 // ty::Const - // + ty: i32 + // + ty: (i32,) @@ -29,7 +29,7 @@ + // + literal: Const { ty: (i32,), val: Value(Scalar(0x00000001)) } StorageLive(_2); // scope 1 at $DIR/const_prop_miscompile.rs:6:6: 6:14 _2 = &mut (_1.0: i32); // scope 1 at $DIR/const_prop_miscompile.rs:6:6: 6:14 - (*_2) = const 5i32; // scope 1 at $DIR/const_prop_miscompile.rs:6:5: 6:18 + (*_2) = const 5_i32; // scope 1 at $DIR/const_prop_miscompile.rs:6:5: 6:18 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000005)) @@ -40,7 +40,7 @@ StorageLive(_3); // scope 1 at $DIR/const_prop_miscompile.rs:7:9: 7:10 StorageLive(_4); // scope 1 at $DIR/const_prop_miscompile.rs:7:13: 7:20 _4 = (_1.0: i32); // scope 1 at $DIR/const_prop_miscompile.rs:7:15: 7:18 - _3 = Eq(move _4, const 5i32); // scope 1 at $DIR/const_prop_miscompile.rs:7:13: 7:25 + _3 = Eq(move _4, const 5_i32); // scope 1 at $DIR/const_prop_miscompile.rs:7:13: 7:25 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000005)) diff --git a/src/test/mir-opt/copy_propagation_arg/rustc.arg_src.CopyPropagation.diff b/src/test/mir-opt/copy_propagation_arg/rustc.arg_src.CopyPropagation.diff index 1e0271a560f65..22fbf4e836ba4 100644 --- a/src/test/mir-opt/copy_propagation_arg/rustc.arg_src.CopyPropagation.diff +++ b/src/test/mir-opt/copy_propagation_arg/rustc.arg_src.CopyPropagation.diff @@ -12,7 +12,7 @@ bb0: { StorageLive(_2); // scope 0 at $DIR/copy_propagation_arg.rs:28:9: 28:10 _2 = _1; // scope 0 at $DIR/copy_propagation_arg.rs:28:13: 28:14 - _1 = const 123i32; // scope 1 at $DIR/copy_propagation_arg.rs:29:5: 29:12 + _1 = const 123_i32; // scope 1 at $DIR/copy_propagation_arg.rs:29:5: 29:12 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000007b)) diff --git a/src/test/mir-opt/copy_propagation_arg/rustc.bar.CopyPropagation.diff b/src/test/mir-opt/copy_propagation_arg/rustc.bar.CopyPropagation.diff index b875bbea67bdf..6953a80a5f08a 100644 --- a/src/test/mir-opt/copy_propagation_arg/rustc.bar.CopyPropagation.diff +++ b/src/test/mir-opt/copy_propagation_arg/rustc.bar.CopyPropagation.diff @@ -23,7 +23,7 @@ bb1: { StorageDead(_3); // scope 0 at $DIR/copy_propagation_arg.rs:16:12: 16:13 StorageDead(_2); // scope 0 at $DIR/copy_propagation_arg.rs:16:13: 16:14 - _1 = const 5u8; // scope 0 at $DIR/copy_propagation_arg.rs:17:5: 17:10 + _1 = const 5_u8; // scope 0 at $DIR/copy_propagation_arg.rs:17:5: 17:10 // ty::Const // + ty: u8 // + val: Value(Scalar(0x05)) diff --git a/src/test/mir-opt/exponential-or/rustc.match_tuple.SimplifyCfg-initial.after.mir b/src/test/mir-opt/exponential-or/rustc.match_tuple.SimplifyCfg-initial.after.mir index 3c1c02da42ff8..b84ca5df9964e 100644 --- a/src/test/mir-opt/exponential-or/rustc.match_tuple.SimplifyCfg-initial.after.mir +++ b/src/test/mir-opt/exponential-or/rustc.match_tuple.SimplifyCfg-initial.after.mir @@ -19,11 +19,11 @@ fn match_tuple(_1: (u32, bool, std::option::Option, u32)) -> u32 { bb0: { FakeRead(ForMatchedPlace, _1); // scope 0 at $DIR/exponential-or.rs:7:11: 7:12 - switchInt((_1.0: u32)) -> [1u32: bb2, 4u32: bb2, otherwise: bb1]; // scope 0 at $DIR/exponential-or.rs:8:15: 8:16 + switchInt((_1.0: u32)) -> [1_u32: bb2, 4_u32: bb2, otherwise: bb1]; // scope 0 at $DIR/exponential-or.rs:8:15: 8:16 } bb1: { - _0 = const 0u32; // scope 0 at $DIR/exponential-or.rs:9:14: 9:15 + _0 = const 0_u32; // scope 0 at $DIR/exponential-or.rs:9:14: 9:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -35,15 +35,15 @@ fn match_tuple(_1: (u32, bool, std::option::Option, u32)) -> u32 { bb2: { _2 = discriminant((_1.2: std::option::Option)); // scope 0 at $DIR/exponential-or.rs:8:37: 8:48 - switchInt(move _2) -> [0isize: bb4, 1isize: bb3, otherwise: bb1]; // scope 0 at $DIR/exponential-or.rs:8:37: 8:48 + switchInt(move _2) -> [0_isize: bb4, 1_isize: bb3, otherwise: bb1]; // scope 0 at $DIR/exponential-or.rs:8:37: 8:48 } bb3: { - switchInt((((_1.2: std::option::Option) as Some).0: i32)) -> [1i32: bb4, 8i32: bb4, otherwise: bb1]; // scope 0 at $DIR/exponential-or.rs:8:42: 8:43 + switchInt((((_1.2: std::option::Option) as Some).0: i32)) -> [1_i32: bb4, 8_i32: bb4, otherwise: bb1]; // scope 0 at $DIR/exponential-or.rs:8:42: 8:43 } bb4: { - _5 = Le(const 6u32, (_1.3: u32)); // scope 0 at $DIR/exponential-or.rs:8:62: 8:67 + _5 = Le(const 6_u32, (_1.3: u32)); // scope 0 at $DIR/exponential-or.rs:8:62: 8:67 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000006)) @@ -54,7 +54,7 @@ fn match_tuple(_1: (u32, bool, std::option::Option, u32)) -> u32 { } bb5: { - _6 = Le((_1.3: u32), const 9u32); // scope 0 at $DIR/exponential-or.rs:8:62: 8:67 + _6 = Le((_1.3: u32), const 9_u32); // scope 0 at $DIR/exponential-or.rs:8:62: 8:67 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000009)) @@ -65,7 +65,7 @@ fn match_tuple(_1: (u32, bool, std::option::Option, u32)) -> u32 { } bb6: { - _3 = Le(const 13u32, (_1.3: u32)); // scope 0 at $DIR/exponential-or.rs:8:70: 8:77 + _3 = Le(const 13_u32, (_1.3: u32)); // scope 0 at $DIR/exponential-or.rs:8:70: 8:77 // ty::Const // + ty: u32 // + val: Value(Scalar(0x0000000d)) @@ -76,7 +76,7 @@ fn match_tuple(_1: (u32, bool, std::option::Option, u32)) -> u32 { } bb7: { - _4 = Le((_1.3: u32), const 16u32); // scope 0 at $DIR/exponential-or.rs:8:70: 8:77 + _4 = Le((_1.3: u32), const 16_u32); // scope 0 at $DIR/exponential-or.rs:8:70: 8:77 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000010)) diff --git a/src/test/mir-opt/generator-drop-cleanup/rustc.main-{{closure}}.generator_drop.0.mir b/src/test/mir-opt/generator-drop-cleanup/rustc.main-{{closure}}.generator_drop.0.mir index 3c77995eea893..bd64a31663a69 100644 --- a/src/test/mir-opt/generator-drop-cleanup/rustc.main-{{closure}}.generator_drop.0.mir +++ b/src/test/mir-opt/generator-drop-cleanup/rustc.main-{{closure}}.generator_drop.0.mir @@ -34,7 +34,7 @@ fn main::{{closure}}#0(_1: *mut [generator@$DIR/generator-drop-cleanup.rs:10:15: bb0: { _9 = discriminant((*_1)); // scope 0 at $DIR/generator-drop-cleanup.rs:10:15: 13:6 - switchInt(move _9) -> [0u32: bb7, 3u32: bb11, otherwise: bb12]; // scope 0 at $DIR/generator-drop-cleanup.rs:10:15: 13:6 + switchInt(move _9) -> [0_u32: bb7, 3_u32: bb11, otherwise: bb12]; // scope 0 at $DIR/generator-drop-cleanup.rs:10:15: 13:6 } bb1 (cleanup): { diff --git a/src/test/mir-opt/generator-storage-dead-unwind/rustc.main-{{closure}}.StateTransform.before.mir b/src/test/mir-opt/generator-storage-dead-unwind/rustc.main-{{closure}}.StateTransform.before.mir index 06645860d842d..7dcfda32ca4a2 100644 --- a/src/test/mir-opt/generator-storage-dead-unwind/rustc.main-{{closure}}.StateTransform.before.mir +++ b/src/test/mir-opt/generator-storage-dead-unwind/rustc.main-{{closure}}.StateTransform.before.mir @@ -21,7 +21,7 @@ yields () bb0: { StorageLive(_3); // scope 0 at $DIR/generator-storage-dead-unwind.rs:23:13: 23:14 - _3 = Foo(const 5i32); // scope 0 at $DIR/generator-storage-dead-unwind.rs:23:17: 23:23 + _3 = Foo(const 5_i32); // scope 0 at $DIR/generator-storage-dead-unwind.rs:23:17: 23:23 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000005)) @@ -29,7 +29,7 @@ yields () // + span: $DIR/generator-storage-dead-unwind.rs:23:21: 23:22 // + literal: Const { ty: i32, val: Value(Scalar(0x00000005)) } StorageLive(_4); // scope 1 at $DIR/generator-storage-dead-unwind.rs:24:13: 24:14 - _4 = Bar(const 6i32); // scope 1 at $DIR/generator-storage-dead-unwind.rs:24:17: 24:23 + _4 = Bar(const 6_i32); // scope 1 at $DIR/generator-storage-dead-unwind.rs:24:17: 24:23 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000006)) diff --git a/src/test/mir-opt/generator-tiny/rustc.main-{{closure}}.generator_resume.0.mir b/src/test/mir-opt/generator-tiny/rustc.main-{{closure}}.generator_resume.0.mir index bd6db11a7e73e..8776e5919bd8d 100644 --- a/src/test/mir-opt/generator-tiny/rustc.main-{{closure}}.generator_resume.0.mir +++ b/src/test/mir-opt/generator-tiny/rustc.main-{{closure}}.generator_resume.0.mir @@ -32,7 +32,7 @@ fn main::{{closure}}#0(_1: std::pin::Pin<&mut [generator@$DIR/generator-tiny.rs: bb0: { _11 = discriminant((*(_1.0: &mut [generator@$DIR/generator-tiny.rs:19:16: 25:6 {u8, HasDrop, ()}]))); // scope 0 at $DIR/generator-tiny.rs:19:16: 25:6 - switchInt(move _11) -> [0u32: bb1, 3u32: bb5, otherwise: bb6]; // scope 0 at $DIR/generator-tiny.rs:19:16: 25:6 + switchInt(move _11) -> [0_u32: bb1, 3_u32: bb5, otherwise: bb6]; // scope 0 at $DIR/generator-tiny.rs:19:16: 25:6 } bb1: { diff --git a/src/test/mir-opt/inline/inline-any-operand/rustc.bar.Inline.after.mir b/src/test/mir-opt/inline/inline-any-operand/rustc.bar.Inline.after.mir index 19748d52ec7e2..c9ff1fe29f5ed 100644 --- a/src/test/mir-opt/inline/inline-any-operand/rustc.bar.Inline.after.mir +++ b/src/test/mir-opt/inline/inline-any-operand/rustc.bar.Inline.after.mir @@ -25,14 +25,14 @@ fn bar() -> bool { // + literal: Const { ty: fn(i32, i32) -> bool {foo}, val: Value(Scalar()) } StorageLive(_2); // scope 1 at $DIR/inline-any-operand.rs:12:5: 12:6 _2 = _1; // scope 1 at $DIR/inline-any-operand.rs:12:5: 12:6 - _3 = const 1i32; // scope 1 at $DIR/inline-any-operand.rs:12:5: 12:13 + _3 = const 1_i32; // scope 1 at $DIR/inline-any-operand.rs:12:5: 12:13 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) // mir::Constant // + span: $DIR/inline-any-operand.rs:12:7: 12:8 // + literal: Const { ty: i32, val: Value(Scalar(0x00000001)) } - _4 = const -1i32; // scope 1 at $DIR/inline-any-operand.rs:12:5: 12:13 + _4 = const -1_i32; // scope 1 at $DIR/inline-any-operand.rs:12:5: 12:13 // ty::Const // + ty: i32 // + val: Value(Scalar(0xffffffff)) diff --git a/src/test/mir-opt/inline/inline-into-box-place/32bit/rustc.main.Inline.diff b/src/test/mir-opt/inline/inline-into-box-place/32bit/rustc.main.Inline.diff index 50913de98b506..3b71fbaa5e8a2 100644 --- a/src/test/mir-opt/inline/inline-into-box-place/32bit/rustc.main.Inline.diff +++ b/src/test/mir-opt/inline/inline-into-box-place/32bit/rustc.main.Inline.diff @@ -19,7 +19,7 @@ _2 = Box(std::vec::Vec); // scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43 - (*_2) = const std::vec::Vec::::new() -> [return: bb2, unwind: bb4]; // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43 + _4 = &mut (*_2); // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43 -+ ((*_4).0: alloc::raw_vec::RawVec) = const alloc::raw_vec::RawVec:: { ptr: std::ptr::Unique:: { pointer: {0x4 as *const u32}, _marker: std::marker::PhantomData:: }, cap: 0usize, alloc: std::alloc::Global }; // scope 2 at $SRC_DIR/liballoc/vec.rs:LL:COL ++ ((*_4).0: alloc::raw_vec::RawVec) = const alloc::raw_vec::RawVec:: { ptr: std::ptr::Unique:: { pointer: {0x4 as *const u32}, _marker: std::marker::PhantomData:: }, cap: 0_usize, alloc: std::alloc::Global }; // scope 2 at $SRC_DIR/liballoc/vec.rs:LL:COL // ty::Const - // + ty: fn() -> std::vec::Vec {std::vec::Vec::::new} - // + val: Value(Scalar()) @@ -39,7 +39,7 @@ + // + span: $SRC_DIR/liballoc/vec.rs:LL:COL + // + user_ty: UserType(0) + // + literal: Const { ty: alloc::raw_vec::RawVec, val: Value(ByRef { alloc: Allocation { bytes: [4, 0, 0, 0, 0, 0, 0, 0], relocations: Relocations(SortedMap { data: [] }), init_mask: InitMask { blocks: [255], len: Size { raw: 8 } }, size: Size { raw: 8 }, align: Align { pow2: 2 }, mutability: Not, extra: () }, offset: Size { raw: 0 } }) } -+ ((*_4).1: usize) = const 0usize; // scope 2 at $SRC_DIR/liballoc/vec.rs:LL:COL ++ ((*_4).1: usize) = const 0_usize; // scope 2 at $SRC_DIR/liballoc/vec.rs:LL:COL + // ty::Const + // + ty: usize + // + val: Value(Scalar(0x00000000)) diff --git a/src/test/mir-opt/inline/inline-into-box-place/64bit/rustc.main.Inline.diff b/src/test/mir-opt/inline/inline-into-box-place/64bit/rustc.main.Inline.diff index 7a1b6460c5bb3..2e7dde39115b7 100644 --- a/src/test/mir-opt/inline/inline-into-box-place/64bit/rustc.main.Inline.diff +++ b/src/test/mir-opt/inline/inline-into-box-place/64bit/rustc.main.Inline.diff @@ -19,7 +19,7 @@ _2 = Box(std::vec::Vec); // scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43 - (*_2) = const std::vec::Vec::::new() -> [return: bb2, unwind: bb4]; // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43 + _4 = &mut (*_2); // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43 -+ ((*_4).0: alloc::raw_vec::RawVec) = const alloc::raw_vec::RawVec:: { ptr: std::ptr::Unique:: { pointer: {0x4 as *const u32}, _marker: std::marker::PhantomData:: }, cap: 0usize, alloc: std::alloc::Global }; // scope 2 at $SRC_DIR/liballoc/vec.rs:LL:COL ++ ((*_4).0: alloc::raw_vec::RawVec) = const alloc::raw_vec::RawVec:: { ptr: std::ptr::Unique:: { pointer: {0x4 as *const u32}, _marker: std::marker::PhantomData:: }, cap: 0_usize, alloc: std::alloc::Global }; // scope 2 at $SRC_DIR/liballoc/vec.rs:LL:COL // ty::Const - // + ty: fn() -> std::vec::Vec {std::vec::Vec::::new} - // + val: Value(Scalar()) @@ -39,7 +39,7 @@ + // + span: $SRC_DIR/liballoc/vec.rs:LL:COL + // + user_ty: UserType(0) + // + literal: Const { ty: alloc::raw_vec::RawVec, val: Value(ByRef { alloc: Allocation { bytes: [4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], relocations: Relocations(SortedMap { data: [] }), init_mask: InitMask { blocks: [65535], len: Size { raw: 16 } }, size: Size { raw: 16 }, align: Align { pow2: 3 }, mutability: Not, extra: () }, offset: Size { raw: 0 } }) } -+ ((*_4).1: usize) = const 0usize; // scope 2 at $SRC_DIR/liballoc/vec.rs:LL:COL ++ ((*_4).1: usize) = const 0_usize; // scope 2 at $SRC_DIR/liballoc/vec.rs:LL:COL + // ty::Const + // + ty: usize + // + val: Value(Scalar(0x0000000000000000)) diff --git a/src/test/mir-opt/inline/inline-specialization/rustc.main.Inline.diff b/src/test/mir-opt/inline/inline-specialization/rustc.main.Inline.diff index a3e0d0a57a7c3..c273c43c4297d 100644 --- a/src/test/mir-opt/inline/inline-specialization/rustc.main.Inline.diff +++ b/src/test/mir-opt/inline/inline-specialization/rustc.main.Inline.diff @@ -13,7 +13,7 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/inline-specialization.rs:5:9: 5:10 - _1 = const as Foo>::bar() -> bb1; // scope 0 at $DIR/inline-specialization.rs:5:13: 5:38 -+ _1 = const 123u32; // scope 2 at $DIR/inline-specialization.rs:14:31: 14:34 ++ _1 = const 123_u32; // scope 2 at $DIR/inline-specialization.rs:14:31: 14:34 // ty::Const - // + ty: fn() -> u32 { as Foo>::bar} - // + val: Value(Scalar()) diff --git a/src/test/mir-opt/instrument_coverage/rustc.bar.InstrumentCoverage.diff b/src/test/mir-opt/instrument_coverage/rustc.bar.InstrumentCoverage.diff index 1e64379aa0e4b..8a079f0da4b01 100644 --- a/src/test/mir-opt/instrument_coverage/rustc.bar.InstrumentCoverage.diff +++ b/src/test/mir-opt/instrument_coverage/rustc.bar.InstrumentCoverage.diff @@ -7,7 +7,7 @@ bb0: { + StorageLive(_1); // scope 0 at $DIR/instrument_coverage.rs:18:1: 20:2 -+ _1 = const std::intrinsics::count_code_region(const 0u32) -> bb2; // scope 0 at $DIR/instrument_coverage.rs:18:1: 20:2 ++ _1 = const std::intrinsics::count_code_region(const 0_u32) -> bb2; // scope 0 at $DIR/instrument_coverage.rs:18:1: 20:2 + // ty::Const + // + ty: unsafe extern "rust-intrinsic" fn(u32) {std::intrinsics::count_code_region} + // + val: Value(Scalar()) diff --git a/src/test/mir-opt/instrument_coverage/rustc.main.InstrumentCoverage.diff b/src/test/mir-opt/instrument_coverage/rustc.main.InstrumentCoverage.diff index 82d21467827eb..3c2ec1dc06b70 100644 --- a/src/test/mir-opt/instrument_coverage/rustc.main.InstrumentCoverage.diff +++ b/src/test/mir-opt/instrument_coverage/rustc.main.InstrumentCoverage.diff @@ -11,7 +11,7 @@ bb0: { - falseUnwind -> [real: bb1, cleanup: bb2]; // scope 0 at $DIR/instrument_coverage.rs:10:5: 14:6 + StorageLive(_4); // scope 0 at $DIR/instrument_coverage.rs:9:1: 15:2 -+ _4 = const std::intrinsics::count_code_region(const 0u32) -> bb7; // scope 0 at $DIR/instrument_coverage.rs:9:1: 15:2 ++ _4 = const std::intrinsics::count_code_region(const 0_u32) -> bb7; // scope 0 at $DIR/instrument_coverage.rs:9:1: 15:2 + // ty::Const + // + ty: unsafe extern "rust-intrinsic" fn(u32) {std::intrinsics::count_code_region} + // + val: Value(Scalar()) diff --git a/src/test/mir-opt/issue-41697/32bit/rustc.{{impl}}-{{constant}}.SimplifyCfg-qualify-consts.after.mir b/src/test/mir-opt/issue-41697/32bit/rustc.{{impl}}-{{constant}}.SimplifyCfg-qualify-consts.after.mir index d263b2515f17a..403555964ca15 100644 --- a/src/test/mir-opt/issue-41697/32bit/rustc.{{impl}}-{{constant}}.SimplifyCfg-qualify-consts.after.mir +++ b/src/test/mir-opt/issue-41697/32bit/rustc.{{impl}}-{{constant}}.SimplifyCfg-qualify-consts.after.mir @@ -5,7 +5,20 @@ let mut _1: (usize, bool); // in scope 0 at $DIR/issue-41697.rs:18:19: 18:22 bb0: { - _1 = CheckedAdd(const 1usize, const 1usize); // scope 0 at $DIR/issue-41697.rs:18:19: 18:22 + _1 = CheckedAdd(const 1_usize, const 1_usize); // scope 0 at $DIR/issue-41697.rs:18:19: 18:22 + // ty::Const + // + ty: usize + // + val: Value(Scalar(0x00000001)) + // mir::Constant + // + span: $DIR/issue-41697.rs:18:19: 18:20 + // + literal: Const { ty: usize, val: Value(Scalar(0x00000001)) } + // ty::Const + // + ty: usize + // + val: Value(Scalar(0x00000001)) + // mir::Constant + // + span: $DIR/issue-41697.rs:18:21: 18:22 + // + literal: Const { ty: usize, val: Value(Scalar(0x00000001)) } + assert(!move (_1.1: bool), "attempt to compute `{} + {}` which would overflow", const 1_usize, const 1_usize) -> [success: bb2, unwind: bb1]; // scope 0 at $DIR/issue-41697.rs:18:19: 18:22 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000001)) @@ -18,7 +31,6 @@ // mir::Constant // + span: $DIR/issue-41697.rs:18:21: 18:22 // + literal: Const { ty: usize, val: Value(Scalar(0x00000001)) } - assert(!move (_1.1: bool), "attempt to add with overflow") -> [success: bb2, unwind: bb1]; // scope 0 at $DIR/issue-41697.rs:18:19: 18:22 } bb1 (cleanup): { diff --git a/src/test/mir-opt/issue-41697/64bit/rustc.{{impl}}-{{constant}}.SimplifyCfg-qualify-consts.after.mir b/src/test/mir-opt/issue-41697/64bit/rustc.{{impl}}-{{constant}}.SimplifyCfg-qualify-consts.after.mir index 6c00f49fb75b1..df933d3ac251f 100644 --- a/src/test/mir-opt/issue-41697/64bit/rustc.{{impl}}-{{constant}}.SimplifyCfg-qualify-consts.after.mir +++ b/src/test/mir-opt/issue-41697/64bit/rustc.{{impl}}-{{constant}}.SimplifyCfg-qualify-consts.after.mir @@ -5,7 +5,20 @@ let mut _1: (usize, bool); // in scope 0 at $DIR/issue-41697.rs:18:19: 18:22 bb0: { - _1 = CheckedAdd(const 1usize, const 1usize); // scope 0 at $DIR/issue-41697.rs:18:19: 18:22 + _1 = CheckedAdd(const 1_usize, const 1_usize); // scope 0 at $DIR/issue-41697.rs:18:19: 18:22 + // ty::Const + // + ty: usize + // + val: Value(Scalar(0x0000000000000001)) + // mir::Constant + // + span: $DIR/issue-41697.rs:18:19: 18:20 + // + literal: Const { ty: usize, val: Value(Scalar(0x0000000000000001)) } + // ty::Const + // + ty: usize + // + val: Value(Scalar(0x0000000000000001)) + // mir::Constant + // + span: $DIR/issue-41697.rs:18:21: 18:22 + // + literal: Const { ty: usize, val: Value(Scalar(0x0000000000000001)) } + assert(!move (_1.1: bool), "attempt to compute `{} + {}` which would overflow", const 1_usize, const 1_usize) -> [success: bb2, unwind: bb1]; // scope 0 at $DIR/issue-41697.rs:18:19: 18:22 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000001)) @@ -18,7 +31,6 @@ // mir::Constant // + span: $DIR/issue-41697.rs:18:21: 18:22 // + literal: Const { ty: usize, val: Value(Scalar(0x0000000000000001)) } - assert(!move (_1.1: bool), "attempt to add with overflow") -> [success: bb2, unwind: bb1]; // scope 0 at $DIR/issue-41697.rs:18:19: 18:22 } bb1 (cleanup): { diff --git a/src/test/mir-opt/issue-41888/rustc.main.ElaborateDrops.after.mir b/src/test/mir-opt/issue-41888/rustc.main.ElaborateDrops.after.mir index ce940273c3ef5..76ad865bcc842 100644 --- a/src/test/mir-opt/issue-41888/rustc.main.ElaborateDrops.after.mir +++ b/src/test/mir-opt/issue-41888/rustc.main.ElaborateDrops.after.mir @@ -96,7 +96,7 @@ fn main() -> () { bb8: { StorageDead(_3); // scope 1 at $DIR/issue-41888.rs:9:19: 9:20 _5 = discriminant(_1); // scope 1 at $DIR/issue-41888.rs:10:16: 10:24 - switchInt(move _5) -> [0isize: bb10, otherwise: bb9]; // scope 1 at $DIR/issue-41888.rs:10:16: 10:24 + switchInt(move _5) -> [0_isize: bb10, otherwise: bb9]; // scope 1 at $DIR/issue-41888.rs:10:16: 10:24 } bb9: { @@ -250,7 +250,7 @@ fn main() -> () { bb20: { _10 = discriminant(_1); // scope 0 at $DIR/issue-41888.rs:15:1: 15:2 - switchInt(move _10) -> [0isize: bb15, otherwise: bb18]; // scope 0 at $DIR/issue-41888.rs:15:1: 15:2 + switchInt(move _10) -> [0_isize: bb15, otherwise: bb18]; // scope 0 at $DIR/issue-41888.rs:15:1: 15:2 } bb21: { @@ -259,7 +259,7 @@ fn main() -> () { bb22 (cleanup): { _11 = discriminant(_1); // scope 0 at $DIR/issue-41888.rs:15:1: 15:2 - switchInt(move _11) -> [0isize: bb17, otherwise: bb19]; // scope 0 at $DIR/issue-41888.rs:15:1: 15:2 + switchInt(move _11) -> [0_isize: bb17, otherwise: bb19]; // scope 0 at $DIR/issue-41888.rs:15:1: 15:2 } bb23 (cleanup): { diff --git a/src/test/mir-opt/issue-49232/rustc.main.mir_map.0.mir b/src/test/mir-opt/issue-49232/rustc.main.mir_map.0.mir index 7299a683a9f0b..f65b93a34da65 100644 --- a/src/test/mir-opt/issue-49232/rustc.main.mir_map.0.mir +++ b/src/test/mir-opt/issue-49232/rustc.main.mir_map.0.mir @@ -58,7 +58,7 @@ fn main() -> () { } bb7: { - _2 = const 4i32; // scope 0 at $DIR/issue-49232.rs:9:26: 9:27 + _2 = const 4_i32; // scope 0 at $DIR/issue-49232.rs:9:26: 9:27 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000004)) diff --git a/src/test/mir-opt/issue-62289/rustc.test.ElaborateDrops.before.mir b/src/test/mir-opt/issue-62289/rustc.test.ElaborateDrops.before.mir index 0b8b03961f2a0..56916d676ed44 100644 --- a/src/test/mir-opt/issue-62289/rustc.test.ElaborateDrops.before.mir +++ b/src/test/mir-opt/issue-62289/rustc.test.ElaborateDrops.before.mir @@ -46,7 +46,7 @@ fn test() -> std::option::Option> { bb2: { StorageDead(_4); // scope 0 at $DIR/issue-62289.rs:9:19: 9:20 _5 = discriminant(_3); // scope 0 at $DIR/issue-62289.rs:9:19: 9:20 - switchInt(move _5) -> [0isize: bb4, 1isize: bb6, otherwise: bb5]; // scope 0 at $DIR/issue-62289.rs:9:19: 9:20 + switchInt(move _5) -> [0_isize: bb4, 1_isize: bb6, otherwise: bb5]; // scope 0 at $DIR/issue-62289.rs:9:19: 9:20 } bb3 (cleanup): { diff --git a/src/test/mir-opt/issue-72181/32bit/rustc.foo.mir_map.0.mir b/src/test/mir-opt/issue-72181/32bit/rustc.foo.mir_map.0.mir index 776eb61a5264f..9f8810e752cb3 100644 --- a/src/test/mir-opt/issue-72181/32bit/rustc.foo.mir_map.0.mir +++ b/src/test/mir-opt/issue-72181/32bit/rustc.foo.mir_map.0.mir @@ -9,7 +9,7 @@ fn foo(_1: [(Never, u32); 1]) -> u32 { bb0: { StorageLive(_2); // scope 0 at $DIR/issue-72181.rs:16:43: 16:44 - _2 = const 0usize; // scope 0 at $DIR/issue-72181.rs:16:43: 16:44 + _2 = const 0_usize; // scope 0 at $DIR/issue-72181.rs:16:43: 16:44 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000000)) diff --git a/src/test/mir-opt/issue-72181/32bit/rustc.main.mir_map.0.mir b/src/test/mir-opt/issue-72181/32bit/rustc.main.mir_map.0.mir index aa44dcd8eaee3..e3fb5eb193ae9 100644 --- a/src/test/mir-opt/issue-72181/32bit/rustc.main.mir_map.0.mir +++ b/src/test/mir-opt/issue-72181/32bit/rustc.main.mir_map.0.mir @@ -39,7 +39,7 @@ fn main() -> () { StorageDead(_1); // scope 0 at $DIR/issue-72181.rs:24:34: 24:35 StorageLive(_2); // scope 1 at $DIR/issue-72181.rs:26:9: 26:10 StorageLive(_3); // scope 1 at $DIR/issue-72181.rs:26:14: 26:27 - _3 = Foo { a: const 42u64 }; // scope 1 at $DIR/issue-72181.rs:26:14: 26:27 + _3 = Foo { a: const 42_u64 }; // scope 1 at $DIR/issue-72181.rs:26:14: 26:27 // ty::Const // + ty: u64 // + val: Value(Scalar(0x000000000000002a)) @@ -47,7 +47,7 @@ fn main() -> () { // + span: $DIR/issue-72181.rs:26:23: 26:25 // + literal: Const { ty: u64, val: Value(Scalar(0x000000000000002a)) } StorageLive(_4); // scope 1 at $DIR/issue-72181.rs:26:29: 26:42 - _4 = Foo { a: const 10u64 }; // scope 1 at $DIR/issue-72181.rs:26:29: 26:42 + _4 = Foo { a: const 10_u64 }; // scope 1 at $DIR/issue-72181.rs:26:29: 26:42 // ty::Const // + ty: u64 // + val: Value(Scalar(0x000000000000000a)) @@ -60,7 +60,7 @@ fn main() -> () { FakeRead(ForLet, _2); // scope 1 at $DIR/issue-72181.rs:26:9: 26:10 StorageLive(_5); // scope 2 at $DIR/issue-72181.rs:27:13: 27:30 StorageLive(_6); // scope 4 at $DIR/issue-72181.rs:27:24: 27:25 - _6 = const 0usize; // scope 4 at $DIR/issue-72181.rs:27:24: 27:25 + _6 = const 0_usize; // scope 4 at $DIR/issue-72181.rs:27:24: 27:25 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000000)) diff --git a/src/test/mir-opt/issue-72181/64bit/rustc.foo.mir_map.0.mir b/src/test/mir-opt/issue-72181/64bit/rustc.foo.mir_map.0.mir index 639019eaf9ccc..aab8efb415c69 100644 --- a/src/test/mir-opt/issue-72181/64bit/rustc.foo.mir_map.0.mir +++ b/src/test/mir-opt/issue-72181/64bit/rustc.foo.mir_map.0.mir @@ -9,7 +9,7 @@ fn foo(_1: [(Never, u32); 1]) -> u32 { bb0: { StorageLive(_2); // scope 0 at $DIR/issue-72181.rs:16:43: 16:44 - _2 = const 0usize; // scope 0 at $DIR/issue-72181.rs:16:43: 16:44 + _2 = const 0_usize; // scope 0 at $DIR/issue-72181.rs:16:43: 16:44 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000000)) diff --git a/src/test/mir-opt/issue-72181/64bit/rustc.main.mir_map.0.mir b/src/test/mir-opt/issue-72181/64bit/rustc.main.mir_map.0.mir index 4098e0e295c5d..d9e791b86bc2b 100644 --- a/src/test/mir-opt/issue-72181/64bit/rustc.main.mir_map.0.mir +++ b/src/test/mir-opt/issue-72181/64bit/rustc.main.mir_map.0.mir @@ -39,7 +39,7 @@ fn main() -> () { StorageDead(_1); // scope 0 at $DIR/issue-72181.rs:24:34: 24:35 StorageLive(_2); // scope 1 at $DIR/issue-72181.rs:26:9: 26:10 StorageLive(_3); // scope 1 at $DIR/issue-72181.rs:26:14: 26:27 - _3 = Foo { a: const 42u64 }; // scope 1 at $DIR/issue-72181.rs:26:14: 26:27 + _3 = Foo { a: const 42_u64 }; // scope 1 at $DIR/issue-72181.rs:26:14: 26:27 // ty::Const // + ty: u64 // + val: Value(Scalar(0x000000000000002a)) @@ -47,7 +47,7 @@ fn main() -> () { // + span: $DIR/issue-72181.rs:26:23: 26:25 // + literal: Const { ty: u64, val: Value(Scalar(0x000000000000002a)) } StorageLive(_4); // scope 1 at $DIR/issue-72181.rs:26:29: 26:42 - _4 = Foo { a: const 10u64 }; // scope 1 at $DIR/issue-72181.rs:26:29: 26:42 + _4 = Foo { a: const 10_u64 }; // scope 1 at $DIR/issue-72181.rs:26:29: 26:42 // ty::Const // + ty: u64 // + val: Value(Scalar(0x000000000000000a)) @@ -60,7 +60,7 @@ fn main() -> () { FakeRead(ForLet, _2); // scope 1 at $DIR/issue-72181.rs:26:9: 26:10 StorageLive(_5); // scope 2 at $DIR/issue-72181.rs:27:13: 27:30 StorageLive(_6); // scope 4 at $DIR/issue-72181.rs:27:24: 27:25 - _6 = const 0usize; // scope 4 at $DIR/issue-72181.rs:27:24: 27:25 + _6 = const 0_usize; // scope 4 at $DIR/issue-72181.rs:27:24: 27:25 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000000)) diff --git a/src/test/mir-opt/loop_test/rustc.main.SimplifyCfg-qualify-consts.after.mir b/src/test/mir-opt/loop_test/rustc.main.SimplifyCfg-qualify-consts.after.mir index 7046ebb793466..e699abf421d60 100644 --- a/src/test/mir-opt/loop_test/rustc.main.SimplifyCfg-qualify-consts.after.mir +++ b/src/test/mir-opt/loop_test/rustc.main.SimplifyCfg-qualify-consts.after.mir @@ -67,7 +67,7 @@ fn main() -> () { bb6: { StorageLive(_6); // scope 0 at $DIR/loop_test.rs:14:13: 14:14 - _6 = const 1i32; // scope 0 at $DIR/loop_test.rs:14:17: 14:18 + _6 = const 1_i32; // scope 0 at $DIR/loop_test.rs:14:17: 14:18 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) diff --git a/src/test/mir-opt/match-arm-scopes/rustc.complicated_match.ElaborateDrops.after.mir b/src/test/mir-opt/match-arm-scopes/rustc.complicated_match.ElaborateDrops.after.mir index 856248e90d495..c6832f21208d4 100644 --- a/src/test/mir-opt/match-arm-scopes/rustc.complicated_match.ElaborateDrops.after.mir +++ b/src/test/mir-opt/match-arm-scopes/rustc.complicated_match.ElaborateDrops.after.mir @@ -54,7 +54,7 @@ fn complicated_match(_1: bool, _2: (bool, bool, std::string::String)) -> i32 { } bb5: { - _0 = const 1i32; // scope 1 at $DIR/match-arm-scopes.rs:16:77: 16:78 + _0 = const 1_i32; // scope 1 at $DIR/match-arm-scopes.rs:16:77: 16:78 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) @@ -82,7 +82,7 @@ fn complicated_match(_1: bool, _2: (bool, bool, std::string::String)) -> i32 { } bb8: { - _0 = const 3i32; // scope 0 at $DIR/match-arm-scopes.rs:16:59: 16:60 + _0 = const 3_i32; // scope 0 at $DIR/match-arm-scopes.rs:16:59: 16:60 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000003)) @@ -142,7 +142,7 @@ fn complicated_match(_1: bool, _2: (bool, bool, std::string::String)) -> i32 { } bb16: { - _0 = const 3i32; // scope 0 at $DIR/match-arm-scopes.rs:16:59: 16:60 + _0 = const 3_i32; // scope 0 at $DIR/match-arm-scopes.rs:16:59: 16:60 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000003)) @@ -181,7 +181,7 @@ fn complicated_match(_1: bool, _2: (bool, bool, std::string::String)) -> i32 { } bb20: { - _0 = const 2i32; // scope 2 at $DIR/match-arm-scopes.rs:17:41: 17:42 + _0 = const 2_i32; // scope 2 at $DIR/match-arm-scopes.rs:17:41: 17:42 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000002)) diff --git a/src/test/mir-opt/match-arm-scopes/rustc.complicated_match.SimplifyCfg-initial.after.mir b/src/test/mir-opt/match-arm-scopes/rustc.complicated_match.SimplifyCfg-initial.after.mir index 1f6b2c982fee0..45f7e91d097c0 100644 --- a/src/test/mir-opt/match-arm-scopes/rustc.complicated_match.SimplifyCfg-initial.after.mir +++ b/src/test/mir-opt/match-arm-scopes/rustc.complicated_match.SimplifyCfg-initial.after.mir @@ -67,7 +67,7 @@ fn complicated_match(_1: bool, _2: (bool, bool, std::string::String)) -> i32 { } bb8: { - _0 = const 1i32; // scope 1 at $DIR/match-arm-scopes.rs:16:77: 16:78 + _0 = const 1_i32; // scope 1 at $DIR/match-arm-scopes.rs:16:77: 16:78 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) @@ -102,7 +102,7 @@ fn complicated_match(_1: bool, _2: (bool, bool, std::string::String)) -> i32 { } bb12: { - _0 = const 3i32; // scope 0 at $DIR/match-arm-scopes.rs:16:59: 16:60 + _0 = const 3_i32; // scope 0 at $DIR/match-arm-scopes.rs:16:59: 16:60 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000003)) @@ -173,7 +173,7 @@ fn complicated_match(_1: bool, _2: (bool, bool, std::string::String)) -> i32 { } bb21: { - _0 = const 3i32; // scope 0 at $DIR/match-arm-scopes.rs:16:59: 16:60 + _0 = const 3_i32; // scope 0 at $DIR/match-arm-scopes.rs:16:59: 16:60 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000003)) @@ -216,7 +216,7 @@ fn complicated_match(_1: bool, _2: (bool, bool, std::string::String)) -> i32 { } bb25: { - _0 = const 2i32; // scope 2 at $DIR/match-arm-scopes.rs:17:41: 17:42 + _0 = const 2_i32; // scope 2 at $DIR/match-arm-scopes.rs:17:41: 17:42 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000002)) diff --git a/src/test/mir-opt/match_false_edges/rustc.full_tested_match.PromoteTemps.after.mir b/src/test/mir-opt/match_false_edges/rustc.full_tested_match.PromoteTemps.after.mir index 3e1dec697b76f..d4a2afe295781 100644 --- a/src/test/mir-opt/match_false_edges/rustc.full_tested_match.PromoteTemps.after.mir +++ b/src/test/mir-opt/match_false_edges/rustc.full_tested_match.PromoteTemps.after.mir @@ -26,7 +26,7 @@ fn full_tested_match() -> () { bb0: { StorageLive(_1); // scope 0 at $DIR/match_false_edges.rs:15:13: 19:6 StorageLive(_2); // scope 0 at $DIR/match_false_edges.rs:15:19: 15:27 - _2 = std::option::Option::::Some(const 42i32); // scope 0 at $DIR/match_false_edges.rs:15:19: 15:27 + _2 = std::option::Option::::Some(const 42_i32); // scope 0 at $DIR/match_false_edges.rs:15:19: 15:27 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000002a)) @@ -35,7 +35,7 @@ fn full_tested_match() -> () { // + literal: Const { ty: i32, val: Value(Scalar(0x0000002a)) } FakeRead(ForMatchedPlace, _2); // scope 0 at $DIR/match_false_edges.rs:15:19: 15:27 _3 = discriminant(_2); // scope 0 at $DIR/match_false_edges.rs:16:9: 16:16 - switchInt(move _3) -> [0isize: bb2, 1isize: bb3, otherwise: bb5]; // scope 0 at $DIR/match_false_edges.rs:16:9: 16:16 + switchInt(move _3) -> [0_isize: bb2, 1_isize: bb3, otherwise: bb5]; // scope 0 at $DIR/match_false_edges.rs:16:9: 16:16 } bb1 (cleanup): { @@ -43,7 +43,7 @@ fn full_tested_match() -> () { } bb2: { - _1 = (const 3i32, const 3i32); // scope 0 at $DIR/match_false_edges.rs:18:17: 18:23 + _1 = (const 3_i32, const 3_i32); // scope 0 at $DIR/match_false_edges.rs:18:17: 18:23 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000003)) @@ -104,7 +104,7 @@ fn full_tested_match() -> () { _5 = ((_2 as Some).0: i32); // scope 0 at $DIR/match_false_edges.rs:16:14: 16:15 StorageLive(_8); // scope 2 at $DIR/match_false_edges.rs:16:35: 16:36 _8 = _5; // scope 2 at $DIR/match_false_edges.rs:16:35: 16:36 - _1 = (const 1i32, move _8); // scope 2 at $DIR/match_false_edges.rs:16:31: 16:37 + _1 = (const 1_i32, move _8); // scope 2 at $DIR/match_false_edges.rs:16:31: 16:37 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) @@ -128,7 +128,7 @@ fn full_tested_match() -> () { _9 = ((_2 as Some).0: i32); // scope 0 at $DIR/match_false_edges.rs:17:14: 17:15 StorageLive(_10); // scope 3 at $DIR/match_false_edges.rs:17:24: 17:25 _10 = _9; // scope 3 at $DIR/match_false_edges.rs:17:24: 17:25 - _1 = (const 2i32, move _10); // scope 3 at $DIR/match_false_edges.rs:17:20: 17:26 + _1 = (const 2_i32, move _10); // scope 3 at $DIR/match_false_edges.rs:17:20: 17:26 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000002)) diff --git a/src/test/mir-opt/match_false_edges/rustc.full_tested_match2.PromoteTemps.before.mir b/src/test/mir-opt/match_false_edges/rustc.full_tested_match2.PromoteTemps.before.mir index 4e6dc6e13ff62..f1744a94fdc13 100644 --- a/src/test/mir-opt/match_false_edges/rustc.full_tested_match2.PromoteTemps.before.mir +++ b/src/test/mir-opt/match_false_edges/rustc.full_tested_match2.PromoteTemps.before.mir @@ -25,7 +25,7 @@ fn full_tested_match2() -> () { bb0: { StorageLive(_1); // scope 0 at $DIR/match_false_edges.rs:26:13: 30:6 StorageLive(_2); // scope 0 at $DIR/match_false_edges.rs:26:19: 26:27 - _2 = std::option::Option::::Some(const 42i32); // scope 0 at $DIR/match_false_edges.rs:26:19: 26:27 + _2 = std::option::Option::::Some(const 42_i32); // scope 0 at $DIR/match_false_edges.rs:26:19: 26:27 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000002a)) @@ -34,7 +34,7 @@ fn full_tested_match2() -> () { // + literal: Const { ty: i32, val: Value(Scalar(0x0000002a)) } FakeRead(ForMatchedPlace, _2); // scope 0 at $DIR/match_false_edges.rs:26:19: 26:27 _3 = discriminant(_2); // scope 0 at $DIR/match_false_edges.rs:27:9: 27:16 - switchInt(move _3) -> [0isize: bb2, 1isize: bb3, otherwise: bb5]; // scope 0 at $DIR/match_false_edges.rs:27:9: 27:16 + switchInt(move _3) -> [0_isize: bb2, 1_isize: bb3, otherwise: bb5]; // scope 0 at $DIR/match_false_edges.rs:27:9: 27:16 } bb1 (cleanup): { @@ -54,7 +54,7 @@ fn full_tested_match2() -> () { _9 = ((_2 as Some).0: i32); // scope 0 at $DIR/match_false_edges.rs:29:14: 29:15 StorageLive(_10); // scope 3 at $DIR/match_false_edges.rs:29:24: 29:25 _10 = _9; // scope 3 at $DIR/match_false_edges.rs:29:24: 29:25 - _1 = (const 2i32, move _10); // scope 3 at $DIR/match_false_edges.rs:29:20: 29:26 + _1 = (const 2_i32, move _10); // scope 3 at $DIR/match_false_edges.rs:29:20: 29:26 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000002)) @@ -96,7 +96,7 @@ fn full_tested_match2() -> () { _5 = ((_2 as Some).0: i32); // scope 0 at $DIR/match_false_edges.rs:27:14: 27:15 StorageLive(_8); // scope 2 at $DIR/match_false_edges.rs:27:35: 27:36 _8 = _5; // scope 2 at $DIR/match_false_edges.rs:27:35: 27:36 - _1 = (const 1i32, move _8); // scope 2 at $DIR/match_false_edges.rs:27:31: 27:37 + _1 = (const 1_i32, move _8); // scope 2 at $DIR/match_false_edges.rs:27:31: 27:37 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) @@ -116,7 +116,7 @@ fn full_tested_match2() -> () { } bb10: { - _1 = (const 3i32, const 3i32); // scope 0 at $DIR/match_false_edges.rs:28:17: 28:23 + _1 = (const 3_i32, const 3_i32); // scope 0 at $DIR/match_false_edges.rs:28:17: 28:23 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000003)) diff --git a/src/test/mir-opt/match_false_edges/rustc.main.PromoteTemps.before.mir b/src/test/mir-opt/match_false_edges/rustc.main.PromoteTemps.before.mir index b54058ca73f6f..4ab4c4d341e2f 100644 --- a/src/test/mir-opt/match_false_edges/rustc.main.PromoteTemps.before.mir +++ b/src/test/mir-opt/match_false_edges/rustc.main.PromoteTemps.before.mir @@ -36,7 +36,7 @@ fn main() -> () { bb0: { StorageLive(_1); // scope 0 at $DIR/match_false_edges.rs:35:13: 40:6 StorageLive(_2); // scope 0 at $DIR/match_false_edges.rs:35:19: 35:26 - _2 = std::option::Option::::Some(const 1i32); // scope 0 at $DIR/match_false_edges.rs:35:19: 35:26 + _2 = std::option::Option::::Some(const 1_i32); // scope 0 at $DIR/match_false_edges.rs:35:19: 35:26 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) @@ -45,7 +45,7 @@ fn main() -> () { // + literal: Const { ty: i32, val: Value(Scalar(0x00000001)) } FakeRead(ForMatchedPlace, _2); // scope 0 at $DIR/match_false_edges.rs:35:19: 35:26 _4 = discriminant(_2); // scope 0 at $DIR/match_false_edges.rs:36:9: 36:17 - switchInt(move _4) -> [1isize: bb3, otherwise: bb2]; // scope 0 at $DIR/match_false_edges.rs:36:9: 36:17 + switchInt(move _4) -> [1_isize: bb3, otherwise: bb2]; // scope 0 at $DIR/match_false_edges.rs:36:9: 36:17 } bb1 (cleanup): { @@ -63,7 +63,7 @@ fn main() -> () { bb4: { StorageLive(_14); // scope 0 at $DIR/match_false_edges.rs:39:9: 39:11 _14 = _2; // scope 0 at $DIR/match_false_edges.rs:39:9: 39:11 - _1 = const 4i32; // scope 5 at $DIR/match_false_edges.rs:39:15: 39:16 + _1 = const 4_i32; // scope 5 at $DIR/match_false_edges.rs:39:15: 39:16 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000004)) @@ -102,7 +102,7 @@ fn main() -> () { FakeRead(ForGuardBinding, _7); // scope 0 at $DIR/match_false_edges.rs:36:27: 36:28 StorageLive(_6); // scope 0 at $DIR/match_false_edges.rs:36:14: 36:16 _6 = ((_2 as Some).0: i32); // scope 0 at $DIR/match_false_edges.rs:36:14: 36:16 - _1 = const 1i32; // scope 2 at $DIR/match_false_edges.rs:36:32: 36:33 + _1 = const 1_i32; // scope 2 at $DIR/match_false_edges.rs:36:32: 36:33 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) @@ -123,7 +123,7 @@ fn main() -> () { bb10: { StorageLive(_9); // scope 0 at $DIR/match_false_edges.rs:37:9: 37:11 _9 = _2; // scope 0 at $DIR/match_false_edges.rs:37:9: 37:11 - _1 = const 2i32; // scope 3 at $DIR/match_false_edges.rs:37:15: 37:16 + _1 = const 2_i32; // scope 3 at $DIR/match_false_edges.rs:37:15: 37:16 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000002)) @@ -161,7 +161,7 @@ fn main() -> () { FakeRead(ForGuardBinding, _11); // scope 0 at $DIR/match_false_edges.rs:38:28: 38:29 StorageLive(_10); // scope 0 at $DIR/match_false_edges.rs:38:14: 38:15 _10 = ((_2 as Some).0: i32); // scope 0 at $DIR/match_false_edges.rs:38:14: 38:15 - _1 = const 3i32; // scope 4 at $DIR/match_false_edges.rs:38:33: 38:34 + _1 = const 3_i32; // scope 4 at $DIR/match_false_edges.rs:38:33: 38:34 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000003)) diff --git a/src/test/mir-opt/match_test/rustc.main.SimplifyCfg-initial.after.mir b/src/test/mir-opt/match_test/rustc.main.SimplifyCfg-initial.after.mir index 5996496406a9f..ef6c88d8005b3 100644 --- a/src/test/mir-opt/match_test/rustc.main.SimplifyCfg-initial.after.mir +++ b/src/test/mir-opt/match_test/rustc.main.SimplifyCfg-initial.after.mir @@ -20,7 +20,7 @@ fn main() -> () { bb0: { StorageLive(_1); // scope 0 at $DIR/match_test.rs:7:9: 7:10 - _1 = const 3i32; // scope 0 at $DIR/match_test.rs:7:13: 7:14 + _1 = const 3_i32; // scope 0 at $DIR/match_test.rs:7:13: 7:14 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000003)) @@ -39,7 +39,7 @@ fn main() -> () { FakeRead(ForLet, _2); // scope 1 at $DIR/match_test.rs:8:9: 8:10 StorageLive(_3); // scope 2 at $DIR/match_test.rs:12:5: 17:6 FakeRead(ForMatchedPlace, _1); // scope 2 at $DIR/match_test.rs:12:11: 12:12 - _6 = Le(const 0i32, _1); // scope 2 at $DIR/match_test.rs:13:9: 13:14 + _6 = Le(const 0_i32, _1); // scope 2 at $DIR/match_test.rs:13:9: 13:14 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) @@ -50,7 +50,7 @@ fn main() -> () { } bb1: { - _7 = Lt(_1, const 10i32); // scope 2 at $DIR/match_test.rs:13:9: 13:14 + _7 = Lt(_1, const 10_i32); // scope 2 at $DIR/match_test.rs:13:9: 13:14 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000000a)) @@ -65,7 +65,7 @@ fn main() -> () { } bb3: { - _3 = const 3i32; // scope 2 at $DIR/match_test.rs:16:14: 16:15 + _3 = const 3_i32; // scope 2 at $DIR/match_test.rs:16:14: 16:15 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000003)) @@ -76,7 +76,7 @@ fn main() -> () { } bb4: { - _4 = Le(const 10i32, _1); // scope 2 at $DIR/match_test.rs:14:9: 14:16 + _4 = Le(const 10_i32, _1); // scope 2 at $DIR/match_test.rs:14:9: 14:16 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000000a)) @@ -87,7 +87,7 @@ fn main() -> () { } bb5: { - _5 = Le(_1, const 20i32); // scope 2 at $DIR/match_test.rs:14:9: 14:16 + _5 = Le(_1, const 20_i32); // scope 2 at $DIR/match_test.rs:14:9: 14:16 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000014)) @@ -102,7 +102,7 @@ fn main() -> () { } bb7: { - switchInt(_1) -> [-1i32: bb8, otherwise: bb3]; // scope 2 at $DIR/match_test.rs:15:9: 15:11 + switchInt(_1) -> [-1_i32: bb8, otherwise: bb3]; // scope 2 at $DIR/match_test.rs:15:9: 15:11 } bb8: { @@ -119,7 +119,7 @@ fn main() -> () { bb10: { StorageDead(_9); // scope 2 at $DIR/match_test.rs:13:24: 13:25 FakeRead(ForMatchGuard, _8); // scope 2 at $DIR/match_test.rs:13:18: 13:19 - _3 = const 0i32; // scope 2 at $DIR/match_test.rs:13:23: 13:24 + _3 = const 0_i32; // scope 2 at $DIR/match_test.rs:13:23: 13:24 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) @@ -135,7 +135,7 @@ fn main() -> () { } bb12: { - _3 = const 1i32; // scope 2 at $DIR/match_test.rs:14:20: 14:21 + _3 = const 1_i32; // scope 2 at $DIR/match_test.rs:14:20: 14:21 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) @@ -146,7 +146,7 @@ fn main() -> () { } bb13: { - _3 = const 2i32; // scope 2 at $DIR/match_test.rs:15:15: 15:16 + _3 = const 2_i32; // scope 2 at $DIR/match_test.rs:15:15: 15:16 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000002)) diff --git a/src/test/mir-opt/no-drop-for-inactive-variant/rustc.unwrap.SimplifyCfg-elaborate-drops.after.mir b/src/test/mir-opt/no-drop-for-inactive-variant/rustc.unwrap.SimplifyCfg-elaborate-drops.after.mir index eb6911735a59e..ce987a57d5fc7 100644 --- a/src/test/mir-opt/no-drop-for-inactive-variant/rustc.unwrap.SimplifyCfg-elaborate-drops.after.mir +++ b/src/test/mir-opt/no-drop-for-inactive-variant/rustc.unwrap.SimplifyCfg-elaborate-drops.after.mir @@ -14,7 +14,7 @@ fn unwrap(_1: std::option::Option) -> T { bb0: { _2 = discriminant(_1); // scope 0 at $DIR/no-drop-for-inactive-variant.rs:9:9: 9:16 - switchInt(move _2) -> [0isize: bb2, 1isize: bb4, otherwise: bb3]; // scope 0 at $DIR/no-drop-for-inactive-variant.rs:9:9: 9:16 + switchInt(move _2) -> [0_isize: bb2, 1_isize: bb4, otherwise: bb3]; // scope 0 at $DIR/no-drop-for-inactive-variant.rs:9:9: 9:16 } bb1 (cleanup): { diff --git a/src/test/mir-opt/nrvo-simple/rustc.nrvo.RenameReturnPlace.diff b/src/test/mir-opt/nrvo-simple/rustc.nrvo.RenameReturnPlace.diff index 4511470f3a50f..18fbffb463067 100644 --- a/src/test/mir-opt/nrvo-simple/rustc.nrvo.RenameReturnPlace.diff +++ b/src/test/mir-opt/nrvo-simple/rustc.nrvo.RenameReturnPlace.diff @@ -17,8 +17,8 @@ bb0: { - StorageLive(_2); // scope 0 at $DIR/nrvo-simple.rs:3:9: 3:16 -- _2 = [const 0u8; 1024]; // scope 0 at $DIR/nrvo-simple.rs:3:19: 3:28 -+ _0 = [const 0u8; 1024]; // scope 0 at $DIR/nrvo-simple.rs:3:19: 3:28 +- _2 = [const 0_u8; 1024]; // scope 0 at $DIR/nrvo-simple.rs:3:19: 3:28 ++ _0 = [const 0_u8; 1024]; // scope 0 at $DIR/nrvo-simple.rs:3:19: 3:28 // ty::Const // + ty: u8 // + val: Value(Scalar(0x00)) diff --git a/src/test/mir-opt/packed-struct-drop-aligned/32bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir b/src/test/mir-opt/packed-struct-drop-aligned/32bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir index 21dab9ab92394..075c7647c671f 100644 --- a/src/test/mir-opt/packed-struct-drop-aligned/32bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir +++ b/src/test/mir-opt/packed-struct-drop-aligned/32bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir @@ -16,7 +16,7 @@ fn main() -> () { StorageLive(_1); // scope 0 at $DIR/packed-struct-drop-aligned.rs:6:9: 6:14 StorageLive(_2); // scope 0 at $DIR/packed-struct-drop-aligned.rs:6:24: 6:42 StorageLive(_3); // scope 0 at $DIR/packed-struct-drop-aligned.rs:6:32: 6:41 - _3 = Droppy(const 0usize); // scope 0 at $DIR/packed-struct-drop-aligned.rs:6:32: 6:41 + _3 = Droppy(const 0_usize); // scope 0 at $DIR/packed-struct-drop-aligned.rs:6:32: 6:41 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000000)) @@ -29,7 +29,7 @@ fn main() -> () { StorageDead(_2); // scope 0 at $DIR/packed-struct-drop-aligned.rs:6:42: 6:43 StorageLive(_4); // scope 1 at $DIR/packed-struct-drop-aligned.rs:7:11: 7:29 StorageLive(_5); // scope 1 at $DIR/packed-struct-drop-aligned.rs:7:19: 7:28 - _5 = Droppy(const 0usize); // scope 1 at $DIR/packed-struct-drop-aligned.rs:7:19: 7:28 + _5 = Droppy(const 0_usize); // scope 1 at $DIR/packed-struct-drop-aligned.rs:7:19: 7:28 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000000)) diff --git a/src/test/mir-opt/packed-struct-drop-aligned/64bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir b/src/test/mir-opt/packed-struct-drop-aligned/64bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir index cf46f74c16df3..99a74b6b24f7f 100644 --- a/src/test/mir-opt/packed-struct-drop-aligned/64bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir +++ b/src/test/mir-opt/packed-struct-drop-aligned/64bit/rustc.main.SimplifyCfg-elaborate-drops.after.mir @@ -16,7 +16,7 @@ fn main() -> () { StorageLive(_1); // scope 0 at $DIR/packed-struct-drop-aligned.rs:6:9: 6:14 StorageLive(_2); // scope 0 at $DIR/packed-struct-drop-aligned.rs:6:24: 6:42 StorageLive(_3); // scope 0 at $DIR/packed-struct-drop-aligned.rs:6:32: 6:41 - _3 = Droppy(const 0usize); // scope 0 at $DIR/packed-struct-drop-aligned.rs:6:32: 6:41 + _3 = Droppy(const 0_usize); // scope 0 at $DIR/packed-struct-drop-aligned.rs:6:32: 6:41 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000000)) @@ -29,7 +29,7 @@ fn main() -> () { StorageDead(_2); // scope 0 at $DIR/packed-struct-drop-aligned.rs:6:42: 6:43 StorageLive(_4); // scope 1 at $DIR/packed-struct-drop-aligned.rs:7:11: 7:29 StorageLive(_5); // scope 1 at $DIR/packed-struct-drop-aligned.rs:7:19: 7:28 - _5 = Droppy(const 0usize); // scope 1 at $DIR/packed-struct-drop-aligned.rs:7:19: 7:28 + _5 = Droppy(const 0_usize); // scope 1 at $DIR/packed-struct-drop-aligned.rs:7:19: 7:28 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000000)) diff --git a/src/test/mir-opt/remove_fake_borrows/rustc.match_guard.CleanupNonCodegenStatements.diff b/src/test/mir-opt/remove_fake_borrows/rustc.match_guard.CleanupNonCodegenStatements.diff index 4e626b1384afc..7fc209778703e 100644 --- a/src/test/mir-opt/remove_fake_borrows/rustc.match_guard.CleanupNonCodegenStatements.diff +++ b/src/test/mir-opt/remove_fake_borrows/rustc.match_guard.CleanupNonCodegenStatements.diff @@ -16,11 +16,11 @@ - FakeRead(ForMatchedPlace, _1); // scope 0 at $DIR/remove_fake_borrows.rs:7:11: 7:12 + nop; // scope 0 at $DIR/remove_fake_borrows.rs:7:11: 7:12 _3 = discriminant(_1); // scope 0 at $DIR/remove_fake_borrows.rs:8:9: 8:16 - switchInt(move _3) -> [1isize: bb2, otherwise: bb1]; // scope 0 at $DIR/remove_fake_borrows.rs:8:9: 8:16 + switchInt(move _3) -> [1_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/remove_fake_borrows.rs:8:9: 8:16 } bb1: { - _0 = const 1i32; // scope 0 at $DIR/remove_fake_borrows.rs:9:14: 9:15 + _0 = const 1_i32; // scope 0 at $DIR/remove_fake_borrows.rs:9:14: 9:15 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) @@ -31,7 +31,7 @@ } bb2: { - switchInt((*(*((_1 as Some).0: &&i32)))) -> [0i32: bb3, otherwise: bb1]; // scope 0 at $DIR/remove_fake_borrows.rs:8:14: 8:15 + switchInt((*(*((_1 as Some).0: &&i32)))) -> [0_i32: bb3, otherwise: bb1]; // scope 0 at $DIR/remove_fake_borrows.rs:8:14: 8:15 } bb3: { @@ -62,7 +62,7 @@ + nop; // scope 0 at $DIR/remove_fake_borrows.rs:8:20: 8:21 + nop; // scope 0 at $DIR/remove_fake_borrows.rs:8:20: 8:21 + nop; // scope 0 at $DIR/remove_fake_borrows.rs:8:20: 8:21 - _0 = const 0i32; // scope 0 at $DIR/remove_fake_borrows.rs:8:25: 8:26 + _0 = const 0_i32; // scope 0 at $DIR/remove_fake_borrows.rs:8:25: 8:26 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) diff --git a/src/test/mir-opt/retag/rustc.main.SimplifyCfg-elaborate-drops.after.mir b/src/test/mir-opt/retag/rustc.main.SimplifyCfg-elaborate-drops.after.mir index c8c5da37abe32..14a7f2d500542 100644 --- a/src/test/mir-opt/retag/rustc.main.SimplifyCfg-elaborate-drops.after.mir +++ b/src/test/mir-opt/retag/rustc.main.SimplifyCfg-elaborate-drops.after.mir @@ -56,7 +56,7 @@ fn main() -> () { bb0: { StorageLive(_1); // scope 0 at $DIR/retag.rs:30:9: 30:14 - _1 = const 0i32; // scope 0 at $DIR/retag.rs:30:17: 30:18 + _1 = const 0_i32; // scope 0 at $DIR/retag.rs:30:17: 30:18 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) @@ -67,7 +67,7 @@ fn main() -> () { StorageLive(_3); // scope 1 at $DIR/retag.rs:32:13: 32:14 StorageLive(_4); // scope 1 at $DIR/retag.rs:32:17: 32:24 StorageLive(_5); // scope 1 at $DIR/retag.rs:32:17: 32:24 - _5 = Test(const 0i32); // scope 1 at $DIR/retag.rs:32:17: 32:24 + _5 = Test(const 0_i32); // scope 1 at $DIR/retag.rs:32:17: 32:24 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) @@ -170,7 +170,7 @@ fn main() -> () { StorageLive(_19); // scope 7 at $DIR/retag.rs:47:5: 47:24 StorageLive(_20); // scope 7 at $DIR/retag.rs:47:5: 47:12 StorageLive(_21); // scope 7 at $DIR/retag.rs:47:5: 47:12 - _21 = Test(const 0i32); // scope 7 at $DIR/retag.rs:47:5: 47:12 + _21 = Test(const 0_i32); // scope 7 at $DIR/retag.rs:47:5: 47:12 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) diff --git a/src/test/mir-opt/simple-match/32bit/rustc.match_bool.mir_map.0.mir b/src/test/mir-opt/simple-match/32bit/rustc.match_bool.mir_map.0.mir index cc2738b5e50a3..da3191554f0e0 100644 --- a/src/test/mir-opt/simple-match/32bit/rustc.match_bool.mir_map.0.mir +++ b/src/test/mir-opt/simple-match/32bit/rustc.match_bool.mir_map.0.mir @@ -18,7 +18,7 @@ fn match_bool(_1: bool) -> usize { } bb3: { - _0 = const 20usize; // scope 0 at $DIR/simple-match.rs:8:14: 8:16 + _0 = const 20_usize; // scope 0 at $DIR/simple-match.rs:8:14: 8:16 // ty::Const // + ty: usize // + val: Value(Scalar(0x00000014)) @@ -29,7 +29,7 @@ fn match_bool(_1: bool) -> usize { } bb4: { - _0 = const 10usize; // scope 0 at $DIR/simple-match.rs:7:17: 7:19 + _0 = const 10_usize; // scope 0 at $DIR/simple-match.rs:7:17: 7:19 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000a)) diff --git a/src/test/mir-opt/simple-match/64bit/rustc.match_bool.mir_map.0.mir b/src/test/mir-opt/simple-match/64bit/rustc.match_bool.mir_map.0.mir index 309041abef9be..55b51a899bc50 100644 --- a/src/test/mir-opt/simple-match/64bit/rustc.match_bool.mir_map.0.mir +++ b/src/test/mir-opt/simple-match/64bit/rustc.match_bool.mir_map.0.mir @@ -18,7 +18,7 @@ fn match_bool(_1: bool) -> usize { } bb3: { - _0 = const 20usize; // scope 0 at $DIR/simple-match.rs:8:14: 8:16 + _0 = const 20_usize; // scope 0 at $DIR/simple-match.rs:8:14: 8:16 // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000014)) @@ -29,7 +29,7 @@ fn match_bool(_1: bool) -> usize { } bb4: { - _0 = const 10usize; // scope 0 at $DIR/simple-match.rs:7:17: 7:19 + _0 = const 10_usize; // scope 0 at $DIR/simple-match.rs:7:17: 7:19 // ty::Const // + ty: usize // + val: Value(Scalar(0x000000000000000a)) diff --git a/src/test/mir-opt/simplify-arm-identity/32bit/rustc.main.SimplifyArmIdentity.diff b/src/test/mir-opt/simplify-arm-identity/32bit/rustc.main.SimplifyArmIdentity.diff index 94759dca038b1..33a3403cada92 100644 --- a/src/test/mir-opt/simplify-arm-identity/32bit/rustc.main.SimplifyArmIdentity.diff +++ b/src/test/mir-opt/simplify-arm-identity/32bit/rustc.main.SimplifyArmIdentity.diff @@ -19,7 +19,7 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/simplify-arm-identity.rs:18:9: 18:10 - ((_1 as Foo).0: u8) = const 0u8; // scope 0 at $DIR/simplify-arm-identity.rs:18:18: 18:29 + ((_1 as Foo).0: u8) = const 0_u8; // scope 0 at $DIR/simplify-arm-identity.rs:18:18: 18:29 // ty::Const // + ty: u8 // + val: Value(Scalar(0x00)) @@ -28,7 +28,7 @@ // + literal: Const { ty: u8, val: Value(Scalar(0x00)) } discriminant(_1) = 0; // scope 0 at $DIR/simplify-arm-identity.rs:18:18: 18:29 StorageLive(_2); // scope 1 at $DIR/simplify-arm-identity.rs:19:18: 22:6 - _3 = const 0isize; // scope 1 at $DIR/simplify-arm-identity.rs:20:9: 20:20 + _3 = const 0_isize; // scope 1 at $DIR/simplify-arm-identity.rs:20:9: 20:20 // ty::Const // + ty: isize // + val: Value(Scalar(0x00000000)) @@ -39,7 +39,7 @@ } bb1: { - _2 = const Dst::Foo(0u8); // scope 1 at $DIR/simplify-arm-identity.rs:21:21: 21:32 + _2 = const Dst::Foo(0_u8); // scope 1 at $DIR/simplify-arm-identity.rs:21:21: 21:32 // ty::Const // + ty: Dst // + val: Value(Scalar(0x00)) diff --git a/src/test/mir-opt/simplify-arm-identity/64bit/rustc.main.SimplifyArmIdentity.diff b/src/test/mir-opt/simplify-arm-identity/64bit/rustc.main.SimplifyArmIdentity.diff index ba21f16b685d4..7e4fe1c2dcc4c 100644 --- a/src/test/mir-opt/simplify-arm-identity/64bit/rustc.main.SimplifyArmIdentity.diff +++ b/src/test/mir-opt/simplify-arm-identity/64bit/rustc.main.SimplifyArmIdentity.diff @@ -19,7 +19,7 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/simplify-arm-identity.rs:18:9: 18:10 - ((_1 as Foo).0: u8) = const 0u8; // scope 0 at $DIR/simplify-arm-identity.rs:18:18: 18:29 + ((_1 as Foo).0: u8) = const 0_u8; // scope 0 at $DIR/simplify-arm-identity.rs:18:18: 18:29 // ty::Const // + ty: u8 // + val: Value(Scalar(0x00)) @@ -28,7 +28,7 @@ // + literal: Const { ty: u8, val: Value(Scalar(0x00)) } discriminant(_1) = 0; // scope 0 at $DIR/simplify-arm-identity.rs:18:18: 18:29 StorageLive(_2); // scope 1 at $DIR/simplify-arm-identity.rs:19:18: 22:6 - _3 = const 0isize; // scope 1 at $DIR/simplify-arm-identity.rs:20:9: 20:20 + _3 = const 0_isize; // scope 1 at $DIR/simplify-arm-identity.rs:20:9: 20:20 // ty::Const // + ty: isize // + val: Value(Scalar(0x0000000000000000)) @@ -39,7 +39,7 @@ } bb1: { - _2 = const Dst::Foo(0u8); // scope 1 at $DIR/simplify-arm-identity.rs:21:21: 21:32 + _2 = const Dst::Foo(0_u8); // scope 1 at $DIR/simplify-arm-identity.rs:21:21: 21:32 // ty::Const // + ty: Dst // + val: Value(Scalar(0x00)) diff --git a/src/test/mir-opt/simplify-arm/rustc.id.SimplifyArmIdentity.diff b/src/test/mir-opt/simplify-arm/rustc.id.SimplifyArmIdentity.diff index 8bb28206964f1..daae94e87f044 100644 --- a/src/test/mir-opt/simplify-arm/rustc.id.SimplifyArmIdentity.diff +++ b/src/test/mir-opt/simplify-arm/rustc.id.SimplifyArmIdentity.diff @@ -13,7 +13,7 @@ bb0: { _2 = discriminant(_1); // scope 0 at $DIR/simplify-arm.rs:11:9: 11:16 - switchInt(move _2) -> [0isize: bb1, 1isize: bb3, otherwise: bb2]; // scope 0 at $DIR/simplify-arm.rs:11:9: 11:16 + switchInt(move _2) -> [0_isize: bb1, 1_isize: bb3, otherwise: bb2]; // scope 0 at $DIR/simplify-arm.rs:11:9: 11:16 } bb1: { diff --git a/src/test/mir-opt/simplify-arm/rustc.id.SimplifyBranchSame.diff b/src/test/mir-opt/simplify-arm/rustc.id.SimplifyBranchSame.diff index 1226b4feaf41f..15bd5e7c9f0b0 100644 --- a/src/test/mir-opt/simplify-arm/rustc.id.SimplifyBranchSame.diff +++ b/src/test/mir-opt/simplify-arm/rustc.id.SimplifyBranchSame.diff @@ -13,7 +13,7 @@ bb0: { _2 = discriminant(_1); // scope 0 at $DIR/simplify-arm.rs:11:9: 11:16 - switchInt(move _2) -> [0isize: bb1, 1isize: bb3, otherwise: bb2]; // scope 0 at $DIR/simplify-arm.rs:11:9: 11:16 + switchInt(move _2) -> [0_isize: bb1, 1_isize: bb3, otherwise: bb2]; // scope 0 at $DIR/simplify-arm.rs:11:9: 11:16 } bb1: { diff --git a/src/test/mir-opt/simplify-arm/rustc.id_result.SimplifyArmIdentity.diff b/src/test/mir-opt/simplify-arm/rustc.id_result.SimplifyArmIdentity.diff index 5a5d67b36d9a5..37273d1d6517b 100644 --- a/src/test/mir-opt/simplify-arm/rustc.id_result.SimplifyArmIdentity.diff +++ b/src/test/mir-opt/simplify-arm/rustc.id_result.SimplifyArmIdentity.diff @@ -18,7 +18,7 @@ bb0: { _2 = discriminant(_1); // scope 0 at $DIR/simplify-arm.rs:18:9: 18:14 - switchInt(move _2) -> [0isize: bb3, 1isize: bb1, otherwise: bb2]; // scope 0 at $DIR/simplify-arm.rs:18:9: 18:14 + switchInt(move _2) -> [0_isize: bb3, 1_isize: bb1, otherwise: bb2]; // scope 0 at $DIR/simplify-arm.rs:18:9: 18:14 } bb1: { diff --git a/src/test/mir-opt/simplify-arm/rustc.id_result.SimplifyBranchSame.diff b/src/test/mir-opt/simplify-arm/rustc.id_result.SimplifyBranchSame.diff index e82865162615e..f138d637435f8 100644 --- a/src/test/mir-opt/simplify-arm/rustc.id_result.SimplifyBranchSame.diff +++ b/src/test/mir-opt/simplify-arm/rustc.id_result.SimplifyBranchSame.diff @@ -18,7 +18,7 @@ bb0: { _2 = discriminant(_1); // scope 0 at $DIR/simplify-arm.rs:18:9: 18:14 - switchInt(move _2) -> [0isize: bb3, 1isize: bb1, otherwise: bb2]; // scope 0 at $DIR/simplify-arm.rs:18:9: 18:14 + switchInt(move _2) -> [0_isize: bb3, 1_isize: bb1, otherwise: bb2]; // scope 0 at $DIR/simplify-arm.rs:18:9: 18:14 } bb1: { diff --git a/src/test/mir-opt/simplify-arm/rustc.id_try.SimplifyArmIdentity.diff b/src/test/mir-opt/simplify-arm/rustc.id_try.SimplifyArmIdentity.diff index 44f475346e016..b46ca21fb90b3 100644 --- a/src/test/mir-opt/simplify-arm/rustc.id_try.SimplifyArmIdentity.diff +++ b/src/test/mir-opt/simplify-arm/rustc.id_try.SimplifyArmIdentity.diff @@ -45,7 +45,7 @@ bb1: { StorageDead(_4); // scope 0 at $DIR/simplify-arm.rs:24:14: 24:15 _5 = discriminant(_3); // scope 0 at $DIR/simplify-arm.rs:24:14: 24:15 - switchInt(move _5) -> [0isize: bb2, 1isize: bb4, otherwise: bb3]; // scope 0 at $DIR/simplify-arm.rs:24:14: 24:15 + switchInt(move _5) -> [0_isize: bb2, 1_isize: bb4, otherwise: bb3]; // scope 0 at $DIR/simplify-arm.rs:24:14: 24:15 } bb2: { diff --git a/src/test/mir-opt/simplify-arm/rustc.id_try.SimplifyBranchSame.diff b/src/test/mir-opt/simplify-arm/rustc.id_try.SimplifyBranchSame.diff index c91c55dfb04c4..93412d1a74f8a 100644 --- a/src/test/mir-opt/simplify-arm/rustc.id_try.SimplifyBranchSame.diff +++ b/src/test/mir-opt/simplify-arm/rustc.id_try.SimplifyBranchSame.diff @@ -45,7 +45,7 @@ bb1: { StorageDead(_4); // scope 0 at $DIR/simplify-arm.rs:24:14: 24:15 _5 = discriminant(_3); // scope 0 at $DIR/simplify-arm.rs:24:14: 24:15 - switchInt(move _5) -> [0isize: bb2, 1isize: bb4, otherwise: bb3]; // scope 0 at $DIR/simplify-arm.rs:24:14: 24:15 + switchInt(move _5) -> [0_isize: bb2, 1_isize: bb4, otherwise: bb3]; // scope 0 at $DIR/simplify-arm.rs:24:14: 24:15 } bb2: { diff --git a/src/test/mir-opt/simplify-locals-fixedpoint/rustc.foo.SimplifyLocals.diff b/src/test/mir-opt/simplify-locals-fixedpoint/rustc.foo.SimplifyLocals.diff index f7db14e716526..720296a2c66b0 100644 --- a/src/test/mir-opt/simplify-locals-fixedpoint/rustc.foo.SimplifyLocals.diff +++ b/src/test/mir-opt/simplify-locals-fixedpoint/rustc.foo.SimplifyLocals.diff @@ -26,7 +26,7 @@ StorageDead(_3); // scope 0 at $DIR/simplify-locals-fixedpoint.rs:4:68: 4:69 StorageDead(_2); // scope 0 at $DIR/simplify-locals-fixedpoint.rs:4:68: 4:69 _5 = discriminant((_1.0: std::option::Option)); // scope 0 at $DIR/simplify-locals-fixedpoint.rs:4:13: 4:20 - switchInt(move _5) -> [1isize: bb2, otherwise: bb1]; // scope 0 at $DIR/simplify-locals-fixedpoint.rs:4:13: 4:20 + switchInt(move _5) -> [1_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/simplify-locals-fixedpoint.rs:4:13: 4:20 } bb1: { @@ -42,7 +42,7 @@ bb2: { _4 = discriminant((_1.1: std::option::Option)); // scope 0 at $DIR/simplify-locals-fixedpoint.rs:4:22: 4:26 - switchInt(move _4) -> [0isize: bb3, otherwise: bb1]; // scope 0 at $DIR/simplify-locals-fixedpoint.rs:4:22: 4:26 + switchInt(move _4) -> [0_isize: bb3, otherwise: bb1]; // scope 0 at $DIR/simplify-locals-fixedpoint.rs:4:22: 4:26 } bb3: { @@ -51,7 +51,7 @@ StorageLive(_7); // scope 1 at $DIR/simplify-locals-fixedpoint.rs:5:12: 5:20 StorageLive(_8); // scope 1 at $DIR/simplify-locals-fixedpoint.rs:5:12: 5:13 _8 = _6; // scope 1 at $DIR/simplify-locals-fixedpoint.rs:5:12: 5:13 - _7 = Gt(move _8, const 42u8); // scope 1 at $DIR/simplify-locals-fixedpoint.rs:5:12: 5:20 + _7 = Gt(move _8, const 42_u8); // scope 1 at $DIR/simplify-locals-fixedpoint.rs:5:12: 5:20 // ty::Const // + ty: u8 // + val: Value(Scalar(0x2a)) diff --git a/src/test/mir-opt/simplify-locals-removes-unused-consts/rustc.main.SimplifyLocals.diff b/src/test/mir-opt/simplify-locals-removes-unused-consts/rustc.main.SimplifyLocals.diff index 0bd4ba97b3ca0..db06b0392df6c 100644 --- a/src/test/mir-opt/simplify-locals-removes-unused-consts/rustc.main.SimplifyLocals.diff +++ b/src/test/mir-opt/simplify-locals-removes-unused-consts/rustc.main.SimplifyLocals.diff @@ -98,24 +98,24 @@ - StorageLive(_9); // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:12: 16:34 - StorageLive(_10); // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:12: 16:30 - StorageLive(_11); // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:12: 16:28 -- _11 = const Temp { x: 40u8 }; // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:12: 16:28 +- _11 = const Temp { x: 40_u8 }; // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:12: 16:28 + StorageDead(_1); // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:14:22: 14:23 + StorageLive(_2); // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:5: 16:35 -+ _2 = const use_u8(const 42u8) -> bb2; // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:5: 16:35 ++ _2 = const use_u8(const 42_u8) -> bb2; // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:5: 16:35 // ty::Const - // + ty: Temp - // + val: Value(Scalar(0x28)) - // mir::Constant - // + span: $DIR/simplify-locals-removes-unused-consts.rs:16:12: 16:28 - // + literal: Const { ty: Temp, val: Value(Scalar(0x28)) } -- _10 = const 40u8; // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:12: 16:30 +- _10 = const 40_u8; // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:12: 16:30 - // ty::Const - // + ty: u8 - // + val: Value(Scalar(0x28)) - // mir::Constant - // + span: $DIR/simplify-locals-removes-unused-consts.rs:16:12: 16:30 - // + literal: Const { ty: u8, val: Value(Scalar(0x28)) } -- _9 = const 42u8; // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:12: 16:34 +- _9 = const 42_u8; // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:12: 16:34 - // ty::Const - // + ty: u8 - // + val: Value(Scalar(0x2a)) @@ -123,7 +123,7 @@ - // + span: $DIR/simplify-locals-removes-unused-consts.rs:16:12: 16:34 - // + literal: Const { ty: u8, val: Value(Scalar(0x2a)) } - StorageDead(_10); // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:33: 16:34 -- _8 = const use_u8(const 42u8) -> bb2; // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:5: 16:35 +- _8 = const use_u8(const 42_u8) -> bb2; // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:5: 16:35 - // ty::Const // + ty: fn(u8) {use_u8} // + val: Value(Scalar()) diff --git a/src/test/mir-opt/simplify-locals-removes-unused-discriminant-reads/32bit/rustc.map.SimplifyLocals.diff b/src/test/mir-opt/simplify-locals-removes-unused-discriminant-reads/32bit/rustc.map.SimplifyLocals.diff index 2f78671763d51..f0b696118e996 100644 --- a/src/test/mir-opt/simplify-locals-removes-unused-discriminant-reads/32bit/rustc.map.SimplifyLocals.diff +++ b/src/test/mir-opt/simplify-locals-removes-unused-discriminant-reads/32bit/rustc.map.SimplifyLocals.diff @@ -15,7 +15,7 @@ bb0: { _2 = discriminant(_1); // scope 0 at $DIR/simplify-locals-removes-unused-discriminant-reads.rs:3:9: 3:13 - switchInt(move _2) -> [0isize: bb2, otherwise: bb1]; // scope 0 at $DIR/simplify-locals-removes-unused-discriminant-reads.rs:3:9: 3:13 + switchInt(move _2) -> [0_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/simplify-locals-removes-unused-discriminant-reads.rs:3:9: 3:13 } bb1: { diff --git a/src/test/mir-opt/simplify-locals-removes-unused-discriminant-reads/64bit/rustc.map.SimplifyLocals.diff b/src/test/mir-opt/simplify-locals-removes-unused-discriminant-reads/64bit/rustc.map.SimplifyLocals.diff index a97fa98a7b09e..1ac6eb85441f5 100644 --- a/src/test/mir-opt/simplify-locals-removes-unused-discriminant-reads/64bit/rustc.map.SimplifyLocals.diff +++ b/src/test/mir-opt/simplify-locals-removes-unused-discriminant-reads/64bit/rustc.map.SimplifyLocals.diff @@ -15,7 +15,7 @@ bb0: { _2 = discriminant(_1); // scope 0 at $DIR/simplify-locals-removes-unused-discriminant-reads.rs:3:9: 3:13 - switchInt(move _2) -> [0isize: bb2, otherwise: bb1]; // scope 0 at $DIR/simplify-locals-removes-unused-discriminant-reads.rs:3:9: 3:13 + switchInt(move _2) -> [0_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/simplify-locals-removes-unused-discriminant-reads.rs:3:9: 3:13 } bb1: { diff --git a/src/test/mir-opt/simplify_try/rustc.try_identity.SimplifyArmIdentity.diff b/src/test/mir-opt/simplify_try/rustc.try_identity.SimplifyArmIdentity.diff index 97050122ca96e..7f8366309c089 100644 --- a/src/test/mir-opt/simplify_try/rustc.try_identity.SimplifyArmIdentity.diff +++ b/src/test/mir-opt/simplify_try/rustc.try_identity.SimplifyArmIdentity.diff @@ -46,7 +46,7 @@ _3 = move _4; // scope 6 at $SRC_DIR/libcore/result.rs:LL:COL StorageDead(_4); // scope 0 at $DIR/simplify_try.rs:6:14: 6:15 _5 = discriminant(_3); // scope 0 at $DIR/simplify_try.rs:6:14: 6:15 - switchInt(move _5) -> [0isize: bb1, otherwise: bb2]; // scope 0 at $DIR/simplify_try.rs:6:14: 6:15 + switchInt(move _5) -> [0_isize: bb1, otherwise: bb2]; // scope 0 at $DIR/simplify_try.rs:6:14: 6:15 } bb1: { diff --git a/src/test/mir-opt/simplify_try_if_let/rustc.{{impl}}-append.SimplifyArmIdentity.diff b/src/test/mir-opt/simplify_try_if_let/rustc.{{impl}}-append.SimplifyArmIdentity.diff index 7d3537d094347..aa416049f6613 100644 --- a/src/test/mir-opt/simplify_try_if_let/rustc.{{impl}}-append.SimplifyArmIdentity.diff +++ b/src/test/mir-opt/simplify_try_if_let/rustc.{{impl}}-append.SimplifyArmIdentity.diff @@ -26,7 +26,7 @@ bb0: { _3 = discriminant(((*_1).1: std::option::Option>)); // scope 0 at $DIR/simplify_try_if_let.rs:22:13: 22:17 - switchInt(move _3) -> [0isize: bb3, 1isize: bb1, otherwise: bb2]; // scope 0 at $DIR/simplify_try_if_let.rs:22:13: 22:17 + switchInt(move _3) -> [0_isize: bb3, 1_isize: bb1, otherwise: bb2]; // scope 0 at $DIR/simplify_try_if_let.rs:22:13: 22:17 } bb1: { @@ -62,7 +62,7 @@ bb4: { StorageDead(_6); // scope 1 at $DIR/simplify_try_if_let.rs:26:59: 26:60 _7 = discriminant(_5); // scope 1 at $DIR/simplify_try_if_let.rs:26:24: 26:40 - switchInt(move _7) -> [1isize: bb6, otherwise: bb5]; // scope 1 at $DIR/simplify_try_if_let.rs:26:24: 26:40 + switchInt(move _7) -> [1_isize: bb6, otherwise: bb5]; // scope 1 at $DIR/simplify_try_if_let.rs:26:24: 26:40 } bb5: { diff --git a/src/test/mir-opt/slice-drop-shim/32bit/rustc.ptr-drop_in_place.[std__string__String].AddMovesForPackedDrops.before.mir b/src/test/mir-opt/slice-drop-shim/32bit/rustc.ptr-drop_in_place.[std__string__String].AddMovesForPackedDrops.before.mir index e79dcba13b00b..4a13ddb33b5de 100644 --- a/src/test/mir-opt/slice-drop-shim/32bit/rustc.ptr-drop_in_place.[std__string__String].AddMovesForPackedDrops.before.mir +++ b/src/test/mir-opt/slice-drop-shim/32bit/rustc.ptr-drop_in_place.[std__string__String].AddMovesForPackedDrops.before.mir @@ -31,7 +31,7 @@ fn std::intrinsics::drop_in_place(_1: *mut [std::string::String]) -> () { bb3 (cleanup): { _5 = &raw mut (*_1)[_4]; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL - _4 = Add(move _4, const 1usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL + _4 = Add(move _4, const 1_usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL // ty::Const // + ty: usize // + val: Value(Scalar(0x00000001)) @@ -48,7 +48,7 @@ fn std::intrinsics::drop_in_place(_1: *mut [std::string::String]) -> () { bb5: { _7 = &raw mut (*_1)[_4]; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL - _4 = Add(move _4, const 1usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL + _4 = Add(move _4, const 1_usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL // ty::Const // + ty: usize // + val: Value(Scalar(0x00000001)) @@ -64,7 +64,7 @@ fn std::intrinsics::drop_in_place(_1: *mut [std::string::String]) -> () { } bb7: { - _4 = const 0usize; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL + _4 = const 0_usize; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL // ty::Const // + ty: usize // + val: Value(Scalar(0x00000000)) @@ -80,7 +80,7 @@ fn std::intrinsics::drop_in_place(_1: *mut [std::string::String]) -> () { bb9 (cleanup): { _11 = _9; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL - _9 = Offset(move _9, const 1usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL + _9 = Offset(move _9, const 1_usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL // ty::Const // + ty: usize // + val: Value(Scalar(0x00000001)) @@ -97,7 +97,7 @@ fn std::intrinsics::drop_in_place(_1: *mut [std::string::String]) -> () { bb11: { _13 = _9; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL - _9 = Offset(move _9, const 1usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL + _9 = Offset(move _9, const 1_usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL // ty::Const // + ty: usize // + val: Value(Scalar(0x00000001)) @@ -126,6 +126,6 @@ fn std::intrinsics::drop_in_place(_1: *mut [std::string::String]) -> () { bb15: { _2 = SizeOf(std::string::String); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL _3 = Len((*_1)); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL - switchInt(move _2) -> [0usize: bb8, otherwise: bb14]; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL + switchInt(move _2) -> [0_usize: bb8, otherwise: bb14]; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL } } diff --git a/src/test/mir-opt/slice-drop-shim/64bit/rustc.ptr-drop_in_place.[std__string__String].AddMovesForPackedDrops.before.mir b/src/test/mir-opt/slice-drop-shim/64bit/rustc.ptr-drop_in_place.[std__string__String].AddMovesForPackedDrops.before.mir index 604a0228f63cf..9968c57c23786 100644 --- a/src/test/mir-opt/slice-drop-shim/64bit/rustc.ptr-drop_in_place.[std__string__String].AddMovesForPackedDrops.before.mir +++ b/src/test/mir-opt/slice-drop-shim/64bit/rustc.ptr-drop_in_place.[std__string__String].AddMovesForPackedDrops.before.mir @@ -31,7 +31,7 @@ fn std::intrinsics::drop_in_place(_1: *mut [std::string::String]) -> () { bb3 (cleanup): { _5 = &raw mut (*_1)[_4]; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL - _4 = Add(move _4, const 1usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL + _4 = Add(move _4, const 1_usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000001)) @@ -48,7 +48,7 @@ fn std::intrinsics::drop_in_place(_1: *mut [std::string::String]) -> () { bb5: { _7 = &raw mut (*_1)[_4]; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL - _4 = Add(move _4, const 1usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL + _4 = Add(move _4, const 1_usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000001)) @@ -64,7 +64,7 @@ fn std::intrinsics::drop_in_place(_1: *mut [std::string::String]) -> () { } bb7: { - _4 = const 0usize; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL + _4 = const 0_usize; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000000)) @@ -80,7 +80,7 @@ fn std::intrinsics::drop_in_place(_1: *mut [std::string::String]) -> () { bb9 (cleanup): { _11 = _9; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL - _9 = Offset(move _9, const 1usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL + _9 = Offset(move _9, const 1_usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000001)) @@ -97,7 +97,7 @@ fn std::intrinsics::drop_in_place(_1: *mut [std::string::String]) -> () { bb11: { _13 = _9; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL - _9 = Offset(move _9, const 1usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL + _9 = Offset(move _9, const 1_usize); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL // ty::Const // + ty: usize // + val: Value(Scalar(0x0000000000000001)) @@ -126,6 +126,6 @@ fn std::intrinsics::drop_in_place(_1: *mut [std::string::String]) -> () { bb15: { _2 = SizeOf(std::string::String); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL _3 = Len((*_1)); // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL - switchInt(move _2) -> [0usize: bb8, otherwise: bb14]; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL + switchInt(move _2) -> [0_usize: bb8, otherwise: bb14]; // scope 0 at $SRC_DIR/libcore/ptr/mod.rs:LL:COL } } diff --git a/src/test/mir-opt/storage_live_dead_in_statics/rustc.XXX.mir_map.0.mir b/src/test/mir-opt/storage_live_dead_in_statics/rustc.XXX.mir_map.0.mir index 62b7535f2b575..d7f73a22c26fd 100644 --- a/src/test/mir-opt/storage_live_dead_in_statics/rustc.XXX.mir_map.0.mir +++ b/src/test/mir-opt/storage_live_dead_in_statics/rustc.XXX.mir_map.0.mir @@ -59,7 +59,7 @@ static XXX: &Foo = { StorageLive(_5); // scope 0 at $DIR/storage_live_dead_in_statics.rs:7:11: 22:6 StorageLive(_6); // scope 0 at $DIR/storage_live_dead_in_statics.rs:7:12: 22:6 StorageLive(_7); // scope 0 at $DIR/storage_live_dead_in_statics.rs:8:9: 8:15 - _7 = (const 0u32, const 1u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:8:9: 8:15 + _7 = (const 0_u32, const 1_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:8:9: 8:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -73,7 +73,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:8:13: 8:14 // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } StorageLive(_8); // scope 0 at $DIR/storage_live_dead_in_statics.rs:8:17: 8:23 - _8 = (const 0u32, const 2u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:8:17: 8:23 + _8 = (const 0_u32, const 2_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:8:17: 8:23 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -87,7 +87,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:8:21: 8:22 // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } StorageLive(_9); // scope 0 at $DIR/storage_live_dead_in_statics.rs:8:25: 8:31 - _9 = (const 0u32, const 3u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:8:25: 8:31 + _9 = (const 0_u32, const 3_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:8:25: 8:31 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -101,7 +101,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:8:29: 8:30 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_10); // scope 0 at $DIR/storage_live_dead_in_statics.rs:9:9: 9:15 - _10 = (const 0u32, const 1u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:9:9: 9:15 + _10 = (const 0_u32, const 1_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:9:9: 9:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -115,7 +115,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:9:13: 9:14 // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } StorageLive(_11); // scope 0 at $DIR/storage_live_dead_in_statics.rs:9:17: 9:23 - _11 = (const 0u32, const 2u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:9:17: 9:23 + _11 = (const 0_u32, const 2_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:9:17: 9:23 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -129,7 +129,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:9:21: 9:22 // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } StorageLive(_12); // scope 0 at $DIR/storage_live_dead_in_statics.rs:9:25: 9:31 - _12 = (const 0u32, const 3u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:9:25: 9:31 + _12 = (const 0_u32, const 3_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:9:25: 9:31 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -143,7 +143,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:9:29: 9:30 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_13); // scope 0 at $DIR/storage_live_dead_in_statics.rs:10:9: 10:15 - _13 = (const 0u32, const 1u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:10:9: 10:15 + _13 = (const 0_u32, const 1_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:10:9: 10:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -157,7 +157,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:10:13: 10:14 // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } StorageLive(_14); // scope 0 at $DIR/storage_live_dead_in_statics.rs:10:17: 10:23 - _14 = (const 0u32, const 2u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:10:17: 10:23 + _14 = (const 0_u32, const 2_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:10:17: 10:23 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -171,7 +171,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:10:21: 10:22 // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } StorageLive(_15); // scope 0 at $DIR/storage_live_dead_in_statics.rs:10:25: 10:31 - _15 = (const 0u32, const 3u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:10:25: 10:31 + _15 = (const 0_u32, const 3_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:10:25: 10:31 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -185,7 +185,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:10:29: 10:30 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_16); // scope 0 at $DIR/storage_live_dead_in_statics.rs:11:9: 11:15 - _16 = (const 0u32, const 1u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:11:9: 11:15 + _16 = (const 0_u32, const 1_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:11:9: 11:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -199,7 +199,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:11:13: 11:14 // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } StorageLive(_17); // scope 0 at $DIR/storage_live_dead_in_statics.rs:11:17: 11:23 - _17 = (const 0u32, const 2u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:11:17: 11:23 + _17 = (const 0_u32, const 2_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:11:17: 11:23 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -213,7 +213,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:11:21: 11:22 // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } StorageLive(_18); // scope 0 at $DIR/storage_live_dead_in_statics.rs:11:25: 11:31 - _18 = (const 0u32, const 3u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:11:25: 11:31 + _18 = (const 0_u32, const 3_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:11:25: 11:31 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -227,7 +227,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:11:29: 11:30 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_19); // scope 0 at $DIR/storage_live_dead_in_statics.rs:12:9: 12:15 - _19 = (const 0u32, const 1u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:12:9: 12:15 + _19 = (const 0_u32, const 1_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:12:9: 12:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -241,7 +241,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:12:13: 12:14 // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } StorageLive(_20); // scope 0 at $DIR/storage_live_dead_in_statics.rs:12:17: 12:23 - _20 = (const 0u32, const 2u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:12:17: 12:23 + _20 = (const 0_u32, const 2_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:12:17: 12:23 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -255,7 +255,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:12:21: 12:22 // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } StorageLive(_21); // scope 0 at $DIR/storage_live_dead_in_statics.rs:12:25: 12:31 - _21 = (const 0u32, const 3u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:12:25: 12:31 + _21 = (const 0_u32, const 3_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:12:25: 12:31 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -269,7 +269,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:12:29: 12:30 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_22); // scope 0 at $DIR/storage_live_dead_in_statics.rs:13:9: 13:15 - _22 = (const 0u32, const 1u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:13:9: 13:15 + _22 = (const 0_u32, const 1_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:13:9: 13:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -283,7 +283,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:13:13: 13:14 // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } StorageLive(_23); // scope 0 at $DIR/storage_live_dead_in_statics.rs:13:17: 13:23 - _23 = (const 0u32, const 2u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:13:17: 13:23 + _23 = (const 0_u32, const 2_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:13:17: 13:23 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -297,7 +297,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:13:21: 13:22 // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } StorageLive(_24); // scope 0 at $DIR/storage_live_dead_in_statics.rs:13:25: 13:31 - _24 = (const 0u32, const 3u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:13:25: 13:31 + _24 = (const 0_u32, const 3_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:13:25: 13:31 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -311,7 +311,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:13:29: 13:30 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_25); // scope 0 at $DIR/storage_live_dead_in_statics.rs:14:9: 14:15 - _25 = (const 0u32, const 1u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:14:9: 14:15 + _25 = (const 0_u32, const 1_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:14:9: 14:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -325,7 +325,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:14:13: 14:14 // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } StorageLive(_26); // scope 0 at $DIR/storage_live_dead_in_statics.rs:14:17: 14:23 - _26 = (const 0u32, const 2u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:14:17: 14:23 + _26 = (const 0_u32, const 2_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:14:17: 14:23 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -339,7 +339,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:14:21: 14:22 // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } StorageLive(_27); // scope 0 at $DIR/storage_live_dead_in_statics.rs:14:25: 14:31 - _27 = (const 0u32, const 3u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:14:25: 14:31 + _27 = (const 0_u32, const 3_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:14:25: 14:31 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -353,7 +353,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:14:29: 14:30 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_28); // scope 0 at $DIR/storage_live_dead_in_statics.rs:15:9: 15:15 - _28 = (const 0u32, const 1u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:15:9: 15:15 + _28 = (const 0_u32, const 1_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:15:9: 15:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -367,7 +367,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:15:13: 15:14 // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } StorageLive(_29); // scope 0 at $DIR/storage_live_dead_in_statics.rs:15:17: 15:23 - _29 = (const 0u32, const 2u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:15:17: 15:23 + _29 = (const 0_u32, const 2_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:15:17: 15:23 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -381,7 +381,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:15:21: 15:22 // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } StorageLive(_30); // scope 0 at $DIR/storage_live_dead_in_statics.rs:15:25: 15:31 - _30 = (const 0u32, const 3u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:15:25: 15:31 + _30 = (const 0_u32, const 3_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:15:25: 15:31 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -395,7 +395,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:15:29: 15:30 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_31); // scope 0 at $DIR/storage_live_dead_in_statics.rs:16:9: 16:15 - _31 = (const 0u32, const 1u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:16:9: 16:15 + _31 = (const 0_u32, const 1_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:16:9: 16:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -409,7 +409,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:16:13: 16:14 // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } StorageLive(_32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:16:17: 16:23 - _32 = (const 0u32, const 2u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:16:17: 16:23 + _32 = (const 0_u32, const 2_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:16:17: 16:23 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -423,7 +423,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:16:21: 16:22 // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } StorageLive(_33); // scope 0 at $DIR/storage_live_dead_in_statics.rs:16:25: 16:31 - _33 = (const 0u32, const 3u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:16:25: 16:31 + _33 = (const 0_u32, const 3_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:16:25: 16:31 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -437,7 +437,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:16:29: 16:30 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_34); // scope 0 at $DIR/storage_live_dead_in_statics.rs:17:9: 17:15 - _34 = (const 0u32, const 1u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:17:9: 17:15 + _34 = (const 0_u32, const 1_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:17:9: 17:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -451,7 +451,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:17:13: 17:14 // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } StorageLive(_35); // scope 0 at $DIR/storage_live_dead_in_statics.rs:17:17: 17:23 - _35 = (const 0u32, const 2u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:17:17: 17:23 + _35 = (const 0_u32, const 2_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:17:17: 17:23 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -465,7 +465,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:17:21: 17:22 // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } StorageLive(_36); // scope 0 at $DIR/storage_live_dead_in_statics.rs:17:25: 17:31 - _36 = (const 0u32, const 3u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:17:25: 17:31 + _36 = (const 0_u32, const 3_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:17:25: 17:31 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -479,7 +479,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:17:29: 17:30 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_37); // scope 0 at $DIR/storage_live_dead_in_statics.rs:18:9: 18:15 - _37 = (const 0u32, const 1u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:18:9: 18:15 + _37 = (const 0_u32, const 1_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:18:9: 18:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -493,7 +493,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:18:13: 18:14 // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } StorageLive(_38); // scope 0 at $DIR/storage_live_dead_in_statics.rs:18:17: 18:23 - _38 = (const 0u32, const 2u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:18:17: 18:23 + _38 = (const 0_u32, const 2_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:18:17: 18:23 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -507,7 +507,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:18:21: 18:22 // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } StorageLive(_39); // scope 0 at $DIR/storage_live_dead_in_statics.rs:18:25: 18:31 - _39 = (const 0u32, const 3u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:18:25: 18:31 + _39 = (const 0_u32, const 3_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:18:25: 18:31 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -521,7 +521,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:18:29: 18:30 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_40); // scope 0 at $DIR/storage_live_dead_in_statics.rs:19:9: 19:15 - _40 = (const 0u32, const 1u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:19:9: 19:15 + _40 = (const 0_u32, const 1_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:19:9: 19:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -535,7 +535,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:19:13: 19:14 // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } StorageLive(_41); // scope 0 at $DIR/storage_live_dead_in_statics.rs:19:17: 19:23 - _41 = (const 0u32, const 2u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:19:17: 19:23 + _41 = (const 0_u32, const 2_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:19:17: 19:23 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -549,7 +549,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:19:21: 19:22 // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } StorageLive(_42); // scope 0 at $DIR/storage_live_dead_in_statics.rs:19:25: 19:31 - _42 = (const 0u32, const 3u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:19:25: 19:31 + _42 = (const 0_u32, const 3_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:19:25: 19:31 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -563,7 +563,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:19:29: 19:30 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_43); // scope 0 at $DIR/storage_live_dead_in_statics.rs:20:9: 20:15 - _43 = (const 0u32, const 1u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:20:9: 20:15 + _43 = (const 0_u32, const 1_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:20:9: 20:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -577,7 +577,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:20:13: 20:14 // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } StorageLive(_44); // scope 0 at $DIR/storage_live_dead_in_statics.rs:20:17: 20:23 - _44 = (const 0u32, const 2u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:20:17: 20:23 + _44 = (const 0_u32, const 2_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:20:17: 20:23 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -591,7 +591,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:20:21: 20:22 // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } StorageLive(_45); // scope 0 at $DIR/storage_live_dead_in_statics.rs:20:25: 20:31 - _45 = (const 0u32, const 3u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:20:25: 20:31 + _45 = (const 0_u32, const 3_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:20:25: 20:31 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -605,7 +605,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:20:29: 20:30 // + literal: Const { ty: u32, val: Value(Scalar(0x00000003)) } StorageLive(_46); // scope 0 at $DIR/storage_live_dead_in_statics.rs:21:9: 21:15 - _46 = (const 0u32, const 1u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:21:9: 21:15 + _46 = (const 0_u32, const 1_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:21:9: 21:15 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -619,7 +619,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:21:13: 21:14 // + literal: Const { ty: u32, val: Value(Scalar(0x00000001)) } StorageLive(_47); // scope 0 at $DIR/storage_live_dead_in_statics.rs:21:17: 21:23 - _47 = (const 0u32, const 2u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:21:17: 21:23 + _47 = (const 0_u32, const 2_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:21:17: 21:23 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) @@ -633,7 +633,7 @@ static XXX: &Foo = { // + span: $DIR/storage_live_dead_in_statics.rs:21:21: 21:22 // + literal: Const { ty: u32, val: Value(Scalar(0x00000002)) } StorageLive(_48); // scope 0 at $DIR/storage_live_dead_in_statics.rs:21:25: 21:31 - _48 = (const 0u32, const 3u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:21:25: 21:31 + _48 = (const 0_u32, const 3_u32); // scope 0 at $DIR/storage_live_dead_in_statics.rs:21:25: 21:31 // ty::Const // + ty: u32 // + val: Value(Scalar(0x00000000)) diff --git a/src/test/mir-opt/storage_ranges/rustc.main.nll.0.mir b/src/test/mir-opt/storage_ranges/rustc.main.nll.0.mir index 7799f20d974bc..099535c0ad279 100644 --- a/src/test/mir-opt/storage_ranges/rustc.main.nll.0.mir +++ b/src/test/mir-opt/storage_ranges/rustc.main.nll.0.mir @@ -38,7 +38,7 @@ fn main() -> () { bb0: { StorageLive(_1); // scope 0 at $DIR/storage_ranges.rs:4:9: 4:10 - _1 = const 0i32; // scope 0 at $DIR/storage_ranges.rs:4:13: 4:14 + _1 = const 0_i32; // scope 0 at $DIR/storage_ranges.rs:4:13: 4:14 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000000)) @@ -66,7 +66,7 @@ fn main() -> () { StorageDead(_3); // scope 1 at $DIR/storage_ranges.rs:7:5: 7:6 StorageDead(_2); // scope 1 at $DIR/storage_ranges.rs:7:5: 7:6 StorageLive(_6); // scope 1 at $DIR/storage_ranges.rs:8:9: 8:10 - _6 = const 1i32; // scope 1 at $DIR/storage_ranges.rs:8:13: 8:14 + _6 = const 1_i32; // scope 1 at $DIR/storage_ranges.rs:8:13: 8:14 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) diff --git a/src/test/mir-opt/tls-access/rustc.main.SimplifyCfg-final.after.mir b/src/test/mir-opt/tls-access/rustc.main.SimplifyCfg-final.after.mir index e4798c2e32407..5ceca2d091e30 100644 --- a/src/test/mir-opt/tls-access/rustc.main.SimplifyCfg-final.after.mir +++ b/src/test/mir-opt/tls-access/rustc.main.SimplifyCfg-final.after.mir @@ -18,7 +18,7 @@ fn main() -> () { _1 = &(*_2); // scope 1 at $DIR/tls-access.rs:8:17: 8:21 StorageLive(_3); // scope 2 at $DIR/tls-access.rs:9:9: 9:12 _3 = &/*tls*/ mut FOO; // scope 2 at $DIR/tls-access.rs:9:9: 9:12 - (*_3) = const 42u8; // scope 2 at $DIR/tls-access.rs:9:9: 9:17 + (*_3) = const 42_u8; // scope 2 at $DIR/tls-access.rs:9:9: 9:17 // ty::Const // + ty: u8 // + val: Value(Scalar(0x2a)) diff --git a/src/test/mir-opt/uniform_array_move_out/rustc.move_out_by_subslice.mir_map.0.mir b/src/test/mir-opt/uniform_array_move_out/rustc.move_out_by_subslice.mir_map.0.mir index de29cd61019f1..eb40baa2000f8 100644 --- a/src/test/mir-opt/uniform_array_move_out/rustc.move_out_by_subslice.mir_map.0.mir +++ b/src/test/mir-opt/uniform_array_move_out/rustc.move_out_by_subslice.mir_map.0.mir @@ -20,7 +20,7 @@ fn move_out_by_subslice() -> () { StorageLive(_2); // scope 0 at $DIR/uniform_array_move_out.rs:11:14: 11:19 StorageLive(_3); // scope 0 at $DIR/uniform_array_move_out.rs:11:14: 11:19 _3 = Box(i32); // scope 0 at $DIR/uniform_array_move_out.rs:11:14: 11:19 - (*_3) = const 1i32; // scope 0 at $DIR/uniform_array_move_out.rs:11:18: 11:19 + (*_3) = const 1_i32; // scope 0 at $DIR/uniform_array_move_out.rs:11:18: 11:19 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) @@ -48,7 +48,7 @@ fn move_out_by_subslice() -> () { StorageLive(_4); // scope 0 at $DIR/uniform_array_move_out.rs:11:21: 11:26 StorageLive(_5); // scope 0 at $DIR/uniform_array_move_out.rs:11:21: 11:26 _5 = Box(i32); // scope 0 at $DIR/uniform_array_move_out.rs:11:21: 11:26 - (*_5) = const 2i32; // scope 0 at $DIR/uniform_array_move_out.rs:11:25: 11:26 + (*_5) = const 2_i32; // scope 0 at $DIR/uniform_array_move_out.rs:11:25: 11:26 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000002)) diff --git a/src/test/mir-opt/uniform_array_move_out/rustc.move_out_from_end.mir_map.0.mir b/src/test/mir-opt/uniform_array_move_out/rustc.move_out_from_end.mir_map.0.mir index aeab0e892ae8b..7beceb66577fe 100644 --- a/src/test/mir-opt/uniform_array_move_out/rustc.move_out_from_end.mir_map.0.mir +++ b/src/test/mir-opt/uniform_array_move_out/rustc.move_out_from_end.mir_map.0.mir @@ -20,7 +20,7 @@ fn move_out_from_end() -> () { StorageLive(_2); // scope 0 at $DIR/uniform_array_move_out.rs:5:14: 5:19 StorageLive(_3); // scope 0 at $DIR/uniform_array_move_out.rs:5:14: 5:19 _3 = Box(i32); // scope 0 at $DIR/uniform_array_move_out.rs:5:14: 5:19 - (*_3) = const 1i32; // scope 0 at $DIR/uniform_array_move_out.rs:5:18: 5:19 + (*_3) = const 1_i32; // scope 0 at $DIR/uniform_array_move_out.rs:5:18: 5:19 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000001)) @@ -48,7 +48,7 @@ fn move_out_from_end() -> () { StorageLive(_4); // scope 0 at $DIR/uniform_array_move_out.rs:5:21: 5:26 StorageLive(_5); // scope 0 at $DIR/uniform_array_move_out.rs:5:21: 5:26 _5 = Box(i32); // scope 0 at $DIR/uniform_array_move_out.rs:5:21: 5:26 - (*_5) = const 2i32; // scope 0 at $DIR/uniform_array_move_out.rs:5:25: 5:26 + (*_5) = const 2_i32; // scope 0 at $DIR/uniform_array_move_out.rs:5:25: 5:26 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000002)) diff --git a/src/test/mir-opt/uninhabited_enum_branching/rustc.main.SimplifyCfg-after-uninhabited-enum-branching.after.mir b/src/test/mir-opt/uninhabited_enum_branching/rustc.main.SimplifyCfg-after-uninhabited-enum-branching.after.mir index df6c90fc7fb37..4f4fb7defc379 100644 --- a/src/test/mir-opt/uninhabited_enum_branching/rustc.main.SimplifyCfg-after-uninhabited-enum-branching.after.mir +++ b/src/test/mir-opt/uninhabited_enum_branching/rustc.main.SimplifyCfg-after-uninhabited-enum-branching.after.mir @@ -33,7 +33,7 @@ fn main() -> () { StorageLive(_7); // scope 0 at $DIR/uninhabited_enum_branching.rs:26:11: 26:19 _7 = Test2::D; // scope 0 at $DIR/uninhabited_enum_branching.rs:26:11: 26:19 _8 = discriminant(_7); // scope 0 at $DIR/uninhabited_enum_branching.rs:27:9: 27:17 - switchInt(move _8) -> [4isize: bb2, otherwise: bb1]; // scope 0 at $DIR/uninhabited_enum_branching.rs:27:9: 27:17 + switchInt(move _8) -> [4_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/uninhabited_enum_branching.rs:27:9: 27:17 } bb1: { diff --git a/src/test/mir-opt/uninhabited_enum_branching/rustc.main.UninhabitedEnumBranching.diff b/src/test/mir-opt/uninhabited_enum_branching/rustc.main.UninhabitedEnumBranching.diff index fa1474aa049de..d262c9432ca83 100644 --- a/src/test/mir-opt/uninhabited_enum_branching/rustc.main.UninhabitedEnumBranching.diff +++ b/src/test/mir-opt/uninhabited_enum_branching/rustc.main.UninhabitedEnumBranching.diff @@ -18,7 +18,7 @@ StorageLive(_2); // scope 0 at $DIR/uninhabited_enum_branching.rs:20:11: 20:19 _2 = Test1::C; // scope 0 at $DIR/uninhabited_enum_branching.rs:20:11: 20:19 _3 = discriminant(_2); // scope 0 at $DIR/uninhabited_enum_branching.rs:21:9: 21:20 -- switchInt(move _3) -> [0isize: bb2, 1isize: bb3, otherwise: bb1]; // scope 0 at $DIR/uninhabited_enum_branching.rs:21:9: 21:20 +- switchInt(move _3) -> [0_isize: bb2, 1_isize: bb3, otherwise: bb1]; // scope 0 at $DIR/uninhabited_enum_branching.rs:21:9: 21:20 + switchInt(move _3) -> bb1; // scope 0 at $DIR/uninhabited_enum_branching.rs:21:9: 21:20 } @@ -68,7 +68,7 @@ StorageLive(_7); // scope 0 at $DIR/uninhabited_enum_branching.rs:26:11: 26:19 _7 = Test2::D; // scope 0 at $DIR/uninhabited_enum_branching.rs:26:11: 26:19 _8 = discriminant(_7); // scope 0 at $DIR/uninhabited_enum_branching.rs:27:9: 27:17 - switchInt(move _8) -> [4isize: bb6, otherwise: bb5]; // scope 0 at $DIR/uninhabited_enum_branching.rs:27:9: 27:17 + switchInt(move _8) -> [4_isize: bb6, otherwise: bb5]; // scope 0 at $DIR/uninhabited_enum_branching.rs:27:9: 27:17 } bb5: { diff --git a/src/test/mir-opt/unreachable/rustc.main.UnreachablePropagation.diff b/src/test/mir-opt/unreachable/rustc.main.UnreachablePropagation.diff index ccd9612caddd4..e7abf57880047 100644 --- a/src/test/mir-opt/unreachable/rustc.main.UnreachablePropagation.diff +++ b/src/test/mir-opt/unreachable/rustc.main.UnreachablePropagation.diff @@ -30,7 +30,7 @@ bb1: { _2 = discriminant(_1); // scope 0 at $DIR/unreachable.rs:9:12: 9:20 -- switchInt(move _2) -> [1isize: bb3, otherwise: bb2]; // scope 0 at $DIR/unreachable.rs:9:12: 9:20 +- switchInt(move _2) -> [1_isize: bb3, otherwise: bb2]; // scope 0 at $DIR/unreachable.rs:9:12: 9:20 + goto -> bb2; // scope 0 at $DIR/unreachable.rs:9:12: 9:20 } @@ -63,7 +63,7 @@ - } - - bb4: { -- _4 = const 42i32; // scope 2 at $DIR/unreachable.rs:15:13: 15:20 +- _4 = const 42_i32; // scope 2 at $DIR/unreachable.rs:15:13: 15:20 - // ty::Const - // + ty: i32 - // + val: Value(Scalar(0x0000002a)) @@ -81,7 +81,7 @@ - } - - bb5: { -- _4 = const 21i32; // scope 2 at $DIR/unreachable.rs:13:13: 13:20 +- _4 = const 21_i32; // scope 2 at $DIR/unreachable.rs:13:13: 13:20 - // ty::Const - // + ty: i32 - // + val: Value(Scalar(0x00000015)) diff --git a/src/test/mir-opt/unreachable_asm/rustc.main.UnreachablePropagation.diff b/src/test/mir-opt/unreachable_asm/rustc.main.UnreachablePropagation.diff index 449bea06207d9..50694900024a0 100644 --- a/src/test/mir-opt/unreachable_asm/rustc.main.UnreachablePropagation.diff +++ b/src/test/mir-opt/unreachable_asm/rustc.main.UnreachablePropagation.diff @@ -33,7 +33,7 @@ bb1: { _2 = discriminant(_1); // scope 0 at $DIR/unreachable_asm.rs:11:12: 11:20 - switchInt(move _2) -> [1isize: bb3, otherwise: bb2]; // scope 0 at $DIR/unreachable_asm.rs:11:12: 11:20 + switchInt(move _2) -> [1_isize: bb3, otherwise: bb2]; // scope 0 at $DIR/unreachable_asm.rs:11:12: 11:20 } bb2: { @@ -65,7 +65,7 @@ } bb4: { - _4 = const 42i32; // scope 2 at $DIR/unreachable_asm.rs:17:13: 17:20 + _4 = const 42_i32; // scope 2 at $DIR/unreachable_asm.rs:17:13: 17:20 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000002a)) @@ -83,7 +83,7 @@ } bb5: { - _4 = const 21i32; // scope 2 at $DIR/unreachable_asm.rs:15:13: 15:20 + _4 = const 21_i32; // scope 2 at $DIR/unreachable_asm.rs:15:13: 15:20 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000015)) diff --git a/src/test/mir-opt/unreachable_asm_2/rustc.main.UnreachablePropagation.diff b/src/test/mir-opt/unreachable_asm_2/rustc.main.UnreachablePropagation.diff index a152e1dbe892f..9be05aefcf69e 100644 --- a/src/test/mir-opt/unreachable_asm_2/rustc.main.UnreachablePropagation.diff +++ b/src/test/mir-opt/unreachable_asm_2/rustc.main.UnreachablePropagation.diff @@ -36,7 +36,7 @@ bb1: { _2 = discriminant(_1); // scope 0 at $DIR/unreachable_asm_2.rs:11:12: 11:20 - switchInt(move _2) -> [1isize: bb3, otherwise: bb2]; // scope 0 at $DIR/unreachable_asm_2.rs:11:12: 11:20 + switchInt(move _2) -> [1_isize: bb3, otherwise: bb2]; // scope 0 at $DIR/unreachable_asm_2.rs:11:12: 11:20 } bb2: { @@ -78,7 +78,7 @@ // + span: $DIR/unreachable_asm_2.rs:20:13: 20:41 // + literal: Const { ty: (), val: Value(Scalar()) } StorageDead(_8); // scope 2 at $DIR/unreachable_asm_2.rs:20:40: 20:41 - _4 = const 42i32; // scope 2 at $DIR/unreachable_asm_2.rs:21:13: 21:20 + _4 = const 42_i32; // scope 2 at $DIR/unreachable_asm_2.rs:21:13: 21:20 // ty::Const // + ty: i32 // + val: Value(Scalar(0x0000002a)) @@ -107,7 +107,7 @@ // + span: $DIR/unreachable_asm_2.rs:16:13: 16:41 // + literal: Const { ty: (), val: Value(Scalar()) } StorageDead(_7); // scope 2 at $DIR/unreachable_asm_2.rs:16:40: 16:41 - _4 = const 21i32; // scope 2 at $DIR/unreachable_asm_2.rs:17:13: 17:20 + _4 = const 21_i32; // scope 2 at $DIR/unreachable_asm_2.rs:17:13: 17:20 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000015)) diff --git a/src/test/mir-opt/unreachable_diverging/rustc.main.UnreachablePropagation.diff b/src/test/mir-opt/unreachable_diverging/rustc.main.UnreachablePropagation.diff index ff23baf0b4e9f..e7886f683c07e 100644 --- a/src/test/mir-opt/unreachable_diverging/rustc.main.UnreachablePropagation.diff +++ b/src/test/mir-opt/unreachable_diverging/rustc.main.UnreachablePropagation.diff @@ -38,7 +38,7 @@ bb1: { _3 = discriminant(_2); // scope 1 at $DIR/unreachable_diverging.rs:14:12: 14:22 - switchInt(move _3) -> [1isize: bb3, otherwise: bb2]; // scope 1 at $DIR/unreachable_diverging.rs:14:12: 14:22 + switchInt(move _3) -> [1_isize: bb3, otherwise: bb2]; // scope 1 at $DIR/unreachable_diverging.rs:14:12: 14:22 } bb2: { diff --git a/src/test/mir-opt/unusual-item-types/32bit/rustc.E-V-{{constant}}.mir_map.0.mir b/src/test/mir-opt/unusual-item-types/32bit/rustc.E-V-{{constant}}.mir_map.0.mir index c800ccb1ae51f..7f0266d658992 100644 --- a/src/test/mir-opt/unusual-item-types/32bit/rustc.E-V-{{constant}}.mir_map.0.mir +++ b/src/test/mir-opt/unusual-item-types/32bit/rustc.E-V-{{constant}}.mir_map.0.mir @@ -4,7 +4,7 @@ E::V::{{constant}}#0: isize = { let mut _0: isize; // return place in scope 0 at $DIR/unusual-item-types.rs:22:9: 22:10 bb0: { - _0 = const 5isize; // scope 0 at $DIR/unusual-item-types.rs:22:9: 22:10 + _0 = const 5_isize; // scope 0 at $DIR/unusual-item-types.rs:22:9: 22:10 // ty::Const // + ty: isize // + val: Value(Scalar(0x00000005)) diff --git a/src/test/mir-opt/unusual-item-types/32bit/rustc.{{impl}}-ASSOCIATED_CONSTANT.mir_map.0.mir b/src/test/mir-opt/unusual-item-types/32bit/rustc.{{impl}}-ASSOCIATED_CONSTANT.mir_map.0.mir index f4a5cc0b3279a..4af856c654eed 100644 --- a/src/test/mir-opt/unusual-item-types/32bit/rustc.{{impl}}-ASSOCIATED_CONSTANT.mir_map.0.mir +++ b/src/test/mir-opt/unusual-item-types/32bit/rustc.{{impl}}-ASSOCIATED_CONSTANT.mir_map.0.mir @@ -4,7 +4,7 @@ const ::ASSOCIATED_CONSTANT: i32 = let mut _0: i32; // return place in scope 0 at $DIR/unusual-item-types.rs:10:32: 10:35 bb0: { - _0 = const 2i32; // scope 0 at $DIR/unusual-item-types.rs:10:38: 10:39 + _0 = const 2_i32; // scope 0 at $DIR/unusual-item-types.rs:10:38: 10:39 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000002)) diff --git a/src/test/mir-opt/unusual-item-types/64bit/rustc.E-V-{{constant}}.mir_map.0.mir b/src/test/mir-opt/unusual-item-types/64bit/rustc.E-V-{{constant}}.mir_map.0.mir index e635cd2b01bbd..f2c1e9c97ddfe 100644 --- a/src/test/mir-opt/unusual-item-types/64bit/rustc.E-V-{{constant}}.mir_map.0.mir +++ b/src/test/mir-opt/unusual-item-types/64bit/rustc.E-V-{{constant}}.mir_map.0.mir @@ -4,7 +4,7 @@ E::V::{{constant}}#0: isize = { let mut _0: isize; // return place in scope 0 at $DIR/unusual-item-types.rs:22:9: 22:10 bb0: { - _0 = const 5isize; // scope 0 at $DIR/unusual-item-types.rs:22:9: 22:10 + _0 = const 5_isize; // scope 0 at $DIR/unusual-item-types.rs:22:9: 22:10 // ty::Const // + ty: isize // + val: Value(Scalar(0x0000000000000005)) diff --git a/src/test/mir-opt/unusual-item-types/64bit/rustc.{{impl}}-ASSOCIATED_CONSTANT.mir_map.0.mir b/src/test/mir-opt/unusual-item-types/64bit/rustc.{{impl}}-ASSOCIATED_CONSTANT.mir_map.0.mir index f4a5cc0b3279a..4af856c654eed 100644 --- a/src/test/mir-opt/unusual-item-types/64bit/rustc.{{impl}}-ASSOCIATED_CONSTANT.mir_map.0.mir +++ b/src/test/mir-opt/unusual-item-types/64bit/rustc.{{impl}}-ASSOCIATED_CONSTANT.mir_map.0.mir @@ -4,7 +4,7 @@ const ::ASSOCIATED_CONSTANT: i32 = let mut _0: i32; // return place in scope 0 at $DIR/unusual-item-types.rs:10:32: 10:35 bb0: { - _0 = const 2i32; // scope 0 at $DIR/unusual-item-types.rs:10:38: 10:39 + _0 = const 2_i32; // scope 0 at $DIR/unusual-item-types.rs:10:38: 10:39 // ty::Const // + ty: i32 // + val: Value(Scalar(0x00000002)) diff --git a/src/test/rustdoc/const-generics/add-impl.rs b/src/test/rustdoc/const-generics/add-impl.rs index 905f958826897..85be89719ec39 100644 --- a/src/test/rustdoc/const-generics/add-impl.rs +++ b/src/test/rustdoc/const-generics/add-impl.rs @@ -1,7 +1,6 @@ // ignore-tidy-linelength #![feature(const_generics)] - #![crate_name = "foo"] use std::ops::Add; @@ -11,7 +10,7 @@ pub struct Simd { inner: T, } -// @has foo/struct.Simd.html '//div[@id="trait-implementations-list"]/h3/code' 'impl Add> for Simd' +// @has foo/struct.Simd.html '//div[@id="trait-implementations-list"]/h3/code' 'impl Add> for Simd' impl Add for Simd { type Output = Self; diff --git a/src/test/ui/array-slice-vec/match_arr_unknown_len.stderr b/src/test/ui/array-slice-vec/match_arr_unknown_len.stderr index 4fe8572c2d531..0ad05b3adeb88 100644 --- a/src/test/ui/array-slice-vec/match_arr_unknown_len.stderr +++ b/src/test/ui/array-slice-vec/match_arr_unknown_len.stderr @@ -11,7 +11,7 @@ error[E0308]: mismatched types --> $DIR/match_arr_unknown_len.rs:6:9 | LL | [1, 2] => true, - | ^^^^^^ expected `2usize`, found `N` + | ^^^^^^ expected `2_usize`, found `N` | = note: expected array `[u32; 2]` found array `[u32; N]` diff --git a/src/test/ui/associated-const/defaults-not-assumed-fail.stderr b/src/test/ui/associated-const/defaults-not-assumed-fail.stderr index fe3721a910922..c1b08010cd5b6 100644 --- a/src/test/ui/associated-const/defaults-not-assumed-fail.stderr +++ b/src/test/ui/associated-const/defaults-not-assumed-fail.stderr @@ -4,7 +4,7 @@ error: any use of this value will cause an error LL | const B: u8 = Self::A + 1; | --------------^^^^^^^^^^^- | | - | attempt to add with overflow + | attempt to compute `u8::MAX + 1_u8` which would overflow | = note: `#[deny(const_err)]` on by default diff --git a/src/test/ui/associated-const/issue-69020-assoc-const-arith-overflow.noopt.stderr b/src/test/ui/associated-const/issue-69020-assoc-const-arith-overflow.noopt.stderr index 510a13ea5b1be..724823e36405e 100644 --- a/src/test/ui/associated-const/issue-69020-assoc-const-arith-overflow.noopt.stderr +++ b/src/test/ui/associated-const/issue-69020-assoc-const-arith-overflow.noopt.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/issue-69020-assoc-const-arith-overflow.rs:29:22 | LL | const NEG: i32 = -i32::MIN + T::NEG; - | ^^^^^^^^^ attempt to negate with overflow + | ^^^^^^^^^ attempt to negate i32::MIN which would overflow | = note: `#[deny(arithmetic_overflow)]` on by default @@ -10,25 +10,25 @@ error: this arithmetic operation will overflow --> $DIR/issue-69020-assoc-const-arith-overflow.rs:31:35 | LL | const NEG_REV: i32 = T::NEG + (-i32::MIN); - | ^^^^^^^^^^^ attempt to negate with overflow + | ^^^^^^^^^^^ attempt to negate i32::MIN which would overflow error: this arithmetic operation will overflow --> $DIR/issue-69020-assoc-const-arith-overflow.rs:34:22 | LL | const ADD: i32 = (i32::MAX+1) + T::ADD; - | ^^^^^^^^^^^^ attempt to add with overflow + | ^^^^^^^^^^^^ attempt to compute `i32::MAX + 1_i32` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-69020-assoc-const-arith-overflow.rs:36:36 | LL | const ADD_REV: i32 = T::ADD + (i32::MAX+1); - | ^^^^^^^^^^^^ attempt to add with overflow + | ^^^^^^^^^^^^ attempt to compute `i32::MAX + 1_i32` which would overflow error: this operation will panic at runtime --> $DIR/issue-69020-assoc-const-arith-overflow.rs:39:22 | LL | const DIV: i32 = (1/0) + T::DIV; - | ^^^^^ attempt to divide by zero + | ^^^^^ attempt to divide 1_i32 by zero | = note: `#[deny(unconditional_panic)]` on by default @@ -36,7 +36,7 @@ error: this operation will panic at runtime --> $DIR/issue-69020-assoc-const-arith-overflow.rs:41:35 | LL | const DIV_REV: i32 = T::DIV + (1/0); - | ^^^^^ attempt to divide by zero + | ^^^^^ attempt to divide 1_i32 by zero error: this operation will panic at runtime --> $DIR/issue-69020-assoc-const-arith-overflow.rs:44:22 diff --git a/src/test/ui/associated-const/issue-69020-assoc-const-arith-overflow.opt.stderr b/src/test/ui/associated-const/issue-69020-assoc-const-arith-overflow.opt.stderr index 510a13ea5b1be..724823e36405e 100644 --- a/src/test/ui/associated-const/issue-69020-assoc-const-arith-overflow.opt.stderr +++ b/src/test/ui/associated-const/issue-69020-assoc-const-arith-overflow.opt.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/issue-69020-assoc-const-arith-overflow.rs:29:22 | LL | const NEG: i32 = -i32::MIN + T::NEG; - | ^^^^^^^^^ attempt to negate with overflow + | ^^^^^^^^^ attempt to negate i32::MIN which would overflow | = note: `#[deny(arithmetic_overflow)]` on by default @@ -10,25 +10,25 @@ error: this arithmetic operation will overflow --> $DIR/issue-69020-assoc-const-arith-overflow.rs:31:35 | LL | const NEG_REV: i32 = T::NEG + (-i32::MIN); - | ^^^^^^^^^^^ attempt to negate with overflow + | ^^^^^^^^^^^ attempt to negate i32::MIN which would overflow error: this arithmetic operation will overflow --> $DIR/issue-69020-assoc-const-arith-overflow.rs:34:22 | LL | const ADD: i32 = (i32::MAX+1) + T::ADD; - | ^^^^^^^^^^^^ attempt to add with overflow + | ^^^^^^^^^^^^ attempt to compute `i32::MAX + 1_i32` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-69020-assoc-const-arith-overflow.rs:36:36 | LL | const ADD_REV: i32 = T::ADD + (i32::MAX+1); - | ^^^^^^^^^^^^ attempt to add with overflow + | ^^^^^^^^^^^^ attempt to compute `i32::MAX + 1_i32` which would overflow error: this operation will panic at runtime --> $DIR/issue-69020-assoc-const-arith-overflow.rs:39:22 | LL | const DIV: i32 = (1/0) + T::DIV; - | ^^^^^ attempt to divide by zero + | ^^^^^ attempt to divide 1_i32 by zero | = note: `#[deny(unconditional_panic)]` on by default @@ -36,7 +36,7 @@ error: this operation will panic at runtime --> $DIR/issue-69020-assoc-const-arith-overflow.rs:41:35 | LL | const DIV_REV: i32 = T::DIV + (1/0); - | ^^^^^ attempt to divide by zero + | ^^^^^ attempt to divide 1_i32 by zero error: this operation will panic at runtime --> $DIR/issue-69020-assoc-const-arith-overflow.rs:44:22 diff --git a/src/test/ui/associated-const/issue-69020-assoc-const-arith-overflow.opt_with_overflow_checks.stderr b/src/test/ui/associated-const/issue-69020-assoc-const-arith-overflow.opt_with_overflow_checks.stderr index 510a13ea5b1be..724823e36405e 100644 --- a/src/test/ui/associated-const/issue-69020-assoc-const-arith-overflow.opt_with_overflow_checks.stderr +++ b/src/test/ui/associated-const/issue-69020-assoc-const-arith-overflow.opt_with_overflow_checks.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/issue-69020-assoc-const-arith-overflow.rs:29:22 | LL | const NEG: i32 = -i32::MIN + T::NEG; - | ^^^^^^^^^ attempt to negate with overflow + | ^^^^^^^^^ attempt to negate i32::MIN which would overflow | = note: `#[deny(arithmetic_overflow)]` on by default @@ -10,25 +10,25 @@ error: this arithmetic operation will overflow --> $DIR/issue-69020-assoc-const-arith-overflow.rs:31:35 | LL | const NEG_REV: i32 = T::NEG + (-i32::MIN); - | ^^^^^^^^^^^ attempt to negate with overflow + | ^^^^^^^^^^^ attempt to negate i32::MIN which would overflow error: this arithmetic operation will overflow --> $DIR/issue-69020-assoc-const-arith-overflow.rs:34:22 | LL | const ADD: i32 = (i32::MAX+1) + T::ADD; - | ^^^^^^^^^^^^ attempt to add with overflow + | ^^^^^^^^^^^^ attempt to compute `i32::MAX + 1_i32` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-69020-assoc-const-arith-overflow.rs:36:36 | LL | const ADD_REV: i32 = T::ADD + (i32::MAX+1); - | ^^^^^^^^^^^^ attempt to add with overflow + | ^^^^^^^^^^^^ attempt to compute `i32::MAX + 1_i32` which would overflow error: this operation will panic at runtime --> $DIR/issue-69020-assoc-const-arith-overflow.rs:39:22 | LL | const DIV: i32 = (1/0) + T::DIV; - | ^^^^^ attempt to divide by zero + | ^^^^^ attempt to divide 1_i32 by zero | = note: `#[deny(unconditional_panic)]` on by default @@ -36,7 +36,7 @@ error: this operation will panic at runtime --> $DIR/issue-69020-assoc-const-arith-overflow.rs:41:35 | LL | const DIV_REV: i32 = T::DIV + (1/0); - | ^^^^^ attempt to divide by zero + | ^^^^^ attempt to divide 1_i32 by zero error: this operation will panic at runtime --> $DIR/issue-69020-assoc-const-arith-overflow.rs:44:22 diff --git a/src/test/ui/const-generics/array-impls/into-iter-no-impls-length-33.stderr b/src/test/ui/const-generics/array-impls/into-iter-no-impls-length-33.stderr index b39a160b52987..ceda31550ff44 100644 --- a/src/test/ui/const-generics/array-impls/into-iter-no-impls-length-33.stderr +++ b/src/test/ui/const-generics/array-impls/into-iter-no-impls-length-33.stderr @@ -13,9 +13,9 @@ LL | pub fn no_iterator() -> impl Iterator { | ^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[i32; 33]` LL | LL | IntoIter::new([0i32; 33]) - | ------------------------- this returned value is of type `std::array::IntoIter` + | ------------------------- this returned value is of type `std::array::IntoIter` | - = note: required because of the requirements on the impl of `std::iter::Iterator` for `std::array::IntoIter` + = note: required because of the requirements on the impl of `std::iter::Iterator` for `std::array::IntoIter` = note: the return type of a function must have a statically known size error[E0277]: arrays only have std trait implementations for lengths 0..=32 @@ -33,9 +33,9 @@ LL | pub fn no_double_ended_iterator() -> impl DoubleEndedIterator { | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[i32; 33]` LL | LL | IntoIter::new([0i32; 33]) - | ------------------------- this returned value is of type `std::array::IntoIter` + | ------------------------- this returned value is of type `std::array::IntoIter` | - = note: required because of the requirements on the impl of `std::iter::DoubleEndedIterator` for `std::array::IntoIter` + = note: required because of the requirements on the impl of `std::iter::DoubleEndedIterator` for `std::array::IntoIter` = note: the return type of a function must have a statically known size error[E0277]: arrays only have std trait implementations for lengths 0..=32 @@ -53,9 +53,9 @@ LL | pub fn no_exact_size_iterator() -> impl ExactSizeIterator { | ^^^^^^^^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[i32; 33]` LL | LL | IntoIter::new([0i32; 33]) - | ------------------------- this returned value is of type `std::array::IntoIter` + | ------------------------- this returned value is of type `std::array::IntoIter` | - = note: required because of the requirements on the impl of `std::iter::ExactSizeIterator` for `std::array::IntoIter` + = note: required because of the requirements on the impl of `std::iter::ExactSizeIterator` for `std::array::IntoIter` = note: the return type of a function must have a statically known size error[E0277]: arrays only have std trait implementations for lengths 0..=32 @@ -73,9 +73,9 @@ LL | pub fn no_fused_iterator() -> impl FusedIterator { | ^^^^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[i32; 33]` LL | LL | IntoIter::new([0i32; 33]) - | ------------------------- this returned value is of type `std::array::IntoIter` + | ------------------------- this returned value is of type `std::array::IntoIter` | - = note: required because of the requirements on the impl of `std::iter::FusedIterator` for `std::array::IntoIter` + = note: required because of the requirements on the impl of `std::iter::FusedIterator` for `std::array::IntoIter` = note: the return type of a function must have a statically known size error[E0277]: arrays only have std trait implementations for lengths 0..=32 @@ -93,9 +93,9 @@ LL | pub fn no_trusted_len() -> impl TrustedLen { | ^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[i32; 33]` LL | LL | IntoIter::new([0i32; 33]) - | ------------------------- this returned value is of type `std::array::IntoIter` + | ------------------------- this returned value is of type `std::array::IntoIter` | - = note: required because of the requirements on the impl of `std::iter::TrustedLen` for `std::array::IntoIter` + = note: required because of the requirements on the impl of `std::iter::TrustedLen` for `std::array::IntoIter` = note: the return type of a function must have a statically known size error[E0277]: arrays only have std trait implementations for lengths 0..=32 @@ -113,9 +113,9 @@ LL | pub fn no_clone() -> impl Clone { | ^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[i32; 33]` LL | LL | IntoIter::new([0i32; 33]) - | ------------------------- this returned value is of type `std::array::IntoIter` + | ------------------------- this returned value is of type `std::array::IntoIter` | - = note: required because of the requirements on the impl of `std::clone::Clone` for `std::array::IntoIter` + = note: required because of the requirements on the impl of `std::clone::Clone` for `std::array::IntoIter` = note: the return type of a function must have a statically known size error[E0277]: arrays only have std trait implementations for lengths 0..=32 @@ -133,9 +133,9 @@ LL | pub fn no_debug() -> impl Debug { | ^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[i32; 33]` LL | LL | IntoIter::new([0i32; 33]) - | ------------------------- this returned value is of type `std::array::IntoIter` + | ------------------------- this returned value is of type `std::array::IntoIter` | - = note: required because of the requirements on the impl of `std::fmt::Debug` for `std::array::IntoIter` + = note: required because of the requirements on the impl of `std::fmt::Debug` for `std::array::IntoIter` = note: the return type of a function must have a statically known size error: aborting due to 14 previous errors diff --git a/src/test/ui/const-generics/different_byref.stderr b/src/test/ui/const-generics/different_byref.stderr index 7eb826b8a36b1..a3f331ee81155 100644 --- a/src/test/ui/const-generics/different_byref.stderr +++ b/src/test/ui/const-generics/different_byref.stderr @@ -11,10 +11,10 @@ error[E0308]: mismatched types --> $DIR/different_byref.rs:8:9 | LL | x = Const::<{ [4] }> {}; - | ^^^^^^^^^^^^^^^^^^^ expected `3usize`, found `4usize` + | ^^^^^^^^^^^^^^^^^^^ expected `3_usize`, found `4_usize` | - = note: expected type `[3usize]` - found type `[4usize]` + = note: expected type `[3_usize]` + found type `[4_usize]` error: aborting due to previous error; 1 warning emitted diff --git a/src/test/ui/const-generics/types-mismatch-const-args.stderr b/src/test/ui/const-generics/types-mismatch-const-args.stderr index 53328c2e89bf4..49530c9d240b5 100644 --- a/src/test/ui/const-generics/types-mismatch-const-args.stderr +++ b/src/test/ui/const-generics/types-mismatch-const-args.stderr @@ -11,10 +11,10 @@ error[E0308]: mismatched types --> $DIR/types-mismatch-const-args.rs:13:41 | LL | let _: A<'a, u32, {2u32}, {3u32}> = A::<'a, u32, {4u32}, {3u32}> { data: PhantomData }; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `2u32`, found `4u32` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `2_u32`, found `4_u32` | - = note: expected type `2u32` - found type `4u32` + = note: expected type `2_u32` + found type `4_u32` error[E0308]: mismatched types --> $DIR/types-mismatch-const-args.rs:15:41 diff --git a/src/test/ui/consts/const-err-early.stderr b/src/test/ui/consts/const-err-early.stderr index b78ac38d7e7e2..0cb7751819774 100644 --- a/src/test/ui/consts/const-err-early.stderr +++ b/src/test/ui/consts/const-err-early.stderr @@ -4,7 +4,7 @@ error: any use of this value will cause an error LL | pub const A: i8 = -std::i8::MIN; | ------------------^^^^^^^^^^^^^- | | - | attempt to negate with overflow + | attempt to negate i8::MIN which would overflow | note: the lint level is defined here --> $DIR/const-err-early.rs:1:9 @@ -18,7 +18,7 @@ error: any use of this value will cause an error LL | pub const B: u8 = 200u8 + 200u8; | ------------------^^^^^^^^^^^^^- | | - | attempt to add with overflow + | attempt to compute `200_u8 + 200_u8` which would overflow error: any use of this value will cause an error --> $DIR/const-err-early.rs:5:19 @@ -26,7 +26,7 @@ error: any use of this value will cause an error LL | pub const C: u8 = 200u8 * 4; | ------------------^^^^^^^^^- | | - | attempt to multiply with overflow + | attempt to compute `200_u8 * 4_u8` which would overflow error: any use of this value will cause an error --> $DIR/const-err-early.rs:6:19 @@ -34,7 +34,7 @@ error: any use of this value will cause an error LL | pub const D: u8 = 42u8 - (42u8 + 1); | ------------------^^^^^^^^^^^^^^^^^- | | - | attempt to subtract with overflow + | attempt to compute `42_u8 - 43_u8` which would overflow error: any use of this value will cause an error --> $DIR/const-err-early.rs:7:19 diff --git a/src/test/ui/consts/const-err-multi.stderr b/src/test/ui/consts/const-err-multi.stderr index 65427b8a1b289..4ac4a8754d396 100644 --- a/src/test/ui/consts/const-err-multi.stderr +++ b/src/test/ui/consts/const-err-multi.stderr @@ -4,7 +4,7 @@ error: any use of this value will cause an error LL | pub const A: i8 = -std::i8::MIN; | ------------------^^^^^^^^^^^^^- | | - | attempt to negate with overflow + | attempt to negate i8::MIN which would overflow | note: the lint level is defined here --> $DIR/const-err-multi.rs:1:9 diff --git a/src/test/ui/consts/const-err2.noopt.stderr b/src/test/ui/consts/const-err2.noopt.stderr index 5aeeec4bd1435..687ffc4c4bf95 100644 --- a/src/test/ui/consts/const-err2.noopt.stderr +++ b/src/test/ui/consts/const-err2.noopt.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/const-err2.rs:19:13 | LL | let a = -std::i8::MIN; - | ^^^^^^^^^^^^^ attempt to negate with overflow + | ^^^^^^^^^^^^^ attempt to negate i8::MIN which would overflow | = note: `#[deny(arithmetic_overflow)]` on by default @@ -10,31 +10,31 @@ error: this arithmetic operation will overflow --> $DIR/const-err2.rs:21:18 | LL | let a_i128 = -std::i128::MIN; - | ^^^^^^^^^^^^^^^ attempt to negate with overflow + | ^^^^^^^^^^^^^^^ attempt to negate i128::MIN which would overflow error: this arithmetic operation will overflow --> $DIR/const-err2.rs:23:13 | LL | let b = 200u8 + 200u8 + 200u8; - | ^^^^^^^^^^^^^ attempt to add with overflow + | ^^^^^^^^^^^^^ attempt to compute `200_u8 + 200_u8` which would overflow error: this arithmetic operation will overflow --> $DIR/const-err2.rs:25:18 | LL | let b_i128 = std::i128::MIN - std::i128::MAX; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempt to subtract with overflow + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempt to compute `i128::MIN - i128::MAX` which would overflow error: this arithmetic operation will overflow --> $DIR/const-err2.rs:27:13 | LL | let c = 200u8 * 4; - | ^^^^^^^^^ attempt to multiply with overflow + | ^^^^^^^^^ attempt to compute `200_u8 * 4_u8` which would overflow error: this arithmetic operation will overflow --> $DIR/const-err2.rs:29:13 | LL | let d = 42u8 - (42u8 + 1); - | ^^^^^^^^^^^^^^^^^ attempt to subtract with overflow + | ^^^^^^^^^^^^^^^^^ attempt to compute `42_u8 - 43_u8` which would overflow error: this operation will panic at runtime --> $DIR/const-err2.rs:31:14 diff --git a/src/test/ui/consts/const-err2.opt.stderr b/src/test/ui/consts/const-err2.opt.stderr index 5aeeec4bd1435..687ffc4c4bf95 100644 --- a/src/test/ui/consts/const-err2.opt.stderr +++ b/src/test/ui/consts/const-err2.opt.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/const-err2.rs:19:13 | LL | let a = -std::i8::MIN; - | ^^^^^^^^^^^^^ attempt to negate with overflow + | ^^^^^^^^^^^^^ attempt to negate i8::MIN which would overflow | = note: `#[deny(arithmetic_overflow)]` on by default @@ -10,31 +10,31 @@ error: this arithmetic operation will overflow --> $DIR/const-err2.rs:21:18 | LL | let a_i128 = -std::i128::MIN; - | ^^^^^^^^^^^^^^^ attempt to negate with overflow + | ^^^^^^^^^^^^^^^ attempt to negate i128::MIN which would overflow error: this arithmetic operation will overflow --> $DIR/const-err2.rs:23:13 | LL | let b = 200u8 + 200u8 + 200u8; - | ^^^^^^^^^^^^^ attempt to add with overflow + | ^^^^^^^^^^^^^ attempt to compute `200_u8 + 200_u8` which would overflow error: this arithmetic operation will overflow --> $DIR/const-err2.rs:25:18 | LL | let b_i128 = std::i128::MIN - std::i128::MAX; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempt to subtract with overflow + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempt to compute `i128::MIN - i128::MAX` which would overflow error: this arithmetic operation will overflow --> $DIR/const-err2.rs:27:13 | LL | let c = 200u8 * 4; - | ^^^^^^^^^ attempt to multiply with overflow + | ^^^^^^^^^ attempt to compute `200_u8 * 4_u8` which would overflow error: this arithmetic operation will overflow --> $DIR/const-err2.rs:29:13 | LL | let d = 42u8 - (42u8 + 1); - | ^^^^^^^^^^^^^^^^^ attempt to subtract with overflow + | ^^^^^^^^^^^^^^^^^ attempt to compute `42_u8 - 43_u8` which would overflow error: this operation will panic at runtime --> $DIR/const-err2.rs:31:14 diff --git a/src/test/ui/consts/const-err2.opt_with_overflow_checks.stderr b/src/test/ui/consts/const-err2.opt_with_overflow_checks.stderr index 5aeeec4bd1435..687ffc4c4bf95 100644 --- a/src/test/ui/consts/const-err2.opt_with_overflow_checks.stderr +++ b/src/test/ui/consts/const-err2.opt_with_overflow_checks.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/const-err2.rs:19:13 | LL | let a = -std::i8::MIN; - | ^^^^^^^^^^^^^ attempt to negate with overflow + | ^^^^^^^^^^^^^ attempt to negate i8::MIN which would overflow | = note: `#[deny(arithmetic_overflow)]` on by default @@ -10,31 +10,31 @@ error: this arithmetic operation will overflow --> $DIR/const-err2.rs:21:18 | LL | let a_i128 = -std::i128::MIN; - | ^^^^^^^^^^^^^^^ attempt to negate with overflow + | ^^^^^^^^^^^^^^^ attempt to negate i128::MIN which would overflow error: this arithmetic operation will overflow --> $DIR/const-err2.rs:23:13 | LL | let b = 200u8 + 200u8 + 200u8; - | ^^^^^^^^^^^^^ attempt to add with overflow + | ^^^^^^^^^^^^^ attempt to compute `200_u8 + 200_u8` which would overflow error: this arithmetic operation will overflow --> $DIR/const-err2.rs:25:18 | LL | let b_i128 = std::i128::MIN - std::i128::MAX; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempt to subtract with overflow + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempt to compute `i128::MIN - i128::MAX` which would overflow error: this arithmetic operation will overflow --> $DIR/const-err2.rs:27:13 | LL | let c = 200u8 * 4; - | ^^^^^^^^^ attempt to multiply with overflow + | ^^^^^^^^^ attempt to compute `200_u8 * 4_u8` which would overflow error: this arithmetic operation will overflow --> $DIR/const-err2.rs:29:13 | LL | let d = 42u8 - (42u8 + 1); - | ^^^^^^^^^^^^^^^^^ attempt to subtract with overflow + | ^^^^^^^^^^^^^^^^^ attempt to compute `42_u8 - 43_u8` which would overflow error: this operation will panic at runtime --> $DIR/const-err2.rs:31:14 diff --git a/src/test/ui/consts/const-eval/conditional_array_execution.stderr b/src/test/ui/consts/const-eval/conditional_array_execution.stderr index df8efc44c4966..62f339809e431 100644 --- a/src/test/ui/consts/const-eval/conditional_array_execution.stderr +++ b/src/test/ui/consts/const-eval/conditional_array_execution.stderr @@ -4,7 +4,7 @@ warning: any use of this value will cause an error LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; | ------------------^^^^^--------------------------- | | - | attempt to subtract with overflow + | attempt to compute `5_u32 - 6_u32` which would overflow | note: the lint level is defined here --> $DIR/conditional_array_execution.rs:3:9 diff --git a/src/test/ui/consts/const-eval/const-eval-overflow-3.stderr b/src/test/ui/consts/const-eval/const-eval-overflow-3.stderr index 2c5b4607aa4d3..dd79cbd7e5ff7 100644 --- a/src/test/ui/consts/const-eval/const-eval-overflow-3.stderr +++ b/src/test/ui/consts/const-eval/const-eval-overflow-3.stderr @@ -2,7 +2,7 @@ error[E0080]: evaluation of constant value failed --> $DIR/const-eval-overflow-3.rs:20:11 | LL | = [0; (i8::MAX + 1) as usize]; - | ^^^^^^^^^^^^^ attempt to add with overflow + | ^^^^^^^^^^^^^ attempt to compute `i8::MAX + 1_i8` which would overflow error: aborting due to previous error diff --git a/src/test/ui/consts/const-eval/const-eval-overflow-4.stderr b/src/test/ui/consts/const-eval/const-eval-overflow-4.stderr index fe7db23dc2e99..30c52a82ea364 100644 --- a/src/test/ui/consts/const-eval/const-eval-overflow-4.stderr +++ b/src/test/ui/consts/const-eval/const-eval-overflow-4.stderr @@ -2,7 +2,7 @@ error[E0080]: evaluation of constant value failed --> $DIR/const-eval-overflow-4.rs:13:13 | LL | : [u32; (i8::MAX as i8 + 1i8) as usize] - | ^^^^^^^^^^^^^^^^^^^^^ attempt to add with overflow + | ^^^^^^^^^^^^^^^^^^^^^ attempt to compute `i8::MAX + 1_i8` which would overflow error: aborting due to previous error diff --git a/src/test/ui/consts/const-eval/const-eval-overflow2.stderr b/src/test/ui/consts/const-eval/const-eval-overflow2.stderr index 6f823005572b5..2ad557a71139e 100644 --- a/src/test/ui/consts/const-eval/const-eval-overflow2.stderr +++ b/src/test/ui/consts/const-eval/const-eval-overflow2.stderr @@ -4,7 +4,7 @@ error: any use of this value will cause an error LL | / const VALS_I8: (i8,) = LL | | ( LL | | i8::MIN - 1, - | | ^^^^^^^^^^^ attempt to subtract with overflow + | | ^^^^^^^^^^^ attempt to compute `i8::MIN - 1_i8` which would overflow LL | | ); | |_______- | @@ -20,7 +20,7 @@ error: any use of this value will cause an error LL | / const VALS_I16: (i16,) = LL | | ( LL | | i16::MIN - 1, - | | ^^^^^^^^^^^^ attempt to subtract with overflow + | | ^^^^^^^^^^^^ attempt to compute `i16::MIN - 1_i16` which would overflow LL | | ); | |_______- @@ -30,7 +30,7 @@ error: any use of this value will cause an error LL | / const VALS_I32: (i32,) = LL | | ( LL | | i32::MIN - 1, - | | ^^^^^^^^^^^^ attempt to subtract with overflow + | | ^^^^^^^^^^^^ attempt to compute `i32::MIN - 1_i32` which would overflow LL | | ); | |_______- @@ -40,7 +40,7 @@ error: any use of this value will cause an error LL | / const VALS_I64: (i64,) = LL | | ( LL | | i64::MIN - 1, - | | ^^^^^^^^^^^^ attempt to subtract with overflow + | | ^^^^^^^^^^^^ attempt to compute `i64::MIN - 1_i64` which would overflow LL | | ); | |_______- @@ -50,7 +50,7 @@ error: any use of this value will cause an error LL | / const VALS_U8: (u8,) = LL | | ( LL | | u8::MIN - 1, - | | ^^^^^^^^^^^ attempt to subtract with overflow + | | ^^^^^^^^^^^ attempt to compute `0_u8 - 1_u8` which would overflow LL | | ); | |_______- @@ -59,7 +59,7 @@ error: any use of this value will cause an error | LL | / const VALS_U16: (u16,) = ( LL | | u16::MIN - 1, - | | ^^^^^^^^^^^^ attempt to subtract with overflow + | | ^^^^^^^^^^^^ attempt to compute `0_u16 - 1_u16` which would overflow LL | | ); | |_______- @@ -68,7 +68,7 @@ error: any use of this value will cause an error | LL | / const VALS_U32: (u32,) = ( LL | | u32::MIN - 1, - | | ^^^^^^^^^^^^ attempt to subtract with overflow + | | ^^^^^^^^^^^^ attempt to compute `0_u32 - 1_u32` which would overflow LL | | ); | |_______- @@ -78,7 +78,7 @@ error: any use of this value will cause an error LL | / const VALS_U64: (u64,) = LL | | ( LL | | u64::MIN - 1, - | | ^^^^^^^^^^^^ attempt to subtract with overflow + | | ^^^^^^^^^^^^ attempt to compute `0_u64 - 1_u64` which would overflow LL | | ); | |_______- diff --git a/src/test/ui/consts/const-eval/const-eval-overflow2b.stderr b/src/test/ui/consts/const-eval/const-eval-overflow2b.stderr index f9a4e5aa96801..fce616b296c29 100644 --- a/src/test/ui/consts/const-eval/const-eval-overflow2b.stderr +++ b/src/test/ui/consts/const-eval/const-eval-overflow2b.stderr @@ -4,7 +4,7 @@ error: any use of this value will cause an error LL | / const VALS_I8: (i8,) = LL | | ( LL | | i8::MAX + 1, - | | ^^^^^^^^^^^ attempt to add with overflow + | | ^^^^^^^^^^^ attempt to compute `i8::MAX + 1_i8` which would overflow LL | | ); | |_______- | @@ -20,7 +20,7 @@ error: any use of this value will cause an error LL | / const VALS_I16: (i16,) = LL | | ( LL | | i16::MAX + 1, - | | ^^^^^^^^^^^^ attempt to add with overflow + | | ^^^^^^^^^^^^ attempt to compute `i16::MAX + 1_i16` which would overflow LL | | ); | |_______- @@ -30,7 +30,7 @@ error: any use of this value will cause an error LL | / const VALS_I32: (i32,) = LL | | ( LL | | i32::MAX + 1, - | | ^^^^^^^^^^^^ attempt to add with overflow + | | ^^^^^^^^^^^^ attempt to compute `i32::MAX + 1_i32` which would overflow LL | | ); | |_______- @@ -40,7 +40,7 @@ error: any use of this value will cause an error LL | / const VALS_I64: (i64,) = LL | | ( LL | | i64::MAX + 1, - | | ^^^^^^^^^^^^ attempt to add with overflow + | | ^^^^^^^^^^^^ attempt to compute `i64::MAX + 1_i64` which would overflow LL | | ); | |_______- @@ -50,7 +50,7 @@ error: any use of this value will cause an error LL | / const VALS_U8: (u8,) = LL | | ( LL | | u8::MAX + 1, - | | ^^^^^^^^^^^ attempt to add with overflow + | | ^^^^^^^^^^^ attempt to compute `u8::MAX + 1_u8` which would overflow LL | | ); | |_______- @@ -59,7 +59,7 @@ error: any use of this value will cause an error | LL | / const VALS_U16: (u16,) = ( LL | | u16::MAX + 1, - | | ^^^^^^^^^^^^ attempt to add with overflow + | | ^^^^^^^^^^^^ attempt to compute `u16::MAX + 1_u16` which would overflow LL | | ); | |_______- @@ -68,7 +68,7 @@ error: any use of this value will cause an error | LL | / const VALS_U32: (u32,) = ( LL | | u32::MAX + 1, - | | ^^^^^^^^^^^^ attempt to add with overflow + | | ^^^^^^^^^^^^ attempt to compute `u32::MAX + 1_u32` which would overflow LL | | ); | |_______- @@ -78,7 +78,7 @@ error: any use of this value will cause an error LL | / const VALS_U64: (u64,) = LL | | ( LL | | u64::MAX + 1, - | | ^^^^^^^^^^^^ attempt to add with overflow + | | ^^^^^^^^^^^^ attempt to compute `u64::MAX + 1_u64` which would overflow LL | | ); | |_______- diff --git a/src/test/ui/consts/const-eval/const-eval-overflow2c.stderr b/src/test/ui/consts/const-eval/const-eval-overflow2c.stderr index 6b90617802629..76201524d32bc 100644 --- a/src/test/ui/consts/const-eval/const-eval-overflow2c.stderr +++ b/src/test/ui/consts/const-eval/const-eval-overflow2c.stderr @@ -4,7 +4,7 @@ error: any use of this value will cause an error LL | / const VALS_I8: (i8,) = LL | | ( LL | | i8::MIN * 2, - | | ^^^^^^^^^^^ attempt to multiply with overflow + | | ^^^^^^^^^^^ attempt to compute `i8::MIN * 2_i8` which would overflow LL | | ); | |_______- | @@ -20,7 +20,7 @@ error: any use of this value will cause an error LL | / const VALS_I16: (i16,) = LL | | ( LL | | i16::MIN * 2, - | | ^^^^^^^^^^^^ attempt to multiply with overflow + | | ^^^^^^^^^^^^ attempt to compute `i16::MIN * 2_i16` which would overflow LL | | ); | |_______- @@ -30,7 +30,7 @@ error: any use of this value will cause an error LL | / const VALS_I32: (i32,) = LL | | ( LL | | i32::MIN * 2, - | | ^^^^^^^^^^^^ attempt to multiply with overflow + | | ^^^^^^^^^^^^ attempt to compute `i32::MIN * 2_i32` which would overflow LL | | ); | |_______- @@ -40,7 +40,7 @@ error: any use of this value will cause an error LL | / const VALS_I64: (i64,) = LL | | ( LL | | i64::MIN * 2, - | | ^^^^^^^^^^^^ attempt to multiply with overflow + | | ^^^^^^^^^^^^ attempt to compute `i64::MIN * 2_i64` which would overflow LL | | ); | |_______- @@ -50,7 +50,7 @@ error: any use of this value will cause an error LL | / const VALS_U8: (u8,) = LL | | ( LL | | u8::MAX * 2, - | | ^^^^^^^^^^^ attempt to multiply with overflow + | | ^^^^^^^^^^^ attempt to compute `u8::MAX * 2_u8` which would overflow LL | | ); | |_______- @@ -59,7 +59,7 @@ error: any use of this value will cause an error | LL | / const VALS_U16: (u16,) = ( LL | | u16::MAX * 2, - | | ^^^^^^^^^^^^ attempt to multiply with overflow + | | ^^^^^^^^^^^^ attempt to compute `u16::MAX * 2_u16` which would overflow LL | | ); | |_______- @@ -68,7 +68,7 @@ error: any use of this value will cause an error | LL | / const VALS_U32: (u32,) = ( LL | | u32::MAX * 2, - | | ^^^^^^^^^^^^ attempt to multiply with overflow + | | ^^^^^^^^^^^^ attempt to compute `u32::MAX * 2_u32` which would overflow LL | | ); | |_______- @@ -78,7 +78,7 @@ error: any use of this value will cause an error LL | / const VALS_U64: (u64,) = LL | | ( LL | | u64::MAX * 2, - | | ^^^^^^^^^^^^ attempt to multiply with overflow + | | ^^^^^^^^^^^^ attempt to compute `u64::MAX * 2_u64` which would overflow LL | | ); | |_______- diff --git a/src/test/ui/consts/const-eval/issue-43197.stderr b/src/test/ui/consts/const-eval/issue-43197.stderr index 8aaae9fe6a7d1..b3e1f496ae3e3 100644 --- a/src/test/ui/consts/const-eval/issue-43197.stderr +++ b/src/test/ui/consts/const-eval/issue-43197.stderr @@ -4,7 +4,7 @@ warning: any use of this value will cause an error LL | const X: u32 = 0 - 1; | ---------------^^^^^- | | - | attempt to subtract with overflow + | attempt to compute `0_u32 - 1_u32` which would overflow | note: the lint level is defined here --> $DIR/issue-43197.rs:3:9 @@ -18,7 +18,7 @@ warning: any use of this value will cause an error LL | const Y: u32 = foo(0 - 1); | -------------------^^^^^-- | | - | attempt to subtract with overflow + | attempt to compute `0_u32 - 1_u32` which would overflow error[E0080]: evaluation of constant expression failed --> $DIR/issue-43197.rs:14:23 diff --git a/src/test/ui/consts/const-eval/issue-50814.stderr b/src/test/ui/consts/const-eval/issue-50814.stderr index 2e5167a99a2c6..4be84f8d1843c 100644 --- a/src/test/ui/consts/const-eval/issue-50814.stderr +++ b/src/test/ui/consts/const-eval/issue-50814.stderr @@ -4,7 +4,7 @@ error: any use of this value will cause an error LL | const MAX: u8 = A::MAX + B::MAX; | ----------------^^^^^^^^^^^^^^^- | | - | attempt to add with overflow + | attempt to compute `u8::MAX + u8::MAX` which would overflow | = note: `#[deny(const_err)]` on by default diff --git a/src/test/ui/consts/const-eval/promoted_errors.noopt.stderr b/src/test/ui/consts/const-eval/promoted_errors.noopt.stderr index a545503ce8955..52313205dc80b 100644 --- a/src/test/ui/consts/const-eval/promoted_errors.noopt.stderr +++ b/src/test/ui/consts/const-eval/promoted_errors.noopt.stderr @@ -2,7 +2,7 @@ warning: this arithmetic operation will overflow --> $DIR/promoted_errors.rs:12:20 | LL | println!("{}", 0u32 - 1); - | ^^^^^^^^ attempt to subtract with overflow + | ^^^^^^^^ attempt to compute `0_u32 - 1_u32` which would overflow | note: the lint level is defined here --> $DIR/promoted_errors.rs:9:20 @@ -14,13 +14,13 @@ warning: this arithmetic operation will overflow --> $DIR/promoted_errors.rs:14:14 | LL | let _x = 0u32 - 1; - | ^^^^^^^^ attempt to subtract with overflow + | ^^^^^^^^ attempt to compute `0_u32 - 1_u32` which would overflow warning: this operation will panic at runtime --> $DIR/promoted_errors.rs:16:20 | LL | println!("{}", 1 / (1 - 1)); - | ^^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^^ attempt to divide 1_i32 by zero | note: the lint level is defined here --> $DIR/promoted_errors.rs:9:41 @@ -50,13 +50,13 @@ warning: this operation will panic at runtime --> $DIR/promoted_errors.rs:20:14 | LL | let _x = 1 / (1 - 1); - | ^^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^^ attempt to divide 1_i32 by zero warning: this operation will panic at runtime --> $DIR/promoted_errors.rs:22:20 | LL | println!("{}", 1 / (false as u32)); - | ^^^^^^^^^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^^^^^^^^^ attempt to divide 1_u32 by zero warning: reaching this expression at runtime will panic or abort --> $DIR/promoted_errors.rs:22:20 @@ -74,7 +74,7 @@ warning: this operation will panic at runtime --> $DIR/promoted_errors.rs:26:14 | LL | let _x = 1 / (false as u32); - | ^^^^^^^^^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^^^^^^^^^ attempt to divide 1_u32 by zero warning: 10 warnings emitted diff --git a/src/test/ui/consts/const-eval/promoted_errors.opt.stderr b/src/test/ui/consts/const-eval/promoted_errors.opt.stderr index 4887826178244..b411bb2e7fe20 100644 --- a/src/test/ui/consts/const-eval/promoted_errors.opt.stderr +++ b/src/test/ui/consts/const-eval/promoted_errors.opt.stderr @@ -2,7 +2,7 @@ warning: this arithmetic operation will overflow --> $DIR/promoted_errors.rs:14:14 | LL | let _x = 0u32 - 1; - | ^^^^^^^^ attempt to subtract with overflow + | ^^^^^^^^ attempt to compute `0_u32 - 1_u32` which would overflow | note: the lint level is defined here --> $DIR/promoted_errors.rs:9:20 @@ -14,7 +14,7 @@ warning: this operation will panic at runtime --> $DIR/promoted_errors.rs:16:20 | LL | println!("{}", 1 / (1 - 1)); - | ^^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^^ attempt to divide 1_i32 by zero | note: the lint level is defined here --> $DIR/promoted_errors.rs:9:41 @@ -44,13 +44,13 @@ warning: this operation will panic at runtime --> $DIR/promoted_errors.rs:20:14 | LL | let _x = 1 / (1 - 1); - | ^^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^^ attempt to divide 1_i32 by zero warning: this operation will panic at runtime --> $DIR/promoted_errors.rs:22:20 | LL | println!("{}", 1 / (false as u32)); - | ^^^^^^^^^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^^^^^^^^^ attempt to divide 1_u32 by zero warning: reaching this expression at runtime will panic or abort --> $DIR/promoted_errors.rs:22:20 @@ -68,7 +68,7 @@ warning: this operation will panic at runtime --> $DIR/promoted_errors.rs:26:14 | LL | let _x = 1 / (false as u32); - | ^^^^^^^^^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^^^^^^^^^ attempt to divide 1_u32 by zero warning: 9 warnings emitted diff --git a/src/test/ui/consts/const-eval/promoted_errors.opt_with_overflow_checks.stderr b/src/test/ui/consts/const-eval/promoted_errors.opt_with_overflow_checks.stderr index a545503ce8955..52313205dc80b 100644 --- a/src/test/ui/consts/const-eval/promoted_errors.opt_with_overflow_checks.stderr +++ b/src/test/ui/consts/const-eval/promoted_errors.opt_with_overflow_checks.stderr @@ -2,7 +2,7 @@ warning: this arithmetic operation will overflow --> $DIR/promoted_errors.rs:12:20 | LL | println!("{}", 0u32 - 1); - | ^^^^^^^^ attempt to subtract with overflow + | ^^^^^^^^ attempt to compute `0_u32 - 1_u32` which would overflow | note: the lint level is defined here --> $DIR/promoted_errors.rs:9:20 @@ -14,13 +14,13 @@ warning: this arithmetic operation will overflow --> $DIR/promoted_errors.rs:14:14 | LL | let _x = 0u32 - 1; - | ^^^^^^^^ attempt to subtract with overflow + | ^^^^^^^^ attempt to compute `0_u32 - 1_u32` which would overflow warning: this operation will panic at runtime --> $DIR/promoted_errors.rs:16:20 | LL | println!("{}", 1 / (1 - 1)); - | ^^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^^ attempt to divide 1_i32 by zero | note: the lint level is defined here --> $DIR/promoted_errors.rs:9:41 @@ -50,13 +50,13 @@ warning: this operation will panic at runtime --> $DIR/promoted_errors.rs:20:14 | LL | let _x = 1 / (1 - 1); - | ^^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^^ attempt to divide 1_i32 by zero warning: this operation will panic at runtime --> $DIR/promoted_errors.rs:22:20 | LL | println!("{}", 1 / (false as u32)); - | ^^^^^^^^^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^^^^^^^^^ attempt to divide 1_u32 by zero warning: reaching this expression at runtime will panic or abort --> $DIR/promoted_errors.rs:22:20 @@ -74,7 +74,7 @@ warning: this operation will panic at runtime --> $DIR/promoted_errors.rs:26:14 | LL | let _x = 1 / (false as u32); - | ^^^^^^^^^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^^^^^^^^^ attempt to divide 1_u32 by zero warning: 10 warnings emitted diff --git a/src/test/ui/consts/const-eval/pub_const_err.stderr b/src/test/ui/consts/const-eval/pub_const_err.stderr index 1f1dd203a6401..ecdba2f1c506d 100644 --- a/src/test/ui/consts/const-eval/pub_const_err.stderr +++ b/src/test/ui/consts/const-eval/pub_const_err.stderr @@ -4,7 +4,7 @@ warning: any use of this value will cause an error LL | pub const Z: u32 = 0 - 1; | -------------------^^^^^- | | - | attempt to subtract with overflow + | attempt to compute `0_u32 - 1_u32` which would overflow | note: the lint level is defined here --> $DIR/pub_const_err.rs:2:9 diff --git a/src/test/ui/consts/const-eval/pub_const_err_bin.stderr b/src/test/ui/consts/const-eval/pub_const_err_bin.stderr index 3ae0a11026f38..b2b65767dc059 100644 --- a/src/test/ui/consts/const-eval/pub_const_err_bin.stderr +++ b/src/test/ui/consts/const-eval/pub_const_err_bin.stderr @@ -4,7 +4,7 @@ warning: any use of this value will cause an error LL | pub const Z: u32 = 0 - 1; | -------------------^^^^^- | | - | attempt to subtract with overflow + | attempt to compute `0_u32 - 1_u32` which would overflow | note: the lint level is defined here --> $DIR/pub_const_err_bin.rs:2:9 diff --git a/src/test/ui/consts/const-eval/shift_overflow.stderr b/src/test/ui/consts/const-eval/shift_overflow.stderr index f4840e9ac96bd..478769ca9ffe1 100644 --- a/src/test/ui/consts/const-eval/shift_overflow.stderr +++ b/src/test/ui/consts/const-eval/shift_overflow.stderr @@ -2,7 +2,7 @@ error[E0080]: evaluation of constant value failed --> $DIR/shift_overflow.rs:3:9 | LL | X = 1 << ((u32::MAX as u64) + 1), - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempt to shift left by 4294967296_u64 which would overflow error: aborting due to previous error diff --git a/src/test/ui/consts/const-len-underflow-separate-spans.stderr b/src/test/ui/consts/const-len-underflow-separate-spans.stderr index 150d3eb525d5e..eff50587ca341 100644 --- a/src/test/ui/consts/const-len-underflow-separate-spans.stderr +++ b/src/test/ui/consts/const-len-underflow-separate-spans.stderr @@ -4,7 +4,7 @@ error: any use of this value will cause an error LL | const LEN: usize = ONE - TWO; | -------------------^^^^^^^^^- | | - | attempt to subtract with overflow + | attempt to compute `1_usize - 2_usize` which would overflow | = note: `#[deny(const_err)]` on by default diff --git a/src/test/ui/consts/const-len-underflow-subspans.rs b/src/test/ui/consts/const-len-underflow-subspans.rs index 37f6ef1bd9d7e..8ef8ef9625c81 100644 --- a/src/test/ui/consts/const-len-underflow-subspans.rs +++ b/src/test/ui/consts/const-len-underflow-subspans.rs @@ -7,5 +7,5 @@ const TWO: usize = 2; fn main() { let a: [i8; ONE - TWO] = unimplemented!(); //~^ ERROR evaluation of constant value failed - //~| attempt to subtract with overflow + //~| attempt to compute `1_usize - 2_usize` which would overflow } diff --git a/src/test/ui/consts/const-len-underflow-subspans.stderr b/src/test/ui/consts/const-len-underflow-subspans.stderr index 63bce1e2c831f..e52e64b25b6de 100644 --- a/src/test/ui/consts/const-len-underflow-subspans.stderr +++ b/src/test/ui/consts/const-len-underflow-subspans.stderr @@ -2,7 +2,7 @@ error[E0080]: evaluation of constant value failed --> $DIR/const-len-underflow-subspans.rs:8:17 | LL | let a: [i8; ONE - TWO] = unimplemented!(); - | ^^^^^^^^^ attempt to subtract with overflow + | ^^^^^^^^^ attempt to compute `1_usize - 2_usize` which would overflow error: aborting due to previous error diff --git a/src/test/ui/consts/const-match-check.eval1.stderr b/src/test/ui/consts/const-match-check.eval1.stderr index 12ba9cacabf7c..eb6b0774e152c 100644 --- a/src/test/ui/consts/const-match-check.eval1.stderr +++ b/src/test/ui/consts/const-match-check.eval1.stderr @@ -1,8 +1,8 @@ -error[E0005]: refutable pattern in local binding: `i32::MIN..=-1i32` and `1i32..=i32::MAX` not covered +error[E0005]: refutable pattern in local binding: `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered --> $DIR/const-match-check.rs:25:15 | LL | A = { let 0 = 0; 0 }, - | ^ patterns `i32::MIN..=-1i32` and `1i32..=i32::MAX` not covered + | ^ patterns `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered | = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html diff --git a/src/test/ui/consts/const-match-check.eval2.stderr b/src/test/ui/consts/const-match-check.eval2.stderr index 2eed7abdc6570..756426d84a479 100644 --- a/src/test/ui/consts/const-match-check.eval2.stderr +++ b/src/test/ui/consts/const-match-check.eval2.stderr @@ -1,8 +1,8 @@ -error[E0005]: refutable pattern in local binding: `i32::MIN..=-1i32` and `1i32..=i32::MAX` not covered +error[E0005]: refutable pattern in local binding: `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered --> $DIR/const-match-check.rs:31:24 | LL | let x: [i32; { let 0 = 0; 0 }] = []; - | ^ patterns `i32::MIN..=-1i32` and `1i32..=i32::MAX` not covered + | ^ patterns `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered | = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html diff --git a/src/test/ui/consts/const-match-check.matchck.stderr b/src/test/ui/consts/const-match-check.matchck.stderr index 1fa0cb17fe66e..84600bb1b8aad 100644 --- a/src/test/ui/consts/const-match-check.matchck.stderr +++ b/src/test/ui/consts/const-match-check.matchck.stderr @@ -1,8 +1,8 @@ -error[E0005]: refutable pattern in local binding: `i32::MIN..=-1i32` and `1i32..=i32::MAX` not covered +error[E0005]: refutable pattern in local binding: `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered --> $DIR/const-match-check.rs:4:22 | LL | const X: i32 = { let 0 = 0; 0 }; - | ^ patterns `i32::MIN..=-1i32` and `1i32..=i32::MAX` not covered + | ^ patterns `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered | = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html @@ -12,11 +12,11 @@ help: you might want to use `if let` to ignore the variant that isn't matched LL | const X: i32 = { if let 0 = 0 { /* */ } 0 }; | ^^^^^^^^^^^^^^^^^^^^^^ -error[E0005]: refutable pattern in local binding: `i32::MIN..=-1i32` and `1i32..=i32::MAX` not covered +error[E0005]: refutable pattern in local binding: `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered --> $DIR/const-match-check.rs:8:23 | LL | static Y: i32 = { let 0 = 0; 0 }; - | ^ patterns `i32::MIN..=-1i32` and `1i32..=i32::MAX` not covered + | ^ patterns `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered | = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html @@ -26,11 +26,11 @@ help: you might want to use `if let` to ignore the variant that isn't matched LL | static Y: i32 = { if let 0 = 0 { /* */ } 0 }; | ^^^^^^^^^^^^^^^^^^^^^^ -error[E0005]: refutable pattern in local binding: `i32::MIN..=-1i32` and `1i32..=i32::MAX` not covered +error[E0005]: refutable pattern in local binding: `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered --> $DIR/const-match-check.rs:13:26 | LL | const X: i32 = { let 0 = 0; 0 }; - | ^ patterns `i32::MIN..=-1i32` and `1i32..=i32::MAX` not covered + | ^ patterns `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered | = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html @@ -40,11 +40,11 @@ help: you might want to use `if let` to ignore the variant that isn't matched LL | const X: i32 = { if let 0 = 0 { /* */ } 0 }; | ^^^^^^^^^^^^^^^^^^^^^^ -error[E0005]: refutable pattern in local binding: `i32::MIN..=-1i32` and `1i32..=i32::MAX` not covered +error[E0005]: refutable pattern in local binding: `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered --> $DIR/const-match-check.rs:19:26 | LL | const X: i32 = { let 0 = 0; 0 }; - | ^ patterns `i32::MIN..=-1i32` and `1i32..=i32::MAX` not covered + | ^ patterns `i32::MIN..=-1_i32` and `1_i32..=i32::MAX` not covered | = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html diff --git a/src/test/ui/consts/const-pattern-irrefutable.rs b/src/test/ui/consts/const-pattern-irrefutable.rs index 65f09eb80098c..2105c12a1680a 100644 --- a/src/test/ui/consts/const-pattern-irrefutable.rs +++ b/src/test/ui/consts/const-pattern-irrefutable.rs @@ -9,8 +9,8 @@ use foo::d; const a: u8 = 2; fn main() { - let a = 4; //~ ERROR refutable pattern in local binding: `0u8..=1u8` and `3u8..=u8::MAX - let c = 4; //~ ERROR refutable pattern in local binding: `0u8..=1u8` and `3u8..=u8::MAX - let d = 4; //~ ERROR refutable pattern in local binding: `0u8..=1u8` and `3u8..=u8::MAX + let a = 4; //~ ERROR refutable pattern in local binding: `0_u8..=1_u8` and `3_u8..=u8::MAX + let c = 4; //~ ERROR refutable pattern in local binding: `0_u8..=1_u8` and `3_u8..=u8::MAX + let d = 4; //~ ERROR refutable pattern in local binding: `0_u8..=1_u8` and `3_u8..=u8::MAX fn f() {} // Check that the `NOTE`s still work with an item here (cf. issue #35115). } diff --git a/src/test/ui/consts/const-pattern-irrefutable.stderr b/src/test/ui/consts/const-pattern-irrefutable.stderr index bb2fdec72ba0d..3e3bc1979a2e0 100644 --- a/src/test/ui/consts/const-pattern-irrefutable.stderr +++ b/src/test/ui/consts/const-pattern-irrefutable.stderr @@ -1,4 +1,4 @@ -error[E0005]: refutable pattern in local binding: `0u8..=1u8` and `3u8..=u8::MAX` not covered +error[E0005]: refutable pattern in local binding: `0_u8..=1_u8` and `3_u8..=u8::MAX` not covered --> $DIR/const-pattern-irrefutable.rs:12:9 | LL | const a: u8 = 2; @@ -12,7 +12,7 @@ LL | let a = 4; | = note: the matched value is of type `u8` -error[E0005]: refutable pattern in local binding: `0u8..=1u8` and `3u8..=u8::MAX` not covered +error[E0005]: refutable pattern in local binding: `0_u8..=1_u8` and `3_u8..=u8::MAX` not covered --> $DIR/const-pattern-irrefutable.rs:13:9 | LL | pub const b: u8 = 2; @@ -26,7 +26,7 @@ LL | let c = 4; | = note: the matched value is of type `u8` -error[E0005]: refutable pattern in local binding: `0u8..=1u8` and `3u8..=u8::MAX` not covered +error[E0005]: refutable pattern in local binding: `0_u8..=1_u8` and `3_u8..=u8::MAX` not covered --> $DIR/const-pattern-irrefutable.rs:14:9 | LL | pub const d: u8 = 2; diff --git a/src/test/ui/consts/offset_from_ub.stderr b/src/test/ui/consts/offset_from_ub.stderr index 92ecea5fdacdd..cde2fe3262692 100644 --- a/src/test/ui/consts/offset_from_ub.stderr +++ b/src/test/ui/consts/offset_from_ub.stderr @@ -45,7 +45,7 @@ error: any use of this value will cause an error LL | intrinsics::ptr_offset_from(self, origin) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | - | exact_div: 1isize cannot be divided by 2isize without remainder + | exact_div: 1_isize cannot be divided by 2_isize without remainder | inside `std::ptr::const_ptr::::offset_from` at $SRC_DIR/libcore/ptr/const_ptr.rs:LL:COL | inside `NOT_MULTIPLE_OF_SIZE` at $DIR/offset_from_ub.rs:31:14 | diff --git a/src/test/ui/error-codes/E0080.rs b/src/test/ui/error-codes/E0080.rs index ac0e7737f43fc..b31cf2ec447e7 100644 --- a/src/test/ui/error-codes/E0080.rs +++ b/src/test/ui/error-codes/E0080.rs @@ -1,6 +1,6 @@ enum Enum { X = (1 << 500), //~ ERROR E0080 - //~| shift left with overflow + //~| attempt to shift left by 500_i32 which would overflow Y = (1 / 0) //~ ERROR E0080 } diff --git a/src/test/ui/error-codes/E0080.stderr b/src/test/ui/error-codes/E0080.stderr index 3113fd2189b4c..3acd15ff6bc9e 100644 --- a/src/test/ui/error-codes/E0080.stderr +++ b/src/test/ui/error-codes/E0080.stderr @@ -2,13 +2,13 @@ error[E0080]: evaluation of constant value failed --> $DIR/E0080.rs:2:9 | LL | X = (1 << 500), - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 500_i32 which would overflow error[E0080]: evaluation of constant value failed --> $DIR/E0080.rs:4:9 | LL | Y = (1 / 0) - | ^^^^^^^ attempt to divide by zero + | ^^^^^^^ attempt to divide 1_isize by zero error: aborting due to 2 previous errors diff --git a/src/test/ui/eval-enum.rs b/src/test/ui/eval-enum.rs index cf49b96143817..4ef06c78069f2 100644 --- a/src/test/ui/eval-enum.rs +++ b/src/test/ui/eval-enum.rs @@ -1,9 +1,9 @@ enum Test { DivZero = 1/0, - //~^ attempt to divide by zero + //~^ attempt to divide 1_isize by zero //~| ERROR evaluation of constant value failed RemZero = 1%0, - //~^ attempt to calculate the remainder with a divisor of zero + //~^ attempt to calculate the remainder of 1_isize with a divisor of zero //~| ERROR evaluation of constant value failed } diff --git a/src/test/ui/eval-enum.stderr b/src/test/ui/eval-enum.stderr index 195eaddb71b37..dd89a2d7c3bfc 100644 --- a/src/test/ui/eval-enum.stderr +++ b/src/test/ui/eval-enum.stderr @@ -2,13 +2,13 @@ error[E0080]: evaluation of constant value failed --> $DIR/eval-enum.rs:2:15 | LL | DivZero = 1/0, - | ^^^ attempt to divide by zero + | ^^^ attempt to divide 1_isize by zero error[E0080]: evaluation of constant value failed --> $DIR/eval-enum.rs:5:15 | LL | RemZero = 1%0, - | ^^^ attempt to calculate the remainder with a divisor of zero + | ^^^ attempt to calculate the remainder of 1_isize with a divisor of zero error: aborting due to 2 previous errors diff --git a/src/test/ui/for/for-loop-refutable-pattern-error-message.stderr b/src/test/ui/for/for-loop-refutable-pattern-error-message.stderr index e32005e21a8e1..20b689aa5e0af 100644 --- a/src/test/ui/for/for-loop-refutable-pattern-error-message.stderr +++ b/src/test/ui/for/for-loop-refutable-pattern-error-message.stderr @@ -1,8 +1,8 @@ -error[E0005]: refutable pattern in `for` loop binding: `&i32::MIN..=0i32` and `&2i32..=i32::MAX` not covered +error[E0005]: refutable pattern in `for` loop binding: `&i32::MIN..=0_i32` and `&2_i32..=i32::MAX` not covered --> $DIR/for-loop-refutable-pattern-error-message.rs:2:9 | LL | for &1 in [1].iter() {} - | ^^ patterns `&i32::MIN..=0i32` and `&2i32..=i32::MAX` not covered + | ^^ patterns `&i32::MIN..=0_i32` and `&2_i32..=i32::MAX` not covered | = note: the matched value is of type `&i32` diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.stderr b/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.stderr index 028bfb89312fc..5744232235dd1 100644 --- a/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.stderr +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.stderr @@ -79,20 +79,20 @@ LL | m!(0, ..core::u8::MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u8` -error[E0004]: non-exhaustive patterns: `254u8..=u8::MAX` not covered +error[E0004]: non-exhaustive patterns: `254_u8..=u8::MAX` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:42:12 | LL | m!(0, ..ALMOST_MAX); - | ^ pattern `254u8..=u8::MAX` not covered + | ^ pattern `254_u8..=u8::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u8` -error[E0004]: non-exhaustive patterns: `0u8` not covered +error[E0004]: non-exhaustive patterns: `0_u8` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:43:12 | LL | m!(0, ALMOST_MIN..); - | ^ pattern `0u8` not covered + | ^ pattern `0_u8` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u8` @@ -106,20 +106,20 @@ LL | m!(0, ..=ALMOST_MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u8` -error[E0004]: non-exhaustive patterns: `43u8` not covered +error[E0004]: non-exhaustive patterns: `43_u8` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:45:12 | LL | m!(0, ..=VAL | VAL_2..); - | ^ pattern `43u8` not covered + | ^ pattern `43_u8` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u8` -error[E0004]: non-exhaustive patterns: `43u8` not covered +error[E0004]: non-exhaustive patterns: `43_u8` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:46:12 | LL | m!(0, ..VAL_1 | VAL_2..); - | ^ pattern `43u8` not covered + | ^ pattern `43_u8` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u8` @@ -133,20 +133,20 @@ LL | m!(0, ..core::u16::MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u16` -error[E0004]: non-exhaustive patterns: `65534u16..=u16::MAX` not covered +error[E0004]: non-exhaustive patterns: `65534_u16..=u16::MAX` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:55:12 | LL | m!(0, ..ALMOST_MAX); - | ^ pattern `65534u16..=u16::MAX` not covered + | ^ pattern `65534_u16..=u16::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u16` -error[E0004]: non-exhaustive patterns: `0u16` not covered +error[E0004]: non-exhaustive patterns: `0_u16` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:56:12 | LL | m!(0, ALMOST_MIN..); - | ^ pattern `0u16` not covered + | ^ pattern `0_u16` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u16` @@ -160,20 +160,20 @@ LL | m!(0, ..=ALMOST_MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u16` -error[E0004]: non-exhaustive patterns: `43u16` not covered +error[E0004]: non-exhaustive patterns: `43_u16` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:58:12 | LL | m!(0, ..=VAL | VAL_2..); - | ^ pattern `43u16` not covered + | ^ pattern `43_u16` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u16` -error[E0004]: non-exhaustive patterns: `43u16` not covered +error[E0004]: non-exhaustive patterns: `43_u16` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:59:12 | LL | m!(0, ..VAL_1 | VAL_2..); - | ^ pattern `43u16` not covered + | ^ pattern `43_u16` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u16` @@ -187,20 +187,20 @@ LL | m!(0, ..core::u32::MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u32` -error[E0004]: non-exhaustive patterns: `4294967294u32..=u32::MAX` not covered +error[E0004]: non-exhaustive patterns: `4294967294_u32..=u32::MAX` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:68:12 | LL | m!(0, ..ALMOST_MAX); - | ^ pattern `4294967294u32..=u32::MAX` not covered + | ^ pattern `4294967294_u32..=u32::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u32` -error[E0004]: non-exhaustive patterns: `0u32` not covered +error[E0004]: non-exhaustive patterns: `0_u32` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:69:12 | LL | m!(0, ALMOST_MIN..); - | ^ pattern `0u32` not covered + | ^ pattern `0_u32` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u32` @@ -214,20 +214,20 @@ LL | m!(0, ..=ALMOST_MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u32` -error[E0004]: non-exhaustive patterns: `43u32` not covered +error[E0004]: non-exhaustive patterns: `43_u32` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:71:12 | LL | m!(0, ..=VAL | VAL_2..); - | ^ pattern `43u32` not covered + | ^ pattern `43_u32` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u32` -error[E0004]: non-exhaustive patterns: `43u32` not covered +error[E0004]: non-exhaustive patterns: `43_u32` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:72:12 | LL | m!(0, ..VAL_1 | VAL_2..); - | ^ pattern `43u32` not covered + | ^ pattern `43_u32` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u32` @@ -241,20 +241,20 @@ LL | m!(0, ..core::u64::MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u64` -error[E0004]: non-exhaustive patterns: `18446744073709551614u64..=u64::MAX` not covered +error[E0004]: non-exhaustive patterns: `18446744073709551614_u64..=u64::MAX` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:81:12 | LL | m!(0, ..ALMOST_MAX); - | ^ pattern `18446744073709551614u64..=u64::MAX` not covered + | ^ pattern `18446744073709551614_u64..=u64::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u64` -error[E0004]: non-exhaustive patterns: `0u64` not covered +error[E0004]: non-exhaustive patterns: `0_u64` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:82:12 | LL | m!(0, ALMOST_MIN..); - | ^ pattern `0u64` not covered + | ^ pattern `0_u64` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u64` @@ -268,20 +268,20 @@ LL | m!(0, ..=ALMOST_MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u64` -error[E0004]: non-exhaustive patterns: `43u64` not covered +error[E0004]: non-exhaustive patterns: `43_u64` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:84:12 | LL | m!(0, ..=VAL | VAL_2..); - | ^ pattern `43u64` not covered + | ^ pattern `43_u64` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u64` -error[E0004]: non-exhaustive patterns: `43u64` not covered +error[E0004]: non-exhaustive patterns: `43_u64` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:85:12 | LL | m!(0, ..VAL_1 | VAL_2..); - | ^ pattern `43u64` not covered + | ^ pattern `43_u64` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u64` @@ -295,20 +295,20 @@ LL | m!(0, ..core::u128::MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u128` -error[E0004]: non-exhaustive patterns: `340282366920938463463374607431768211454u128..=u128::MAX` not covered +error[E0004]: non-exhaustive patterns: `340282366920938463463374607431768211454_u128..=u128::MAX` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:94:12 | LL | m!(0, ..ALMOST_MAX); - | ^ pattern `340282366920938463463374607431768211454u128..=u128::MAX` not covered + | ^ pattern `340282366920938463463374607431768211454_u128..=u128::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u128` -error[E0004]: non-exhaustive patterns: `0u128` not covered +error[E0004]: non-exhaustive patterns: `0_u128` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:95:12 | LL | m!(0, ALMOST_MIN..); - | ^ pattern `0u128` not covered + | ^ pattern `0_u128` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u128` @@ -322,20 +322,20 @@ LL | m!(0, ..=ALMOST_MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u128` -error[E0004]: non-exhaustive patterns: `43u128` not covered +error[E0004]: non-exhaustive patterns: `43_u128` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:97:12 | LL | m!(0, ..=VAL | VAL_2..); - | ^ pattern `43u128` not covered + | ^ pattern `43_u128` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u128` -error[E0004]: non-exhaustive patterns: `43u128` not covered +error[E0004]: non-exhaustive patterns: `43_u128` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:98:12 | LL | m!(0, ..VAL_1 | VAL_2..); - | ^ pattern `43u128` not covered + | ^ pattern `43_u128` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u128` @@ -349,11 +349,11 @@ LL | m!(0, ..core::i8::MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i8` -error[E0004]: non-exhaustive patterns: `126i8..=i8::MAX` not covered +error[E0004]: non-exhaustive patterns: `126_i8..=i8::MAX` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:110:12 | LL | m!(0, ..ALMOST_MAX); - | ^ pattern `126i8..=i8::MAX` not covered + | ^ pattern `126_i8..=i8::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i8` @@ -376,20 +376,20 @@ LL | m!(0, ..=ALMOST_MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i8` -error[E0004]: non-exhaustive patterns: `43i8` not covered +error[E0004]: non-exhaustive patterns: `43_i8` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:113:12 | LL | m!(0, ..=VAL | VAL_2..); - | ^ pattern `43i8` not covered + | ^ pattern `43_i8` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i8` -error[E0004]: non-exhaustive patterns: `43i8` not covered +error[E0004]: non-exhaustive patterns: `43_i8` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:114:12 | LL | m!(0, ..VAL_1 | VAL_2..); - | ^ pattern `43i8` not covered + | ^ pattern `43_i8` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i8` @@ -403,11 +403,11 @@ LL | m!(0, ..core::i16::MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i16` -error[E0004]: non-exhaustive patterns: `32766i16..=i16::MAX` not covered +error[E0004]: non-exhaustive patterns: `32766_i16..=i16::MAX` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:123:12 | LL | m!(0, ..ALMOST_MAX); - | ^ pattern `32766i16..=i16::MAX` not covered + | ^ pattern `32766_i16..=i16::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i16` @@ -430,20 +430,20 @@ LL | m!(0, ..=ALMOST_MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i16` -error[E0004]: non-exhaustive patterns: `43i16` not covered +error[E0004]: non-exhaustive patterns: `43_i16` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:126:12 | LL | m!(0, ..=VAL | VAL_2..); - | ^ pattern `43i16` not covered + | ^ pattern `43_i16` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i16` -error[E0004]: non-exhaustive patterns: `43i16` not covered +error[E0004]: non-exhaustive patterns: `43_i16` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:127:12 | LL | m!(0, ..VAL_1 | VAL_2..); - | ^ pattern `43i16` not covered + | ^ pattern `43_i16` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i16` @@ -457,11 +457,11 @@ LL | m!(0, ..core::i32::MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i32` -error[E0004]: non-exhaustive patterns: `2147483646i32..=i32::MAX` not covered +error[E0004]: non-exhaustive patterns: `2147483646_i32..=i32::MAX` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:136:12 | LL | m!(0, ..ALMOST_MAX); - | ^ pattern `2147483646i32..=i32::MAX` not covered + | ^ pattern `2147483646_i32..=i32::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i32` @@ -484,20 +484,20 @@ LL | m!(0, ..=ALMOST_MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i32` -error[E0004]: non-exhaustive patterns: `43i32` not covered +error[E0004]: non-exhaustive patterns: `43_i32` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:139:12 | LL | m!(0, ..=VAL | VAL_2..); - | ^ pattern `43i32` not covered + | ^ pattern `43_i32` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i32` -error[E0004]: non-exhaustive patterns: `43i32` not covered +error[E0004]: non-exhaustive patterns: `43_i32` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:140:12 | LL | m!(0, ..VAL_1 | VAL_2..); - | ^ pattern `43i32` not covered + | ^ pattern `43_i32` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i32` @@ -511,11 +511,11 @@ LL | m!(0, ..core::i64::MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i64` -error[E0004]: non-exhaustive patterns: `9223372036854775806i64..=i64::MAX` not covered +error[E0004]: non-exhaustive patterns: `9223372036854775806_i64..=i64::MAX` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:149:12 | LL | m!(0, ..ALMOST_MAX); - | ^ pattern `9223372036854775806i64..=i64::MAX` not covered + | ^ pattern `9223372036854775806_i64..=i64::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i64` @@ -538,20 +538,20 @@ LL | m!(0, ..=ALMOST_MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i64` -error[E0004]: non-exhaustive patterns: `43i64` not covered +error[E0004]: non-exhaustive patterns: `43_i64` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:152:12 | LL | m!(0, ..=VAL | VAL_2..); - | ^ pattern `43i64` not covered + | ^ pattern `43_i64` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i64` -error[E0004]: non-exhaustive patterns: `43i64` not covered +error[E0004]: non-exhaustive patterns: `43_i64` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:153:12 | LL | m!(0, ..VAL_1 | VAL_2..); - | ^ pattern `43i64` not covered + | ^ pattern `43_i64` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i64` @@ -565,11 +565,11 @@ LL | m!(0, ..core::i128::MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i128` -error[E0004]: non-exhaustive patterns: `170141183460469231731687303715884105726i128..=i128::MAX` not covered +error[E0004]: non-exhaustive patterns: `170141183460469231731687303715884105726_i128..=i128::MAX` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:162:12 | LL | m!(0, ..ALMOST_MAX); - | ^ pattern `170141183460469231731687303715884105726i128..=i128::MAX` not covered + | ^ pattern `170141183460469231731687303715884105726_i128..=i128::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i128` @@ -592,20 +592,20 @@ LL | m!(0, ..=ALMOST_MAX); = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i128` -error[E0004]: non-exhaustive patterns: `43i128` not covered +error[E0004]: non-exhaustive patterns: `43_i128` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:165:12 | LL | m!(0, ..=VAL | VAL_2..); - | ^ pattern `43i128` not covered + | ^ pattern `43_i128` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i128` -error[E0004]: non-exhaustive patterns: `43i128` not covered +error[E0004]: non-exhaustive patterns: `43_i128` not covered --> $DIR/half-open-range-pats-exhaustive-fail.rs:166:12 | LL | m!(0, ..VAL_1 | VAL_2..); - | ^ pattern `43i128` not covered + | ^ pattern `43_i128` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i128` diff --git a/src/test/ui/issues/issue-8460-const.noopt.stderr b/src/test/ui/issues/issue-8460-const.noopt.stderr index 3556ec08247b5..eb8d66790ccea 100644 --- a/src/test/ui/issues/issue-8460-const.noopt.stderr +++ b/src/test/ui/issues/issue-8460-const.noopt.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:14:36 | LL | assert!(thread::spawn(move|| { isize::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^^^ attempt to compute `isize::MIN / -1_isize` which would overflow | = note: `#[deny(arithmetic_overflow)]` on by default @@ -10,37 +10,37 @@ error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:16:36 | LL | assert!(thread::spawn(move|| { i8::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^ attempt to compute `i8::MIN / -1_i8` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:18:36 | LL | assert!(thread::spawn(move|| { i16::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^ attempt to compute `i16::MIN / -1_i16` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:20:36 | LL | assert!(thread::spawn(move|| { i32::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^ attempt to compute `i32::MIN / -1_i32` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:22:36 | LL | assert!(thread::spawn(move|| { i64::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^ attempt to compute `i64::MIN / -1_i64` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:24:36 | LL | assert!(thread::spawn(move|| { i128::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^^ attempt to compute `i128::MIN / -1_i128` which would overflow error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:26:36 | LL | assert!(thread::spawn(move|| { 1isize / 0; }).join().is_err()); - | ^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^ attempt to divide 1_isize by zero | = note: `#[deny(unconditional_panic)]` on by default @@ -48,103 +48,103 @@ error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:28:36 | LL | assert!(thread::spawn(move|| { 1i8 / 0; }).join().is_err()); - | ^^^^^^^ attempt to divide by zero + | ^^^^^^^ attempt to divide 1_i8 by zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:30:36 | LL | assert!(thread::spawn(move|| { 1i16 / 0; }).join().is_err()); - | ^^^^^^^^ attempt to divide by zero + | ^^^^^^^^ attempt to divide 1_i16 by zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:32:36 | LL | assert!(thread::spawn(move|| { 1i32 / 0; }).join().is_err()); - | ^^^^^^^^ attempt to divide by zero + | ^^^^^^^^ attempt to divide 1_i32 by zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:34:36 | LL | assert!(thread::spawn(move|| { 1i64 / 0; }).join().is_err()); - | ^^^^^^^^ attempt to divide by zero + | ^^^^^^^^ attempt to divide 1_i64 by zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:36:36 | LL | assert!(thread::spawn(move|| { 1i128 / 0; }).join().is_err()); - | ^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^ attempt to divide 1_i128 by zero error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:38:36 | LL | assert!(thread::spawn(move|| { isize::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^^^ attempt to compute the remainder of `isize::MIN % -1_isize` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:40:36 | LL | assert!(thread::spawn(move|| { i8::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^ attempt to compute the remainder of `i8::MIN % -1_i8` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:42:36 | LL | assert!(thread::spawn(move|| { i16::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^ attempt to compute the remainder of `i16::MIN % -1_i16` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:44:36 | LL | assert!(thread::spawn(move|| { i32::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^ attempt to compute the remainder of `i32::MIN % -1_i32` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:46:36 | LL | assert!(thread::spawn(move|| { i64::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^ attempt to compute the remainder of `i64::MIN % -1_i64` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:48:36 | LL | assert!(thread::spawn(move|| { i128::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^^ attempt to compute the remainder of `i128::MIN % -1_i128` which would overflow error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:50:36 | LL | assert!(thread::spawn(move|| { 1isize % 0; }).join().is_err()); - | ^^^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^^^ attempt to calculate the remainder of 1_isize with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:52:36 | LL | assert!(thread::spawn(move|| { 1i8 % 0; }).join().is_err()); - | ^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^ attempt to calculate the remainder of 1_i8 with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:54:36 | LL | assert!(thread::spawn(move|| { 1i16 % 0; }).join().is_err()); - | ^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^ attempt to calculate the remainder of 1_i16 with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:56:36 | LL | assert!(thread::spawn(move|| { 1i32 % 0; }).join().is_err()); - | ^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^ attempt to calculate the remainder of 1_i32 with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:58:36 | LL | assert!(thread::spawn(move|| { 1i64 % 0; }).join().is_err()); - | ^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^ attempt to calculate the remainder of 1_i64 with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:60:36 | LL | assert!(thread::spawn(move|| { 1i128 % 0; }).join().is_err()); - | ^^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^^ attempt to calculate the remainder of 1_i128 with a divisor of zero error: aborting due to 24 previous errors diff --git a/src/test/ui/issues/issue-8460-const.opt.stderr b/src/test/ui/issues/issue-8460-const.opt.stderr index 3556ec08247b5..eb8d66790ccea 100644 --- a/src/test/ui/issues/issue-8460-const.opt.stderr +++ b/src/test/ui/issues/issue-8460-const.opt.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:14:36 | LL | assert!(thread::spawn(move|| { isize::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^^^ attempt to compute `isize::MIN / -1_isize` which would overflow | = note: `#[deny(arithmetic_overflow)]` on by default @@ -10,37 +10,37 @@ error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:16:36 | LL | assert!(thread::spawn(move|| { i8::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^ attempt to compute `i8::MIN / -1_i8` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:18:36 | LL | assert!(thread::spawn(move|| { i16::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^ attempt to compute `i16::MIN / -1_i16` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:20:36 | LL | assert!(thread::spawn(move|| { i32::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^ attempt to compute `i32::MIN / -1_i32` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:22:36 | LL | assert!(thread::spawn(move|| { i64::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^ attempt to compute `i64::MIN / -1_i64` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:24:36 | LL | assert!(thread::spawn(move|| { i128::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^^ attempt to compute `i128::MIN / -1_i128` which would overflow error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:26:36 | LL | assert!(thread::spawn(move|| { 1isize / 0; }).join().is_err()); - | ^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^ attempt to divide 1_isize by zero | = note: `#[deny(unconditional_panic)]` on by default @@ -48,103 +48,103 @@ error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:28:36 | LL | assert!(thread::spawn(move|| { 1i8 / 0; }).join().is_err()); - | ^^^^^^^ attempt to divide by zero + | ^^^^^^^ attempt to divide 1_i8 by zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:30:36 | LL | assert!(thread::spawn(move|| { 1i16 / 0; }).join().is_err()); - | ^^^^^^^^ attempt to divide by zero + | ^^^^^^^^ attempt to divide 1_i16 by zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:32:36 | LL | assert!(thread::spawn(move|| { 1i32 / 0; }).join().is_err()); - | ^^^^^^^^ attempt to divide by zero + | ^^^^^^^^ attempt to divide 1_i32 by zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:34:36 | LL | assert!(thread::spawn(move|| { 1i64 / 0; }).join().is_err()); - | ^^^^^^^^ attempt to divide by zero + | ^^^^^^^^ attempt to divide 1_i64 by zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:36:36 | LL | assert!(thread::spawn(move|| { 1i128 / 0; }).join().is_err()); - | ^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^ attempt to divide 1_i128 by zero error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:38:36 | LL | assert!(thread::spawn(move|| { isize::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^^^ attempt to compute the remainder of `isize::MIN % -1_isize` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:40:36 | LL | assert!(thread::spawn(move|| { i8::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^ attempt to compute the remainder of `i8::MIN % -1_i8` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:42:36 | LL | assert!(thread::spawn(move|| { i16::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^ attempt to compute the remainder of `i16::MIN % -1_i16` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:44:36 | LL | assert!(thread::spawn(move|| { i32::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^ attempt to compute the remainder of `i32::MIN % -1_i32` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:46:36 | LL | assert!(thread::spawn(move|| { i64::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^ attempt to compute the remainder of `i64::MIN % -1_i64` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:48:36 | LL | assert!(thread::spawn(move|| { i128::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^^ attempt to compute the remainder of `i128::MIN % -1_i128` which would overflow error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:50:36 | LL | assert!(thread::spawn(move|| { 1isize % 0; }).join().is_err()); - | ^^^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^^^ attempt to calculate the remainder of 1_isize with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:52:36 | LL | assert!(thread::spawn(move|| { 1i8 % 0; }).join().is_err()); - | ^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^ attempt to calculate the remainder of 1_i8 with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:54:36 | LL | assert!(thread::spawn(move|| { 1i16 % 0; }).join().is_err()); - | ^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^ attempt to calculate the remainder of 1_i16 with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:56:36 | LL | assert!(thread::spawn(move|| { 1i32 % 0; }).join().is_err()); - | ^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^ attempt to calculate the remainder of 1_i32 with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:58:36 | LL | assert!(thread::spawn(move|| { 1i64 % 0; }).join().is_err()); - | ^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^ attempt to calculate the remainder of 1_i64 with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:60:36 | LL | assert!(thread::spawn(move|| { 1i128 % 0; }).join().is_err()); - | ^^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^^ attempt to calculate the remainder of 1_i128 with a divisor of zero error: aborting due to 24 previous errors diff --git a/src/test/ui/issues/issue-8460-const.opt_with_overflow_checks.stderr b/src/test/ui/issues/issue-8460-const.opt_with_overflow_checks.stderr index 3556ec08247b5..eb8d66790ccea 100644 --- a/src/test/ui/issues/issue-8460-const.opt_with_overflow_checks.stderr +++ b/src/test/ui/issues/issue-8460-const.opt_with_overflow_checks.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:14:36 | LL | assert!(thread::spawn(move|| { isize::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^^^ attempt to compute `isize::MIN / -1_isize` which would overflow | = note: `#[deny(arithmetic_overflow)]` on by default @@ -10,37 +10,37 @@ error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:16:36 | LL | assert!(thread::spawn(move|| { i8::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^ attempt to compute `i8::MIN / -1_i8` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:18:36 | LL | assert!(thread::spawn(move|| { i16::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^ attempt to compute `i16::MIN / -1_i16` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:20:36 | LL | assert!(thread::spawn(move|| { i32::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^ attempt to compute `i32::MIN / -1_i32` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:22:36 | LL | assert!(thread::spawn(move|| { i64::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^ attempt to compute `i64::MIN / -1_i64` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:24:36 | LL | assert!(thread::spawn(move|| { i128::MIN / -1; }).join().is_err()); - | ^^^^^^^^^^^^^^ attempt to divide with overflow + | ^^^^^^^^^^^^^^ attempt to compute `i128::MIN / -1_i128` which would overflow error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:26:36 | LL | assert!(thread::spawn(move|| { 1isize / 0; }).join().is_err()); - | ^^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^^ attempt to divide 1_isize by zero | = note: `#[deny(unconditional_panic)]` on by default @@ -48,103 +48,103 @@ error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:28:36 | LL | assert!(thread::spawn(move|| { 1i8 / 0; }).join().is_err()); - | ^^^^^^^ attempt to divide by zero + | ^^^^^^^ attempt to divide 1_i8 by zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:30:36 | LL | assert!(thread::spawn(move|| { 1i16 / 0; }).join().is_err()); - | ^^^^^^^^ attempt to divide by zero + | ^^^^^^^^ attempt to divide 1_i16 by zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:32:36 | LL | assert!(thread::spawn(move|| { 1i32 / 0; }).join().is_err()); - | ^^^^^^^^ attempt to divide by zero + | ^^^^^^^^ attempt to divide 1_i32 by zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:34:36 | LL | assert!(thread::spawn(move|| { 1i64 / 0; }).join().is_err()); - | ^^^^^^^^ attempt to divide by zero + | ^^^^^^^^ attempt to divide 1_i64 by zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:36:36 | LL | assert!(thread::spawn(move|| { 1i128 / 0; }).join().is_err()); - | ^^^^^^^^^ attempt to divide by zero + | ^^^^^^^^^ attempt to divide 1_i128 by zero error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:38:36 | LL | assert!(thread::spawn(move|| { isize::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^^^ attempt to compute the remainder of `isize::MIN % -1_isize` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:40:36 | LL | assert!(thread::spawn(move|| { i8::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^ attempt to compute the remainder of `i8::MIN % -1_i8` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:42:36 | LL | assert!(thread::spawn(move|| { i16::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^ attempt to compute the remainder of `i16::MIN % -1_i16` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:44:36 | LL | assert!(thread::spawn(move|| { i32::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^ attempt to compute the remainder of `i32::MIN % -1_i32` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:46:36 | LL | assert!(thread::spawn(move|| { i64::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^ attempt to compute the remainder of `i64::MIN % -1_i64` which would overflow error: this arithmetic operation will overflow --> $DIR/issue-8460-const.rs:48:36 | LL | assert!(thread::spawn(move|| { i128::MIN % -1; }).join().is_err()); - | ^^^^^^^^^^^^^^ attempt to calculate the remainder with overflow + | ^^^^^^^^^^^^^^ attempt to compute the remainder of `i128::MIN % -1_i128` which would overflow error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:50:36 | LL | assert!(thread::spawn(move|| { 1isize % 0; }).join().is_err()); - | ^^^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^^^ attempt to calculate the remainder of 1_isize with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:52:36 | LL | assert!(thread::spawn(move|| { 1i8 % 0; }).join().is_err()); - | ^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^ attempt to calculate the remainder of 1_i8 with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:54:36 | LL | assert!(thread::spawn(move|| { 1i16 % 0; }).join().is_err()); - | ^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^ attempt to calculate the remainder of 1_i16 with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:56:36 | LL | assert!(thread::spawn(move|| { 1i32 % 0; }).join().is_err()); - | ^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^ attempt to calculate the remainder of 1_i32 with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:58:36 | LL | assert!(thread::spawn(move|| { 1i64 % 0; }).join().is_err()); - | ^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^ attempt to calculate the remainder of 1_i64 with a divisor of zero error: this operation will panic at runtime --> $DIR/issue-8460-const.rs:60:36 | LL | assert!(thread::spawn(move|| { 1i128 % 0; }).join().is_err()); - | ^^^^^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^^^^^ attempt to calculate the remainder of 1_i128 with a divisor of zero error: aborting due to 24 previous errors diff --git a/src/test/ui/lint/lint-exceeding-bitshifts.noopt.stderr b/src/test/ui/lint/lint-exceeding-bitshifts.noopt.stderr index 8dbfeff7972fb..d33b99bdc4387 100644 --- a/src/test/ui/lint/lint-exceeding-bitshifts.noopt.stderr +++ b/src/test/ui/lint/lint-exceeding-bitshifts.noopt.stderr @@ -1,152 +1,152 @@ warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:17:20 + --> $DIR/lint-exceeding-bitshifts.rs:18:20 | LL | const N: i32 = T::N << 42; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 42_i32 which would overflow | note: the lint level is defined here - --> $DIR/lint-exceeding-bitshifts.rs:9:9 + --> $DIR/lint-exceeding-bitshifts.rs:10:9 | LL | #![warn(arithmetic_overflow, const_err)] | ^^^^^^^^^^^^^^^^^^^ warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:21:13 + --> $DIR/lint-exceeding-bitshifts.rs:22:13 | LL | let _ = x << 42; - | ^^^^^^^ attempt to shift left with overflow + | ^^^^^^^ attempt to shift left by 42_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:26:15 + --> $DIR/lint-exceeding-bitshifts.rs:27:15 | LL | let n = 1u8 << 8; - | ^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^ attempt to shift left by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:28:15 + --> $DIR/lint-exceeding-bitshifts.rs:29:15 | LL | let n = 1u16 << 16; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 16_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:30:15 + --> $DIR/lint-exceeding-bitshifts.rs:31:15 | LL | let n = 1u32 << 32; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 32_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:32:15 + --> $DIR/lint-exceeding-bitshifts.rs:33:15 | LL | let n = 1u64 << 64; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:34:15 + --> $DIR/lint-exceeding-bitshifts.rs:35:15 | LL | let n = 1i8 << 8; - | ^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^ attempt to shift left by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:36:15 + --> $DIR/lint-exceeding-bitshifts.rs:37:15 | LL | let n = 1i16 << 16; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 16_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:38:15 + --> $DIR/lint-exceeding-bitshifts.rs:39:15 | LL | let n = 1i32 << 32; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 32_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:40:15 + --> $DIR/lint-exceeding-bitshifts.rs:41:15 | LL | let n = 1i64 << 64; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:43:15 + --> $DIR/lint-exceeding-bitshifts.rs:44:15 | LL | let n = 1u8 >> 8; - | ^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^ attempt to shift right by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:45:15 + --> $DIR/lint-exceeding-bitshifts.rs:46:15 | LL | let n = 1u16 >> 16; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 16_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:47:15 + --> $DIR/lint-exceeding-bitshifts.rs:48:15 | LL | let n = 1u32 >> 32; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 32_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:49:15 + --> $DIR/lint-exceeding-bitshifts.rs:50:15 | LL | let n = 1u64 >> 64; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:51:15 + --> $DIR/lint-exceeding-bitshifts.rs:52:15 | LL | let n = 1i8 >> 8; - | ^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^ attempt to shift right by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:53:15 + --> $DIR/lint-exceeding-bitshifts.rs:54:15 | LL | let n = 1i16 >> 16; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 16_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:55:15 + --> $DIR/lint-exceeding-bitshifts.rs:56:15 | LL | let n = 1i32 >> 32; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 32_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:57:15 + --> $DIR/lint-exceeding-bitshifts.rs:58:15 | LL | let n = 1i64 >> 64; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:61:15 + --> $DIR/lint-exceeding-bitshifts.rs:62:15 | LL | let n = n << 8; - | ^^^^^^ attempt to shift left with overflow + | ^^^^^^ attempt to shift left by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:63:15 + --> $DIR/lint-exceeding-bitshifts.rs:64:15 | LL | let n = 1u8 << -8; - | ^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^ attempt to shift left by -8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:68:15 + --> $DIR/lint-exceeding-bitshifts.rs:69:15 | LL | let n = 1u8 << (4+4); - | ^^^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^^^ attempt to shift left by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:70:15 + --> $DIR/lint-exceeding-bitshifts.rs:71:15 | LL | let n = 1i64 >> [64][0]; - | ^^^^^^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^^^^^^ attempt to shift right by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:76:15 + --> $DIR/lint-exceeding-bitshifts.rs:77:15 | LL | let n = 1_isize << BITS; - | ^^^^^^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^^^^^^ attempt to shift left by %BITS% which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:77:15 + --> $DIR/lint-exceeding-bitshifts.rs:78:15 | LL | let n = 1_usize << BITS; - | ^^^^^^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^^^^^^ attempt to shift left by %BITS% which would overflow warning: 24 warnings emitted diff --git a/src/test/ui/lint/lint-exceeding-bitshifts.opt.stderr b/src/test/ui/lint/lint-exceeding-bitshifts.opt.stderr index 8dbfeff7972fb..d33b99bdc4387 100644 --- a/src/test/ui/lint/lint-exceeding-bitshifts.opt.stderr +++ b/src/test/ui/lint/lint-exceeding-bitshifts.opt.stderr @@ -1,152 +1,152 @@ warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:17:20 + --> $DIR/lint-exceeding-bitshifts.rs:18:20 | LL | const N: i32 = T::N << 42; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 42_i32 which would overflow | note: the lint level is defined here - --> $DIR/lint-exceeding-bitshifts.rs:9:9 + --> $DIR/lint-exceeding-bitshifts.rs:10:9 | LL | #![warn(arithmetic_overflow, const_err)] | ^^^^^^^^^^^^^^^^^^^ warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:21:13 + --> $DIR/lint-exceeding-bitshifts.rs:22:13 | LL | let _ = x << 42; - | ^^^^^^^ attempt to shift left with overflow + | ^^^^^^^ attempt to shift left by 42_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:26:15 + --> $DIR/lint-exceeding-bitshifts.rs:27:15 | LL | let n = 1u8 << 8; - | ^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^ attempt to shift left by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:28:15 + --> $DIR/lint-exceeding-bitshifts.rs:29:15 | LL | let n = 1u16 << 16; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 16_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:30:15 + --> $DIR/lint-exceeding-bitshifts.rs:31:15 | LL | let n = 1u32 << 32; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 32_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:32:15 + --> $DIR/lint-exceeding-bitshifts.rs:33:15 | LL | let n = 1u64 << 64; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:34:15 + --> $DIR/lint-exceeding-bitshifts.rs:35:15 | LL | let n = 1i8 << 8; - | ^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^ attempt to shift left by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:36:15 + --> $DIR/lint-exceeding-bitshifts.rs:37:15 | LL | let n = 1i16 << 16; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 16_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:38:15 + --> $DIR/lint-exceeding-bitshifts.rs:39:15 | LL | let n = 1i32 << 32; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 32_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:40:15 + --> $DIR/lint-exceeding-bitshifts.rs:41:15 | LL | let n = 1i64 << 64; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:43:15 + --> $DIR/lint-exceeding-bitshifts.rs:44:15 | LL | let n = 1u8 >> 8; - | ^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^ attempt to shift right by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:45:15 + --> $DIR/lint-exceeding-bitshifts.rs:46:15 | LL | let n = 1u16 >> 16; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 16_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:47:15 + --> $DIR/lint-exceeding-bitshifts.rs:48:15 | LL | let n = 1u32 >> 32; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 32_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:49:15 + --> $DIR/lint-exceeding-bitshifts.rs:50:15 | LL | let n = 1u64 >> 64; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:51:15 + --> $DIR/lint-exceeding-bitshifts.rs:52:15 | LL | let n = 1i8 >> 8; - | ^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^ attempt to shift right by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:53:15 + --> $DIR/lint-exceeding-bitshifts.rs:54:15 | LL | let n = 1i16 >> 16; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 16_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:55:15 + --> $DIR/lint-exceeding-bitshifts.rs:56:15 | LL | let n = 1i32 >> 32; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 32_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:57:15 + --> $DIR/lint-exceeding-bitshifts.rs:58:15 | LL | let n = 1i64 >> 64; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:61:15 + --> $DIR/lint-exceeding-bitshifts.rs:62:15 | LL | let n = n << 8; - | ^^^^^^ attempt to shift left with overflow + | ^^^^^^ attempt to shift left by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:63:15 + --> $DIR/lint-exceeding-bitshifts.rs:64:15 | LL | let n = 1u8 << -8; - | ^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^ attempt to shift left by -8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:68:15 + --> $DIR/lint-exceeding-bitshifts.rs:69:15 | LL | let n = 1u8 << (4+4); - | ^^^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^^^ attempt to shift left by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:70:15 + --> $DIR/lint-exceeding-bitshifts.rs:71:15 | LL | let n = 1i64 >> [64][0]; - | ^^^^^^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^^^^^^ attempt to shift right by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:76:15 + --> $DIR/lint-exceeding-bitshifts.rs:77:15 | LL | let n = 1_isize << BITS; - | ^^^^^^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^^^^^^ attempt to shift left by %BITS% which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:77:15 + --> $DIR/lint-exceeding-bitshifts.rs:78:15 | LL | let n = 1_usize << BITS; - | ^^^^^^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^^^^^^ attempt to shift left by %BITS% which would overflow warning: 24 warnings emitted diff --git a/src/test/ui/lint/lint-exceeding-bitshifts.opt_with_overflow_checks.stderr b/src/test/ui/lint/lint-exceeding-bitshifts.opt_with_overflow_checks.stderr index 8dbfeff7972fb..d33b99bdc4387 100644 --- a/src/test/ui/lint/lint-exceeding-bitshifts.opt_with_overflow_checks.stderr +++ b/src/test/ui/lint/lint-exceeding-bitshifts.opt_with_overflow_checks.stderr @@ -1,152 +1,152 @@ warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:17:20 + --> $DIR/lint-exceeding-bitshifts.rs:18:20 | LL | const N: i32 = T::N << 42; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 42_i32 which would overflow | note: the lint level is defined here - --> $DIR/lint-exceeding-bitshifts.rs:9:9 + --> $DIR/lint-exceeding-bitshifts.rs:10:9 | LL | #![warn(arithmetic_overflow, const_err)] | ^^^^^^^^^^^^^^^^^^^ warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:21:13 + --> $DIR/lint-exceeding-bitshifts.rs:22:13 | LL | let _ = x << 42; - | ^^^^^^^ attempt to shift left with overflow + | ^^^^^^^ attempt to shift left by 42_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:26:15 + --> $DIR/lint-exceeding-bitshifts.rs:27:15 | LL | let n = 1u8 << 8; - | ^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^ attempt to shift left by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:28:15 + --> $DIR/lint-exceeding-bitshifts.rs:29:15 | LL | let n = 1u16 << 16; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 16_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:30:15 + --> $DIR/lint-exceeding-bitshifts.rs:31:15 | LL | let n = 1u32 << 32; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 32_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:32:15 + --> $DIR/lint-exceeding-bitshifts.rs:33:15 | LL | let n = 1u64 << 64; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:34:15 + --> $DIR/lint-exceeding-bitshifts.rs:35:15 | LL | let n = 1i8 << 8; - | ^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^ attempt to shift left by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:36:15 + --> $DIR/lint-exceeding-bitshifts.rs:37:15 | LL | let n = 1i16 << 16; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 16_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:38:15 + --> $DIR/lint-exceeding-bitshifts.rs:39:15 | LL | let n = 1i32 << 32; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 32_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:40:15 + --> $DIR/lint-exceeding-bitshifts.rs:41:15 | LL | let n = 1i64 << 64; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:43:15 + --> $DIR/lint-exceeding-bitshifts.rs:44:15 | LL | let n = 1u8 >> 8; - | ^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^ attempt to shift right by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:45:15 + --> $DIR/lint-exceeding-bitshifts.rs:46:15 | LL | let n = 1u16 >> 16; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 16_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:47:15 + --> $DIR/lint-exceeding-bitshifts.rs:48:15 | LL | let n = 1u32 >> 32; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 32_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:49:15 + --> $DIR/lint-exceeding-bitshifts.rs:50:15 | LL | let n = 1u64 >> 64; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:51:15 + --> $DIR/lint-exceeding-bitshifts.rs:52:15 | LL | let n = 1i8 >> 8; - | ^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^ attempt to shift right by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:53:15 + --> $DIR/lint-exceeding-bitshifts.rs:54:15 | LL | let n = 1i16 >> 16; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 16_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:55:15 + --> $DIR/lint-exceeding-bitshifts.rs:56:15 | LL | let n = 1i32 >> 32; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 32_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:57:15 + --> $DIR/lint-exceeding-bitshifts.rs:58:15 | LL | let n = 1i64 >> 64; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:61:15 + --> $DIR/lint-exceeding-bitshifts.rs:62:15 | LL | let n = n << 8; - | ^^^^^^ attempt to shift left with overflow + | ^^^^^^ attempt to shift left by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:63:15 + --> $DIR/lint-exceeding-bitshifts.rs:64:15 | LL | let n = 1u8 << -8; - | ^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^ attempt to shift left by -8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:68:15 + --> $DIR/lint-exceeding-bitshifts.rs:69:15 | LL | let n = 1u8 << (4+4); - | ^^^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^^^ attempt to shift left by 8_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:70:15 + --> $DIR/lint-exceeding-bitshifts.rs:71:15 | LL | let n = 1i64 >> [64][0]; - | ^^^^^^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^^^^^^ attempt to shift right by 64_i32 which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:76:15 + --> $DIR/lint-exceeding-bitshifts.rs:77:15 | LL | let n = 1_isize << BITS; - | ^^^^^^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^^^^^^ attempt to shift left by %BITS% which would overflow warning: this arithmetic operation will overflow - --> $DIR/lint-exceeding-bitshifts.rs:77:15 + --> $DIR/lint-exceeding-bitshifts.rs:78:15 | LL | let n = 1_usize << BITS; - | ^^^^^^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^^^^^^ attempt to shift left by %BITS% which would overflow warning: 24 warnings emitted diff --git a/src/test/ui/lint/lint-exceeding-bitshifts.rs b/src/test/ui/lint/lint-exceeding-bitshifts.rs index 4d56d103a8343..a76ca93f8e1a3 100644 --- a/src/test/ui/lint/lint-exceeding-bitshifts.rs +++ b/src/test/ui/lint/lint-exceeding-bitshifts.rs @@ -4,6 +4,7 @@ //[opt_with_overflow_checks]compile-flags: -C overflow-checks=on -O // build-pass // ignore-pass (test emits codegen-time warnings and verifies that they are not errors) +// normalize-stderr-test "shift left by (64|32)_usize which" -> "shift left by %BITS% which" #![crate_type="lib"] #![warn(arithmetic_overflow, const_err)] diff --git a/src/test/ui/mir/mir_detects_invalid_ops.stderr b/src/test/ui/mir/mir_detects_invalid_ops.stderr index 0b6dbfd7c3d85..b4f74a52a74cd 100644 --- a/src/test/ui/mir/mir_detects_invalid_ops.stderr +++ b/src/test/ui/mir/mir_detects_invalid_ops.stderr @@ -2,7 +2,7 @@ error: this operation will panic at runtime --> $DIR/mir_detects_invalid_ops.rs:11:14 | LL | let _z = 1 / y; - | ^^^^^ attempt to divide by zero + | ^^^^^ attempt to divide 1_i32 by zero | = note: `#[deny(unconditional_panic)]` on by default @@ -10,7 +10,7 @@ error: this operation will panic at runtime --> $DIR/mir_detects_invalid_ops.rs:16:14 | LL | let _z = 1 % y; - | ^^^^^ attempt to calculate the remainder with a divisor of zero + | ^^^^^ attempt to calculate the remainder of 1_i32 with a divisor of zero error: aborting due to 2 previous errors diff --git a/src/test/ui/numbers-arithmetic/overflowing-lsh-1.stderr b/src/test/ui/numbers-arithmetic/overflowing-lsh-1.stderr index 54008d33968bc..995afeeed880c 100644 --- a/src/test/ui/numbers-arithmetic/overflowing-lsh-1.stderr +++ b/src/test/ui/numbers-arithmetic/overflowing-lsh-1.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/overflowing-lsh-1.rs:7:14 | LL | let _x = 1_i32 << 32; - | ^^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^^ attempt to shift left by 32_i32 which would overflow | note: the lint level is defined here --> $DIR/overflowing-lsh-1.rs:4:9 diff --git a/src/test/ui/numbers-arithmetic/overflowing-lsh-2.stderr b/src/test/ui/numbers-arithmetic/overflowing-lsh-2.stderr index 872e71bb73796..e6f6b1ccd192d 100644 --- a/src/test/ui/numbers-arithmetic/overflowing-lsh-2.stderr +++ b/src/test/ui/numbers-arithmetic/overflowing-lsh-2.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/overflowing-lsh-2.rs:7:14 | LL | let _x = 1 << -1; - | ^^^^^^^ attempt to shift left with overflow + | ^^^^^^^ attempt to shift left by -1_i32 which would overflow | note: the lint level is defined here --> $DIR/overflowing-lsh-2.rs:4:9 diff --git a/src/test/ui/numbers-arithmetic/overflowing-lsh-3.stderr b/src/test/ui/numbers-arithmetic/overflowing-lsh-3.stderr index d55ed4a046c9d..e57b892b8085d 100644 --- a/src/test/ui/numbers-arithmetic/overflowing-lsh-3.stderr +++ b/src/test/ui/numbers-arithmetic/overflowing-lsh-3.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/overflowing-lsh-3.rs:7:14 | LL | let _x = 1_u64 << 64; - | ^^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^^ attempt to shift left by 64_i32 which would overflow | note: the lint level is defined here --> $DIR/overflowing-lsh-3.rs:4:9 diff --git a/src/test/ui/numbers-arithmetic/overflowing-lsh-4.stderr b/src/test/ui/numbers-arithmetic/overflowing-lsh-4.stderr index 1ef8dd3466c0a..f20b41c1baa4f 100644 --- a/src/test/ui/numbers-arithmetic/overflowing-lsh-4.stderr +++ b/src/test/ui/numbers-arithmetic/overflowing-lsh-4.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/overflowing-lsh-4.rs:11:13 | LL | let x = 1_i8 << 17; - | ^^^^^^^^^^ attempt to shift left with overflow + | ^^^^^^^^^^ attempt to shift left by 17_i32 which would overflow | note: the lint level is defined here --> $DIR/overflowing-lsh-4.rs:7:9 diff --git a/src/test/ui/numbers-arithmetic/overflowing-rsh-1.stderr b/src/test/ui/numbers-arithmetic/overflowing-rsh-1.stderr index 236303e2e9aa3..18861a1b96fa8 100644 --- a/src/test/ui/numbers-arithmetic/overflowing-rsh-1.stderr +++ b/src/test/ui/numbers-arithmetic/overflowing-rsh-1.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/overflowing-rsh-1.rs:7:14 | LL | let _x = -1_i32 >> 32; - | ^^^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^^^ attempt to shift right by 32_i32 which would overflow | note: the lint level is defined here --> $DIR/overflowing-rsh-1.rs:4:9 diff --git a/src/test/ui/numbers-arithmetic/overflowing-rsh-2.stderr b/src/test/ui/numbers-arithmetic/overflowing-rsh-2.stderr index 981c8986f76b9..a2fb2b90535c3 100644 --- a/src/test/ui/numbers-arithmetic/overflowing-rsh-2.stderr +++ b/src/test/ui/numbers-arithmetic/overflowing-rsh-2.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/overflowing-rsh-2.rs:7:14 | LL | let _x = -1_i32 >> -1; - | ^^^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^^^ attempt to shift right by -1_i32 which would overflow | note: the lint level is defined here --> $DIR/overflowing-rsh-2.rs:4:9 diff --git a/src/test/ui/numbers-arithmetic/overflowing-rsh-3.stderr b/src/test/ui/numbers-arithmetic/overflowing-rsh-3.stderr index c2994503f0efc..24588b4a6b9b6 100644 --- a/src/test/ui/numbers-arithmetic/overflowing-rsh-3.stderr +++ b/src/test/ui/numbers-arithmetic/overflowing-rsh-3.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/overflowing-rsh-3.rs:7:14 | LL | let _x = -1_i64 >> 64; - | ^^^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^^^ attempt to shift right by 64_i32 which would overflow | note: the lint level is defined here --> $DIR/overflowing-rsh-3.rs:4:9 diff --git a/src/test/ui/numbers-arithmetic/overflowing-rsh-4.stderr b/src/test/ui/numbers-arithmetic/overflowing-rsh-4.stderr index 3db1da06dbed8..3f59653ea6075 100644 --- a/src/test/ui/numbers-arithmetic/overflowing-rsh-4.stderr +++ b/src/test/ui/numbers-arithmetic/overflowing-rsh-4.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/overflowing-rsh-4.rs:11:13 | LL | let x = 2_i8 >> 17; - | ^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^ attempt to shift right by 17_i32 which would overflow | note: the lint level is defined here --> $DIR/overflowing-rsh-4.rs:7:9 diff --git a/src/test/ui/numbers-arithmetic/overflowing-rsh-5.stderr b/src/test/ui/numbers-arithmetic/overflowing-rsh-5.stderr index bd3eae82977e3..8b0daf1551e4b 100644 --- a/src/test/ui/numbers-arithmetic/overflowing-rsh-5.stderr +++ b/src/test/ui/numbers-arithmetic/overflowing-rsh-5.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/overflowing-rsh-5.rs:7:14 | LL | let _n = 1i64 >> [64][0]; - | ^^^^^^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^^^^^^ attempt to shift right by 64_i32 which would overflow | note: the lint level is defined here --> $DIR/overflowing-rsh-5.rs:4:9 diff --git a/src/test/ui/numbers-arithmetic/overflowing-rsh-6.stderr b/src/test/ui/numbers-arithmetic/overflowing-rsh-6.stderr index 5d76639fb50f3..53a1445b54e38 100644 --- a/src/test/ui/numbers-arithmetic/overflowing-rsh-6.stderr +++ b/src/test/ui/numbers-arithmetic/overflowing-rsh-6.stderr @@ -2,7 +2,7 @@ error: this arithmetic operation will overflow --> $DIR/overflowing-rsh-6.rs:7:14 | LL | let _n = 1i64 >> [64][0]; - | ^^^^^^^^^^^^^^^ attempt to shift right with overflow + | ^^^^^^^^^^^^^^^ attempt to shift right by 64_i32 which would overflow | note: the lint level is defined here --> $DIR/overflowing-rsh-6.rs:4:9 diff --git a/src/test/ui/or-patterns/exhaustiveness-non-exhaustive.rs b/src/test/ui/or-patterns/exhaustiveness-non-exhaustive.rs index 31b3407a46e08..f2d5de75b65bd 100644 --- a/src/test/ui/or-patterns/exhaustiveness-non-exhaustive.rs +++ b/src/test/ui/or-patterns/exhaustiveness-non-exhaustive.rs @@ -4,15 +4,15 @@ // We wrap patterns in a tuple because top-level or-patterns were special-cased. fn main() { match (0u8, 0u8) { - //~^ ERROR non-exhaustive patterns: `(2u8..=u8::MAX, _)` + //~^ ERROR non-exhaustive patterns: `(2_u8..=u8::MAX, _)` (0 | 1, 2 | 3) => {} } match ((0u8,),) { - //~^ ERROR non-exhaustive patterns: `((4u8..=u8::MAX))` + //~^ ERROR non-exhaustive patterns: `((4_u8..=u8::MAX))` ((0 | 1,) | (2 | 3,),) => {} } match (Some(0u8),) { - //~^ ERROR non-exhaustive patterns: `(Some(2u8..=u8::MAX))` + //~^ ERROR non-exhaustive patterns: `(Some(2_u8..=u8::MAX))` (None | Some(0 | 1),) => {} } } diff --git a/src/test/ui/or-patterns/exhaustiveness-non-exhaustive.stderr b/src/test/ui/or-patterns/exhaustiveness-non-exhaustive.stderr index 653f4978ab350..7e8bb73190747 100644 --- a/src/test/ui/or-patterns/exhaustiveness-non-exhaustive.stderr +++ b/src/test/ui/or-patterns/exhaustiveness-non-exhaustive.stderr @@ -1,26 +1,26 @@ -error[E0004]: non-exhaustive patterns: `(2u8..=u8::MAX, _)` not covered +error[E0004]: non-exhaustive patterns: `(2_u8..=u8::MAX, _)` not covered --> $DIR/exhaustiveness-non-exhaustive.rs:6:11 | LL | match (0u8, 0u8) { - | ^^^^^^^^^^ pattern `(2u8..=u8::MAX, _)` not covered + | ^^^^^^^^^^ pattern `(2_u8..=u8::MAX, _)` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `(u8, u8)` -error[E0004]: non-exhaustive patterns: `((4u8..=u8::MAX))` not covered +error[E0004]: non-exhaustive patterns: `((4_u8..=u8::MAX))` not covered --> $DIR/exhaustiveness-non-exhaustive.rs:10:11 | LL | match ((0u8,),) { - | ^^^^^^^^^ pattern `((4u8..=u8::MAX))` not covered + | ^^^^^^^^^ pattern `((4_u8..=u8::MAX))` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `((u8,),)` -error[E0004]: non-exhaustive patterns: `(Some(2u8..=u8::MAX))` not covered +error[E0004]: non-exhaustive patterns: `(Some(2_u8..=u8::MAX))` not covered --> $DIR/exhaustiveness-non-exhaustive.rs:14:11 | LL | match (Some(0u8),) { - | ^^^^^^^^^^^^ pattern `(Some(2u8..=u8::MAX))` not covered + | ^^^^^^^^^^^^ pattern `(Some(2_u8..=u8::MAX))` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `(std::option::Option,)` diff --git a/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.stderr b/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.stderr index 2eadef9cb5c11..2acf1f41c6fa6 100644 --- a/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.stderr +++ b/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.stderr @@ -1,8 +1,8 @@ -error[E0005]: refutable pattern in local binding: `i32::MIN..=-1i32` and `3i32..=i32::MAX` not covered +error[E0005]: refutable pattern in local binding: `i32::MIN..=-1_i32` and `3_i32..=i32::MAX` not covered --> $DIR/issue-69875-should-have-been-expanded-earlier-non-exhaustive.rs:4:9 | LL | let 0 | (1 | 2) = 0; - | ^^^^^^^^^^^ patterns `i32::MIN..=-1i32` and `3i32..=i32::MAX` not covered + | ^^^^^^^^^^^ patterns `i32::MIN..=-1_i32` and `3_i32..=i32::MAX` not covered | = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html @@ -12,11 +12,11 @@ help: you might want to use `if let` to ignore the variant that isn't matched LL | if let 0 | (1 | 2) = 0 { /* */ } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0004]: non-exhaustive patterns: `i32::MIN..=-1i32` and `3i32..=i32::MAX` not covered +error[E0004]: non-exhaustive patterns: `i32::MIN..=-1_i32` and `3_i32..=i32::MAX` not covered --> $DIR/issue-69875-should-have-been-expanded-earlier-non-exhaustive.rs:5:11 | LL | match 0 { - | ^ patterns `i32::MIN..=-1i32` and `3i32..=i32::MAX` not covered + | ^ patterns `i32::MIN..=-1_i32` and `3_i32..=i32::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i32` diff --git a/src/test/ui/pattern/usefulness/exhaustive_integer_patterns.stderr b/src/test/ui/pattern/usefulness/exhaustive_integer_patterns.stderr index 6427a30b8f2ed..161ac477183c3 100644 --- a/src/test/ui/pattern/usefulness/exhaustive_integer_patterns.stderr +++ b/src/test/ui/pattern/usefulness/exhaustive_integer_patterns.stderr @@ -10,20 +10,20 @@ note: the lint level is defined here LL | #![deny(unreachable_patterns)] | ^^^^^^^^^^^^^^^^^^^^ -error[E0004]: non-exhaustive patterns: `128u8..=u8::MAX` not covered +error[E0004]: non-exhaustive patterns: `128_u8..=u8::MAX` not covered --> $DIR/exhaustive_integer_patterns.rs:28:11 | LL | match x { - | ^ pattern `128u8..=u8::MAX` not covered + | ^ pattern `128_u8..=u8::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u8` -error[E0004]: non-exhaustive patterns: `11u8..=19u8`, `31u8..=34u8`, `36u8..=69u8` and 1 more not covered +error[E0004]: non-exhaustive patterns: `11_u8..=19_u8`, `31_u8..=34_u8`, `36_u8..=69_u8` and 1 more not covered --> $DIR/exhaustive_integer_patterns.rs:33:11 | LL | match x { - | ^ patterns `11u8..=19u8`, `31u8..=34u8`, `36u8..=69u8` and 1 more not covered + | ^ patterns `11_u8..=19_u8`, `31_u8..=34_u8`, `36_u8..=69_u8` and 1 more not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u8` @@ -34,11 +34,11 @@ error: unreachable pattern LL | -2..=20 => {} | ^^^^^^^ -error[E0004]: non-exhaustive patterns: `i8::MIN..=-8i8`, `-6i8`, `121i8..=124i8` and 1 more not covered +error[E0004]: non-exhaustive patterns: `i8::MIN..=-8_i8`, `-6_i8`, `121_i8..=124_i8` and 1 more not covered --> $DIR/exhaustive_integer_patterns.rs:41:11 | LL | match x { - | ^ patterns `i8::MIN..=-8i8`, `-6i8`, `121i8..=124i8` and 1 more not covered + | ^ patterns `i8::MIN..=-8_i8`, `-6_i8`, `121_i8..=124_i8` and 1 more not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i8` @@ -52,38 +52,38 @@ LL | match 0i8 { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i8` -error[E0004]: non-exhaustive patterns: `0i16` not covered +error[E0004]: non-exhaustive patterns: `0_i16` not covered --> $DIR/exhaustive_integer_patterns.rs:91:11 | LL | match 0i16 { - | ^^^^ pattern `0i16` not covered + | ^^^^ pattern `0_i16` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i16` -error[E0004]: non-exhaustive patterns: `128u8..=u8::MAX` not covered +error[E0004]: non-exhaustive patterns: `128_u8..=u8::MAX` not covered --> $DIR/exhaustive_integer_patterns.rs:109:11 | LL | match 0u8 { - | ^^^ pattern `128u8..=u8::MAX` not covered + | ^^^ pattern `128_u8..=u8::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u8` -error[E0004]: non-exhaustive patterns: `(0u8, Some(_))` and `(2u8..=u8::MAX, Some(_))` not covered +error[E0004]: non-exhaustive patterns: `(0_u8, Some(_))` and `(2_u8..=u8::MAX, Some(_))` not covered --> $DIR/exhaustive_integer_patterns.rs:121:11 | LL | match (0u8, Some(())) { - | ^^^^^^^^^^^^^^^ patterns `(0u8, Some(_))` and `(2u8..=u8::MAX, Some(_))` not covered + | ^^^^^^^^^^^^^^^ patterns `(0_u8, Some(_))` and `(2_u8..=u8::MAX, Some(_))` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `(u8, std::option::Option<()>)` -error[E0004]: non-exhaustive patterns: `(126u8..=127u8, false)` not covered +error[E0004]: non-exhaustive patterns: `(126_u8..=127_u8, false)` not covered --> $DIR/exhaustive_integer_patterns.rs:126:11 | LL | match (0u8, true) { - | ^^^^^^^^^^^ pattern `(126u8..=127u8, false)` not covered + | ^^^^^^^^^^^ pattern `(126_u8..=127_u8, false)` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `(u8, bool)` @@ -92,7 +92,7 @@ error: multiple patterns covering the same range --> $DIR/exhaustive_integer_patterns.rs:141:9 | LL | 0 .. 2 => {} - | ------ this range overlaps on `1u8` + | ------ this range overlaps on `1_u8` LL | 1 ..= 2 => {} | ^^^^^^^ overlapping patterns | @@ -111,20 +111,20 @@ LL | match 0u128 { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u128` -error[E0004]: non-exhaustive patterns: `5u128..=u128::MAX` not covered +error[E0004]: non-exhaustive patterns: `5_u128..=u128::MAX` not covered --> $DIR/exhaustive_integer_patterns.rs:150:11 | LL | match 0u128 { - | ^^^^^ pattern `5u128..=u128::MAX` not covered + | ^^^^^ pattern `5_u128..=u128::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u128` -error[E0004]: non-exhaustive patterns: `0u128..=3u128` not covered +error[E0004]: non-exhaustive patterns: `0_u128..=3_u128` not covered --> $DIR/exhaustive_integer_patterns.rs:154:11 | LL | match 0u128 { - | ^^^^^ pattern `0u128..=3u128` not covered + | ^^^^^ pattern `0_u128..=3_u128` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `u128` diff --git a/src/test/ui/pattern/usefulness/issue-43253.stderr b/src/test/ui/pattern/usefulness/issue-43253.stderr index 6e65c51dd3cf3..04feef1706cf4 100644 --- a/src/test/ui/pattern/usefulness/issue-43253.stderr +++ b/src/test/ui/pattern/usefulness/issue-43253.stderr @@ -2,7 +2,7 @@ warning: multiple patterns covering the same range --> $DIR/issue-43253.rs:16:9 | LL | 1..10 => {}, - | ----- this range overlaps on `9i32` + | ----- this range overlaps on `9_i32` LL | 9..=10 => {}, | ^^^^^^ overlapping patterns | diff --git a/src/test/ui/pattern/usefulness/match-byte-array-patterns-2.stderr b/src/test/ui/pattern/usefulness/match-byte-array-patterns-2.stderr index 0e12b89de1b91..ffc8433403fd5 100644 --- a/src/test/ui/pattern/usefulness/match-byte-array-patterns-2.stderr +++ b/src/test/ui/pattern/usefulness/match-byte-array-patterns-2.stderr @@ -1,8 +1,8 @@ -error[E0004]: non-exhaustive patterns: `&[0u8..=64u8, _, _, _]` and `&[66u8..=u8::MAX, _, _, _]` not covered +error[E0004]: non-exhaustive patterns: `&[0_u8..=64_u8, _, _, _]` and `&[66_u8..=u8::MAX, _, _, _]` not covered --> $DIR/match-byte-array-patterns-2.rs:4:11 | LL | match buf { - | ^^^ patterns `&[0u8..=64u8, _, _, _]` and `&[66u8..=u8::MAX, _, _, _]` not covered + | ^^^ patterns `&[0_u8..=64_u8, _, _, _]` and `&[66_u8..=u8::MAX, _, _, _]` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `&[u8; 4]` diff --git a/src/test/ui/pattern/usefulness/match-non-exhaustive.stderr b/src/test/ui/pattern/usefulness/match-non-exhaustive.stderr index c6a9329f9e8e1..a35d61e4b710b 100644 --- a/src/test/ui/pattern/usefulness/match-non-exhaustive.stderr +++ b/src/test/ui/pattern/usefulness/match-non-exhaustive.stderr @@ -1,8 +1,8 @@ -error[E0004]: non-exhaustive patterns: `i32::MIN..=0i32` and `2i32..=i32::MAX` not covered +error[E0004]: non-exhaustive patterns: `i32::MIN..=0_i32` and `2_i32..=i32::MAX` not covered --> $DIR/match-non-exhaustive.rs:2:11 | LL | match 0 { 1 => () } - | ^ patterns `i32::MIN..=0i32` and `2i32..=i32::MAX` not covered + | ^ patterns `i32::MIN..=0_i32` and `2_i32..=i32::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `i32` diff --git a/src/test/ui/pattern/usefulness/non-exhaustive-match.rs b/src/test/ui/pattern/usefulness/non-exhaustive-match.rs index 9177345bc6f50..a28cfb579f4f1 100644 --- a/src/test/ui/pattern/usefulness/non-exhaustive-match.rs +++ b/src/test/ui/pattern/usefulness/non-exhaustive-match.rs @@ -11,8 +11,8 @@ fn main() { match Some(10) { //~ ERROR non-exhaustive patterns: `Some(_)` not covered None => {} } - match (2, 3, 4) { //~ ERROR non-exhaustive patterns: `(_, _, i32::MIN..=3i32)` - // and `(_, _, 5i32..=i32::MAX)` not covered + match (2, 3, 4) { //~ ERROR non-exhaustive patterns: `(_, _, i32::MIN..=3_i32)` + // and `(_, _, 5_i32..=i32::MAX)` not covered (_, _, 4) => {} } match (T::A, T::A) { //~ ERROR non-exhaustive patterns: `(A, A)` not covered diff --git a/src/test/ui/pattern/usefulness/non-exhaustive-match.stderr b/src/test/ui/pattern/usefulness/non-exhaustive-match.stderr index 3cdbd8a3433f4..056efb9b75ddd 100644 --- a/src/test/ui/pattern/usefulness/non-exhaustive-match.stderr +++ b/src/test/ui/pattern/usefulness/non-exhaustive-match.stderr @@ -36,11 +36,11 @@ LL | Some(#[stable(feature = "rust1", since = "1.0.0")] T), = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `std::option::Option` -error[E0004]: non-exhaustive patterns: `(_, _, i32::MIN..=3i32)` and `(_, _, 5i32..=i32::MAX)` not covered +error[E0004]: non-exhaustive patterns: `(_, _, i32::MIN..=3_i32)` and `(_, _, 5_i32..=i32::MAX)` not covered --> $DIR/non-exhaustive-match.rs:14:11 | LL | match (2, 3, 4) { - | ^^^^^^^^^ patterns `(_, _, i32::MIN..=3i32)` and `(_, _, 5i32..=i32::MAX)` not covered + | ^^^^^^^^^ patterns `(_, _, i32::MIN..=3_i32)` and `(_, _, 5_i32..=i32::MAX)` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `(i32, i32, i32)` diff --git a/src/test/ui/pattern/usefulness/refutable-pattern-errors.rs b/src/test/ui/pattern/usefulness/refutable-pattern-errors.rs index 3ef2ead32cb7c..75658c490c4e2 100644 --- a/src/test/ui/pattern/usefulness/refutable-pattern-errors.rs +++ b/src/test/ui/pattern/usefulness/refutable-pattern-errors.rs @@ -5,5 +5,5 @@ fn func((1, (Some(1), 2..=3)): (isize, (Option, isize))) { } fn main() { let (1, (Some(1), 2..=3)) = (1, (None, 2)); - //~^ ERROR refutable pattern in local binding: `(i32::MIN..=0i32, _)` and `(2i32..=i32::MAX, _)` not covered + //~^ ERROR refutable pattern in local binding: `(i32::MIN..=0_i32, _)` and `(2_i32..=i32::MAX, _)` not covered } diff --git a/src/test/ui/pattern/usefulness/refutable-pattern-errors.stderr b/src/test/ui/pattern/usefulness/refutable-pattern-errors.stderr index ac729ae9f7cdf..8d0409a6af940 100644 --- a/src/test/ui/pattern/usefulness/refutable-pattern-errors.stderr +++ b/src/test/ui/pattern/usefulness/refutable-pattern-errors.stderr @@ -6,11 +6,11 @@ LL | fn func((1, (Some(1), 2..=3)): (isize, (Option, isize))) { } | = note: the matched value is of type `(isize, (std::option::Option, isize))` -error[E0005]: refutable pattern in local binding: `(i32::MIN..=0i32, _)` and `(2i32..=i32::MAX, _)` not covered +error[E0005]: refutable pattern in local binding: `(i32::MIN..=0_i32, _)` and `(2_i32..=i32::MAX, _)` not covered --> $DIR/refutable-pattern-errors.rs:7:9 | LL | let (1, (Some(1), 2..=3)) = (1, (None, 2)); - | ^^^^^^^^^^^^^^^^^^^^^ patterns `(i32::MIN..=0i32, _)` and `(2i32..=i32::MAX, _)` not covered + | ^^^^^^^^^^^^^^^^^^^^^ patterns `(i32::MIN..=0_i32, _)` and `(2_i32..=i32::MAX, _)` not covered | = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html diff --git a/src/test/ui/precise_pointer_size_matching.stderr b/src/test/ui/precise_pointer_size_matching.stderr index 7b9e30f40fbb3..9a34171a391c4 100644 --- a/src/test/ui/precise_pointer_size_matching.stderr +++ b/src/test/ui/precise_pointer_size_matching.stderr @@ -1,17 +1,17 @@ -error[E0004]: non-exhaustive patterns: `isize::MIN..=-6isize` and `21isize..=isize::MAX` not covered +error[E0004]: non-exhaustive patterns: `isize::MIN..=-6_isize` and `21_isize..=isize::MAX` not covered --> $DIR/precise_pointer_size_matching.rs:24:11 | LL | match 0isize { - | ^^^^^^ patterns `isize::MIN..=-6isize` and `21isize..=isize::MAX` not covered + | ^^^^^^ patterns `isize::MIN..=-6_isize` and `21_isize..=isize::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `isize` -error[E0004]: non-exhaustive patterns: `0usize` and `21usize..=usize::MAX` not covered +error[E0004]: non-exhaustive patterns: `0_usize` and `21_usize..=usize::MAX` not covered --> $DIR/precise_pointer_size_matching.rs:29:11 | LL | match 0usize { - | ^^^^^^ patterns `0usize` and `21usize..=usize::MAX` not covered + | ^^^^^^ patterns `0_usize` and `21_usize..=usize::MAX` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms = note: the matched value is of type `usize` diff --git a/src/test/ui/suggestions/const-pat-non-exaustive-let-new-var.rs b/src/test/ui/suggestions/const-pat-non-exaustive-let-new-var.rs index 21fb8d4a2e68d..ac819dce6db2b 100644 --- a/src/test/ui/suggestions/const-pat-non-exaustive-let-new-var.rs +++ b/src/test/ui/suggestions/const-pat-non-exaustive-let-new-var.rs @@ -1,6 +1,6 @@ fn main() { let A = 3; - //~^ ERROR refutable pattern in local binding: `i32::MIN..=1i32` and + //~^ ERROR refutable pattern in local binding: `i32::MIN..=1_i32` and //~| interpreted as a constant pattern, not a new variable //~| HELP introduce a variable instead //~| SUGGESTION a_var diff --git a/src/test/ui/suggestions/const-pat-non-exaustive-let-new-var.stderr b/src/test/ui/suggestions/const-pat-non-exaustive-let-new-var.stderr index 7a6269da07f32..af64c09d5cadb 100644 --- a/src/test/ui/suggestions/const-pat-non-exaustive-let-new-var.stderr +++ b/src/test/ui/suggestions/const-pat-non-exaustive-let-new-var.stderr @@ -1,4 +1,4 @@ -error[E0005]: refutable pattern in local binding: `i32::MIN..=1i32` and `3i32..=i32::MAX` not covered +error[E0005]: refutable pattern in local binding: `i32::MIN..=1_i32` and `3_i32..=i32::MAX` not covered --> $DIR/const-pat-non-exaustive-let-new-var.rs:2:9 | LL | let A = 3; From 6f8bec93990434b5da5060f05d1e9fa7116bc743 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Wed, 13 May 2020 00:21:54 -0400 Subject: [PATCH 138/142] Warn if linking to a private item --- src/librustdoc/lib.rs | 1 + .../passes/collect_intra_doc_links.rs | 30 +++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index de6fa3dbd4a89..4961dc2d4bcea 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -34,6 +34,7 @@ extern crate rustc_metadata; extern crate rustc_middle; extern crate rustc_mir; extern crate rustc_parse; +extern crate rustc_privacy; extern crate rustc_resolve; extern crate rustc_session; extern crate rustc_span as rustc_span; diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index f5b2f1bb5b178..a19d3afc2e3b1 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -178,6 +178,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { let result = cx.enter_resolver(|resolver| { resolver.resolve_str_path_error(DUMMY_SP, &path_str, ns, module_id) }); + debug!("{} resolved to {:?} in namespace {:?}", path_str, ns, result); let result = match result { Ok((_, Res::Err)) => Err(ErrorKind::ResolutionFailure), _ => result.map_err(|_| ErrorKind::ResolutionFailure), @@ -202,7 +203,11 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { } return Ok((res, Some(path_str.to_owned()))); } - _ => return Ok((res, extra_fragment.clone())), + other => { + debug!("failed to resolve {} in namespace {:?} (got {:?})", path_str, ns, other); + debug!("extra_fragment is {:?}", extra_fragment); + return Ok((res, extra_fragment.clone())); + } }; if value != (ns == ValueNS) { @@ -555,9 +560,11 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> { } else { (parts[0].to_owned(), None) }; + let resolved_self; + let mut path_str; let (res, fragment) = { let mut kind = None; - let mut path_str = if let Some(prefix) = + path_str = if let Some(prefix) = ["struct@", "enum@", "type@", "trait@", "union@"] .iter() .find(|p| link.starts_with(**p)) @@ -614,7 +621,6 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> { let base_node = if item.is_mod() && item.attrs.inner_docs { None } else { parent_node }; - let resolved_self; // replace `Self` with suitable item's parent name if path_str.starts_with("Self::") { if let Some(ref name) = parent_name { @@ -760,6 +766,24 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> { if let Res::PrimTy(_) = res { item.attrs.links.push((ori_link, None, fragment)); } else { + // ~~WRONG: TODO: I think this happens too late and we need to instead put this in `self.resolve`~~ + debug!("item {:?} resolved to {:?}", item, res); + if let Some(local) = res.opt_def_id().and_then(|def_id| def_id.as_local()) { + let hir_id = self.cx.tcx.hir().as_local_hir_id(local); + if !self.cx.tcx.privacy_access_levels(rustc_hir::def_id::LOCAL_CRATE).is_exported(hir_id) { + let item_name = item.name.as_deref().unwrap_or(""); + build_diagnostic( + cx, + &item, + path_str, + &dox, + link_range, + &format!("public documentation for `{}` links to a private item", item_name), + "this item is private", + None, + ); + } + } let id = register_res(cx, res); item.attrs.links.push((ori_link, Some(id), fragment)); } From 20552c811a99a561f23b5918de9ffd95a06f815c Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Sat, 30 May 2020 11:35:35 -0400 Subject: [PATCH 139/142] Generate docs for links to private items when passed --document-private - Pass around document_private a lot more - Add tests + Add tests for intra-doc links to private items + Add ignored tests for warnings in reference links --- src/librustdoc/config.rs | 14 ++++------ src/librustdoc/core.rs | 15 +++++----- src/librustdoc/html/format.rs | 2 +- src/librustdoc/html/render.rs | 3 +- src/librustdoc/html/render/cache.rs | 6 ++++ src/librustdoc/lib.rs | 1 - .../passes/collect_intra_doc_links.rs | 28 +++++++++++++------ .../intra-links-private.public.stderr | 10 +++++++ src/test/rustdoc-ui/intra-links-private.rs | 10 +++++++ .../reference-link-has-one-warning.rs | 6 ++++ .../reference-link-has-one-warning.stderr | 10 +++++++ 11 files changed, 78 insertions(+), 27 deletions(-) create mode 100644 src/test/rustdoc-ui/intra-links-private.public.stderr create mode 100644 src/test/rustdoc-ui/intra-links-private.rs create mode 100644 src/test/rustdoc-ui/reference-link-has-one-warning.rs create mode 100644 src/test/rustdoc-ui/reference-link-has-one-warning.stderr diff --git a/src/librustdoc/config.rs b/src/librustdoc/config.rs index 5dbcc5c9ec8b9..35b15cf717cee 100644 --- a/src/librustdoc/config.rs +++ b/src/librustdoc/config.rs @@ -123,10 +123,6 @@ pub struct Options { /// /// Be aware: This option can come both from the CLI and from crate attributes! pub default_passes: DefaultPassOption, - /// Document items that have lower than `pub` visibility. - pub document_private: bool, - /// Document items that have `doc(hidden)`. - pub document_hidden: bool, /// Any passes manually selected by the user. /// /// Be aware: This option can come both from the CLI and from crate attributes! @@ -177,8 +173,6 @@ impl fmt::Debug for Options { .field("test_args", &self.test_args) .field("persist_doctests", &self.persist_doctests) .field("default_passes", &self.default_passes) - .field("document_private", &self.document_private) - .field("document_hidden", &self.document_hidden) .field("manual_passes", &self.manual_passes) .field("display_warnings", &self.display_warnings) .field("show_coverage", &self.show_coverage) @@ -250,6 +244,10 @@ pub struct RenderOptions { pub generate_search_filter: bool, /// Option (disabled by default) to generate files used by RLS and some other tools. pub generate_redirect_pages: bool, + /// Document items that have lower than `pub` visibility. + pub document_private: bool, + /// Document items that have `doc(hidden)`. + pub document_hidden: bool, } impl Options { @@ -567,8 +565,6 @@ impl Options { should_test, test_args, default_passes, - document_private, - document_hidden, manual_passes, display_warnings, show_coverage, @@ -597,6 +593,8 @@ impl Options { markdown_playground_url, generate_search_filter, generate_redirect_pages, + document_private, + document_hidden, }, output_format, }) diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index 1690b946bb625..8ab6c74289d17 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -62,6 +62,8 @@ pub struct DocContext<'tcx> { // FIXME(eddyb) make this a `ty::TraitRef<'tcx>` set. pub generated_synthetics: RefCell, DefId)>>, pub auto_traits: Vec, + /// The options given to rustdoc that could be relevant to a pass. + pub render_options: RenderOptions, } impl<'tcx> DocContext<'tcx> { @@ -281,8 +283,6 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt describe_lints, lint_cap, mut default_passes, - mut document_private, - document_hidden, mut manual_passes, display_warnings, render_options, @@ -448,6 +448,7 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt .cloned() .filter(|trait_def_id| tcx.trait_is_auto(*trait_def_id)) .collect(), + render_options, }; debug!("crate: {:?}", tcx.hir().krate()); @@ -524,7 +525,7 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt } if attr.is_word() && name == sym::document_private_items { - document_private = true; + ctxt.render_options.document_private = true; } } @@ -544,9 +545,9 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt for p in passes { let run = match p.condition { Always => true, - WhenDocumentPrivate => document_private, - WhenNotDocumentPrivate => !document_private, - WhenNotDocumentHidden => !document_hidden, + WhenDocumentPrivate => ctxt.render_options.document_private, + WhenNotDocumentPrivate => !ctxt.render_options.document_private, + WhenNotDocumentHidden => !ctxt.render_options.document_hidden, }; if run { debug!("running pass {}", p.pass.name); @@ -556,7 +557,7 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt ctxt.sess().abort_if_errors(); - (krate, ctxt.renderinfo.into_inner(), render_options) + (krate, ctxt.renderinfo.into_inner(), ctxt.render_options) }) }) }) diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs index e60ff37fd279a..a453a8b3dcb2a 100644 --- a/src/librustdoc/html/format.rs +++ b/src/librustdoc/html/format.rs @@ -468,7 +468,7 @@ impl clean::Path { pub fn href(did: DefId) -> Option<(String, ItemType, Vec)> { let cache = cache(); - if !did.is_local() && !cache.access_levels.is_public(did) { + if !did.is_local() && !cache.access_levels.is_public(did) && !cache.document_private { return None; } diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 1681b73d0c257..04c4685213b2e 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -469,6 +469,7 @@ pub fn run( static_root_path, generate_search_filter, generate_redirect_pages, + document_private, .. } = options; @@ -546,7 +547,7 @@ pub fn run( scx.ensure_dir(&dst)?; krate = sources::render(&dst, &mut scx, krate)?; let (new_crate, index, cache) = - Cache::from_krate(renderinfo, &extern_html_root_urls, &dst, krate); + Cache::from_krate(renderinfo, document_private, &extern_html_root_urls, &dst, krate); krate = new_crate; let cache = Arc::new(cache); let mut cx = Context { diff --git a/src/librustdoc/html/render/cache.rs b/src/librustdoc/html/render/cache.rs index 225940773413e..1b5c8a9378e41 100644 --- a/src/librustdoc/html/render/cache.rs +++ b/src/librustdoc/html/render/cache.rs @@ -91,6 +91,10 @@ crate struct Cache { /// The version of the crate being documented, if given from the `--crate-version` flag. pub crate_version: Option, + /// Whether to document private items. + /// This is stored in `Cache` so it doesn't need to be passed through all rustdoc functions. + pub document_private: bool, + // Private fields only used when initially crawling a crate to build a cache stack: Vec, parent_stack: Vec, @@ -126,6 +130,7 @@ crate struct Cache { impl Cache { pub fn from_krate( renderinfo: RenderInfo, + document_private: bool, extern_html_root_urls: &BTreeMap, dst: &Path, mut krate: clean::Crate, @@ -160,6 +165,7 @@ impl Cache { stripped_mod: false, access_levels, crate_version: krate.version.take(), + document_private, orphan_impl_items: Vec::new(), orphan_trait_impls: Vec::new(), traits: krate.external_traits.replace(Default::default()), diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index 4961dc2d4bcea..de6fa3dbd4a89 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -34,7 +34,6 @@ extern crate rustc_metadata; extern crate rustc_middle; extern crate rustc_mir; extern crate rustc_parse; -extern crate rustc_privacy; extern crate rustc_resolve; extern crate rustc_session; extern crate rustc_span as rustc_span; diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index a19d3afc2e3b1..e4fe8996a233f 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -204,7 +204,10 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { return Ok((res, Some(path_str.to_owned()))); } other => { - debug!("failed to resolve {} in namespace {:?} (got {:?})", path_str, ns, other); + debug!( + "failed to resolve {} in namespace {:?} (got {:?})", + path_str, ns, other + ); debug!("extra_fragment is {:?}", extra_fragment); return Ok((res, extra_fragment.clone())); } @@ -564,10 +567,9 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> { let mut path_str; let (res, fragment) = { let mut kind = None; - path_str = if let Some(prefix) = - ["struct@", "enum@", "type@", "trait@", "union@"] - .iter() - .find(|p| link.starts_with(**p)) + path_str = if let Some(prefix) = ["struct@", "enum@", "type@", "trait@", "union@"] + .iter() + .find(|p| link.starts_with(**p)) { kind = Some(TypeNS); link.trim_start_matches(prefix) @@ -766,22 +768,30 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> { if let Res::PrimTy(_) = res { item.attrs.links.push((ori_link, None, fragment)); } else { - // ~~WRONG: TODO: I think this happens too late and we need to instead put this in `self.resolve`~~ - debug!("item {:?} resolved to {:?}", item, res); + debug!("linked item {} resolved to {:?}", path_str, res); if let Some(local) = res.opt_def_id().and_then(|def_id| def_id.as_local()) { + use rustc_hir::def_id::LOCAL_CRATE; + let hir_id = self.cx.tcx.hir().as_local_hir_id(local); - if !self.cx.tcx.privacy_access_levels(rustc_hir::def_id::LOCAL_CRATE).is_exported(hir_id) { + if !self.cx.tcx.privacy_access_levels(LOCAL_CRATE).is_exported(hir_id) + && !self.cx.render_options.document_private + { let item_name = item.name.as_deref().unwrap_or(""); + let err_msg = format!( + "public documentation for `{}` links to a private item", + item_name + ); build_diagnostic( cx, &item, path_str, &dox, link_range, - &format!("public documentation for `{}` links to a private item", item_name), + &err_msg, "this item is private", None, ); + continue; } } let id = register_res(cx, res); diff --git a/src/test/rustdoc-ui/intra-links-private.public.stderr b/src/test/rustdoc-ui/intra-links-private.public.stderr new file mode 100644 index 0000000000000..0a8dafdaf9466 --- /dev/null +++ b/src/test/rustdoc-ui/intra-links-private.public.stderr @@ -0,0 +1,10 @@ +warning: `[DontDocMe]` public documentation for `DocMe` links to a private item + --> $DIR/intra-links-private.rs:6:11 + | +LL | /// docs [DontDocMe] + | ^^^^^^^^^ this item is private + | + = note: `#[warn(intra_doc_link_resolution_failure)]` on by default + +warning: 1 warning emitted + diff --git a/src/test/rustdoc-ui/intra-links-private.rs b/src/test/rustdoc-ui/intra-links-private.rs new file mode 100644 index 0000000000000..b7906aba5b1a9 --- /dev/null +++ b/src/test/rustdoc-ui/intra-links-private.rs @@ -0,0 +1,10 @@ +// check-pass +// revisions: public private +// [private]compile-flags: --document-private-items +#![cfg_attr(private, deny(intra_doc_resolution_failure))] + +/// docs [DontDocMe] +//[public]~^ WARNING `[DontDocMe]` public documentation for `DocMe` links to a private item +// FIXME: for [private] we should also make sure the link was actually generated +pub struct DocMe; +struct DontDocMe; diff --git a/src/test/rustdoc-ui/reference-link-has-one-warning.rs b/src/test/rustdoc-ui/reference-link-has-one-warning.rs new file mode 100644 index 0000000000000..21cb7eb9040bd --- /dev/null +++ b/src/test/rustdoc-ui/reference-link-has-one-warning.rs @@ -0,0 +1,6 @@ +// ignore-test +// check-pass + +/// docs [label][with#anchor#error] +//~^ WARNING has an issue with the link anchor +pub struct S; diff --git a/src/test/rustdoc-ui/reference-link-has-one-warning.stderr b/src/test/rustdoc-ui/reference-link-has-one-warning.stderr new file mode 100644 index 0000000000000..5bbc62b76dd04 --- /dev/null +++ b/src/test/rustdoc-ui/reference-link-has-one-warning.stderr @@ -0,0 +1,10 @@ +warning: `[with#anchor#error]` has an issue with the link anchor. + --> $DIR/reference-link-has-one-warning.rs:3:18 + | +LL | /// docs [label][with#anchor#error] + | ^^^^^^^^^^^^^^^^^ only one `#` is allowed in a link + | + = note: `#[warn(intra_doc_link_resolution_failure)]` on by default + +warning: 1 warning emitted + From 67423821aa0dd705720c9e183d04d4b7a55b723f Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Fri, 26 Jun 2020 08:24:45 -0400 Subject: [PATCH 140/142] Fix debug messages --- src/librustdoc/passes/collect_intra_doc_links.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index e4fe8996a233f..8da74f375d9ce 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -178,7 +178,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { let result = cx.enter_resolver(|resolver| { resolver.resolve_str_path_error(DUMMY_SP, &path_str, ns, module_id) }); - debug!("{} resolved to {:?} in namespace {:?}", path_str, ns, result); + debug!("{} resolved to {:?} in namespace {:?}", path_str, result, ns); let result = match result { Ok((_, Res::Err)) => Err(ErrorKind::ResolutionFailure), _ => result.map_err(|_| ErrorKind::ResolutionFailure), @@ -208,7 +208,6 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { "failed to resolve {} in namespace {:?} (got {:?})", path_str, ns, other ); - debug!("extra_fragment is {:?}", extra_fragment); return Ok((res, extra_fragment.clone())); } }; @@ -768,7 +767,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> { if let Res::PrimTy(_) = res { item.attrs.links.push((ori_link, None, fragment)); } else { - debug!("linked item {} resolved to {:?}", path_str, res); + debug!("intra-doc link to {} resolved to {:?}", path_str, res); if let Some(local) = res.opt_def_id().and_then(|def_id| def_id.as_local()) { use rustc_hir::def_id::LOCAL_CRATE; From cb152eae2f63cc07e23142452d7e80b24392c284 Mon Sep 17 00:00:00 2001 From: "KRAAI, MATTHEW [VISUS]" Date: Fri, 26 Jun 2020 06:22:35 -0700 Subject: [PATCH 141/142] Remove blank line --- src/liballoc/raw_vec/tests.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/liballoc/raw_vec/tests.rs b/src/liballoc/raw_vec/tests.rs index 6418c4a9823f2..5408faa079c15 100644 --- a/src/liballoc/raw_vec/tests.rs +++ b/src/liballoc/raw_vec/tests.rs @@ -12,7 +12,6 @@ fn allocator_param() { // // Instead, this just checks that the `RawVec` methods do at // least go through the Allocator API when it reserves - // storage. // A dumb allocator that consumes a fixed amount of fuel From 7b2064f4f969062312ec3144e7901ea7b6be5b62 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Mon, 22 Jun 2020 00:40:11 +0300 Subject: [PATCH 142/142] rustc_lexer: Simplify shebang parsing once more --- src/librustc_lexer/src/lib.rs | 27 +++++++++------------ src/test/ui/parser/shebang/shebang-empty.rs | 4 +++ src/test/ui/parser/shebang/shebang-space.rs | 5 ++++ src/test/ui/shebang.rs | 5 ---- 4 files changed, 21 insertions(+), 20 deletions(-) create mode 100644 src/test/ui/parser/shebang/shebang-empty.rs create mode 100644 src/test/ui/parser/shebang/shebang-space.rs delete mode 100644 src/test/ui/shebang.rs diff --git a/src/librustc_lexer/src/lib.rs b/src/librustc_lexer/src/lib.rs index 200e7acf80235..77b3d26463dfe 100644 --- a/src/librustc_lexer/src/lib.rs +++ b/src/librustc_lexer/src/lib.rs @@ -179,21 +179,18 @@ pub enum Base { /// but shebang isn't a part of rust syntax. pub fn strip_shebang(input: &str) -> Option { // Shebang must start with `#!` literally, without any preceding whitespace. - if input.starts_with("#!") { - let input_tail = &input[2..]; - // Shebang must have something non-whitespace after `#!` on the first line. - let first_line_tail = input_tail.lines().next()?; - if first_line_tail.contains(|c| !is_whitespace(c)) { - // Ok, this is a shebang but if the next non-whitespace token is `[` or maybe - // a doc comment (due to `TokenKind::(Line,Block)Comment` ambiguity at lexer level), - // then it may be valid Rust code, so consider it Rust code. - let next_non_whitespace_token = tokenize(input_tail).map(|tok| tok.kind).find(|tok| - !matches!(tok, TokenKind::Whitespace | TokenKind::LineComment | TokenKind::BlockComment { .. }) - ); - if next_non_whitespace_token != Some(TokenKind::OpenBracket) { - // No other choice than to consider this a shebang. - return Some(2 + first_line_tail.len()); - } + // For simplicity we consider any line starting with `#!` a shebang, + // regardless of restrictions put on shebangs by specific platforms. + if let Some(input_tail) = input.strip_prefix("#!") { + // Ok, this is a shebang but if the next non-whitespace token is `[` or maybe + // a doc comment (due to `TokenKind::(Line,Block)Comment` ambiguity at lexer level), + // then it may be valid Rust code, so consider it Rust code. + let next_non_whitespace_token = tokenize(input_tail).map(|tok| tok.kind).find(|tok| + !matches!(tok, TokenKind::Whitespace | TokenKind::LineComment | TokenKind::BlockComment { .. }) + ); + if next_non_whitespace_token != Some(TokenKind::OpenBracket) { + // No other choice than to consider this a shebang. + return Some(2 + input_tail.lines().next().unwrap_or_default().len()); } } None diff --git a/src/test/ui/parser/shebang/shebang-empty.rs b/src/test/ui/parser/shebang/shebang-empty.rs new file mode 100644 index 0000000000000..e38cc637e945e --- /dev/null +++ b/src/test/ui/parser/shebang/shebang-empty.rs @@ -0,0 +1,4 @@ +#! + +// check-pass +fn main() {} diff --git a/src/test/ui/parser/shebang/shebang-space.rs b/src/test/ui/parser/shebang/shebang-space.rs new file mode 100644 index 0000000000000..0978b759d2a6e --- /dev/null +++ b/src/test/ui/parser/shebang/shebang-space.rs @@ -0,0 +1,5 @@ +#! + +// check-pass +// ignore-tidy-end-whitespace +fn main() {} diff --git a/src/test/ui/shebang.rs b/src/test/ui/shebang.rs deleted file mode 100644 index 3d3ba468be955..0000000000000 --- a/src/test/ui/shebang.rs +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env rustx - -// run-pass - -pub fn main() { println!("Hello World"); }

    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 gpa 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

  • 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 gpa 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