Auto merge of #89405 - GuillaumeGomez:fix-clippy-lints, r=cjgillot

Fix clippy lints

I'm currently working on allowing clippy to run on librustdoc after a discussion I had with `@Mark-Simulacrum.` So in the meantime, I fixed a few lints on the compiler crates.
This commit is contained in:
bors 2021-10-02 10:52:09 +00:00
commit b27661eb33
61 changed files with 458 additions and 506 deletions

View file

@ -277,26 +277,26 @@ fn do_mir_borrowck<'a, 'tcx>(
let regioncx = Rc::new(regioncx); let regioncx = Rc::new(regioncx);
let flow_borrows = Borrows::new(tcx, &body, &regioncx, &borrow_set) let flow_borrows = Borrows::new(tcx, body, &regioncx, &borrow_set)
.into_engine(tcx, &body) .into_engine(tcx, body)
.pass_name("borrowck") .pass_name("borrowck")
.iterate_to_fixpoint(); .iterate_to_fixpoint();
let flow_uninits = MaybeUninitializedPlaces::new(tcx, &body, &mdpe) let flow_uninits = MaybeUninitializedPlaces::new(tcx, body, &mdpe)
.into_engine(tcx, &body) .into_engine(tcx, body)
.pass_name("borrowck") .pass_name("borrowck")
.iterate_to_fixpoint(); .iterate_to_fixpoint();
let flow_ever_inits = EverInitializedPlaces::new(tcx, &body, &mdpe) let flow_ever_inits = EverInitializedPlaces::new(tcx, body, &mdpe)
.into_engine(tcx, &body) .into_engine(tcx, body)
.pass_name("borrowck") .pass_name("borrowck")
.iterate_to_fixpoint(); .iterate_to_fixpoint();
let movable_generator = match tcx.hir().get(id) { let movable_generator = !matches!(
tcx.hir().get(id),
Node::Expr(&hir::Expr { Node::Expr(&hir::Expr {
kind: hir::ExprKind::Closure(.., Some(hir::Movability::Static)), kind: hir::ExprKind::Closure(.., Some(hir::Movability::Static)),
.. ..
}) => false, })
_ => true, );
};
for (idx, move_data_results) in promoted_errors { for (idx, move_data_results) in promoted_errors {
let promoted_body = &promoted[idx]; let promoted_body = &promoted[idx];
@ -374,8 +374,8 @@ fn do_mir_borrowck<'a, 'tcx>(
mbcx.report_move_errors(move_errors); mbcx.report_move_errors(move_errors);
rustc_mir_dataflow::visit_results( rustc_mir_dataflow::visit_results(
&body, body,
traversal::reverse_postorder(&body).map(|(bb, _)| bb), traversal::reverse_postorder(body).map(|(bb, _)| bb),
&results, &results,
&mut mbcx, &mut mbcx,
); );

View file

@ -526,7 +526,7 @@ impl<'tcx> FnAbiLlvmExt<'tcx> for FnAbi<'tcx, Ty<'tcx>> {
}; };
match self.ret.mode { match self.ret.mode {
PassMode::Direct(ref attrs) => { PassMode::Direct(ref attrs) => {
attrs.apply_attrs_to_callsite(llvm::AttributePlace::ReturnValue, &bx.cx, callsite); attrs.apply_attrs_to_callsite(llvm::AttributePlace::ReturnValue, bx.cx, callsite);
} }
PassMode::Indirect { ref attrs, extra_attrs: _, on_stack } => { PassMode::Indirect { ref attrs, extra_attrs: _, on_stack } => {
assert!(!on_stack); assert!(!on_stack);

View file

@ -105,7 +105,7 @@ impl AsmBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> {
let r = r.unwrap(); let r = r.unwrap();
// Again, based on how many outputs we have // Again, based on how many outputs we have
let outputs = ia.outputs.iter().zip(&outputs).filter(|&(ref o, _)| !o.is_indirect); let outputs = ia.outputs.iter().zip(&outputs).filter(|&(o, _)| !o.is_indirect);
for (i, (_, &place)) in outputs.enumerate() { for (i, (_, &place)) in outputs.enumerate() {
let v = if num_outputs == 1 { r } else { self.extract_value(r, i as u64) }; let v = if num_outputs == 1 { r } else { self.extract_value(r, i as u64) };
OperandValue::Immediate(v).store(self, place); OperandValue::Immediate(v).store(self, place);
@ -331,7 +331,7 @@ impl AsmBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> {
let output_type = match &output_types[..] { let output_type = match &output_types[..] {
[] => self.type_void(), [] => self.type_void(),
[ty] => ty, [ty] => ty,
tys => self.type_struct(&tys, false), tys => self.type_struct(tys, false),
}; };
let dialect = match asm_arch { let dialect = match asm_arch {
InlineAsmArch::X86 | InlineAsmArch::X86_64 InlineAsmArch::X86 | InlineAsmArch::X86_64

View file

@ -109,7 +109,7 @@ fn prepare_lto(
.extend(exported_symbols[&cnum].iter().filter_map(symbol_filter)); .extend(exported_symbols[&cnum].iter().filter_map(symbol_filter));
} }
let archive = ArchiveRO::open(&path).expect("wanted an rlib"); let archive = ArchiveRO::open(path).expect("wanted an rlib");
let obj_files = archive let obj_files = archive
.iter() .iter()
.filter_map(|child| child.ok().and_then(|c| c.name().map(|name| (name, c)))) .filter_map(|child| child.ok().and_then(|c| c.name().map(|name| (name, c))))
@ -316,14 +316,14 @@ fn fat_lto(
.generic_activity_with_arg("LLVM_fat_lto_link_module", format!("{:?}", name)); .generic_activity_with_arg("LLVM_fat_lto_link_module", format!("{:?}", name));
info!("linking {:?}", name); info!("linking {:?}", name);
let data = bc_decoded.data(); let data = bc_decoded.data();
linker.add(&data).map_err(|()| { linker.add(data).map_err(|()| {
let msg = format!("failed to load bc of {:?}", name); let msg = format!("failed to load bc of {:?}", name);
write::llvm_err(&diag_handler, &msg) write::llvm_err(diag_handler, &msg)
})?; })?;
serialized_bitcode.push(bc_decoded); serialized_bitcode.push(bc_decoded);
} }
drop(linker); drop(linker);
save_temp_bitcode(&cgcx, &module, "lto.input"); save_temp_bitcode(cgcx, &module, "lto.input");
// Fat LTO also suffers from the invalid DWARF issue similar to Thin LTO. // Fat LTO also suffers from the invalid DWARF issue similar to Thin LTO.
// Here we rewrite all `DICompileUnit` pointers if there is only one `DICompileUnit`. // Here we rewrite all `DICompileUnit` pointers if there is only one `DICompileUnit`.
@ -347,14 +347,14 @@ fn fat_lto(
ptr as *const *const libc::c_char, ptr as *const *const libc::c_char,
symbols_below_threshold.len() as libc::size_t, symbols_below_threshold.len() as libc::size_t,
); );
save_temp_bitcode(&cgcx, &module, "lto.after-restriction"); save_temp_bitcode(cgcx, &module, "lto.after-restriction");
} }
if cgcx.no_landing_pads { if cgcx.no_landing_pads {
unsafe { unsafe {
llvm::LLVMRustMarkAllFunctionsNounwind(llmod); llvm::LLVMRustMarkAllFunctionsNounwind(llmod);
} }
save_temp_bitcode(&cgcx, &module, "lto.after-nounwind"); save_temp_bitcode(cgcx, &module, "lto.after-nounwind");
} }
} }
@ -498,7 +498,7 @@ fn thin_lto(
symbols_below_threshold.as_ptr(), symbols_below_threshold.as_ptr(),
symbols_below_threshold.len() as u32, symbols_below_threshold.len() as u32,
) )
.ok_or_else(|| write::llvm_err(&diag_handler, "failed to prepare thin LTO context"))?; .ok_or_else(|| write::llvm_err(diag_handler, "failed to prepare thin LTO context"))?;
let data = ThinData(data); let data = ThinData(data);
@ -572,7 +572,7 @@ fn thin_lto(
if let Some(path) = key_map_path { if let Some(path) = key_map_path {
if let Err(err) = curr_key_map.save_to_file(&path) { if let Err(err) = curr_key_map.save_to_file(&path) {
let msg = format!("Error while writing ThinLTO key data: {}", err); let msg = format!("Error while writing ThinLTO key data: {}", err);
return Err(write::llvm_err(&diag_handler, &msg)); return Err(write::llvm_err(diag_handler, &msg));
} }
} }
@ -744,8 +744,7 @@ pub unsafe fn optimize_thin_module(
// crates but for locally codegened modules we may be able to reuse // crates but for locally codegened modules we may be able to reuse
// that LLVM Context and Module. // that LLVM Context and Module.
let llcx = llvm::LLVMRustContextCreate(cgcx.fewer_names); let llcx = llvm::LLVMRustContextCreate(cgcx.fewer_names);
let llmod_raw = let llmod_raw = parse_module(llcx, module_name, thin_module.data(), &diag_handler)? as *const _;
parse_module(llcx, &module_name, thin_module.data(), &diag_handler)? as *const _;
let module = ModuleCodegen { let module = ModuleCodegen {
module_llvm: ModuleLlvm { llmod_raw, llcx, tm }, module_llvm: ModuleLlvm { llmod_raw, llcx, tm },
name: thin_module.name().to_string(), name: thin_module.name().to_string(),
@ -754,7 +753,7 @@ pub unsafe fn optimize_thin_module(
{ {
let target = &*module.module_llvm.tm; let target = &*module.module_llvm.tm;
let llmod = module.module_llvm.llmod(); let llmod = module.module_llvm.llmod();
save_temp_bitcode(&cgcx, &module, "thin-lto-input"); save_temp_bitcode(cgcx, &module, "thin-lto-input");
// Before we do much else find the "main" `DICompileUnit` that we'll be // Before we do much else find the "main" `DICompileUnit` that we'll be
// using below. If we find more than one though then rustc has changed // using below. If we find more than one though then rustc has changed
@ -775,7 +774,7 @@ pub unsafe fn optimize_thin_module(
.prof .prof
.generic_activity_with_arg("LLVM_thin_lto_remove_landing_pads", thin_module.name()); .generic_activity_with_arg("LLVM_thin_lto_remove_landing_pads", thin_module.name());
llvm::LLVMRustMarkAllFunctionsNounwind(llmod); llvm::LLVMRustMarkAllFunctionsNounwind(llmod);
save_temp_bitcode(&cgcx, &module, "thin-lto-after-nounwind"); save_temp_bitcode(cgcx, &module, "thin-lto-after-nounwind");
} }
// Up next comes the per-module local analyses that we do for Thin LTO. // Up next comes the per-module local analyses that we do for Thin LTO.
@ -947,7 +946,7 @@ pub fn parse_module<'a>(
llvm::LLVMRustParseBitcodeForLTO(cx, data.as_ptr(), data.len(), name.as_ptr()).ok_or_else( llvm::LLVMRustParseBitcodeForLTO(cx, data.as_ptr(), data.len(), name.as_ptr()).ok_or_else(
|| { || {
let msg = "failed to parse bitcode for LTO module"; let msg = "failed to parse bitcode for LTO module";
write::llvm_err(&diag_handler, msg) write::llvm_err(diag_handler, msg)
}, },
) )
} }

View file

@ -41,7 +41,7 @@ use std::sync::Arc;
pub fn llvm_err(handler: &rustc_errors::Handler, msg: &str) -> FatalError { pub fn llvm_err(handler: &rustc_errors::Handler, msg: &str) -> FatalError {
match llvm::last_error() { match llvm::last_error() {
Some(err) => handler.fatal(&format!("{}: {}", msg, err)), Some(err) => handler.fatal(&format!("{}: {}", msg, err)),
None => handler.fatal(&msg), None => handler.fatal(msg),
} }
} }
@ -96,7 +96,7 @@ pub fn create_target_machine(tcx: TyCtxt<'_>, mod_name: &str) -> &'static mut ll
None None
}; };
let config = TargetMachineFactoryConfig { split_dwarf_file }; let config = TargetMachineFactoryConfig { split_dwarf_file };
target_machine_factory(&tcx.sess, tcx.backend_optimization_level(()))(config) target_machine_factory(tcx.sess, tcx.backend_optimization_level(()))(config)
.unwrap_or_else(|err| llvm_err(tcx.sess.diagnostic(), &err).raise()) .unwrap_or_else(|err| llvm_err(tcx.sess.diagnostic(), &err).raise())
} }
@ -558,7 +558,7 @@ pub(crate) unsafe fn optimize(
let prepare_for_thin_lto = cgcx.lto == Lto::Thin let prepare_for_thin_lto = cgcx.lto == Lto::Thin
|| cgcx.lto == Lto::ThinLocal || cgcx.lto == Lto::ThinLocal
|| (cgcx.lto != Lto::Fat && cgcx.opts.cg.linker_plugin_lto.enabled()); || (cgcx.lto != Lto::Fat && cgcx.opts.cg.linker_plugin_lto.enabled());
with_llvm_pmb(llmod, &config, opt_level, prepare_for_thin_lto, &mut |b| { with_llvm_pmb(llmod, config, opt_level, prepare_for_thin_lto, &mut |b| {
llvm::LLVMRustAddLastExtensionPasses( llvm::LLVMRustAddLastExtensionPasses(
b, b,
extra_passes.as_ptr(), extra_passes.as_ptr(),
@ -660,9 +660,9 @@ pub(crate) fn link(
let _timer = let _timer =
cgcx.prof.generic_activity_with_arg("LLVM_link_module", format!("{:?}", module.name)); cgcx.prof.generic_activity_with_arg("LLVM_link_module", format!("{:?}", module.name));
let buffer = ModuleBuffer::new(module.module_llvm.llmod()); let buffer = ModuleBuffer::new(module.module_llvm.llmod());
linker.add(&buffer.data()).map_err(|()| { linker.add(buffer.data()).map_err(|()| {
let msg = format!("failed to serialize module {:?}", module.name); let msg = format!("failed to serialize module {:?}", module.name);
llvm_err(&diag_handler, &msg) llvm_err(diag_handler, &msg)
})?; })?;
} }
drop(linker); drop(linker);

View file

@ -86,7 +86,7 @@ impl ty::layout::HasParamEnv<'tcx> for Builder<'_, '_, 'tcx> {
impl HasTargetSpec for Builder<'_, '_, 'tcx> { impl HasTargetSpec for Builder<'_, '_, 'tcx> {
#[inline] #[inline]
fn target_spec(&self) -> &Target { fn target_spec(&self) -> &Target {
&self.cx.target_spec() self.cx.target_spec()
} }
} }

View file

@ -44,7 +44,7 @@ pub fn get_fn(cx: &CodegenCx<'ll, 'tcx>, instance: Instance<'tcx>) -> &'ll Value
let fn_abi = cx.fn_abi_of_instance(instance, ty::List::empty()); let fn_abi = cx.fn_abi_of_instance(instance, ty::List::empty());
let llfn = if let Some(llfn) = cx.get_declared_value(&sym) { let llfn = if let Some(llfn) = cx.get_declared_value(sym) {
// Create a fn pointer with the new signature. // Create a fn pointer with the new signature.
let llptrty = fn_abi.ptr_to_llvm_type(cx); let llptrty = fn_abi.ptr_to_llvm_type(cx);
@ -79,7 +79,7 @@ pub fn get_fn(cx: &CodegenCx<'ll, 'tcx>, instance: Instance<'tcx>) -> &'ll Value
llfn llfn
} }
} else { } else {
let llfn = cx.declare_fn(&sym, &fn_abi); let llfn = cx.declare_fn(sym, fn_abi);
debug!("get_fn: not casting pointer!"); debug!("get_fn: not casting pointer!");
attributes::from_fn_attrs(cx, llfn, instance); attributes::from_fn_attrs(cx, llfn, instance);

View file

@ -178,7 +178,7 @@ fn check_and_apply_linkage(
}; };
unsafe { unsafe {
// Declare a symbol `foo` with the desired linkage. // Declare a symbol `foo` with the desired linkage.
let g1 = cx.declare_global(&sym, llty2); let g1 = cx.declare_global(sym, llty2);
llvm::LLVMRustSetLinkage(g1, base::linkage_to_llvm(linkage)); llvm::LLVMRustSetLinkage(g1, base::linkage_to_llvm(linkage));
// Declare an internal global `extern_with_linkage_foo` which // Declare an internal global `extern_with_linkage_foo` which
@ -188,7 +188,7 @@ fn check_and_apply_linkage(
// `extern_with_linkage_foo` will instead be initialized to // `extern_with_linkage_foo` will instead be initialized to
// zero. // zero.
let mut real_name = "_rust_extern_with_linkage_".to_string(); let mut real_name = "_rust_extern_with_linkage_".to_string();
real_name.push_str(&sym); real_name.push_str(sym);
let g2 = cx.define_global(&real_name, llty).unwrap_or_else(|| { let g2 = cx.define_global(&real_name, llty).unwrap_or_else(|| {
cx.sess().span_fatal( cx.sess().span_fatal(
cx.tcx.def_span(span_def_id), cx.tcx.def_span(span_def_id),
@ -202,7 +202,7 @@ fn check_and_apply_linkage(
} else { } else {
// Generate an external declaration. // Generate an external declaration.
// FIXME(nagisa): investigate whether it can be changed into define_global // FIXME(nagisa): investigate whether it can be changed into define_global
cx.declare_global(&sym, llty) cx.declare_global(sym, llty)
} }
} }
@ -234,7 +234,7 @@ impl CodegenCx<'ll, 'tcx> {
_ => self.define_private_global(self.val_ty(cv)), _ => self.define_private_global(self.val_ty(cv)),
}; };
llvm::LLVMSetInitializer(gv, cv); llvm::LLVMSetInitializer(gv, cv);
set_global_alignment(&self, gv, align); set_global_alignment(self, gv, align);
llvm::SetUnnamedAddress(gv, llvm::UnnamedAddr::Global); llvm::SetUnnamedAddress(gv, llvm::UnnamedAddr::Global);
gv gv
} }
@ -279,7 +279,7 @@ impl CodegenCx<'ll, 'tcx> {
g g
} else { } else {
check_and_apply_linkage(&self, &fn_attrs, ty, sym, def_id) check_and_apply_linkage(self, fn_attrs, ty, sym, def_id)
}; };
// Thread-local statics in some other crate need to *always* be linked // Thread-local statics in some other crate need to *always* be linked
@ -369,7 +369,7 @@ impl StaticMethods for CodegenCx<'ll, 'tcx> {
unsafe { unsafe {
let attrs = self.tcx.codegen_fn_attrs(def_id); let attrs = self.tcx.codegen_fn_attrs(def_id);
let (v, alloc) = match codegen_static_initializer(&self, def_id) { let (v, alloc) = match codegen_static_initializer(self, def_id) {
Ok(v) => v, Ok(v) => v,
// Error has already been reported // Error has already been reported
Err(_) => return, Err(_) => return,
@ -417,7 +417,7 @@ impl StaticMethods for CodegenCx<'ll, 'tcx> {
self.statics_to_rauw.borrow_mut().push((g, new_g)); self.statics_to_rauw.borrow_mut().push((g, new_g));
new_g new_g
}; };
set_global_alignment(&self, g, self.align_of(ty)); set_global_alignment(self, g, self.align_of(ty));
llvm::LLVMSetInitializer(g, v); llvm::LLVMSetInitializer(g, v);
if self.should_assume_dso_local(g, true) { if self.should_assume_dso_local(g, true) {
@ -430,7 +430,7 @@ impl StaticMethods for CodegenCx<'ll, 'tcx> {
llvm::LLVMSetGlobalConstant(g, llvm::True); llvm::LLVMSetGlobalConstant(g, llvm::True);
} }
debuginfo::create_global_var_metadata(&self, def_id, g); debuginfo::create_global_var_metadata(self, def_id, g);
if attrs.flags.contains(CodegenFnAttrFlags::THREAD_LOCAL) { if attrs.flags.contains(CodegenFnAttrFlags::THREAD_LOCAL) {
llvm::set_thread_local_mode(g, self.tls_model); llvm::set_thread_local_mode(g, self.tls_model);
@ -518,7 +518,7 @@ impl StaticMethods for CodegenCx<'ll, 'tcx> {
); );
} }
} else { } else {
base::set_link_section(g, &attrs); base::set_link_section(g, attrs);
} }
if attrs.flags.contains(CodegenFnAttrFlags::USED) { if attrs.flags.contains(CodegenFnAttrFlags::USED) {

View file

@ -363,7 +363,7 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
fn create_used_variable_impl(&self, name: &'static CStr, values: &[&'ll Value]) { fn create_used_variable_impl(&self, name: &'static CStr, values: &[&'ll Value]) {
let section = cstr!("llvm.metadata"); let section = cstr!("llvm.metadata");
let array = self.const_array(&self.type_ptr_to(self.type_i8()), values); let array = self.const_array(self.type_ptr_to(self.type_i8()), values);
unsafe { unsafe {
let g = llvm::LLVMAddGlobal(self.llmod, self.val_ty(array), name.as_ptr()); let g = llvm::LLVMAddGlobal(self.llmod, self.val_ty(array), name.as_ptr());
@ -447,7 +447,7 @@ impl MiscMethods<'tcx> for CodegenCx<'ll, 'tcx> {
} }
fn sess(&self) -> &Session { fn sess(&self) -> &Session {
&self.tcx.sess self.tcx.sess
} }
fn check_overflow(&self) -> bool { fn check_overflow(&self) -> bool {

View file

@ -73,7 +73,7 @@ pub fn finalize<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>) {
mapgen.write_coverage_mapping(expressions, counter_regions, coverage_mapping_buffer); mapgen.write_coverage_mapping(expressions, counter_regions, coverage_mapping_buffer);
}); });
debug_assert!( debug_assert!(
coverage_mapping_buffer.len() > 0, !coverage_mapping_buffer.is_empty(),
"Every `FunctionCoverage` should have at least one counter" "Every `FunctionCoverage` should have at least one counter"
); );
@ -311,8 +311,7 @@ fn add_unused_functions<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>) {
// for each region in it's MIR. // for each region in it's MIR.
// Convert the `HashSet` of `codegenned_def_ids` to a sortable vector, and sort them. // Convert the `HashSet` of `codegenned_def_ids` to a sortable vector, and sort them.
let mut sorted_codegenned_def_ids: Vec<DefId> = let mut sorted_codegenned_def_ids: Vec<DefId> = codegenned_def_ids.iter().copied().collect();
codegenned_def_ids.iter().map(|def_id| *def_id).collect();
sorted_codegenned_def_ids.sort_unstable(); sorted_codegenned_def_ids.sort_unstable();
let mut first_covered_def_id_by_file: FxHashMap<Symbol, DefId> = FxHashMap::default(); let mut first_covered_def_id_by_file: FxHashMap<Symbol, DefId> = FxHashMap::default();

View file

@ -199,8 +199,8 @@ fn declare_unused_fn(cx: &CodegenCx<'ll, 'tcx>, def_id: &DefId) -> Instance<'tcx
); );
let llfn = cx.declare_fn( let llfn = cx.declare_fn(
&tcx.symbol_name(instance).name, tcx.symbol_name(instance).name,
&cx.fn_abi_of_fn_ptr( cx.fn_abi_of_fn_ptr(
ty::Binder::dummy(tcx.mk_fn_sig( ty::Binder::dummy(tcx.mk_fn_sig(
iter::once(tcx.mk_unit()), iter::once(tcx.mk_unit()),
tcx.mk_unit(), tcx.mk_unit(),

View file

@ -41,7 +41,7 @@ pub fn compute_mir_scopes(
// Instantiate all scopes. // Instantiate all scopes.
for idx in 0..mir.source_scopes.len() { for idx in 0..mir.source_scopes.len() {
let scope = SourceScope::new(idx); let scope = SourceScope::new(idx);
make_mir_scope(cx, instance, &mir, fn_dbg_scope, &has_variables, debug_context, scope); make_mir_scope(cx, instance, mir, fn_dbg_scope, &has_variables, debug_context, scope);
} }
} }
@ -94,7 +94,7 @@ fn make_mir_scope(
callee, callee,
); );
let callee_fn_abi = cx.fn_abi_of_instance(callee, ty::List::empty()); let callee_fn_abi = cx.fn_abi_of_instance(callee, ty::List::empty());
cx.dbg_scope_fn(callee, &callee_fn_abi, None) cx.dbg_scope_fn(callee, callee_fn_abi, None)
} }
None => unsafe { None => unsafe {
llvm::LLVMRustDIBuilderCreateLexicalBlock( llvm::LLVMRustDIBuilderCreateLexicalBlock(

View file

@ -59,10 +59,8 @@ pub fn get_or_insert_gdb_debug_scripts_section_global(cx: &CodegenCx<'ll, '_>) -
} }
pub fn needs_gdb_debug_scripts_section(cx: &CodegenCx<'_, '_>) -> bool { pub fn needs_gdb_debug_scripts_section(cx: &CodegenCx<'_, '_>) -> bool {
let omit_gdb_pretty_printer_section = cx let omit_gdb_pretty_printer_section =
.tcx cx.tcx.sess.contains_name(cx.tcx.hir().krate_attrs(), sym::omit_gdb_pretty_printer_section);
.sess
.contains_name(&cx.tcx.hir().krate_attrs(), sym::omit_gdb_pretty_printer_section);
!omit_gdb_pretty_printer_section !omit_gdb_pretty_printer_section
&& cx.sess().opts.debuginfo != DebugInfo::None && cx.sess().opts.debuginfo != DebugInfo::None

View file

@ -477,7 +477,7 @@ fn subroutine_type_metadata(
let signature_metadata: Vec<_> = iter::once( let signature_metadata: Vec<_> = iter::once(
// return type // return type
match signature.output().kind() { match signature.output().kind() {
ty::Tuple(ref tys) if tys.is_empty() => None, ty::Tuple(tys) if tys.is_empty() => None,
_ => Some(type_metadata(cx, signature.output(), span)), _ => Some(type_metadata(cx, signature.output(), span)),
}, },
) )
@ -647,7 +647,7 @@ pub fn type_metadata(cx: &CodegenCx<'ll, 'tcx>, t: Ty<'tcx>, usage_site_span: Sp
ty::Never | ty::Bool | ty::Char | ty::Int(_) | ty::Uint(_) | ty::Float(_) => { ty::Never | ty::Bool | ty::Char | ty::Int(_) | ty::Uint(_) | ty::Float(_) => {
MetadataCreationResult::new(basic_type_metadata(cx, t), false) MetadataCreationResult::new(basic_type_metadata(cx, t), false)
} }
ty::Tuple(ref elements) if elements.is_empty() => { ty::Tuple(elements) if elements.is_empty() => {
MetadataCreationResult::new(basic_type_metadata(cx, t), false) MetadataCreationResult::new(basic_type_metadata(cx, t), false)
} }
ty::Array(typ, _) | ty::Slice(typ) => { ty::Array(typ, _) | ty::Slice(typ) => {
@ -746,7 +746,7 @@ pub fn type_metadata(cx: &CodegenCx<'ll, 'tcx>, t: Ty<'tcx>, usage_site_span: Sp
.finalize(cx) .finalize(cx)
} }
}, },
ty::Tuple(ref elements) => { ty::Tuple(elements) => {
let tys: Vec<_> = elements.iter().map(|k| k.expect_ty()).collect(); let tys: Vec<_> = elements.iter().map(|k| k.expect_ty()).collect();
prepare_tuple_metadata(cx, t, &tys, unique_type_id, usage_site_span, NO_SCOPE_METADATA) prepare_tuple_metadata(cx, t, &tys, unique_type_id, usage_site_span, NO_SCOPE_METADATA)
.finalize(cx) .finalize(cx)
@ -932,7 +932,7 @@ fn basic_type_metadata(cx: &CodegenCx<'ll, 'tcx>, t: Ty<'tcx>) -> &'ll DIType {
let (name, encoding) = match t.kind() { let (name, encoding) = match t.kind() {
ty::Never => ("!", DW_ATE_unsigned), ty::Never => ("!", DW_ATE_unsigned),
ty::Tuple(ref elements) if elements.is_empty() => ("()", DW_ATE_unsigned), ty::Tuple(elements) if elements.is_empty() => ("()", DW_ATE_unsigned),
ty::Bool => ("bool", DW_ATE_boolean), ty::Bool => ("bool", DW_ATE_boolean),
ty::Char => ("char", DW_ATE_unsigned_char), ty::Char => ("char", DW_ATE_unsigned_char),
ty::Int(int_ty) if msvc_like_names => (int_ty.msvc_basic_name(), DW_ATE_signed), ty::Int(int_ty) if msvc_like_names => (int_ty.msvc_basic_name(), DW_ATE_signed),
@ -1123,7 +1123,7 @@ pub fn compile_unit_metadata(
let gcov_cu_info = [ let gcov_cu_info = [
path_to_mdstring(debug_context.llcontext, &output_filenames.with_extension("gcno")), path_to_mdstring(debug_context.llcontext, &output_filenames.with_extension("gcno")),
path_to_mdstring(debug_context.llcontext, &gcda_path), path_to_mdstring(debug_context.llcontext, gcda_path),
cu_desc_metadata, cu_desc_metadata,
]; ];
let gcov_metadata = llvm::LLVMMDNodeInContext( let gcov_metadata = llvm::LLVMMDNodeInContext(
@ -1963,17 +1963,13 @@ impl<'tcx> VariantInfo<'_, 'tcx> {
} }
fn source_info(&self, cx: &CodegenCx<'ll, 'tcx>) -> Option<SourceInfo<'ll>> { fn source_info(&self, cx: &CodegenCx<'ll, 'tcx>) -> Option<SourceInfo<'ll>> {
match self { if let VariantInfo::Generator { def_id, variant_index, .. } = self {
VariantInfo::Generator { def_id, variant_index, .. } => { let span =
let span = cx.tcx.generator_layout(*def_id).unwrap().variant_source_info cx.tcx.generator_layout(*def_id).unwrap().variant_source_info[*variant_index].span;
[*variant_index] if !span.is_dummy() {
.span; let loc = cx.lookup_debug_loc(span.lo());
if !span.is_dummy() { return Some(SourceInfo { file: file_metadata(cx, &loc.file), line: loc.line });
let loc = cx.lookup_debug_loc(span.lo());
return Some(SourceInfo { file: file_metadata(cx, &loc.file), line: loc.line });
}
} }
_ => {}
} }
None None
} }
@ -1994,11 +1990,11 @@ fn describe_enum_variant(
let unique_type_id = debug_context(cx) let unique_type_id = debug_context(cx)
.type_map .type_map
.borrow_mut() .borrow_mut()
.get_unique_type_id_of_enum_variant(cx, layout.ty, &variant_name); .get_unique_type_id_of_enum_variant(cx, layout.ty, variant_name);
create_struct_stub( create_struct_stub(
cx, cx,
layout.ty, layout.ty,
&variant_name, variant_name,
unique_type_id, unique_type_id,
Some(containing_scope), Some(containing_scope),
DIFlags::FlagZero, DIFlags::FlagZero,
@ -2385,7 +2381,7 @@ fn set_members_of_composite_type(
{ {
let mut composite_types_completed = let mut composite_types_completed =
debug_context(cx).composite_types_completed.borrow_mut(); debug_context(cx).composite_types_completed.borrow_mut();
if !composite_types_completed.insert(&composite_type_metadata) { if !composite_types_completed.insert(composite_type_metadata) {
bug!( bug!(
"debuginfo::set_members_of_composite_type() - \ "debuginfo::set_members_of_composite_type() - \
Already completed forward declaration re-encountered." Already completed forward declaration re-encountered."

View file

@ -328,7 +328,7 @@ impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> {
// name if necessary. // name if necessary.
let generics = self.tcx().generics_of(enclosing_fn_def_id); let generics = self.tcx().generics_of(enclosing_fn_def_id);
let substs = instance.substs.truncate_to(self.tcx(), generics); let substs = instance.substs.truncate_to(self.tcx(), generics);
let template_parameters = get_template_parameters(self, &generics, substs, &mut name); let template_parameters = get_template_parameters(self, generics, substs, &mut name);
let linkage_name = &mangled_name_of_instance(self, instance).name; let linkage_name = &mangled_name_of_instance(self, instance).name;
// Omit the linkage_name if it is the same as subprogram name. // Omit the linkage_name if it is the same as subprogram name.
@ -559,7 +559,7 @@ impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> {
scope_metadata: &'ll DIScope, scope_metadata: &'ll DIScope,
file: &rustc_span::SourceFile, file: &rustc_span::SourceFile,
) -> &'ll DILexicalBlock { ) -> &'ll DILexicalBlock {
metadata::extend_scope_to_file(&self, scope_metadata, file) metadata::extend_scope_to_file(self, scope_metadata, file)
} }
fn debuginfo_finalize(&self) { fn debuginfo_finalize(&self) {

View file

@ -71,7 +71,7 @@ fn get_simple_intrinsic(cx: &CodegenCx<'ll, '_>, name: Symbol) -> Option<(&'ll T
sym::roundf64 => "llvm.round.f64", sym::roundf64 => "llvm.round.f64",
_ => return None, _ => return None,
}; };
Some(cx.get_intrinsic(&llvm_name)) Some(cx.get_intrinsic(llvm_name))
} }
impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> { impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> {
@ -743,7 +743,7 @@ fn gen_fn<'ll, 'tcx>(
) -> (&'ll Type, &'ll Value) { ) -> (&'ll Type, &'ll Value) {
let fn_abi = cx.fn_abi_of_fn_ptr(rust_fn_sig, ty::List::empty()); let fn_abi = cx.fn_abi_of_fn_ptr(rust_fn_sig, ty::List::empty());
let llty = fn_abi.llvm_type(cx); let llty = fn_abi.llvm_type(cx);
let llfn = cx.declare_fn(name, &fn_abi); let llfn = cx.declare_fn(name, fn_abi);
cx.set_frame_pointer_type(llfn); cx.set_frame_pointer_type(llfn);
cx.apply_target_cpu_attr(llfn); cx.apply_target_cpu_attr(llfn);
// FIXME(eddyb) find a nicer way to do this. // FIXME(eddyb) find a nicer way to do this.
@ -1159,7 +1159,7 @@ fn generic_simd_intrinsic(
_ => return_error!("unrecognized intrinsic `{}`", name), _ => return_error!("unrecognized intrinsic `{}`", name),
}; };
let llvm_name = &format!("llvm.{0}.v{1}{2}", intr_name, in_len, elem_ty_str); let llvm_name = &format!("llvm.{0}.v{1}{2}", intr_name, in_len, elem_ty_str);
let f = bx.declare_cfn(&llvm_name, llvm::UnnamedAddr::No, fn_ty); let f = bx.declare_cfn(llvm_name, llvm::UnnamedAddr::No, fn_ty);
let c = let c =
bx.call(fn_ty, f, &args.iter().map(|arg| arg.immediate()).collect::<Vec<_>>(), None); bx.call(fn_ty, f, &args.iter().map(|arg| arg.immediate()).collect::<Vec<_>>(), None);
Ok(c) Ok(c)
@ -1793,7 +1793,7 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#,
let vec_ty = bx.cx.type_vector(elem_ty, in_len as u64); let vec_ty = bx.cx.type_vector(elem_ty, in_len as u64);
let fn_ty = bx.type_func(&[vec_ty, vec_ty], vec_ty); let fn_ty = bx.type_func(&[vec_ty, vec_ty], vec_ty);
let f = bx.declare_cfn(&llvm_intrinsic, llvm::UnnamedAddr::No, fn_ty); let f = bx.declare_cfn(llvm_intrinsic, llvm::UnnamedAddr::No, fn_ty);
let v = bx.call(fn_ty, f, &[lhs, rhs], None); let v = bx.call(fn_ty, f, &[lhs, rhs], None);
return Ok(v); return Ok(v);
} }

View file

@ -339,7 +339,7 @@ impl ModuleLlvm {
unsafe { unsafe {
let llcx = llvm::LLVMRustContextCreate(cgcx.fewer_names); let llcx = llvm::LLVMRustContextCreate(cgcx.fewer_names);
let llmod_raw = back::lto::parse_module(llcx, name, buffer, handler)?; let llmod_raw = back::lto::parse_module(llcx, name, buffer, handler)?;
let tm_factory_config = TargetMachineFactoryConfig::new(&cgcx, name.to_str().unwrap()); let tm_factory_config = TargetMachineFactoryConfig::new(cgcx, name.to_str().unwrap());
let tm = match (cgcx.tm_factory)(tm_factory_config) { let tm = match (cgcx.tm_factory)(tm_factory_config) {
Ok(m) => m, Ok(m) => m,
Err(e) => { Err(e) => {

View file

@ -789,7 +789,7 @@ pub mod coverageinfo {
start_line, start_line,
start_col, start_col,
end_line, end_line,
end_col: ((1 as u32) << 31) | end_col, end_col: (1_u32 << 31) | end_col,
kind: RegionKind::GapRegion, kind: RegionKind::GapRegion,
} }
} }

View file

@ -298,7 +298,7 @@ fn print_target_features(sess: &Session, tm: &llvm::TargetMachine) {
for (feature, desc) in &target_features { for (feature, desc) in &target_features {
println!(" {1:0$} - {2}.", max_feature_len, feature, desc); println!(" {1:0$} - {2}.", max_feature_len, feature, desc);
} }
if target_features.len() == 0 { if target_features.is_empty() {
println!(" Target features listing is not supported by this LLVM version."); println!(" Target features listing is not supported by this LLVM version.");
} }
println!("\nUse +feature to enable a feature, or -feature to disable it."); println!("\nUse +feature to enable a feature, or -feature to disable it.");

View file

@ -53,10 +53,10 @@ impl PreDefineMethods<'tcx> for CodegenCx<'ll, 'tcx> {
assert!(!instance.substs.needs_infer()); assert!(!instance.substs.needs_infer());
let fn_abi = self.fn_abi_of_instance(instance, ty::List::empty()); let fn_abi = self.fn_abi_of_instance(instance, ty::List::empty());
let lldecl = self.declare_fn(symbol_name, &fn_abi); let lldecl = self.declare_fn(symbol_name, fn_abi);
unsafe { llvm::LLVMRustSetLinkage(lldecl, base::linkage_to_llvm(linkage)) }; unsafe { llvm::LLVMRustSetLinkage(lldecl, base::linkage_to_llvm(linkage)) };
let attrs = self.tcx.codegen_fn_attrs(instance.def_id()); let attrs = self.tcx.codegen_fn_attrs(instance.def_id());
base::set_link_section(lldecl, &attrs); base::set_link_section(lldecl, attrs);
if linkage == Linkage::LinkOnceODR || linkage == Linkage::WeakODR { if linkage == Linkage::LinkOnceODR || linkage == Linkage::WeakODR {
llvm::SetUniqueComdat(self.llmod, lldecl); llvm::SetUniqueComdat(self.llmod, lldecl);
} }
@ -145,10 +145,6 @@ impl CodegenCx<'ll, 'tcx> {
// With pie relocation model calls of functions defined in the translation // With pie relocation model calls of functions defined in the translation
// unit can use copy relocations. // unit can use copy relocations.
if self.tcx.sess.relocation_model() == RelocModel::Pie && !is_declaration { self.tcx.sess.relocation_model() == RelocModel::Pie && !is_declaration
return true;
}
return false;
} }
} }

View file

@ -248,7 +248,7 @@ impl Type {
} }
fn ptr_to(&self, address_space: AddressSpace) -> &Type { fn ptr_to(&self, address_space: AddressSpace) -> &Type {
unsafe { llvm::LLVMPointerType(&self, address_space.0) } unsafe { llvm::LLVMPointerType(self, address_space.0) }
} }
} }

View file

@ -232,7 +232,7 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyAndLayout<'tcx> {
cx.type_ptr_to(cx.layout_of(self.ty.boxed_ty()).llvm_type(cx)) cx.type_ptr_to(cx.layout_of(self.ty.boxed_ty()).llvm_type(cx))
} }
ty::FnPtr(sig) => { ty::FnPtr(sig) => {
cx.fn_ptr_backend_type(&cx.fn_abi_of_fn_ptr(sig, ty::List::empty())) cx.fn_ptr_backend_type(cx.fn_abi_of_fn_ptr(sig, ty::List::empty()))
} }
_ => self.scalar_llvm_type_at(cx, scalar, Size::ZERO), _ => self.scalar_llvm_type_at(cx, scalar, Size::ZERO),
}; };
@ -245,7 +245,7 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyAndLayout<'tcx> {
Variants::Single { index } => Some(index), Variants::Single { index } => Some(index),
_ => None, _ => None,
}; };
if let Some(ref llty) = cx.type_lowering.borrow().get(&(self.ty, variant_index)) { if let Some(llty) = cx.type_lowering.borrow().get(&(self.ty, variant_index)) {
return llty.lltype; return llty.lltype;
} }
@ -270,10 +270,9 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyAndLayout<'tcx> {
}; };
debug!("--> mapped {:#?} to llty={:?}", self, llty); debug!("--> mapped {:#?} to llty={:?}", self, llty);
cx.type_lowering.borrow_mut().insert( cx.type_lowering
(self.ty, variant_index), .borrow_mut()
TypeLowering { lltype: llty, field_remapping: field_remapping }, .insert((self.ty, variant_index), TypeLowering { lltype: llty, field_remapping });
);
if let Some((llty, layout)) = defer { if let Some((llty, layout)) = defer {
let (llfields, packed, new_field_remapping) = struct_llfields(cx, layout); let (llfields, packed, new_field_remapping) = struct_llfields(cx, layout);

View file

@ -125,7 +125,7 @@ fn emit_aapcs_va_arg(
// if the offset >= 0 then the value will be on the stack // if the offset >= 0 then the value will be on the stack
let mut reg_off_v = bx.load(bx.type_i32(), reg_off, offset_align); let mut reg_off_v = bx.load(bx.type_i32(), reg_off, offset_align);
let use_stack = bx.icmp(IntPredicate::IntSGE, reg_off_v, zero); let use_stack = bx.icmp(IntPredicate::IntSGE, reg_off_v, zero);
bx.cond_br(use_stack, &on_stack.llbb(), &maybe_reg.llbb()); bx.cond_br(use_stack, on_stack.llbb(), maybe_reg.llbb());
// The value at this point might be in a register, but there is a chance that // The value at this point might be in a register, but there is a chance that
// it could be on the stack so we have to update the offset and then check // it could be on the stack so we have to update the offset and then check
@ -142,7 +142,7 @@ fn emit_aapcs_va_arg(
// Check to see if we have overflowed the registers as a result of this. // Check to see if we have overflowed the registers as a result of this.
// If we have then we need to use the stack for this value // If we have then we need to use the stack for this value
let use_stack = maybe_reg.icmp(IntPredicate::IntSGT, new_reg_off_v, zero); let use_stack = maybe_reg.icmp(IntPredicate::IntSGT, new_reg_off_v, zero);
maybe_reg.cond_br(use_stack, &on_stack.llbb(), &in_reg.llbb()); maybe_reg.cond_br(use_stack, on_stack.llbb(), in_reg.llbb());
let top_type = bx.type_i8p(); let top_type = bx.type_i8p();
let top = in_reg.struct_gep(va_list_ty, va_list_addr, reg_top_index); let top = in_reg.struct_gep(va_list_ty, va_list_addr, reg_top_index);
@ -158,17 +158,17 @@ fn emit_aapcs_va_arg(
let reg_type = layout.llvm_type(bx); let reg_type = layout.llvm_type(bx);
let reg_addr = in_reg.bitcast(reg_addr, bx.cx.type_ptr_to(reg_type)); let reg_addr = in_reg.bitcast(reg_addr, bx.cx.type_ptr_to(reg_type));
let reg_value = in_reg.load(reg_type, reg_addr, layout.align.abi); let reg_value = in_reg.load(reg_type, reg_addr, layout.align.abi);
in_reg.br(&end.llbb()); in_reg.br(end.llbb());
// On Stack block // On Stack block
let stack_value = let stack_value =
emit_ptr_va_arg(&mut on_stack, list, target_ty, false, Align::from_bytes(8).unwrap(), true); emit_ptr_va_arg(&mut on_stack, list, target_ty, false, Align::from_bytes(8).unwrap(), true);
on_stack.br(&end.llbb()); on_stack.br(end.llbb());
let val = end.phi( let val = end.phi(
layout.immediate_llvm_type(bx), layout.immediate_llvm_type(bx),
&[reg_value, stack_value], &[reg_value, stack_value],
&[&in_reg.llbb(), &on_stack.llbb()], &[in_reg.llbb(), on_stack.llbb()],
); );
*bx = end; *bx = end;

View file

@ -128,7 +128,7 @@ impl Callbacks for TimePassesCallbacks {
} }
pub fn diagnostics_registry() -> Registry { pub fn diagnostics_registry() -> Registry {
Registry::new(&rustc_error_codes::DIAGNOSTICS) Registry::new(rustc_error_codes::DIAGNOSTICS)
} }
/// This is the primary entry point for rustc. /// This is the primary entry point for rustc.
@ -265,8 +265,8 @@ fn run_compiler(
&***compiler.codegen_backend(), &***compiler.codegen_backend(),
compiler.session(), compiler.session(),
None, None,
&compiler.output_dir(), compiler.output_dir(),
&compiler.output_file(), compiler.output_file(),
); );
if should_stop == Compilation::Stop { if should_stop == Compilation::Stop {
@ -330,7 +330,7 @@ fn run_compiler(
let krate = queries.parse()?.take(); let krate = queries.parse()?.take();
pretty::print_after_parsing( pretty::print_after_parsing(
sess, sess,
&compiler.input(), compiler.input(),
&krate, &krate,
*ppm, *ppm,
compiler.output_file().as_ref().map(|p| &**p), compiler.output_file().as_ref().map(|p| &**p),
@ -356,7 +356,7 @@ fn run_compiler(
// Lint plugins are registered; now we can process command line flags. // Lint plugins are registered; now we can process command line flags.
if sess.opts.describe_lints { if sess.opts.describe_lints {
describe_lints(&sess, &lint_store, true); describe_lints(sess, lint_store, true);
return early_exit(); return early_exit();
} }
} }
@ -388,7 +388,7 @@ fn run_compiler(
save::process_crate( save::process_crate(
tcx, tcx,
&crate_name, &crate_name,
&compiler.input(), compiler.input(),
None, None,
DumpHandler::new( DumpHandler::new(
compiler.output_dir().as_ref().map(|p| &**p), compiler.output_dir().as_ref().map(|p| &**p),
@ -598,7 +598,7 @@ impl RustcDefaultCalls {
if let Input::File(file) = compiler.input() { if let Input::File(file) = compiler.input() {
// FIXME: #![crate_type] and #![crate_name] support not implemented yet // FIXME: #![crate_type] and #![crate_name] support not implemented yet
sess.init_crate_types(collect_crate_types(sess, &[])); sess.init_crate_types(collect_crate_types(sess, &[]));
let outputs = compiler.build_output_filenames(&sess, &[]); let outputs = compiler.build_output_filenames(sess, &[]);
let rlink_data = fs::read_to_string(file).unwrap_or_else(|err| { let rlink_data = fs::read_to_string(file).unwrap_or_else(|err| {
sess.fatal(&format!("failed to read rlink file: {}", err)); sess.fatal(&format!("failed to read rlink file: {}", err));
}); });
@ -606,7 +606,7 @@ impl RustcDefaultCalls {
json::decode(&rlink_data).unwrap_or_else(|err| { json::decode(&rlink_data).unwrap_or_else(|err| {
sess.fatal(&format!("failed to decode rlink: {}", err)); sess.fatal(&format!("failed to decode rlink: {}", err));
}); });
let result = compiler.codegen_backend().link(&sess, codegen_results, &outputs); let result = compiler.codegen_backend().link(sess, codegen_results, &outputs);
abort_on_err(result, sess); abort_on_err(result, sess);
} else { } else {
sess.fatal("rlink must be a file") sess.fatal("rlink must be a file")
@ -894,9 +894,9 @@ Available lint options:
}; };
println!("Lint groups provided by rustc:\n"); println!("Lint groups provided by rustc:\n");
println!(" {} {}", padded("name"), "sub-lints"); println!(" {} sub-lints", padded("name"));
println!(" {} {}", padded("----"), "---------"); println!(" {} ---------", padded("----"));
println!(" {} {}", padded("warnings"), "all lints that are set to issue warnings"); println!(" {} all lints that are set to issue warnings", padded("warnings"));
let print_lint_groups = |lints: Vec<(&'static str, Vec<LintId>)>| { let print_lint_groups = |lints: Vec<(&'static str, Vec<LintId>)>| {
for (name, to) in lints { for (name, to) in lints {
@ -1217,7 +1217,7 @@ pub fn report_ice(info: &panic::PanicInfo<'_>, bug_report_url: &str) {
} }
for note in &xs { for note in &xs {
handler.note_without_error(&note); handler.note_without_error(note);
} }
// If backtraces are enabled, also print the query stack // If backtraces are enabled, also print the query stack
@ -1326,7 +1326,7 @@ mod signal_handler {
std::alloc::alloc(std::alloc::Layout::from_size_align(ALT_STACK_SIZE, 1).unwrap()) std::alloc::alloc(std::alloc::Layout::from_size_align(ALT_STACK_SIZE, 1).unwrap())
as *mut libc::c_void; as *mut libc::c_void;
alt_stack.ss_size = ALT_STACK_SIZE; alt_stack.ss_size = ALT_STACK_SIZE;
libc::sigaltstack(&mut alt_stack, std::ptr::null_mut()); libc::sigaltstack(&alt_stack, std::ptr::null_mut());
let mut sa: libc::sigaction = std::mem::zeroed(); let mut sa: libc::sigaction = std::mem::zeroed();
sa.sa_sigaction = print_stack_trace as libc::sighandler_t; sa.sa_sigaction = print_stack_trace as libc::sighandler_t;

View file

@ -296,7 +296,7 @@ struct TypedAnnotation<'tcx> {
impl<'tcx> HirPrinterSupport<'tcx> for TypedAnnotation<'tcx> { impl<'tcx> HirPrinterSupport<'tcx> for TypedAnnotation<'tcx> {
fn sess(&self) -> &Session { fn sess(&self) -> &Session {
&self.tcx.sess self.tcx.sess
} }
fn hir_map(&self) -> Option<hir_map::Map<'tcx>> { fn hir_map(&self) -> Option<hir_map::Map<'tcx>> {
@ -347,8 +347,7 @@ impl<'tcx> pprust_hir::PpAnn for TypedAnnotation<'tcx> {
fn get_source(input: &Input, sess: &Session) -> (String, FileName) { fn get_source(input: &Input, sess: &Session) -> (String, FileName) {
let src_name = input.source_name(); let src_name = input.source_name();
let src = String::clone( let src = String::clone(
&sess sess.source_map()
.source_map()
.get_source_file(&src_name) .get_source_file(&src_name)
.expect("get_source_file") .expect("get_source_file")
.src .src

View file

@ -41,7 +41,7 @@ fn track_span_parent(def_id: rustc_span::def_id::LocalDefId) {
fn track_diagnostic(diagnostic: &Diagnostic) { fn track_diagnostic(diagnostic: &Diagnostic) {
tls::with_context_opt(|icx| { tls::with_context_opt(|icx| {
if let Some(icx) = icx { if let Some(icx) = icx {
if let Some(ref diagnostics) = icx.diagnostics { if let Some(diagnostics) = icx.diagnostics {
let mut diagnostics = diagnostics.lock(); let mut diagnostics = diagnostics.lock();
diagnostics.extend(Some(diagnostic.clone())); diagnostics.extend(Some(diagnostic.clone()));
} }

View file

@ -65,13 +65,7 @@ impl Compiler {
sess: &Session, sess: &Session,
attrs: &[ast::Attribute], attrs: &[ast::Attribute],
) -> OutputFilenames { ) -> OutputFilenames {
util::build_output_filenames( util::build_output_filenames(&self.input, &self.output_dir, &self.output_file, attrs, sess)
&self.input,
&self.output_dir,
&self.output_file,
&attrs,
&sess,
)
} }
} }

View file

@ -169,7 +169,7 @@ pub fn create_resolver(
) -> BoxedResolver { ) -> BoxedResolver {
tracing::trace!("create_resolver"); tracing::trace!("create_resolver");
BoxedResolver::new(sess, move |sess, resolver_arenas| { BoxedResolver::new(sess, move |sess, resolver_arenas| {
Resolver::new(sess, &krate, &crate_name, metadata_loader, &resolver_arenas) Resolver::new(sess, krate, crate_name, metadata_loader, resolver_arenas)
}) })
} }
@ -201,7 +201,7 @@ pub fn register_plugins<'a>(
sess.opts.cg.metadata.clone(), sess.opts.cg.metadata.clone(),
); );
sess.stable_crate_id.set(stable_crate_id).expect("not yet initialized"); sess.stable_crate_id.set(stable_crate_id).expect("not yet initialized");
rustc_incremental::prepare_session_directory(sess, &crate_name, stable_crate_id)?; rustc_incremental::prepare_session_directory(sess, crate_name, stable_crate_id)?;
if sess.opts.incremental.is_some() { if sess.opts.incremental.is_some() {
sess.time("incr_comp_garbage_collect_session_directories", || { sess.time("incr_comp_garbage_collect_session_directories", || {
@ -219,7 +219,7 @@ pub fn register_plugins<'a>(
sess.opts.debugging_opts.no_interleave_lints, sess.opts.debugging_opts.no_interleave_lints,
sess.unstable_options(), sess.unstable_options(),
); );
register_lints(&sess, &mut lint_store); register_lints(sess, &mut lint_store);
let registrars = let registrars =
sess.time("plugin_loading", || plugin::load::load_plugins(sess, metadata_loader, &krate)); sess.time("plugin_loading", || plugin::load::load_plugins(sess, metadata_loader, &krate));
@ -244,7 +244,7 @@ fn pre_expansion_lint(
rustc_lint::check_ast_crate( rustc_lint::check_ast_crate(
sess, sess,
lint_store, lint_store,
&krate, krate,
crate_attrs, crate_attrs,
true, true,
None, None,
@ -270,10 +270,10 @@ pub fn configure_and_expand(
krate = sess.time("crate_injection", || { krate = sess.time("crate_injection", || {
let alt_std_name = sess.opts.alt_std_name.as_ref().map(|s| Symbol::intern(s)); let alt_std_name = sess.opts.alt_std_name.as_ref().map(|s| Symbol::intern(s));
rustc_builtin_macros::standard_library_imports::inject(krate, resolver, &sess, alt_std_name) rustc_builtin_macros::standard_library_imports::inject(krate, resolver, sess, alt_std_name)
}); });
util::check_attr_crate_type(&sess, &krate.attrs, &mut resolver.lint_buffer()); util::check_attr_crate_type(sess, &krate.attrs, &mut resolver.lint_buffer());
// Expand all macros // Expand all macros
krate = sess.time("macro_expand_crate", || { krate = sess.time("macro_expand_crate", || {
@ -310,9 +310,9 @@ pub fn configure_and_expand(
// Create the config for macro expansion // Create the config for macro expansion
let features = sess.features_untracked(); let features = sess.features_untracked();
let recursion_limit = get_recursion_limit(&krate.attrs, &sess); let recursion_limit = get_recursion_limit(&krate.attrs, sess);
let cfg = rustc_expand::expand::ExpansionConfig { let cfg = rustc_expand::expand::ExpansionConfig {
features: Some(&features), features: Some(features),
recursion_limit, recursion_limit,
trace_mac: sess.opts.debugging_opts.trace_macros, trace_mac: sess.opts.debugging_opts.trace_macros,
should_test: sess.opts.test, should_test: sess.opts.test,
@ -327,7 +327,7 @@ pub fn configure_and_expand(
pre_expansion_lint(sess, lint_store, &krate, &crate_attrs, &ident.name.as_str()); pre_expansion_lint(sess, lint_store, &krate, &crate_attrs, &ident.name.as_str());
(krate.attrs, krate.items) (krate.attrs, krate.items)
}; };
let mut ecx = ExtCtxt::new(&sess, cfg, resolver, Some(&extern_mod_loaded)); let mut ecx = ExtCtxt::new(sess, cfg, resolver, Some(&extern_mod_loaded));
// Expand macros now! // Expand macros now!
let krate = sess.time("expand_crate", || ecx.monotonic_expander().expand_crate(krate)); let krate = sess.time("expand_crate", || ecx.monotonic_expander().expand_crate(krate));
@ -369,7 +369,7 @@ pub fn configure_and_expand(
})?; })?;
sess.time("maybe_building_test_harness", || { sess.time("maybe_building_test_harness", || {
rustc_builtin_macros::test_harness::inject(&sess, resolver, &mut krate) rustc_builtin_macros::test_harness::inject(sess, resolver, &mut krate)
}); });
if let Some(PpMode::Source(PpSourceMode::EveryBodyLoops)) = sess.opts.pretty { if let Some(PpMode::Source(PpSourceMode::EveryBodyLoops)) = sess.opts.pretty {
@ -392,8 +392,8 @@ pub fn configure_and_expand(
// start passing '--crate-type proc-macro' // start passing '--crate-type proc-macro'
if has_proc_macro_decls && sess.opts.actually_rustdoc && !is_proc_macro_crate { if has_proc_macro_decls && sess.opts.actually_rustdoc && !is_proc_macro_crate {
let mut msg = sess.diagnostic().struct_warn( let mut msg = sess.diagnostic().struct_warn(
&"Trying to document proc macro crate \ "Trying to document proc macro crate \
without passing '--crate-type proc-macro to rustdoc", without passing '--crate-type proc-macro to rustdoc",
); );
msg.warn("The generated documentation may be incorrect"); msg.warn("The generated documentation may be incorrect");
@ -403,7 +403,7 @@ pub fn configure_and_expand(
let num_crate_types = crate_types.len(); let num_crate_types = crate_types.len();
let is_test_crate = sess.opts.test; let is_test_crate = sess.opts.test;
rustc_builtin_macros::proc_macro_harness::inject( rustc_builtin_macros::proc_macro_harness::inject(
&sess, sess,
resolver, resolver,
krate, krate,
is_proc_macro_crate, is_proc_macro_crate,
@ -691,7 +691,7 @@ pub fn prepare_outputs(
); );
let output_paths = let output_paths =
generated_output_paths(sess, &outputs, compiler.output_file.is_some(), &crate_name); generated_output_paths(sess, &outputs, compiler.output_file.is_some(), crate_name);
// Ensure the source file isn't accidentally overwritten during compilation. // Ensure the source file isn't accidentally overwritten during compilation.
if let Some(ref input_path) = compiler.input_path { if let Some(ref input_path) = compiler.input_path {
@ -832,7 +832,7 @@ pub fn create_global_ctxt<'tcx>(
dep_graph, dep_graph,
queries.on_disk_cache.as_ref().map(OnDiskCache::as_dyn), queries.on_disk_cache.as_ref().map(OnDiskCache::as_dyn),
queries.as_dyn(), queries.as_dyn(),
&crate_name, crate_name,
outputs, outputs,
) )
}) })

View file

@ -110,7 +110,7 @@ impl<'tcx> Queries<'tcx> {
&self.compiler.sess &self.compiler.sess
} }
fn codegen_backend(&self) -> &Lrc<Box<dyn CodegenBackend>> { fn codegen_backend(&self) -> &Lrc<Box<dyn CodegenBackend>> {
&self.compiler.codegen_backend() self.compiler.codegen_backend()
} }
fn dep_graph_future(&self) -> Result<&Query<Option<DepGraphFuture>>> { fn dep_graph_future(&self) -> Result<&Query<Option<DepGraphFuture>>> {
@ -181,7 +181,7 @@ impl<'tcx> Queries<'tcx> {
&crate_name, &crate_name,
); );
let krate = resolver.access(|resolver| { let krate = resolver.access(|resolver| {
passes::configure_and_expand(&sess, &lint_store, krate, &crate_name, resolver) passes::configure_and_expand(sess, &lint_store, krate, &crate_name, resolver)
})?; })?;
Ok((Rc::new(krate), Rc::new(RefCell::new(resolver)), lint_store)) Ok((Rc::new(krate), Rc::new(RefCell::new(resolver)), lint_store))
}) })
@ -343,7 +343,7 @@ impl Linker {
let sess = &self.sess; let sess = &self.sess;
let dep_graph = self.dep_graph; let dep_graph = self.dep_graph;
sess.time("serialize_work_products", || { sess.time("serialize_work_products", || {
rustc_incremental::save_work_product_index(&sess, &dep_graph, work_products) rustc_incremental::save_work_product_index(sess, &dep_graph, work_products)
}); });
let prof = self.sess.prof.clone(); let prof = self.sess.prof.clone();
@ -386,7 +386,7 @@ impl Compiler {
F: for<'tcx> FnOnce(&'tcx Queries<'tcx>) -> T, F: for<'tcx> FnOnce(&'tcx Queries<'tcx>) -> T,
{ {
let mut _timer = None; let mut _timer = None;
let queries = Queries::new(&self); let queries = Queries::new(self);
let ret = f(&queries); let ret = f(&queries);
// NOTE: intentionally does not compute the global context if it hasn't been built yet, // NOTE: intentionally does not compute the global context if it hasn't been built yet,

View file

@ -402,7 +402,7 @@ pub fn get_codegen_sysroot(
.iter() .iter()
.chain(sysroot_candidates.iter()) .chain(sysroot_candidates.iter())
.map(|sysroot| { .map(|sysroot| {
filesearch::make_target_lib_path(&sysroot, &target).with_file_name("codegen-backends") filesearch::make_target_lib_path(sysroot, target).with_file_name("codegen-backends")
}) })
.find(|f| { .find(|f| {
info!("codegen backend candidate: {}", f.display()); info!("codegen backend candidate: {}", f.display());
@ -619,7 +619,7 @@ pub fn build_output_filenames(
.opts .opts
.crate_name .crate_name
.clone() .clone()
.or_else(|| rustc_attr::find_crate_name(&sess, attrs).map(|n| n.to_string())) .or_else(|| rustc_attr::find_crate_name(sess, attrs).map(|n| n.to_string()))
.unwrap_or_else(|| input.filestem().to_owned()); .unwrap_or_else(|| input.filestem().to_owned());
OutputFilenames::new( OutputFilenames::new(

View file

@ -17,6 +17,10 @@ impl RustString {
pub fn len(&self) -> usize { pub fn len(&self) -> usize {
self.bytes.borrow().len() self.bytes.borrow().len()
} }
pub fn is_empty(&self) -> bool {
self.bytes.borrow().is_empty()
}
} }
/// Appending to a Rust string -- used by RawRustStringOstream. /// Appending to a Rust string -- used by RawRustStringOstream.

View file

@ -470,7 +470,7 @@ impl EmbargoVisitor<'tcx> {
let hir_id = self.tcx.hir().local_def_id_to_hir_id(local_def_id); let hir_id = self.tcx.hir().local_def_id_to_hir_id(local_def_id);
let attrs = self.tcx.hir().attrs(hir_id); let attrs = self.tcx.hir().attrs(hir_id);
if attr::find_transparency(&attrs, md.macro_rules).0 != Transparency::Opaque { if attr::find_transparency(attrs, md.macro_rules).0 != Transparency::Opaque {
return; return;
} }
@ -797,7 +797,7 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> {
// Re-exports are handled in `visit_mod`. However, in order to avoid looping over // Re-exports are handled in `visit_mod`. However, in order to avoid looping over
// all of the items of a mod in `visit_mod` looking for use statements, we handle // all of the items of a mod in `visit_mod` looking for use statements, we handle
// making sure that intermediate use statements have their visibilities updated here. // making sure that intermediate use statements have their visibilities updated here.
hir::ItemKind::Use(ref path, _) => { hir::ItemKind::Use(path, _) => {
if item_level.is_some() { if item_level.is_some() {
self.update_visibility_of_intermediate_use_statements(path.segments.as_ref()); self.update_visibility_of_intermediate_use_statements(path.segments.as_ref());
} }
@ -1099,11 +1099,11 @@ impl<'tcx> Visitor<'tcx> for NamePrivacyVisitor<'tcx> {
} }
fn visit_expr(&mut self, expr: &'tcx hir::Expr<'tcx>) { fn visit_expr(&mut self, expr: &'tcx hir::Expr<'tcx>) {
if let hir::ExprKind::Struct(ref qpath, fields, ref base) = expr.kind { if let hir::ExprKind::Struct(qpath, fields, ref base) = expr.kind {
let res = self.typeck_results().qpath_res(qpath, expr.hir_id); let res = self.typeck_results().qpath_res(qpath, expr.hir_id);
let adt = self.typeck_results().expr_ty(expr).ty_adt_def().unwrap(); let adt = self.typeck_results().expr_ty(expr).ty_adt_def().unwrap();
let variant = adt.variant_of_res(res); let variant = adt.variant_of_res(res);
if let Some(ref base) = *base { if let Some(base) = *base {
// If the expression uses FRU we need to make sure all the unmentioned fields // If the expression uses FRU we need to make sure all the unmentioned fields
// are checked for privacy (RFC 736). Rather than computing the set of // are checked for privacy (RFC 736). Rather than computing the set of
// unmentioned fields, just check them all. // unmentioned fields, just check them all.
@ -1312,7 +1312,7 @@ impl<'tcx> Visitor<'tcx> for TypePrivacyVisitor<'tcx> {
return; return;
} }
match expr.kind { match expr.kind {
hir::ExprKind::Assign(_, ref rhs, _) | hir::ExprKind::Match(ref rhs, ..) => { hir::ExprKind::Assign(_, rhs, _) | hir::ExprKind::Match(rhs, ..) => {
// Do not report duplicate errors for `x = y` and `match x { ... }`. // Do not report duplicate errors for `x = y` and `match x { ... }`.
if self.check_expr_pat_type(rhs.hir_id, rhs.span) { if self.check_expr_pat_type(rhs.hir_id, rhs.span) {
return; return;
@ -1397,7 +1397,7 @@ impl<'tcx> Visitor<'tcx> for TypePrivacyVisitor<'tcx> {
} }
fn visit_local(&mut self, local: &'tcx hir::Local<'tcx>) { fn visit_local(&mut self, local: &'tcx hir::Local<'tcx>) {
if let Some(ref init) = local.init { if let Some(init) = local.init {
if self.check_expr_pat_type(init.hir_id, init.span) { if self.check_expr_pat_type(init.hir_id, init.span) {
// Do not report duplicate errors for `let x = y`. // Do not report duplicate errors for `let x = y`.
return; return;
@ -1474,7 +1474,7 @@ impl<'a, 'tcx> ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> {
// .. and it corresponds to a private type in the AST (this returns // .. and it corresponds to a private type in the AST (this returns
// `None` for type parameters). // `None` for type parameters).
match self.tcx.hir().find(self.tcx.hir().local_def_id_to_hir_id(did)) { match self.tcx.hir().find(self.tcx.hir().local_def_id_to_hir_id(did)) {
Some(Node::Item(ref item)) => !item.vis.node.is_pub(), Some(Node::Item(item)) => !item.vis.node.is_pub(),
Some(_) | None => false, Some(_) | None => false,
} }
} else { } else {
@ -1490,7 +1490,7 @@ impl<'a, 'tcx> ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> {
fn check_generic_bound(&mut self, bound: &hir::GenericBound<'_>) { fn check_generic_bound(&mut self, bound: &hir::GenericBound<'_>) {
if let hir::GenericBound::Trait(ref trait_ref, _) = *bound { if let hir::GenericBound::Trait(ref trait_ref, _) = *bound {
if self.path_is_private_type(&trait_ref.trait_ref.path) { if self.path_is_private_type(trait_ref.trait_ref.path) {
self.old_error_set.insert(trait_ref.trait_ref.hir_ref_id); self.old_error_set.insert(trait_ref.trait_ref.hir_ref_id);
} }
} }
@ -1517,7 +1517,7 @@ impl<'a, 'b, 'tcx, 'v> Visitor<'v> for ObsoleteCheckTypeForPrivatenessVisitor<'a
} }
fn visit_ty(&mut self, ty: &hir::Ty<'_>) { fn visit_ty(&mut self, ty: &hir::Ty<'_>) {
if let hir::TyKind::Path(hir::QPath::Resolved(_, ref path)) = ty.kind { if let hir::TyKind::Path(hir::QPath::Resolved(_, path)) = ty.kind {
if self.inner.path_is_private_type(path) { if self.inner.path_is_private_type(path) {
self.contains_private = true; self.contains_private = true;
// Found what we're looking for, so let's stop working. // Found what we're looking for, so let's stop working.
@ -1556,7 +1556,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> {
// namespace (the contents have their own privacies). // namespace (the contents have their own privacies).
hir::ItemKind::ForeignMod { .. } => {} hir::ItemKind::ForeignMod { .. } => {}
hir::ItemKind::Trait(.., ref bounds, _) => { hir::ItemKind::Trait(.., bounds, _) => {
if !self.trait_is_public(item.def_id) { if !self.trait_is_public(item.def_id) {
return; return;
} }
@ -1586,7 +1586,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> {
at_outer_type: true, at_outer_type: true,
outer_type_is_public_path: false, outer_type_is_public_path: false,
}; };
visitor.visit_ty(&impl_.self_ty); visitor.visit_ty(impl_.self_ty);
self_contains_private = visitor.contains_private; self_contains_private = visitor.contains_private;
self_is_public_path = visitor.outer_type_is_public_path; self_is_public_path = visitor.outer_type_is_public_path;
} }
@ -1664,12 +1664,12 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> {
// //
// Those in 2. are warned via walk_generics and this // Those in 2. are warned via walk_generics and this
// call here. // call here.
intravisit::walk_path(self, &tr.path); intravisit::walk_path(self, tr.path);
// Those in 3. are warned with this call. // Those in 3. are warned with this call.
for impl_item_ref in impl_.items { for impl_item_ref in impl_.items {
let impl_item = self.tcx.hir().impl_item(impl_item_ref.id); let impl_item = self.tcx.hir().impl_item(impl_item_ref.id);
if let hir::ImplItemKind::TyAlias(ref ty) = impl_item.kind { if let hir::ImplItemKind::TyAlias(ty) = impl_item.kind {
self.visit_ty(ty); self.visit_ty(ty);
} }
} }
@ -1739,7 +1739,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> {
} }
hir::WherePredicate::RegionPredicate(_) => {} hir::WherePredicate::RegionPredicate(_) => {}
hir::WherePredicate::EqPredicate(eq_pred) => { hir::WherePredicate::EqPredicate(eq_pred) => {
self.visit_ty(&eq_pred.rhs_ty); self.visit_ty(eq_pred.rhs_ty);
} }
} }
} }
@ -1752,7 +1752,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> {
} }
fn visit_ty(&mut self, t: &'tcx hir::Ty<'tcx>) { fn visit_ty(&mut self, t: &'tcx hir::Ty<'tcx>) {
if let hir::TyKind::Path(hir::QPath::Resolved(_, ref path)) = t.kind { if let hir::TyKind::Path(hir::QPath::Resolved(_, path)) = t.kind {
if self.path_is_private_type(path) { if self.path_is_private_type(path) {
self.old_error_set.insert(t.hir_id); self.old_error_set.insert(t.hir_id);
} }
@ -2191,7 +2191,7 @@ fn check_private_in_public(tcx: TyCtxt<'_>, (): ()) {
let mut visitor = ObsoleteVisiblePrivateTypesVisitor { let mut visitor = ObsoleteVisiblePrivateTypesVisitor {
tcx, tcx,
access_levels: &access_levels, access_levels,
in_variant: false, in_variant: false,
old_error_set: Default::default(), old_error_set: Default::default(),
}; };

View file

@ -132,7 +132,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
} }
let kind_ord = param.kind.to_ord(tcx); let kind_ord = param.kind.to_ord(tcx);
let arg_ord = arg.to_ord(&tcx.features()); let arg_ord = arg.to_ord(tcx.features());
// This note is only true when generic parameters are strictly ordered by their kind. // This note is only true when generic parameters are strictly ordered by their kind.
if possible_ordering_error && kind_ord.cmp(&arg_ord) != core::cmp::Ordering::Equal { if possible_ordering_error && kind_ord.cmp(&arg_ord) != core::cmp::Ordering::Equal {
@ -423,7 +423,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
is_method_call: IsMethodCall, is_method_call: IsMethodCall,
) -> GenericArgCountResult { ) -> GenericArgCountResult {
let empty_args = hir::GenericArgs::none(); let empty_args = hir::GenericArgs::none();
let suppress_mismatch = Self::check_impl_trait(tcx, seg, &generics); let suppress_mismatch = Self::check_impl_trait(tcx, seg, generics);
let gen_args = seg.args.unwrap_or(&empty_args); let gen_args = seg.args.unwrap_or(&empty_args);
let gen_pos = if is_method_call == IsMethodCall::Yes { let gen_pos = if is_method_call == IsMethodCall::Yes {

View file

@ -352,8 +352,8 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
span, span,
def_id, def_id,
seg, seg,
&generics, generics,
&generic_args, generic_args,
GenericArgPosition::Type, GenericArgPosition::Type,
self_ty.is_some(), self_ty.is_some(),
infer_args, infer_args,
@ -363,7 +363,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
// Traits always have `Self` as a generic parameter, which means they will not return early // Traits always have `Self` as a generic parameter, which means they will not return early
// here and so associated type bindings will be handled regardless of whether there are any // here and so associated type bindings will be handled regardless of whether there are any
// non-`Self` generic parameters. // non-`Self` generic parameters.
if generics.params.len() == 0 { if generics.params.is_empty() {
return (tcx.intern_substs(&[]), arg_count); return (tcx.intern_substs(&[]), arg_count);
} }
@ -417,7 +417,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
let tcx = self.astconv.tcx(); let tcx = self.astconv.tcx();
match (&param.kind, arg) { match (&param.kind, arg) {
(GenericParamDefKind::Lifetime, GenericArg::Lifetime(lt)) => { (GenericParamDefKind::Lifetime, GenericArg::Lifetime(lt)) => {
self.astconv.ast_region_to_region(&lt, Some(param)).into() self.astconv.ast_region_to_region(lt, Some(param)).into()
} }
(&GenericParamDefKind::Type { has_default, .. }, GenericArg::Type(ty)) => { (&GenericParamDefKind::Type { has_default, .. }, GenericArg::Type(ty)) => {
if has_default { if has_default {
@ -441,7 +441,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
self.inferred_params.push(ty.span); self.inferred_params.push(ty.span);
tcx.ty_error().into() tcx.ty_error().into()
} else { } else {
self.astconv.ast_ty_to_ty(&ty).into() self.astconv.ast_ty_to_ty(ty).into()
} }
} }
(GenericParamDefKind::Const { .. }, GenericArg::Const(ct)) => { (GenericParamDefKind::Const { .. }, GenericArg::Const(ct)) => {
@ -622,10 +622,10 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
.iter() .iter()
.map(|binding| { .map(|binding| {
let kind = match binding.kind { let kind = match binding.kind {
hir::TypeBindingKind::Equality { ref ty } => { hir::TypeBindingKind::Equality { ty } => {
ConvertedBindingKind::Equality(self.ast_ty_to_ty(ty)) ConvertedBindingKind::Equality(self.ast_ty_to_ty(ty))
} }
hir::TypeBindingKind::Constraint { ref bounds } => { hir::TypeBindingKind::Constraint { bounds } => {
ConvertedBindingKind::Constraint(bounds) ConvertedBindingKind::Constraint(bounds)
} }
}; };
@ -908,18 +908,15 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
if let Some((self_ty, where_clause)) = self_ty_where_predicates { if let Some((self_ty, where_clause)) = self_ty_where_predicates {
let self_ty_def_id = tcx.hir().local_def_id(self_ty).to_def_id(); let self_ty_def_id = tcx.hir().local_def_id(self_ty).to_def_id();
for clause in where_clause { for clause in where_clause {
match clause { if let hir::WherePredicate::BoundPredicate(pred) = clause {
hir::WherePredicate::BoundPredicate(pred) => { match pred.bounded_ty.kind {
match pred.bounded_ty.kind { hir::TyKind::Path(hir::QPath::Resolved(_, path)) => match path.res {
hir::TyKind::Path(hir::QPath::Resolved(_, path)) => match path.res { Res::Def(DefKind::TyParam, def_id) if def_id == self_ty_def_id => {}
Res::Def(DefKind::TyParam, def_id) if def_id == self_ty_def_id => {}
_ => continue,
},
_ => continue, _ => continue,
} },
search_bounds(pred.bounds); _ => continue,
} }
_ => {} search_bounds(pred.bounds);
} }
} }
} }
@ -1030,7 +1027,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
param_ty: Ty<'tcx>, param_ty: Ty<'tcx>,
ast_bounds: &[hir::GenericBound<'_>], ast_bounds: &[hir::GenericBound<'_>],
) -> Bounds<'tcx> { ) -> Bounds<'tcx> {
self.compute_bounds_inner(param_ty, &ast_bounds) self.compute_bounds_inner(param_ty, ast_bounds)
} }
/// Convert the bounds in `ast_bounds` that refer to traits which define an associated type /// Convert the bounds in `ast_bounds` that refer to traits which define an associated type
@ -1231,7 +1228,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
} }
match binding.kind { match binding.kind {
ConvertedBindingKind::Equality(ref ty) => { ConvertedBindingKind::Equality(ty) => {
// "Desugar" a constraint like `T: Iterator<Item = u32>` this to // "Desugar" a constraint like `T: Iterator<Item = u32>` this to
// the "projection predicate" for: // the "projection predicate" for:
// //
@ -2207,7 +2204,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
assert_eq!(opt_self_ty, None); assert_eq!(opt_self_ty, None);
let path_segs = let path_segs =
self.def_ids_for_value_path_segments(&path.segments, None, kind, def_id); self.def_ids_for_value_path_segments(path.segments, None, kind, def_id);
let generic_segs: FxHashSet<_> = let generic_segs: FxHashSet<_> =
path_segs.iter().map(|PathSeg(_, index)| index).collect(); path_segs.iter().map(|PathSeg(_, index)| index).collect();
self.prohibit_generics(path.segments.iter().enumerate().filter_map( self.prohibit_generics(path.segments.iter().enumerate().filter_map(
@ -2304,34 +2301,32 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
let tcx = self.tcx(); let tcx = self.tcx();
let result_ty = match ast_ty.kind { let result_ty = match ast_ty.kind {
hir::TyKind::Slice(ref ty) => tcx.mk_slice(self.ast_ty_to_ty(&ty)), hir::TyKind::Slice(ref ty) => tcx.mk_slice(self.ast_ty_to_ty(ty)),
hir::TyKind::Ptr(ref mt) => { hir::TyKind::Ptr(ref mt) => {
tcx.mk_ptr(ty::TypeAndMut { ty: self.ast_ty_to_ty(&mt.ty), mutbl: mt.mutbl }) tcx.mk_ptr(ty::TypeAndMut { ty: self.ast_ty_to_ty(mt.ty), mutbl: mt.mutbl })
} }
hir::TyKind::Rptr(ref region, ref mt) => { hir::TyKind::Rptr(ref region, ref mt) => {
let r = self.ast_region_to_region(region, None); let r = self.ast_region_to_region(region, None);
debug!(?r); debug!(?r);
let t = self.ast_ty_to_ty_inner(&mt.ty, true); let t = self.ast_ty_to_ty_inner(mt.ty, true);
tcx.mk_ref(r, ty::TypeAndMut { ty: t, mutbl: mt.mutbl }) tcx.mk_ref(r, ty::TypeAndMut { ty: t, mutbl: mt.mutbl })
} }
hir::TyKind::Never => tcx.types.never, hir::TyKind::Never => tcx.types.never,
hir::TyKind::Tup(ref fields) => { hir::TyKind::Tup(fields) => tcx.mk_tup(fields.iter().map(|t| self.ast_ty_to_ty(t))),
tcx.mk_tup(fields.iter().map(|t| self.ast_ty_to_ty(&t))) hir::TyKind::BareFn(bf) => {
} require_c_abi_if_c_variadic(tcx, bf.decl, bf.abi, ast_ty.span);
hir::TyKind::BareFn(ref bf) => {
require_c_abi_if_c_variadic(tcx, &bf.decl, bf.abi, ast_ty.span);
tcx.mk_fn_ptr(self.ty_of_fn( tcx.mk_fn_ptr(self.ty_of_fn(
ast_ty.hir_id, ast_ty.hir_id,
bf.unsafety, bf.unsafety,
bf.abi, bf.abi,
&bf.decl, bf.decl,
&hir::Generics::empty(), &hir::Generics::empty(),
None, None,
Some(ast_ty), Some(ast_ty),
)) ))
} }
hir::TyKind::TraitObject(ref bounds, ref lifetime, _) => { hir::TyKind::TraitObject(bounds, ref lifetime, _) => {
self.conv_object_ty_poly_trait_ref(ast_ty.span, bounds, lifetime, borrowed) self.conv_object_ty_poly_trait_ref(ast_ty.span, bounds, lifetime, borrowed)
} }
hir::TyKind::Path(hir::QPath::Resolved(ref maybe_qself, ref path)) => { hir::TyKind::Path(hir::QPath::Resolved(ref maybe_qself, ref path)) => {
@ -2339,7 +2334,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
let opt_self_ty = maybe_qself.as_ref().map(|qself| self.ast_ty_to_ty(qself)); let opt_self_ty = maybe_qself.as_ref().map(|qself| self.ast_ty_to_ty(qself));
self.res_to_ty(opt_self_ty, path, false) self.res_to_ty(opt_self_ty, path, false)
} }
hir::TyKind::OpaqueDef(item_id, ref lifetimes) => { hir::TyKind::OpaqueDef(item_id, lifetimes) => {
let opaque_ty = tcx.hir().item(item_id); let opaque_ty = tcx.hir().item(item_id);
let def_id = item_id.def_id.to_def_id(); let def_id = item_id.def_id.to_def_id();
@ -2354,7 +2349,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
debug!(?qself, ?segment); debug!(?qself, ?segment);
let ty = self.ast_ty_to_ty(qself); let ty = self.ast_ty_to_ty(qself);
let res = if let hir::TyKind::Path(hir::QPath::Resolved(_, ref path)) = qself.kind { let res = if let hir::TyKind::Path(hir::QPath::Resolved(_, path)) = qself.kind {
path.res path.res
} else { } else {
Res::Err Res::Err
@ -2379,7 +2374,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
hir::TyKind::Array(ref ty, ref length) => { hir::TyKind::Array(ref ty, ref length) => {
let length_def_id = tcx.hir().local_def_id(length.hir_id); let length_def_id = tcx.hir().local_def_id(length.hir_id);
let length = ty::Const::from_anon_const(tcx, length_def_id); let length = ty::Const::from_anon_const(tcx, length_def_id);
let array_ty = tcx.mk_ty(ty::Array(self.ast_ty_to_ty(&ty), length)); let array_ty = tcx.mk_ty(ty::Array(self.ast_ty_to_ty(ty), length));
self.normalize_ty(ast_ty.span, array_ty) self.normalize_ty(ast_ty.span, array_ty)
} }
hir::TyKind::Typeof(ref e) => { hir::TyKind::Typeof(ref e) => {
@ -2485,7 +2480,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
let input_tys = decl.inputs.iter().map(|a| self.ty_of_arg(a, None)); let input_tys = decl.inputs.iter().map(|a| self.ty_of_arg(a, None));
let output_ty = match decl.output { let output_ty = match decl.output {
hir::FnRetTy::Return(ref output) => { hir::FnRetTy::Return(output) => {
visitor.visit_ty(output); visitor.visit_ty(output);
self.ast_ty_to_ty(output) self.ast_ty_to_ty(output)
} }

View file

@ -28,7 +28,7 @@ struct ConfirmContext<'a, 'tcx> {
impl<'a, 'tcx> Deref for ConfirmContext<'a, 'tcx> { impl<'a, 'tcx> Deref for ConfirmContext<'a, 'tcx> {
type Target = FnCtxt<'a, 'tcx>; type Target = FnCtxt<'a, 'tcx>;
fn deref(&self) -> &Self::Target { fn deref(&self) -> &Self::Target {
&self.fcx self.fcx
} }
} }
@ -290,7 +290,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
.autoderef(self.span, self_ty) .autoderef(self.span, self_ty)
.include_raw_pointers() .include_raw_pointers()
.find_map(|(ty, _)| match ty.kind() { .find_map(|(ty, _)| match ty.kind() {
ty::Dynamic(ref data, ..) => Some(closure( ty::Dynamic(data, ..) => Some(closure(
self, self,
ty, ty,
data.principal().unwrap_or_else(|| { data.principal().unwrap_or_else(|| {
@ -323,7 +323,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
self.tcx, self.tcx,
self.span, self.span,
pick.item.def_id, pick.item.def_id,
&generics, generics,
seg, seg,
IsMethodCall::Yes, IsMethodCall::Yes,
); );
@ -343,7 +343,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
def_id: DefId, def_id: DefId,
) -> (Option<&'a hir::GenericArgs<'a>>, bool) { ) -> (Option<&'a hir::GenericArgs<'a>>, bool) {
if def_id == self.pick.item.def_id { if def_id == self.pick.item.def_id {
if let Some(ref data) = self.seg.args { if let Some(data) = self.seg.args {
return (Some(data), false); return (Some(data), false);
} }
} }

View file

@ -160,7 +160,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
.unwrap_or(0); .unwrap_or(0);
// Account for `foo.bar<T>`; // Account for `foo.bar<T>`;
let sugg_span = span.unwrap_or_else(|| call_expr.span).shrink_to_hi(); let sugg_span = span.unwrap_or(call_expr.span).shrink_to_hi();
let (suggestion, applicability) = ( let (suggestion, applicability) = (
format!("({})", (0..params).map(|_| "_").collect::<Vec<_>>().join(", ")), format!("({})", (0..params).map(|_| "_").collect::<Vec<_>>().join(", ")),
if params > 0 { Applicability::HasPlaceholders } else { Applicability::MaybeIncorrect }, if params > 0 { Applicability::HasPlaceholders } else { Applicability::MaybeIncorrect },
@ -320,7 +320,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
GenericParamDefKind::Type { .. } => { GenericParamDefKind::Type { .. } => {
if param.index == 0 { if param.index == 0 {
return self_ty.into(); return self_ty.into();
} else if let Some(ref input_types) = opt_input_types { } else if let Some(input_types) = opt_input_types {
return input_types[param.index as usize - 1].into(); return input_types[param.index as usize - 1].into();
} }
} }

View file

@ -88,7 +88,7 @@ struct ProbeContext<'a, 'tcx> {
impl<'a, 'tcx> Deref for ProbeContext<'a, 'tcx> { impl<'a, 'tcx> Deref for ProbeContext<'a, 'tcx> {
type Target = FnCtxt<'a, 'tcx>; type Target = FnCtxt<'a, 'tcx>;
fn deref(&self) -> &Self::Target { fn deref(&self) -> &Self::Target {
&self.fcx self.fcx
} }
} }
@ -614,7 +614,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
let lang_items = self.tcx.lang_items(); let lang_items = self.tcx.lang_items();
match *self_ty.value.value.kind() { match *self_ty.value.value.kind() {
ty::Dynamic(ref data, ..) if let Some(p) = data.principal() => { ty::Dynamic(data, ..) if let Some(p) = data.principal() => {
// Subtle: we can't use `instantiate_query_response` here: using it will // Subtle: we can't use `instantiate_query_response` here: using it will
// commit to all of the type equalities assumed by inference going through // commit to all of the type equalities assumed by inference going through
// autoderef (see the `method-probe-no-guessing` test). // autoderef (see the `method-probe-no-guessing` test).
@ -634,7 +634,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
// type variables in any form, so just do that! // type variables in any form, so just do that!
let (QueryResponse { value: generalized_self_ty, .. }, _ignored_var_values) = let (QueryResponse { value: generalized_self_ty, .. }, _ignored_var_values) =
self.fcx self.fcx
.instantiate_canonical_with_fresh_inference_vars(self.span, &self_ty); .instantiate_canonical_with_fresh_inference_vars(self.span, self_ty);
self.assemble_inherent_candidates_from_object(generalized_self_ty); self.assemble_inherent_candidates_from_object(generalized_self_ty);
self.assemble_inherent_impl_candidates_for_type(p.def_id()); self.assemble_inherent_impl_candidates_for_type(p.def_id());
@ -1428,7 +1428,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
// match as well (or at least may match, sometimes we // match as well (or at least may match, sometimes we
// don't have enough information to fully evaluate). // don't have enough information to fully evaluate).
match probe.kind { match probe.kind {
InherentImplCandidate(ref substs, ref ref_obligations) => { InherentImplCandidate(substs, ref ref_obligations) => {
// Check whether the impl imposes obligations we have to worry about. // Check whether the impl imposes obligations we have to worry about.
let impl_def_id = probe.item.container.id(); let impl_def_id = probe.item.container.id();
let impl_bounds = self.tcx.predicates_of(impl_def_id); let impl_bounds = self.tcx.predicates_of(impl_def_id);

View file

@ -328,48 +328,44 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
Applicability::MaybeIncorrect, Applicability::MaybeIncorrect,
); );
} }
ExprKind::Path(ref qpath) => { ExprKind::Path(QPath::Resolved(_, path)) => {
// local binding // local binding
if let QPath::Resolved(_, path) = qpath { if let hir::def::Res::Local(hir_id) = path.res {
if let hir::def::Res::Local(hir_id) = path.res { let span = tcx.hir().span(hir_id);
let span = tcx.hir().span(hir_id); let snippet = tcx.sess.source_map().span_to_snippet(span);
let snippet = tcx.sess.source_map().span_to_snippet(span); let filename = tcx.sess.source_map().span_to_filename(span);
let filename = tcx.sess.source_map().span_to_filename(span);
let parent_node = self let parent_node =
.tcx self.tcx.hir().get(self.tcx.hir().get_parent_node(hir_id));
.hir() let msg = format!(
.get(self.tcx.hir().get_parent_node(hir_id)); "you must specify a type for this binding, like `{}`",
let msg = format!( concrete_type,
"you must specify a type for this binding, like `{}`", );
concrete_type,
);
match (filename, parent_node, snippet) { match (filename, parent_node, snippet) {
( (
FileName::Real(_), FileName::Real(_),
Node::Local(hir::Local { Node::Local(hir::Local {
source: hir::LocalSource::Normal, source: hir::LocalSource::Normal,
ty, ty,
.. ..
}), }),
Ok(ref snippet), Ok(ref snippet),
) => { ) => {
err.span_suggestion( err.span_suggestion(
// account for `let x: _ = 42;` // account for `let x: _ = 42;`
// ^^^^ // ^^^^
span.to(ty span.to(ty
.as_ref() .as_ref()
.map(|ty| ty.span) .map(|ty| ty.span)
.unwrap_or(span)), .unwrap_or(span)),
&msg, &msg,
format!("{}: {}", snippet, concrete_type), format!("{}: {}", snippet, concrete_type),
Applicability::MaybeIncorrect, Applicability::MaybeIncorrect,
); );
} }
_ => { _ => {
err.span_label(span, msg); err.span_label(span, msg);
}
} }
} }
} }
@ -383,11 +379,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// Don't show generic arguments when the method can't be found in any implementation (#81576). // Don't show generic arguments when the method can't be found in any implementation (#81576).
let mut ty_str_reported = ty_str.clone(); let mut ty_str_reported = ty_str.clone();
if let ty::Adt(_, ref generics) = actual.kind() { if let ty::Adt(_, generics) = actual.kind() {
if generics.len() > 0 { if generics.len() > 0 {
let mut autoderef = self.autoderef(span, actual); let mut autoderef = self.autoderef(span, actual);
let candidate_found = autoderef.any(|(ty, _)| { let candidate_found = autoderef.any(|(ty, _)| {
if let ty::Adt(ref adt_deref, _) = ty.kind() { if let ty::Adt(adt_deref, _) = ty.kind() {
self.tcx self.tcx
.inherent_impls(adt_deref.did) .inherent_impls(adt_deref.did)
.iter() .iter()
@ -482,7 +478,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let mut label_span_not_found = || { let mut label_span_not_found = || {
if unsatisfied_predicates.is_empty() { if unsatisfied_predicates.is_empty() {
err.span_label(span, format!("{item_kind} not found in `{ty_str}`")); err.span_label(span, format!("{item_kind} not found in `{ty_str}`"));
if let ty::Adt(ref adt, _) = rcvr_ty.kind() { if let ty::Adt(adt, _) = rcvr_ty.kind() {
let mut inherent_impls_candidate = self let mut inherent_impls_candidate = self
.tcx .tcx
.inherent_impls(adt.did) .inherent_impls(adt.did)
@ -511,7 +507,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
if inherent_impls_candidate.len() > 0 { if !inherent_impls_candidate.is_empty() {
inherent_impls_candidate.sort(); inherent_impls_candidate.sort();
inherent_impls_candidate.dedup(); inherent_impls_candidate.dedup();
@ -565,7 +561,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let is_accessible = field.vis.is_accessible_from(scope, self.tcx); let is_accessible = field.vis.is_accessible_from(scope, self.tcx);
if is_accessible { if is_accessible {
if self.is_fn_ty(&field_ty, span) { if self.is_fn_ty(field_ty, span) {
let expr_span = expr.span.to(item_name.span); let expr_span = expr.span.to(item_name.span);
err.multipart_suggestion( err.multipart_suggestion(
&format!( &format!(
@ -605,7 +601,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
label_span_not_found(); label_span_not_found();
} }
if self.is_fn_ty(&rcvr_ty, span) { if self.is_fn_ty(rcvr_ty, span) {
fn report_function<T: std::fmt::Display>( fn report_function<T: std::fmt::Display>(
err: &mut DiagnosticBuilder<'_>, err: &mut DiagnosticBuilder<'_>,
name: T, name: T,
@ -618,7 +614,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
if let SelfSource::MethodCall(expr) = source { if let SelfSource::MethodCall(expr) = source {
if let Ok(expr_string) = tcx.sess.source_map().span_to_snippet(expr.span) { if let Ok(expr_string) = tcx.sess.source_map().span_to_snippet(expr.span) {
report_function(&mut err, expr_string); report_function(&mut err, expr_string);
} else if let ExprKind::Path(QPath::Resolved(_, ref path)) = expr.kind { } else if let ExprKind::Path(QPath::Resolved(_, path)) = expr.kind {
if let Some(segment) = path.segments.last() { if let Some(segment) = path.segments.last() {
report_function(&mut err, segment.ident); report_function(&mut err, segment.ident);
} }
@ -808,7 +804,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
); );
} }
bound_list.sort_by(|(_, a), (_, b)| a.cmp(&b)); // Sort alphabetically. bound_list.sort_by(|(_, a), (_, b)| a.cmp(b)); // Sort alphabetically.
bound_list.dedup_by(|(_, a), (_, b)| a == b); // #35677 bound_list.dedup_by(|(_, a), (_, b)| a == b); // #35677
bound_list.sort_by_key(|(pos, _)| *pos); // Keep the original predicate order. bound_list.sort_by_key(|(pos, _)| *pos); // Keep the original predicate order.
bound_spans.sort(); bound_spans.sort();
@ -1007,12 +1003,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
if adt_def.did.is_local() { if adt_def.did.is_local() {
let diagnostic_items = self.tcx.diagnostic_items(trait_ref.def_id.krate); let diagnostic_items = self.tcx.diagnostic_items(trait_ref.def_id.krate);
return derivables.iter().find_map(|trait_derivable| { return derivables.iter().find_map(|trait_derivable| {
let item_def_id = let item_def_id = diagnostic_items.get(trait_derivable)?;
if let Some(item_def_id) = diagnostic_items.get(trait_derivable) {
item_def_id
} else {
return None;
};
if item_def_id == &trait_pred.trait_ref.def_id if item_def_id == &trait_pred.trait_ref.def_id
&& !(adt_def.is_enum() && *trait_derivable == sym::Default) && !(adt_def.is_enum() && *trait_derivable == sym::Default)
{ {
@ -1371,9 +1362,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
) )
}; };
// Obtain the span for `param` and use it for a structured suggestion. // Obtain the span for `param` and use it for a structured suggestion.
if let (Some(ref param), Some(ref table)) = if let (Some(param), Some(table)) = (param_type, self.in_progress_typeck_results) {
(param_type, self.in_progress_typeck_results)
{
let table_owner = table.borrow().hir_owner; let table_owner = table.borrow().hir_owner;
let generics = self.tcx.generics_of(table_owner.to_def_id()); let generics = self.tcx.generics_of(table_owner.to_def_id());
let type_param = generics.type_param(param, self.tcx); let type_param = generics.type_param(param, self.tcx);
@ -1384,7 +1373,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// We do this to avoid suggesting code that ends up as `T: FooBar`, // We do this to avoid suggesting code that ends up as `T: FooBar`,
// instead we suggest `T: Foo + Bar` in that case. // instead we suggest `T: Foo + Bar` in that case.
match hir.get(id) { match hir.get(id) {
Node::GenericParam(ref param) => { Node::GenericParam(param) => {
let mut impl_trait = false; let mut impl_trait = false;
let has_bounds = let has_bounds =
if let hir::GenericParamKind::Type { synthetic: Some(_), .. } = if let hir::GenericParamKind::Type { synthetic: Some(_), .. } =
@ -1558,7 +1547,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
match ty.kind() { match ty.kind() {
ty::Adt(def, _) => def.did.is_local(), ty::Adt(def, _) => def.did.is_local(),
ty::Foreign(did) => did.is_local(), ty::Foreign(did) => did.is_local(),
ty::Dynamic(ref tr, ..) => tr.principal().map_or(false, |d| d.def_id().is_local()), ty::Dynamic(tr, ..) => tr.principal().map_or(false, |d| d.def_id().is_local()),
ty::Param(_) => true, ty::Param(_) => true,
// Everything else (primitive types, etc.) is effectively // Everything else (primitive types, etc.) is effectively

View file

@ -271,22 +271,22 @@ fn primary_body_of(
) -> Option<(hir::BodyId, Option<&hir::Ty<'_>>, Option<&hir::FnSig<'_>>)> { ) -> Option<(hir::BodyId, Option<&hir::Ty<'_>>, Option<&hir::FnSig<'_>>)> {
match tcx.hir().get(id) { match tcx.hir().get(id) {
Node::Item(item) => match item.kind { Node::Item(item) => match item.kind {
hir::ItemKind::Const(ref ty, body) | hir::ItemKind::Static(ref ty, _, body) => { hir::ItemKind::Const(ty, body) | hir::ItemKind::Static(ty, _, body) => {
Some((body, Some(ty), None)) Some((body, Some(ty), None))
} }
hir::ItemKind::Fn(ref sig, .., body) => Some((body, None, Some(&sig))), hir::ItemKind::Fn(ref sig, .., body) => Some((body, None, Some(sig))),
_ => None, _ => None,
}, },
Node::TraitItem(item) => match item.kind { Node::TraitItem(item) => match item.kind {
hir::TraitItemKind::Const(ref ty, Some(body)) => Some((body, Some(ty), None)), hir::TraitItemKind::Const(ty, Some(body)) => Some((body, Some(ty), None)),
hir::TraitItemKind::Fn(ref sig, hir::TraitFn::Provided(body)) => { hir::TraitItemKind::Fn(ref sig, hir::TraitFn::Provided(body)) => {
Some((body, None, Some(&sig))) Some((body, None, Some(sig)))
} }
_ => None, _ => None,
}, },
Node::ImplItem(item) => match item.kind { Node::ImplItem(item) => match item.kind {
hir::ImplItemKind::Const(ref ty, body) => Some((body, Some(ty), None)), hir::ImplItemKind::Const(ty, body) => Some((body, Some(ty), None)),
hir::ImplItemKind::Fn(ref sig, body) => Some((body, None, Some(&sig))), hir::ImplItemKind::Fn(ref sig, body) => Some((body, None, Some(sig))),
_ => None, _ => None,
}, },
Node::AnonConst(constant) => Some((constant.body, None, None)), Node::AnonConst(constant) => Some((constant.body, None, None)),
@ -555,16 +555,13 @@ fn maybe_check_static_with_link_section(tcx: TyCtxt<'_>, id: LocalDefId, span: S
// `#[link_section]` may contain arbitrary, or even undefined bytes, but it is // `#[link_section]` may contain arbitrary, or even undefined bytes, but it is
// the consumer's responsibility to ensure all bytes that have been read // the consumer's responsibility to ensure all bytes that have been read
// have defined values. // have defined values.
match tcx.eval_static_initializer(id.to_def_id()) { if let Ok(alloc) = tcx.eval_static_initializer(id.to_def_id()) {
Ok(alloc) => { if alloc.relocations().len() != 0 {
if alloc.relocations().len() != 0 { let msg = "statics with a custom `#[link_section]` must be a \
let msg = "statics with a custom `#[link_section]` must be a \
simple list of bytes on the wasm target with no \ simple list of bytes on the wasm target with no \
extra levels of indirection such as references"; extra levels of indirection such as references";
tcx.sess.span_err(span, msg); tcx.sess.span_err(span, msg);
}
} }
Err(_) => {}
} }
} }
@ -631,7 +628,7 @@ fn missing_items_err(
let padding: String = " ".repeat(indentation); let padding: String = " ".repeat(indentation);
for trait_item in missing_items { for trait_item in missing_items {
let snippet = suggestion_signature(&trait_item, tcx); let snippet = suggestion_signature(trait_item, tcx);
let code = format!("{}{}\n{}", padding, snippet, padding); let code = format!("{}{}\n{}", padding, snippet, padding);
let msg = format!("implement the missing item: `{}`", snippet); let msg = format!("implement the missing item: `{}`", snippet);
let appl = Applicability::HasPlaceholders; let appl = Applicability::HasPlaceholders;

View file

@ -444,7 +444,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// Check if the method would be found if the type param wasn't // 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 // involved. If so, it means that adding a trait bound to the param is
// enough. Otherwise we do not give the suggestion. // enough. Otherwise we do not give the suggestion.
let mut eraser = TypeParamEraser(&self, expr.span); let mut eraser = TypeParamEraser(self, expr.span);
let needs_bound = self let needs_bound = self
.lookup_op_method( .lookup_op_method(
eraser.fold_ty(lhs_ty), eraser.fold_ty(lhs_ty),
@ -475,7 +475,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
bug!("type param visitor stored a non type param: {:?}", ty.kind()); bug!("type param visitor stored a non type param: {:?}", ty.kind());
} }
} else if !suggested_deref && !involves_fn { } else if !suggested_deref && !involves_fn {
suggest_impl_missing(&mut err, lhs_ty, &missing_trait); suggest_impl_missing(&mut err, lhs_ty, missing_trait);
} }
} }
err.emit(); err.emit();
@ -718,14 +718,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
} }
Str | Never | Char | Tuple(_) | Array(_, _) => {} Str | Never | Char | Tuple(_) | Array(_, _) => {}
Ref(_, ref lty, _) if *lty.kind() == Str => {} Ref(_, lty, _) if *lty.kind() == Str => {}
_ => { _ => {
let missing_trait = match op { let missing_trait = match op {
hir::UnOp::Neg => "std::ops::Neg", hir::UnOp::Neg => "std::ops::Neg",
hir::UnOp::Not => "std::ops::Not", hir::UnOp::Not => "std::ops::Not",
hir::UnOp::Deref => "std::ops::UnDerf", hir::UnOp::Deref => "std::ops::UnDerf",
}; };
suggest_impl_missing(&mut err, operand_ty, &missing_trait); suggest_impl_missing(&mut err, operand_ty, missing_trait);
} }
} }
} }

View file

@ -341,7 +341,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
expected: Ty<'tcx>, expected: Ty<'tcx>,
mut def_bm: BindingMode, mut def_bm: BindingMode,
) -> (Ty<'tcx>, BindingMode) { ) -> (Ty<'tcx>, BindingMode) {
let mut expected = self.resolve_vars_with_obligations(&expected); let mut expected = self.resolve_vars_with_obligations(expected);
// Peel off as many `&` or `&mut` from the scrutinee type as possible. For example, // Peel off as many `&` or `&mut` from the scrutinee type as possible. For example,
// for `match &&&mut Some(5)` the loop runs three times, aborting when it reaches // for `match &&&mut Some(5)` the loop runs three times, aborting when it reaches
@ -587,7 +587,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
if let Some(p) = sub { if let Some(p) = sub {
self.check_pat(&p, expected, def_bm, TopInfo { parent_pat: Some(&pat), ..ti }); self.check_pat(p, expected, def_bm, TopInfo { parent_pat: Some(pat), ..ti });
} }
local_ty local_ty
@ -697,8 +697,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} else { } else {
let err = self.tcx.ty_error(); let err = self.tcx.ty_error();
for field in fields { for field in fields {
let ti = TopInfo { parent_pat: Some(&pat), ..ti }; let ti = TopInfo { parent_pat: Some(pat), ..ti };
self.check_pat(&field.pat, err, def_bm, ti); self.check_pat(field.pat, err, def_bm, ti);
} }
return err; return err;
}; };
@ -707,7 +707,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
self.demand_eqtype_pat(pat.span, expected, pat_ty, ti); self.demand_eqtype_pat(pat.span, expected, pat_ty, ti);
// Type-check subpatterns. // Type-check subpatterns.
if self.check_struct_pat_fields(pat_ty, &pat, variant, fields, etc, def_bm, ti) { if self.check_struct_pat_fields(pat_ty, pat, variant, fields, etc, def_bm, ti) {
pat_ty pat_ty
} else { } else {
self.tcx.ty_error() self.tcx.ty_error()
@ -876,7 +876,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let on_error = || { let on_error = || {
let parent_pat = Some(pat); let parent_pat = Some(pat);
for pat in subpats { for pat in subpats {
self.check_pat(&pat, tcx.ty_error(), def_bm, TopInfo { parent_pat, ..ti }); self.check_pat(pat, tcx.ty_error(), def_bm, TopInfo { parent_pat, ..ti });
} }
}; };
let report_unexpected_res = |res: Res| { let report_unexpected_res = |res: Res| {
@ -961,7 +961,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}; };
for (i, subpat) in subpats.iter().enumerate_and_adjust(variant.fields.len(), ddpos) { for (i, subpat) in subpats.iter().enumerate_and_adjust(variant.fields.len(), ddpos) {
let field_ty = self.field_ty(subpat.span, &variant.fields[i], substs); let field_ty = self.field_ty(subpat.span, &variant.fields[i], substs);
self.check_pat(&subpat, field_ty, def_bm, TopInfo { parent_pat: Some(&pat), ..ti }); self.check_pat(subpat, field_ty, def_bm, TopInfo { parent_pat: Some(pat), ..ti });
self.tcx.check_stability( self.tcx.check_stability(
variant.fields[i].did, variant.fields[i].did,
@ -1151,7 +1151,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let mut expected_len = elements.len(); let mut expected_len = elements.len();
if ddpos.is_some() { if ddpos.is_some() {
// Require known type only when `..` is present. // Require known type only when `..` is present.
if let ty::Tuple(ref tys) = self.structurally_resolved_type(span, expected).kind() { if let ty::Tuple(tys) = self.structurally_resolved_type(span, expected).kind() {
expected_len = tys.len(); expected_len = tys.len();
} }
} }
@ -1172,12 +1172,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// further errors being emitted when using the bindings. #50333 // further errors being emitted when using the bindings. #50333
let element_tys_iter = (0..max_len).map(|_| tcx.ty_error()); let element_tys_iter = (0..max_len).map(|_| tcx.ty_error());
for (_, elem) in elements.iter().enumerate_and_adjust(max_len, ddpos) { for (_, elem) in elements.iter().enumerate_and_adjust(max_len, ddpos) {
self.check_pat(elem, &tcx.ty_error(), def_bm, ti); self.check_pat(elem, tcx.ty_error(), def_bm, ti);
} }
tcx.mk_tup(element_tys_iter) tcx.mk_tup(element_tys_iter)
} else { } else {
for (i, elem) in elements.iter().enumerate_and_adjust(max_len, ddpos) { for (i, elem) in elements.iter().enumerate_and_adjust(max_len, ddpos) {
self.check_pat(elem, &element_tys[i].expect_ty(), def_bm, ti); self.check_pat(elem, element_tys[i].expect_ty(), def_bm, ti);
} }
pat_ty pat_ty
} }
@ -1240,14 +1240,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
}; };
self.check_pat(&field.pat, field_ty, def_bm, TopInfo { parent_pat: Some(&pat), ..ti }); self.check_pat(field.pat, field_ty, def_bm, TopInfo { parent_pat: Some(pat), ..ti });
} }
let mut unmentioned_fields = variant let mut unmentioned_fields = variant
.fields .fields
.iter() .iter()
.map(|field| (field, field.ident.normalize_to_macros_2_0())) .map(|field| (field, field.ident.normalize_to_macros_2_0()))
.filter(|(_, ident)| !used_fields.contains_key(&ident)) .filter(|(_, ident)| !used_fields.contains_key(ident))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let inexistent_fields_err = if !(inexistent_fields.is_empty() || variant.is_recovered()) { let inexistent_fields_err = if !(inexistent_fields.is_empty() || variant.is_recovered()) {
@ -1290,13 +1290,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
self.non_exhaustive_reachable_pattern(pat, &accessible_unmentioned_fields, adt_ty) self.non_exhaustive_reachable_pattern(pat, &accessible_unmentioned_fields, adt_ty)
} else if !etc { } else if !etc {
if accessible_unmentioned_fields.is_empty() { if accessible_unmentioned_fields.is_empty() {
unmentioned_err = Some(self.error_no_accessible_fields(pat, &fields)); unmentioned_err = Some(self.error_no_accessible_fields(pat, fields));
} else { } else {
unmentioned_err = Some(self.error_unmentioned_fields( unmentioned_err = Some(self.error_unmentioned_fields(
pat, pat,
&accessible_unmentioned_fields, &accessible_unmentioned_fields,
accessible_unmentioned_fields.len() != unmentioned_fields.len(), accessible_unmentioned_fields.len() != unmentioned_fields.len(),
&fields, fields,
)); ));
} }
} }
@ -1763,7 +1763,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
ti: TopInfo<'tcx>, ti: TopInfo<'tcx>,
) -> Ty<'tcx> { ) -> Ty<'tcx> {
let tcx = self.tcx; let tcx = self.tcx;
let (box_ty, inner_ty) = if self.check_dereferenceable(span, expected, &inner) { let (box_ty, inner_ty) = if self.check_dereferenceable(span, expected, inner) {
// Here, `demand::subtype` is good enough, but I don't // Here, `demand::subtype` is good enough, but I don't
// think any errors can be introduced by using `demand::eqtype`. // think any errors can be introduced by using `demand::eqtype`.
let inner_ty = self.next_ty_var(TypeVariableOrigin { let inner_ty = self.next_ty_var(TypeVariableOrigin {
@ -1777,7 +1777,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let err = tcx.ty_error(); let err = tcx.ty_error();
(err, err) (err, err)
}; };
self.check_pat(&inner, inner_ty, def_bm, ti); self.check_pat(inner, inner_ty, def_bm, ti);
box_ty box_ty
} }
@ -1792,7 +1792,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
) -> Ty<'tcx> { ) -> Ty<'tcx> {
let tcx = self.tcx; let tcx = self.tcx;
let expected = self.shallow_resolve(expected); let expected = self.shallow_resolve(expected);
let (rptr_ty, inner_ty) = if self.check_dereferenceable(pat.span, expected, &inner) { let (rptr_ty, inner_ty) = if self.check_dereferenceable(pat.span, expected, inner) {
// `demand::subtype` would be good enough, but using `eqtype` turns // `demand::subtype` would be good enough, but using `eqtype` turns
// out to be equally general. See (note_1) for details. // out to be equally general. See (note_1) for details.
@ -1814,7 +1814,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// Look for a case like `fn foo(&foo: u32)` and suggest // Look for a case like `fn foo(&foo: u32)` and suggest
// `fn foo(foo: &u32)` // `fn foo(foo: &u32)`
if let Some(mut err) = err { if let Some(mut err) = err {
self.borrow_pat_suggestion(&mut err, &pat, &inner, &expected); self.borrow_pat_suggestion(&mut err, pat, inner, expected);
err.emit(); err.emit();
} }
(rptr_ty, inner_ty) (rptr_ty, inner_ty)
@ -1824,7 +1824,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let err = tcx.ty_error(); let err = tcx.ty_error();
(err, err) (err, err)
}; };
self.check_pat(&inner, inner_ty, def_bm, TopInfo { parent_pat: Some(&pat), ..ti }); self.check_pat(inner, inner_ty, def_bm, TopInfo { parent_pat: Some(pat), ..ti });
rptr_ty rptr_ty
} }
@ -1880,15 +1880,15 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// Type check all the patterns before `slice`. // Type check all the patterns before `slice`.
for elt in before { for elt in before {
self.check_pat(&elt, element_ty, def_bm, ti); self.check_pat(elt, element_ty, def_bm, ti);
} }
// Type check the `slice`, if present, against its expected type. // Type check the `slice`, if present, against its expected type.
if let Some(slice) = slice { if let Some(slice) = slice {
self.check_pat(&slice, opt_slice_ty.unwrap(), def_bm, ti); self.check_pat(slice, opt_slice_ty.unwrap(), def_bm, ti);
} }
// Type check the elements after `slice`, if present. // Type check the elements after `slice`, if present.
for elt in after { for elt in after {
self.check_pat(&elt, element_ty, def_bm, ti); self.check_pat(elt, element_ty, def_bm, ti);
} }
inferred inferred
} }

View file

@ -288,7 +288,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
| hir::ExprKind::Index(ref expr, _) | hir::ExprKind::Index(ref expr, _)
| hir::ExprKind::Unary(hir::UnOp::Deref, ref expr) = exprs.last().unwrap().kind | hir::ExprKind::Unary(hir::UnOp::Deref, ref expr) = exprs.last().unwrap().kind
{ {
exprs.push(&expr); exprs.push(expr);
} }
debug!("convert_place_derefs_to_mutable: exprs={:?}", exprs); debug!("convert_place_derefs_to_mutable: exprs={:?}", exprs);
@ -350,10 +350,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
match expr.kind { match expr.kind {
hir::ExprKind::Index(ref base_expr, ..) => { hir::ExprKind::Index(base_expr, ..) => {
self.convert_place_op_to_mutable(PlaceOp::Index, expr, base_expr); self.convert_place_op_to_mutable(PlaceOp::Index, expr, base_expr);
} }
hir::ExprKind::Unary(hir::UnOp::Deref, ref base_expr) => { hir::ExprKind::Unary(hir::UnOp::Deref, base_expr) => {
self.convert_place_op_to_mutable(PlaceOp::Deref, expr, base_expr); self.convert_place_op_to_mutable(PlaceOp::Deref, expr, base_expr);
} }
_ => {} _ => {}

View file

@ -190,7 +190,7 @@ pub struct RegionCtxt<'a, 'tcx> {
impl<'a, 'tcx> Deref for RegionCtxt<'a, 'tcx> { impl<'a, 'tcx> Deref for RegionCtxt<'a, 'tcx> {
type Target = FnCtxt<'a, 'tcx>; type Target = FnCtxt<'a, 'tcx>;
fn deref(&self) -> &Self::Target { fn deref(&self) -> &Self::Target {
&self.fcx self.fcx
} }
} }
@ -292,7 +292,7 @@ impl<'a, 'tcx> RegionCtxt<'a, 'tcx> {
self.outlives_environment.add_implied_bounds(self.fcx, fn_sig_tys, body_id.hir_id, span); self.outlives_environment.add_implied_bounds(self.fcx, fn_sig_tys, body_id.hir_id, span);
self.outlives_environment.save_implied_bounds(body_id.hir_id); self.outlives_environment.save_implied_bounds(body_id.hir_id);
self.link_fn_params(&body.params); self.link_fn_params(body.params);
self.visit_body(body); self.visit_body(body);
self.visit_region_obligations(body_id.hir_id); self.visit_region_obligations(body_id.hir_id);
@ -379,13 +379,13 @@ impl<'a, 'tcx> Visitor<'tcx> for RegionCtxt<'a, 'tcx> {
fn visit_arm(&mut self, arm: &'tcx hir::Arm<'tcx>) { fn visit_arm(&mut self, arm: &'tcx hir::Arm<'tcx>) {
// see above // see above
self.constrain_bindings_in_pat(&arm.pat); self.constrain_bindings_in_pat(arm.pat);
intravisit::walk_arm(self, arm); intravisit::walk_arm(self, arm);
} }
fn visit_local(&mut self, l: &'tcx hir::Local<'tcx>) { fn visit_local(&mut self, l: &'tcx hir::Local<'tcx>) {
// see above // see above
self.constrain_bindings_in_pat(&l.pat); self.constrain_bindings_in_pat(l.pat);
self.link_local(l); self.link_local(l);
intravisit::walk_local(self, l); intravisit::walk_local(self, l);
} }
@ -407,13 +407,13 @@ impl<'a, 'tcx> Visitor<'tcx> for RegionCtxt<'a, 'tcx> {
match expr.kind { match expr.kind {
hir::ExprKind::AddrOf(hir::BorrowKind::Ref, m, ref base) => { hir::ExprKind::AddrOf(hir::BorrowKind::Ref, m, ref base) => {
self.link_addr_of(expr, m, &base); self.link_addr_of(expr, m, base);
intravisit::walk_expr(self, expr); intravisit::walk_expr(self, expr);
} }
hir::ExprKind::Match(ref discr, ref arms, _) => { hir::ExprKind::Match(ref discr, arms, _) => {
self.link_match(&discr, &arms[..]); self.link_match(discr, &arms[..]);
intravisit::walk_expr(self, expr); intravisit::walk_expr(self, expr);
} }
@ -448,7 +448,7 @@ impl<'a, 'tcx> RegionCtxt<'a, 'tcx> {
let mut place = self.with_mc(|mc| mc.cat_expr_unadjusted(expr))?; let mut place = self.with_mc(|mc| mc.cat_expr_unadjusted(expr))?;
let typeck_results = self.typeck_results.borrow(); let typeck_results = self.typeck_results.borrow();
let adjustments = typeck_results.expr_adjustments(&expr); let adjustments = typeck_results.expr_adjustments(expr);
if adjustments.is_empty() { if adjustments.is_empty() {
return Ok(place); return Ok(place);
} }
@ -475,7 +475,7 @@ impl<'a, 'tcx> RegionCtxt<'a, 'tcx> {
self.link_autoref(expr, &place, autoref); self.link_autoref(expr, &place, autoref);
} }
place = self.with_mc(|mc| mc.cat_expr_adjusted(expr, place, &adjustment))?; place = self.with_mc(|mc| mc.cat_expr_adjusted(expr, place, adjustment))?;
} }
Ok(place) Ok(place)
@ -540,10 +540,10 @@ impl<'a, 'tcx> RegionCtxt<'a, 'tcx> {
None => { None => {
return; return;
} }
Some(ref expr) => &**expr, Some(expr) => &*expr,
}; };
let discr_cmt = ignore_err!(self.with_mc(|mc| mc.cat_expr(init_expr))); let discr_cmt = ignore_err!(self.with_mc(|mc| mc.cat_expr(init_expr)));
self.link_pattern(discr_cmt, &local.pat); self.link_pattern(discr_cmt, local.pat);
} }
/// Computes the guarantors for any ref bindings in a match and /// Computes the guarantors for any ref bindings in a match and
@ -554,7 +554,7 @@ impl<'a, 'tcx> RegionCtxt<'a, 'tcx> {
let discr_cmt = ignore_err!(self.with_mc(|mc| mc.cat_expr(discr))); let discr_cmt = ignore_err!(self.with_mc(|mc| mc.cat_expr(discr)));
debug!("discr_cmt={:?}", discr_cmt); debug!("discr_cmt={:?}", discr_cmt);
for arm in arms { for arm in arms {
self.link_pattern(discr_cmt.clone(), &arm.pat); self.link_pattern(discr_cmt.clone(), arm.pat);
} }
} }
@ -567,7 +567,7 @@ impl<'a, 'tcx> RegionCtxt<'a, 'tcx> {
let param_cmt = let param_cmt =
self.with_mc(|mc| mc.cat_rvalue(param.hir_id, param.pat.span, param_ty)); self.with_mc(|mc| mc.cat_rvalue(param.hir_id, param.pat.span, param_ty));
debug!("param_ty={:?} param_cmt={:?} param={:?}", param_ty, param_cmt, param); debug!("param_ty={:?} param_cmt={:?} param={:?}", param_ty, param_cmt, param);
self.link_pattern(param_cmt, &param.pat); self.link_pattern(param_cmt, param.pat);
} }
} }
@ -582,7 +582,7 @@ impl<'a, 'tcx> RegionCtxt<'a, 'tcx> {
if let Some(ty::BindByReference(mutbl)) = if let Some(ty::BindByReference(mutbl)) =
mc.typeck_results.extract_binding_mode(self.tcx.sess, *hir_id, *span) mc.typeck_results.extract_binding_mode(self.tcx.sess, *hir_id, *span)
{ {
self.link_region_from_node_type(*span, *hir_id, mutbl, &sub_cmt); self.link_region_from_node_type(*span, *hir_id, mutbl, sub_cmt);
} }
} }
}) })

View file

@ -790,7 +790,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// This is a multi-line closure with just a `{` on the first line, // This is a multi-line closure with just a `{` on the first line,
// so we put the `let` on its own line. // so we put the `let` on its own line.
// We take the indentation from the next non-empty line. // We take the indentation from the next non-empty line.
let line2 = lines.filter(|line| !line.is_empty()).next().unwrap_or_default(); let line2 = lines.find(|line| !line.is_empty()).unwrap_or_default();
let indent = line2.split_once(|c: char| !c.is_whitespace()).unwrap_or_default().0; let indent = line2.split_once(|c: char| !c.is_whitespace()).unwrap_or_default().0;
diagnostics_builder.span_suggestion( diagnostics_builder.span_suggestion(
closure_body_span.with_lo(closure_body_span.lo() + BytePos::from_usize(line1.len())).shrink_to_lo(), closure_body_span.with_lo(closure_body_span.lo() + BytePos::from_usize(line1.len())).shrink_to_lo(),
@ -844,14 +844,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
) -> String { ) -> String {
let mut reasons = String::new(); let mut reasons = String::new();
if auto_trait_reasons.len() > 0 { if !auto_trait_reasons.is_empty() {
reasons = format!( reasons = format!(
"{} trait implementation for closure", "{} trait implementation for closure",
auto_trait_reasons.clone().into_iter().collect::<Vec<&str>>().join(", ") auto_trait_reasons.clone().into_iter().collect::<Vec<&str>>().join(", ")
); );
} }
if auto_trait_reasons.len() > 0 && drop_reason { if !auto_trait_reasons.is_empty() && drop_reason {
reasons = format!("{} and ", reasons); reasons = format!("{} and ", reasons);
} }
@ -885,13 +885,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let auto_traits = let auto_traits =
vec!["`Clone`", "`Sync`", "`Send`", "`Unpin`", "`UnwindSafe`", "`RefUnwindSafe`"]; vec!["`Clone`", "`Sync`", "`Send`", "`Unpin`", "`UnwindSafe`", "`RefUnwindSafe`"];
let root_var_min_capture_list = if let Some(root_var_min_capture_list) = let root_var_min_capture_list = min_captures.and_then(|m| m.get(&var_hir_id))?;
min_captures.and_then(|m| m.get(&var_hir_id))
{
root_var_min_capture_list
} else {
return None;
};
let ty = self.infcx.resolve_vars_if_possible(self.node_ty(var_hir_id)); let ty = self.infcx.resolve_vars_if_possible(self.node_ty(var_hir_id));
@ -966,14 +960,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
} }
if capture_problems.len() > 0 { if !capture_problems.is_empty() {
problematic_captures.insert( problematic_captures.insert(
(capture.info.path_expr_id, capture.to_string(self.tcx)), (capture.info.path_expr_id, capture.to_string(self.tcx)),
capture_problems, capture_problems,
); );
} }
} }
if problematic_captures.len() > 0 { if !problematic_captures.is_empty() {
return Some(problematic_captures); return Some(problematic_captures);
} }
None None
@ -1042,7 +1036,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let is_moved = !projections_list.is_empty(); let is_moved = !projections_list.is_empty();
let is_not_completely_captured = let is_not_completely_captured =
root_var_min_capture_list.iter().any(|capture| capture.place.projections.len() > 0); root_var_min_capture_list.iter().any(|capture| !capture.place.projections.is_empty());
if is_moved if is_moved
&& is_not_completely_captured && is_not_completely_captured
@ -1056,7 +1050,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
return Some(diagnostics_info); return Some(diagnostics_info);
} }
return None; None
} }
/// Figures out the list of root variables (and their types) that aren't completely /// Figures out the list of root variables (and their types) that aren't completely
@ -1152,7 +1146,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
)); ));
} }
if capture_diagnostic.len() > 0 { if !capture_diagnostic.is_empty() {
need_migrations.push((var_hir_id, responsible_captured_hir_ids)); need_migrations.push((var_hir_id, responsible_captured_hir_ids));
} }
} }
@ -1857,10 +1851,10 @@ impl<'a, 'tcx> euv::Delegate<'tcx> for InferBorrowKind<'a, 'tcx> {
#[instrument(skip(self), level = "debug")] #[instrument(skip(self), level = "debug")]
fn consume(&mut self, place_with_id: &PlaceWithHirId<'tcx>, diag_expr_id: hir::HirId) { fn consume(&mut self, place_with_id: &PlaceWithHirId<'tcx>, diag_expr_id: hir::HirId) {
if !self.capture_information.contains_key(&place_with_id.place) { if !self.capture_information.contains_key(&place_with_id.place) {
self.init_capture_info_for_place(&place_with_id, diag_expr_id); self.init_capture_info_for_place(place_with_id, diag_expr_id);
} }
self.adjust_upvar_borrow_kind_for_consume(&place_with_id, diag_expr_id); self.adjust_upvar_borrow_kind_for_consume(place_with_id, diag_expr_id);
} }
#[instrument(skip(self), level = "debug")] #[instrument(skip(self), level = "debug")]
@ -1997,7 +1991,7 @@ fn restrict_capture_precision<'tcx>(
} }
} }
return (place, curr_mode); (place, curr_mode)
} }
/// Truncate deref of any reference. /// Truncate deref of any reference.
@ -2066,7 +2060,7 @@ fn construct_capture_kind_reason_string(
place: &Place<'tcx>, place: &Place<'tcx>,
capture_info: &ty::CaptureInfo<'tcx>, capture_info: &ty::CaptureInfo<'tcx>,
) -> String { ) -> String {
let place_str = construct_place_string(tcx, &place); let place_str = construct_place_string(tcx, place);
let capture_kind_str = match capture_info.capture_kind { let capture_kind_str = match capture_info.capture_kind {
ty::UpvarCapture::ByValue(_) => "ByValue".into(), ty::UpvarCapture::ByValue(_) => "ByValue".into(),
@ -2077,7 +2071,7 @@ fn construct_capture_kind_reason_string(
} }
fn construct_path_string(tcx: TyCtxt<'_>, place: &Place<'tcx>) -> String { fn construct_path_string(tcx: TyCtxt<'_>, place: &Place<'tcx>) -> String {
let place_str = construct_place_string(tcx, &place); let place_str = construct_place_string(tcx, place);
format!("{} used here", place_str) format!("{} used here", place_str)
} }
@ -2087,7 +2081,7 @@ fn construct_capture_info_string(
place: &Place<'tcx>, place: &Place<'tcx>,
capture_info: &ty::CaptureInfo<'tcx>, capture_info: &ty::CaptureInfo<'tcx>,
) -> String { ) -> String {
let place_str = construct_place_string(tcx, &place); let place_str = construct_place_string(tcx, place);
let capture_kind_str = match capture_info.capture_kind { let capture_kind_str = match capture_info.capture_kind {
ty::UpvarCapture::ByValue(_) => "ByValue".into(), ty::UpvarCapture::ByValue(_) => "ByValue".into(),

View file

@ -144,20 +144,20 @@ pub fn check_item_well_formed(tcx: TyCtxt<'_>, def_id: LocalDefId) {
hir::ItemKind::Fn(ref sig, ..) => { hir::ItemKind::Fn(ref sig, ..) => {
check_item_fn(tcx, item.hir_id(), item.ident, item.span, sig.decl); check_item_fn(tcx, item.hir_id(), item.ident, item.span, sig.decl);
} }
hir::ItemKind::Static(ref ty, ..) => { hir::ItemKind::Static(ty, ..) => {
check_item_type(tcx, item.hir_id(), ty.span, false); check_item_type(tcx, item.hir_id(), ty.span, false);
} }
hir::ItemKind::Const(ref ty, ..) => { hir::ItemKind::Const(ty, ..) => {
check_item_type(tcx, item.hir_id(), ty.span, false); check_item_type(tcx, item.hir_id(), ty.span, false);
} }
hir::ItemKind::ForeignMod { items, .. } => { hir::ItemKind::ForeignMod { items, .. } => {
for it in items.iter() { for it in items.iter() {
let it = tcx.hir().foreign_item(it.id); let it = tcx.hir().foreign_item(it.id);
match it.kind { match it.kind {
hir::ForeignItemKind::Fn(ref decl, ..) => { hir::ForeignItemKind::Fn(decl, ..) => {
check_item_fn(tcx, it.hir_id(), it.ident, it.span, decl) check_item_fn(tcx, it.hir_id(), it.ident, it.span, decl)
} }
hir::ForeignItemKind::Static(ref ty, ..) => { hir::ForeignItemKind::Static(ty, ..) => {
check_item_type(tcx, it.hir_id(), ty.span, true) check_item_type(tcx, it.hir_id(), ty.span, true)
} }
hir::ForeignItemKind::Type => (), hir::ForeignItemKind::Type => (),
@ -198,7 +198,7 @@ pub fn check_trait_item(tcx: TyCtxt<'_>, def_id: LocalDefId) {
hir::TraitItemKind::Type(_bounds, Some(ty)) => (None, ty.span), hir::TraitItemKind::Type(_bounds, Some(ty)) => (None, ty.span),
_ => (None, trait_item.span), _ => (None, trait_item.span),
}; };
check_object_unsafe_self_trait_by_name(tcx, &trait_item); check_object_unsafe_self_trait_by_name(tcx, trait_item);
check_associated_item(tcx, trait_item.hir_id(), span, method_sig); check_associated_item(tcx, trait_item.hir_id(), span, method_sig);
let encl_trait_hir_id = tcx.hir().get_parent_item(hir_id); let encl_trait_hir_id = tcx.hir().get_parent_item(hir_id);
@ -218,7 +218,7 @@ pub fn check_trait_item(tcx: TyCtxt<'_>, def_id: LocalDefId) {
// We are looking at the `call` function of the `fn` or `fn_mut` lang item. // We are looking at the `call` function of the `fn` or `fn_mut` lang item.
// Do some rudimentary sanity checking to avoid an ICE later (issue #83471). // Do some rudimentary sanity checking to avoid an ICE later (issue #83471).
if let Some(hir::FnSig { decl, span, .. }) = method_sig { if let Some(hir::FnSig { decl, span, .. }) = method_sig {
if let &[self_ty, _] = &decl.inputs { if let [self_ty, _] = decl.inputs {
if !matches!(self_ty.kind, hir::TyKind::Rptr(_, _)) { if !matches!(self_ty.kind, hir::TyKind::Rptr(_, _)) {
tcx.sess tcx.sess
.struct_span_err( .struct_span_err(
@ -473,7 +473,7 @@ fn check_associated_item(
item.def_id, item.def_id,
&mut implied_bounds, &mut implied_bounds,
); );
check_method_receiver(fcx, hir_sig, &item, self_ty); check_method_receiver(fcx, hir_sig, item, self_ty);
} }
ty::AssocKind::Type => { ty::AssocKind::Type => {
if let ty::AssocItemContainer::TraitContainer(_) = item.container { if let ty::AssocItemContainer::TraitContainer(_) = item.container {
@ -794,7 +794,7 @@ fn check_where_clauses<'tcx, 'fcx>(
for param in &generics.params { for param in &generics.params {
match param.kind { match param.kind {
GenericParamDefKind::Type { .. } => { GenericParamDefKind::Type { .. } => {
if is_our_default(&param) { if is_our_default(param) {
let ty = tcx.type_of(param.def_id); let ty = tcx.type_of(param.def_id);
// Ignore dependent defaults -- that is, where the default of one type // Ignore dependent defaults -- that is, where the default of one type
// parameter includes another (e.g., `<T, U = T>`). In those cases, we can't // parameter includes another (e.g., `<T, U = T>`). In those cases, we can't
@ -809,7 +809,7 @@ fn check_where_clauses<'tcx, 'fcx>(
} }
} }
GenericParamDefKind::Const { .. } => { GenericParamDefKind::Const { .. } => {
if is_our_default(&param) { if is_our_default(param) {
// FIXME(const_generics_defaults): This // FIXME(const_generics_defaults): This
// is incorrect when dealing with unused substs, for example // is incorrect when dealing with unused substs, for example
// for `struct Foo<const N: usize, const M: usize = { 1 - 2 }>` // for `struct Foo<const N: usize, const M: usize = { 1 - 2 }>`

View file

@ -140,7 +140,7 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
// operating on scalars, we clear the overload. // operating on scalars, we clear the overload.
fn fix_scalar_builtin_expr(&mut self, e: &hir::Expr<'_>) { fn fix_scalar_builtin_expr(&mut self, e: &hir::Expr<'_>) {
match e.kind { match e.kind {
hir::ExprKind::Unary(hir::UnOp::Neg | hir::UnOp::Not, ref inner) => { hir::ExprKind::Unary(hir::UnOp::Neg | hir::UnOp::Not, inner) => {
let inner_ty = self.fcx.node_ty(inner.hir_id); let inner_ty = self.fcx.node_ty(inner.hir_id);
let inner_ty = self.fcx.resolve_vars_if_possible(inner_ty); let inner_ty = self.fcx.resolve_vars_if_possible(inner_ty);
@ -150,8 +150,7 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
typeck_results.node_substs_mut().remove(e.hir_id); typeck_results.node_substs_mut().remove(e.hir_id);
} }
} }
hir::ExprKind::Binary(ref op, ref lhs, ref rhs) hir::ExprKind::Binary(ref op, lhs, rhs) | hir::ExprKind::AssignOp(ref op, lhs, rhs) => {
| hir::ExprKind::AssignOp(ref op, ref lhs, ref rhs) => {
let lhs_ty = self.fcx.node_ty(lhs.hir_id); let lhs_ty = self.fcx.node_ty(lhs.hir_id);
let lhs_ty = self.fcx.resolve_vars_if_possible(lhs_ty); let lhs_ty = self.fcx.resolve_vars_if_possible(lhs_ty);
@ -198,7 +197,7 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
// All valid indexing looks like this; might encounter non-valid indexes at this point. // All valid indexing looks like this; might encounter non-valid indexes at this point.
let base_ty = typeck_results let base_ty = typeck_results
.expr_ty_adjusted_opt(&base) .expr_ty_adjusted_opt(base)
.map(|t| self.fcx.resolve_vars_if_possible(t).kind()); .map(|t| self.fcx.resolve_vars_if_possible(t).kind());
if base_ty.is_none() { if base_ty.is_none() {
// When encountering `return [0][0]` outside of a `fn` body we can encounter a base // When encountering `return [0][0]` outside of a `fn` body we can encounter a base
@ -207,7 +206,7 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
self.tcx().sess.delay_span_bug(e.span, &format!("bad base: `{:?}`", base)); self.tcx().sess.delay_span_bug(e.span, &format!("bad base: `{:?}`", base));
} }
if let Some(ty::Ref(_, base_ty, _)) = base_ty { if let Some(ty::Ref(_, base_ty, _)) = base_ty {
let index_ty = typeck_results.expr_ty_adjusted_opt(&index).unwrap_or_else(|| { let index_ty = typeck_results.expr_ty_adjusted_opt(index).unwrap_or_else(|| {
// When encountering `return [0][0]` outside of a `fn` body we would attempt // When encountering `return [0][0]` outside of a `fn` body we would attempt
// to access an unexistend index. We assume that more relevant errors will // to access an unexistend index. We assume that more relevant errors will
// already have been emitted, so we only gate on this with an ICE if no // already have been emitted, so we only gate on this with an ICE if no

View file

@ -26,7 +26,7 @@ impl ItemLikeVisitor<'v> for CheckVisitor<'tcx> {
if item.vis.node.is_pub() || item.span.is_dummy() { if item.vis.node.is_pub() || item.span.is_dummy() {
return; return;
} }
if let hir::ItemKind::Use(ref path, _) = item.kind { if let hir::ItemKind::Use(path, _) = item.kind {
self.check_import(item.item_id(), path.span); self.check_import(item.item_id(), path.span);
} }
} }

View file

@ -56,7 +56,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> {
ty::Foreign(did) => { ty::Foreign(did) => {
self.check_def_id(item, did); self.check_def_id(item, did);
} }
ty::Dynamic(ref data, ..) if data.principal_def_id().is_some() => { ty::Dynamic(data, ..) if data.principal_def_id().is_some() => {
self.check_def_id(item, data.principal_def_id().unwrap()); self.check_def_id(item, data.principal_def_id().unwrap());
} }
ty::Dynamic(..) => { ty::Dynamic(..) => {
@ -410,7 +410,7 @@ impl InherentCollect<'tcx> {
// OK // OK
} }
_ => { _ => {
let to_implement = if assoc_items.len() == 0 { let to_implement = if assoc_items.is_empty() {
String::new() String::new()
} else { } else {
let plural = assoc_items.len() > 1; let plural = assoc_items.len() > 1;

View file

@ -187,7 +187,7 @@ impl ItemLikeVisitor<'v> for InherentOverlapChecker<'tcx> {
.collect::<FxHashSet<usize>>(); .collect::<FxHashSet<usize>>();
match ids.len() { match ids.len() {
0 | 1 => { 0 | 1 => {
let id_to_set = if ids.len() == 0 { let id_to_set = if ids.is_empty() {
// Create a new connected region // Create a new connected region
let region = ConnectedRegion { let region = ConnectedRegion {
idents: idents_to_add, idents: idents_to_add,

View file

@ -221,7 +221,7 @@ fn check_object_overlap<'tcx>(
} }
// check for overlap with the automatic `impl Trait for dyn Trait` // check for overlap with the automatic `impl Trait for dyn Trait`
if let ty::Dynamic(ref data, ..) = trait_ref.self_ty().kind() { if let ty::Dynamic(data, ..) = trait_ref.self_ty().kind() {
// This is something like impl Trait1 for Trait2. Illegal // This is something like impl Trait1 for Trait2. Illegal
// if Trait1 is a supertrait of Trait2 or Trait2 is not object safe. // if Trait1 is a supertrait of Trait2 or Trait2 is not object safe.

View file

@ -199,20 +199,16 @@ crate fn placeholder_type_error(
let parent_id = tcx.hir().get_parent_node(hir_ty.hir_id); let parent_id = tcx.hir().get_parent_node(hir_ty.hir_id);
let parent_node = tcx.hir().get(parent_id); let parent_node = tcx.hir().get(parent_id);
is_const_or_static = match parent_node { is_const_or_static = matches!(
parent_node,
Node::Item(&hir::Item { Node::Item(&hir::Item {
kind: hir::ItemKind::Const(..) | hir::ItemKind::Static(..), kind: hir::ItemKind::Const(..) | hir::ItemKind::Static(..),
.. ..
}) }) | Node::TraitItem(&hir::TraitItem {
| Node::TraitItem(&hir::TraitItem {
kind: hir::TraitItemKind::Const(..), kind: hir::TraitItemKind::Const(..),
.. ..
}) }) | Node::ImplItem(&hir::ImplItem { kind: hir::ImplItemKind::Const(..), .. })
| Node::ImplItem(&hir::ImplItem { );
kind: hir::ImplItemKind::Const(..), ..
}) => true,
_ => false,
};
} }
} }
@ -681,10 +677,10 @@ impl ItemCtxt<'tcx> {
_ => None, _ => None,
}) })
.flat_map(|bp| { .flat_map(|bp| {
let bt = if is_param(self.tcx, &bp.bounded_ty, param_id) { let bt = if is_param(self.tcx, bp.bounded_ty, param_id) {
Some(ty) Some(ty)
} else if !only_self_bounds.0 { } else if !only_self_bounds.0 {
Some(self.to_ty(&bp.bounded_ty)) Some(self.to_ty(bp.bounded_ty))
} else { } else {
None None
}; };
@ -723,7 +719,7 @@ impl ItemCtxt<'tcx> {
/// `ast_ty_to_ty`, because we want to avoid triggering an all-out /// `ast_ty_to_ty`, because we want to avoid triggering an all-out
/// conversion of the type to avoid inducing unnecessary cycles. /// conversion of the type to avoid inducing unnecessary cycles.
fn is_param(tcx: TyCtxt<'_>, ast_ty: &hir::Ty<'_>, param_id: hir::HirId) -> bool { fn is_param(tcx: TyCtxt<'_>, ast_ty: &hir::Ty<'_>, param_id: hir::HirId) -> bool {
if let hir::TyKind::Path(hir::QPath::Resolved(None, ref path)) = ast_ty.kind { if let hir::TyKind::Path(hir::QPath::Resolved(None, path)) = ast_ty.kind {
match path.res { match path.res {
Res::SelfTy(Some(def_id), None) | Res::Def(DefKind::TyParam, def_id) => { Res::SelfTy(Some(def_id), None) | Res::Def(DefKind::TyParam, def_id) => {
def_id == tcx.hir().local_def_id(param_id).to_def_id() def_id == tcx.hir().local_def_id(param_id).to_def_id()
@ -776,7 +772,7 @@ fn convert_item(tcx: TyCtxt<'_>, item_id: hir::ItemId) {
tcx.ensure().generics_of(def_id); tcx.ensure().generics_of(def_id);
tcx.ensure().type_of(def_id); tcx.ensure().type_of(def_id);
tcx.ensure().predicates_of(def_id); tcx.ensure().predicates_of(def_id);
convert_enum_variant_types(tcx, def_id.to_def_id(), &enum_definition.variants); convert_enum_variant_types(tcx, def_id.to_def_id(), enum_definition.variants);
} }
hir::ItemKind::Impl { .. } => { hir::ItemKind::Impl { .. } => {
tcx.ensure().generics_of(def_id); tcx.ensure().generics_of(def_id);
@ -1153,11 +1149,11 @@ fn super_predicates_that_define_assoc_type(
<dyn AstConv<'_>>::compute_bounds_that_match_assoc_type( <dyn AstConv<'_>>::compute_bounds_that_match_assoc_type(
&icx, &icx,
self_param_ty, self_param_ty,
&bounds, bounds,
assoc_name, assoc_name,
) )
} else { } else {
<dyn AstConv<'_>>::compute_bounds(&icx, self_param_ty, &bounds) <dyn AstConv<'_>>::compute_bounds(&icx, self_param_ty, bounds)
}; };
let superbounds1 = superbounds1.predicates(tcx, self_param_ty); let superbounds1 = superbounds1.predicates(tcx, self_param_ty);
@ -1334,25 +1330,25 @@ fn has_late_bound_regions<'tcx>(tcx: TyCtxt<'tcx>, node: Node<'tcx>) -> Option<S
match node { match node {
Node::TraitItem(item) => match item.kind { Node::TraitItem(item) => match item.kind {
hir::TraitItemKind::Fn(ref sig, _) => { hir::TraitItemKind::Fn(ref sig, _) => {
has_late_bound_regions(tcx, &item.generics, &sig.decl) has_late_bound_regions(tcx, &item.generics, sig.decl)
} }
_ => None, _ => None,
}, },
Node::ImplItem(item) => match item.kind { Node::ImplItem(item) => match item.kind {
hir::ImplItemKind::Fn(ref sig, _) => { hir::ImplItemKind::Fn(ref sig, _) => {
has_late_bound_regions(tcx, &item.generics, &sig.decl) has_late_bound_regions(tcx, &item.generics, sig.decl)
} }
_ => None, _ => None,
}, },
Node::ForeignItem(item) => match item.kind { Node::ForeignItem(item) => match item.kind {
hir::ForeignItemKind::Fn(ref fn_decl, _, ref generics) => { hir::ForeignItemKind::Fn(fn_decl, _, ref generics) => {
has_late_bound_regions(tcx, generics, fn_decl) has_late_bound_regions(tcx, generics, fn_decl)
} }
_ => None, _ => None,
}, },
Node::Item(item) => match item.kind { Node::Item(item) => match item.kind {
hir::ItemKind::Fn(ref sig, .., ref generics, _) => { hir::ItemKind::Fn(ref sig, .., ref generics, _) => {
has_late_bound_regions(tcx, generics, &sig.decl) has_late_bound_regions(tcx, generics, sig.decl)
} }
_ => None, _ => None,
}, },
@ -1374,7 +1370,7 @@ impl<'v> Visitor<'v> for AnonConstInParamTyDetector {
} }
fn visit_generic_param(&mut self, p: &'v hir::GenericParam<'v>) { fn visit_generic_param(&mut self, p: &'v hir::GenericParam<'v>) {
if let GenericParamKind::Const { ref ty, default: _ } = p.kind { if let GenericParamKind::Const { ty, default: _ } = p.kind {
let prev = self.in_param_ty; let prev = self.in_param_ty;
self.in_param_ty = true; self.in_param_ty = true;
self.visit_ty(ty); self.visit_ty(ty);
@ -1587,7 +1583,7 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
let mut own_start = has_self as u32; let mut own_start = has_self as u32;
let parent_count = parent_def_id.map_or(0, |def_id| { let parent_count = parent_def_id.map_or(0, |def_id| {
let generics = tcx.generics_of(def_id); let generics = tcx.generics_of(def_id);
assert_eq!(has_self, false); assert!(!has_self);
parent_has_self = generics.has_self; parent_has_self = generics.has_self;
own_start = generics.count() as u32; own_start = generics.count() as u32;
generics.parent_count + generics.params.len() generics.parent_count + generics.params.len()
@ -1738,9 +1734,9 @@ fn is_suggestable_infer_ty(ty: &hir::Ty<'_>) -> bool {
} }
pub fn get_infer_ret_ty(output: &'hir hir::FnRetTy<'hir>) -> Option<&'hir hir::Ty<'hir>> { pub fn get_infer_ret_ty(output: &'hir hir::FnRetTy<'hir>) -> Option<&'hir hir::Ty<'hir>> {
if let hir::FnRetTy::Return(ref ty) = output { if let hir::FnRetTy::Return(ty) = output {
if is_suggestable_infer_ty(ty) { if is_suggestable_infer_ty(ty) {
return Some(&**ty); return Some(&*ty);
} }
} }
None None
@ -1810,8 +1806,8 @@ fn fn_sig(tcx: TyCtxt<'_>, def_id: DefId) -> ty::PolyFnSig<'_> {
hir_id, hir_id,
sig.header.unsafety, sig.header.unsafety,
sig.header.abi, sig.header.abi,
&sig.decl, sig.decl,
&generics, generics,
Some(ident.span), Some(ident.span),
None, None,
), ),
@ -1829,15 +1825,13 @@ fn fn_sig(tcx: TyCtxt<'_>, def_id: DefId) -> ty::PolyFnSig<'_> {
header.unsafety, header.unsafety,
header.abi, header.abi,
decl, decl,
&generics, generics,
Some(ident.span), Some(ident.span),
None, None,
), ),
ForeignItem(&hir::ForeignItem { ForeignItem(&hir::ForeignItem {
kind: ForeignItemKind::Fn(ref fn_decl, _, _), kind: ForeignItemKind::Fn(fn_decl, _, _), ident, ..
ident,
..
}) => { }) => {
let abi = tcx.hir().get_foreign_abi(hir_id); let abi = tcx.hir().get_foreign_abi(hir_id);
compute_sig_of_foreign_fn_decl(tcx, def_id.to_def_id(), fn_decl, abi, ident) compute_sig_of_foreign_fn_decl(tcx, def_id.to_def_id(), fn_decl, abi, ident)
@ -2042,9 +2036,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP
match item.kind { match item.kind {
ItemKind::Impl(ref impl_) => { ItemKind::Impl(ref impl_) => {
if impl_.defaultness.is_default() { if impl_.defaultness.is_default() {
is_default_impl_trait = tcx is_default_impl_trait = tcx.impl_trait_ref(def_id).map(ty::Binder::dummy);
.impl_trait_ref(def_id)
.map(|trait_ref| ty::Binder::dummy(trait_ref));
} }
&impl_.generics &impl_.generics
} }
@ -2143,7 +2135,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP
GenericParamKind::Lifetime { .. } => { GenericParamKind::Lifetime { .. } => {
param.bounds.iter().for_each(|bound| match bound { param.bounds.iter().for_each(|bound| match bound {
hir::GenericBound::Outlives(lt) => { hir::GenericBound::Outlives(lt) => {
let bound = <dyn AstConv<'_>>::ast_region_to_region(&icx, &lt, None); let bound = <dyn AstConv<'_>>::ast_region_to_region(&icx, lt, None);
let outlives = ty::Binder::dummy(ty::OutlivesPredicate(region, bound)); let outlives = ty::Binder::dummy(ty::OutlivesPredicate(region, bound));
predicates.insert((outlives.to_predicate(tcx), lt.span)); predicates.insert((outlives.to_predicate(tcx), lt.span));
} }
@ -2165,12 +2157,12 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP
let param_ty = ty::ParamTy::new(index, name).to_ty(tcx); let param_ty = ty::ParamTy::new(index, name).to_ty(tcx);
index += 1; index += 1;
let mut bounds = <dyn AstConv<'_>>::compute_bounds(&icx, param_ty, &param.bounds); let mut bounds = <dyn AstConv<'_>>::compute_bounds(&icx, param_ty, param.bounds);
// Params are implicitly sized unless a `?Sized` bound is found // Params are implicitly sized unless a `?Sized` bound is found
<dyn AstConv<'_>>::add_implicitly_sized( <dyn AstConv<'_>>::add_implicitly_sized(
&icx, &icx,
&mut bounds, &mut bounds,
&param.bounds, param.bounds,
Some((param.hir_id, ast_generics.where_clause.predicates)), Some((param.hir_id, ast_generics.where_clause.predicates)),
param.span, param.span,
); );
@ -2189,7 +2181,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP
for predicate in where_clause.predicates { for predicate in where_clause.predicates {
match predicate { match predicate {
hir::WherePredicate::BoundPredicate(bound_pred) => { hir::WherePredicate::BoundPredicate(bound_pred) => {
let ty = icx.to_ty(&bound_pred.bounded_ty); let ty = icx.to_ty(bound_pred.bounded_ty);
let bound_vars = icx.tcx.late_bound_vars(bound_pred.bounded_ty.hir_id); let bound_vars = icx.tcx.late_bound_vars(bound_pred.bounded_ty.hir_id);
// Keep the type around in a dummy predicate, in case of no bounds. // Keep the type around in a dummy predicate, in case of no bounds.
@ -2410,7 +2402,7 @@ fn explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericPredicat
} else { } else {
if matches!(def_kind, DefKind::AnonConst) && tcx.lazy_normalization() { if matches!(def_kind, DefKind::AnonConst) && tcx.lazy_normalization() {
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local()); let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local());
if let Some(_) = tcx.hir().opt_const_param_default_param_hir_id(hir_id) { if tcx.hir().opt_const_param_default_param_hir_id(hir_id).is_some() {
// In `generics_of` we set the generics' parent to be our parent's parent which means that // In `generics_of` we set the generics' parent to be our parent's parent which means that
// we lose out on the predicates of our actual parent if we dont return those predicates here. // we lose out on the predicates of our actual parent if we dont return those predicates here.
// (See comment in `generics_of` for more information on why the parent shenanigans is necessary) // (See comment in `generics_of` for more information on why the parent shenanigans is necessary)
@ -2503,10 +2495,10 @@ fn compute_sig_of_foreign_fn_decl<'tcx>(
} }
}; };
for (input, ty) in iter::zip(decl.inputs, fty.inputs().skip_binder()) { for (input, ty) in iter::zip(decl.inputs, fty.inputs().skip_binder()) {
check(&input, ty) check(input, ty)
} }
if let hir::FnRetTy::Return(ref ty) = decl.output { if let hir::FnRetTy::Return(ref ty) = decl.output {
check(&ty, fty.output().skip_binder()) check(ty, fty.output().skip_binder())
} }
} }
@ -2561,7 +2553,7 @@ fn from_target_feature(
let msg = "malformed `target_feature` attribute input"; let msg = "malformed `target_feature` attribute input";
let code = "enable = \"..\"".to_owned(); let code = "enable = \"..\"".to_owned();
tcx.sess tcx.sess
.struct_span_err(span, &msg) .struct_span_err(span, msg)
.span_suggestion(span, "must be of the form", code, Applicability::HasPlaceholders) .span_suggestion(span, "must be of the form", code, Applicability::HasPlaceholders)
.emit(); .emit();
}; };
@ -2846,7 +2838,7 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, id: DefId) -> CodegenFnAttrs {
tcx, tcx,
id, id,
attr, attr,
&supported_target_features, supported_target_features,
&mut codegen_fn_attrs.target_features, &mut codegen_fn_attrs.target_features,
); );
} else if attr.has_name(sym::linkage) { } else if attr.has_name(sym::linkage) {
@ -3113,7 +3105,7 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, id: DefId) -> CodegenFnAttrs {
codegen_fn_attrs.flags |= CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL; codegen_fn_attrs.flags |= CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL;
} }
let check_name = |attr: &Attribute, sym| attr.has_name(sym); let check_name = |attr: &Attribute, sym| attr.has_name(sym);
if let Some(name) = weak_lang_items::link_name(check_name, &attrs) { if let Some(name) = weak_lang_items::link_name(check_name, attrs) {
codegen_fn_attrs.export_name = Some(name); codegen_fn_attrs.export_name = Some(name);
codegen_fn_attrs.link_name = Some(name); codegen_fn_attrs.link_name = Some(name);
} }

View file

@ -26,9 +26,9 @@ fn associated_type_bounds<'tcx>(
); );
let icx = ItemCtxt::new(tcx, assoc_item_def_id); let icx = ItemCtxt::new(tcx, assoc_item_def_id);
let mut bounds = <dyn AstConv<'_>>::compute_bounds(&icx, item_ty, &ast_bounds); let mut bounds = <dyn AstConv<'_>>::compute_bounds(&icx, item_ty, ast_bounds);
// Associated types are implicitly sized unless a `?Sized` bound is found // Associated types are implicitly sized unless a `?Sized` bound is found
<dyn AstConv<'_>>::add_implicitly_sized(&icx, &mut bounds, &ast_bounds, None, span); <dyn AstConv<'_>>::add_implicitly_sized(&icx, &mut bounds, ast_bounds, None, span);
let trait_def_id = tcx.associated_item(assoc_item_def_id).container.id(); let trait_def_id = tcx.associated_item(assoc_item_def_id).container.id();
let trait_predicates = tcx.trait_explicit_predicates_and_bounds(trait_def_id.expect_local()); let trait_predicates = tcx.trait_explicit_predicates_and_bounds(trait_def_id.expect_local());
@ -64,9 +64,9 @@ fn opaque_type_bounds<'tcx>(
tcx.mk_opaque(opaque_def_id, InternalSubsts::identity_for_item(tcx, opaque_def_id)); tcx.mk_opaque(opaque_def_id, InternalSubsts::identity_for_item(tcx, opaque_def_id));
let icx = ItemCtxt::new(tcx, opaque_def_id); let icx = ItemCtxt::new(tcx, opaque_def_id);
let mut bounds = <dyn AstConv<'_>>::compute_bounds(&icx, item_ty, &ast_bounds); let mut bounds = <dyn AstConv<'_>>::compute_bounds(&icx, item_ty, ast_bounds);
// Opaque types are implicitly sized unless a `?Sized` bound is found // Opaque types are implicitly sized unless a `?Sized` bound is found
<dyn AstConv<'_>>::add_implicitly_sized(&icx, &mut bounds, &ast_bounds, None, span); <dyn AstConv<'_>>::add_implicitly_sized(&icx, &mut bounds, ast_bounds, None, span);
let bounds = bounds.predicates(tcx, item_ty); let bounds = bounds.predicates(tcx, item_ty);
debug!("opaque_type_bounds({}) = {:?}", tcx.def_path_str(opaque_def_id), bounds); debug!("opaque_type_bounds({}) = {:?}", tcx.def_path_str(opaque_def_id), bounds);

View file

@ -312,7 +312,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
let substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id()); let substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id());
tcx.mk_fn_def(def_id.to_def_id(), substs) tcx.mk_fn_def(def_id.to_def_id(), substs)
} }
TraitItemKind::Const(ref ty, body_id) => body_id TraitItemKind::Const(ty, body_id) => body_id
.and_then(|body_id| { .and_then(|body_id| {
if is_suggestable_infer_ty(ty) { if is_suggestable_infer_ty(ty) {
Some(infer_placeholder_type( Some(infer_placeholder_type(
@ -323,7 +323,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
} }
}) })
.unwrap_or_else(|| icx.to_ty(ty)), .unwrap_or_else(|| icx.to_ty(ty)),
TraitItemKind::Type(_, Some(ref ty)) => icx.to_ty(ty), TraitItemKind::Type(_, Some(ty)) => icx.to_ty(ty),
TraitItemKind::Type(_, None) => { TraitItemKind::Type(_, None) => {
span_bug!(item.span, "associated type missing default"); span_bug!(item.span, "associated type missing default");
} }
@ -334,14 +334,14 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
let substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id()); let substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id());
tcx.mk_fn_def(def_id.to_def_id(), substs) tcx.mk_fn_def(def_id.to_def_id(), substs)
} }
ImplItemKind::Const(ref ty, body_id) => { ImplItemKind::Const(ty, body_id) => {
if is_suggestable_infer_ty(ty) { if is_suggestable_infer_ty(ty) {
infer_placeholder_type(tcx, def_id, body_id, ty.span, item.ident, "constant") infer_placeholder_type(tcx, def_id, body_id, ty.span, item.ident, "constant")
} else { } else {
icx.to_ty(ty) icx.to_ty(ty)
} }
} }
ImplItemKind::TyAlias(ref ty) => { ImplItemKind::TyAlias(ty) => {
if tcx.impl_trait_ref(tcx.hir().get_parent_did(hir_id).to_def_id()).is_none() { if tcx.impl_trait_ref(tcx.hir().get_parent_did(hir_id).to_def_id()).is_none() {
check_feature_inherent_assoc_ty(tcx, item.span); check_feature_inherent_assoc_ty(tcx, item.span);
} }
@ -352,7 +352,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
Node::Item(item) => { Node::Item(item) => {
match item.kind { match item.kind {
ItemKind::Static(ref ty, .., body_id) => { ItemKind::Static(ty, .., body_id) => {
if is_suggestable_infer_ty(ty) { if is_suggestable_infer_ty(ty) {
infer_placeholder_type( infer_placeholder_type(
tcx, tcx,
@ -366,7 +366,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
icx.to_ty(ty) icx.to_ty(ty)
} }
} }
ItemKind::Const(ref ty, body_id) => { ItemKind::Const(ty, body_id) => {
if is_suggestable_infer_ty(ty) { if is_suggestable_infer_ty(ty) {
infer_placeholder_type( infer_placeholder_type(
tcx, def_id, body_id, ty.span, item.ident, "constant", tcx, def_id, body_id, ty.span, item.ident, "constant",
@ -375,8 +375,8 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
icx.to_ty(ty) icx.to_ty(ty)
} }
} }
ItemKind::TyAlias(ref self_ty, _) ItemKind::TyAlias(self_ty, _)
| ItemKind::Impl(hir::Impl { ref self_ty, .. }) => icx.to_ty(self_ty), | ItemKind::Impl(hir::Impl { self_ty, .. }) => icx.to_ty(self_ty),
ItemKind::Fn(..) => { ItemKind::Fn(..) => {
let substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id()); let substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id());
tcx.mk_fn_def(def_id.to_def_id(), substs) tcx.mk_fn_def(def_id.to_def_id(), substs)
@ -395,7 +395,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
.mir_borrowck(owner.expect_local()) .mir_borrowck(owner.expect_local())
.concrete_opaque_types .concrete_opaque_types
.get_value_matching(|(key, _)| key.def_id == def_id.to_def_id()) .get_value_matching(|(key, _)| key.def_id == def_id.to_def_id())
.map(|concrete_ty| *concrete_ty) .copied()
.unwrap_or_else(|| { .unwrap_or_else(|| {
tcx.sess.delay_span_bug( tcx.sess.delay_span_bug(
DUMMY_SP, DUMMY_SP,
@ -446,7 +446,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
let substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id()); let substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id());
tcx.mk_fn_def(def_id.to_def_id(), substs) tcx.mk_fn_def(def_id.to_def_id(), substs)
} }
ForeignItemKind::Static(ref t, _) => icx.to_ty(t), ForeignItemKind::Static(t, _) => icx.to_ty(t),
ForeignItemKind::Type => tcx.mk_foreign(def_id.to_def_id()), ForeignItemKind::Type => tcx.mk_foreign(def_id.to_def_id()),
}, },
@ -460,7 +460,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
} }
}, },
Node::Field(field) => icx.to_ty(&field.ty), Node::Field(field) => icx.to_ty(field.ty),
Node::Expr(&Expr { kind: ExprKind::Closure(.., gen), .. }) => { Node::Expr(&Expr { kind: ExprKind::Closure(.., gen), .. }) => {
let substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id()); let substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id());
@ -685,9 +685,9 @@ fn find_opaque_ty_constraints(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Ty<'_> {
// //
// requires us to explicitly process `foo()` in order // requires us to explicitly process `foo()` in order
// to notice the defining usage of `Blah`. // to notice the defining usage of `Blah`.
Node::Item(ref it) => locator.visit_item(it), Node::Item(it) => locator.visit_item(it),
Node::ImplItem(ref it) => locator.visit_impl_item(it), Node::ImplItem(it) => locator.visit_impl_item(it),
Node::TraitItem(ref it) => locator.visit_trait_item(it), Node::TraitItem(it) => locator.visit_trait_item(it),
other => bug!("{:?} is not a valid scope for an opaque type item", other), other => bug!("{:?} is not a valid scope for an opaque type item", other),
} }
} }

View file

@ -206,7 +206,7 @@ pub fn setup_constraining_predicates<'tcx>(
// Then the projection only applies if `T` is known, but it still // Then the projection only applies if `T` is known, but it still
// does not determine `U`. // does not determine `U`.
let inputs = parameters_for(tcx, &projection.projection_ty, true); let inputs = parameters_for(tcx, &projection.projection_ty, true);
let relies_only_on_inputs = inputs.iter().all(|p| input_parameters.contains(&p)); let relies_only_on_inputs = inputs.iter().all(|p| input_parameters.contains(p));
if !relies_only_on_inputs { if !relies_only_on_inputs {
continue; continue;
} }

View file

@ -124,12 +124,12 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
#[instrument(skip(self), level = "debug")] #[instrument(skip(self), level = "debug")]
pub fn consume_body(&mut self, body: &hir::Body<'_>) { pub fn consume_body(&mut self, body: &hir::Body<'_>) {
for param in body.params { for param in body.params {
let param_ty = return_if_err!(self.mc.pat_ty_adjusted(&param.pat)); let param_ty = return_if_err!(self.mc.pat_ty_adjusted(param.pat));
debug!("consume_body: param_ty = {:?}", param_ty); debug!("consume_body: param_ty = {:?}", param_ty);
let param_place = self.mc.cat_rvalue(param.hir_id, param.pat.span, param_ty); let param_place = self.mc.cat_rvalue(param.hir_id, param.pat.span, param_ty);
self.walk_irrefutable_pat(&param_place, &param.pat); self.walk_irrefutable_pat(&param_place, param.pat);
} }
self.consume_expr(&body.value); self.consume_expr(&body.value);
@ -145,7 +145,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
fn consume_exprs(&mut self, exprs: &[hir::Expr<'_>]) { fn consume_exprs(&mut self, exprs: &[hir::Expr<'_>]) {
for expr in exprs { for expr in exprs {
self.consume_expr(&expr); self.consume_expr(expr);
} }
} }
@ -184,57 +184,57 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
match expr.kind { match expr.kind {
hir::ExprKind::Path(_) => {} hir::ExprKind::Path(_) => {}
hir::ExprKind::Type(ref subexpr, _) => self.walk_expr(subexpr), hir::ExprKind::Type(subexpr, _) => self.walk_expr(subexpr),
hir::ExprKind::Unary(hir::UnOp::Deref, ref base) => { hir::ExprKind::Unary(hir::UnOp::Deref, base) => {
// *base // *base
self.select_from_expr(base); self.select_from_expr(base);
} }
hir::ExprKind::Field(ref base, _) => { hir::ExprKind::Field(base, _) => {
// base.f // base.f
self.select_from_expr(base); self.select_from_expr(base);
} }
hir::ExprKind::Index(ref lhs, ref rhs) => { hir::ExprKind::Index(lhs, rhs) => {
// lhs[rhs] // lhs[rhs]
self.select_from_expr(lhs); self.select_from_expr(lhs);
self.consume_expr(rhs); self.consume_expr(rhs);
} }
hir::ExprKind::Call(ref callee, ref args) => { hir::ExprKind::Call(callee, args) => {
// callee(args) // callee(args)
self.consume_expr(callee); self.consume_expr(callee);
self.consume_exprs(args); self.consume_exprs(args);
} }
hir::ExprKind::MethodCall(.., ref args, _) => { hir::ExprKind::MethodCall(.., args, _) => {
// callee.m(args) // callee.m(args)
self.consume_exprs(args); self.consume_exprs(args);
} }
hir::ExprKind::Struct(_, ref fields, ref opt_with) => { hir::ExprKind::Struct(_, fields, ref opt_with) => {
self.walk_struct_expr(fields, opt_with); self.walk_struct_expr(fields, opt_with);
} }
hir::ExprKind::Tup(ref exprs) => { hir::ExprKind::Tup(exprs) => {
self.consume_exprs(exprs); self.consume_exprs(exprs);
} }
hir::ExprKind::If(ref cond_expr, ref then_expr, ref opt_else_expr) => { hir::ExprKind::If(ref cond_expr, ref then_expr, ref opt_else_expr) => {
self.consume_expr(&cond_expr); self.consume_expr(cond_expr);
self.consume_expr(&then_expr); self.consume_expr(then_expr);
if let Some(ref else_expr) = *opt_else_expr { if let Some(ref else_expr) = *opt_else_expr {
self.consume_expr(&else_expr); self.consume_expr(else_expr);
} }
} }
hir::ExprKind::Let(ref pat, ref expr, _) => { hir::ExprKind::Let(pat, ref expr, _) => {
self.walk_local(expr, pat, |t| t.borrow_expr(&expr, ty::ImmBorrow)); self.walk_local(expr, pat, |t| t.borrow_expr(expr, ty::ImmBorrow));
} }
hir::ExprKind::Match(ref discr, arms, _) => { hir::ExprKind::Match(ref discr, arms, _) => {
let discr_place = return_if_err!(self.mc.cat_expr(&discr)); let discr_place = return_if_err!(self.mc.cat_expr(discr));
// Matching should not always be considered a use of the place, hence // Matching should not always be considered a use of the place, hence
// discr does not necessarily need to be borrowed. // discr does not necessarily need to be borrowed.
@ -243,7 +243,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
let ExprUseVisitor { ref mc, body_owner: _, delegate: _ } = *self; let ExprUseVisitor { ref mc, body_owner: _, delegate: _ } = *self;
let mut needs_to_be_read = false; let mut needs_to_be_read = false;
for arm in arms.iter() { for arm in arms.iter() {
return_if_err!(mc.cat_pattern(discr_place.clone(), &arm.pat, |place, pat| { return_if_err!(mc.cat_pattern(discr_place.clone(), arm.pat, |place, pat| {
match &pat.kind { match &pat.kind {
PatKind::Binding(.., opt_sub_pat) => { PatKind::Binding(.., opt_sub_pat) => {
// If the opt_sub_pat is None, than the binding does not count as // If the opt_sub_pat is None, than the binding does not count as
@ -303,7 +303,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
} }
if needs_to_be_read { if needs_to_be_read {
self.borrow_expr(&discr, ty::ImmBorrow); self.borrow_expr(discr, ty::ImmBorrow);
} else { } else {
let closure_def_id = match discr_place.place.base { let closure_def_id = match discr_place.place.base {
PlaceBase::Upvar(upvar_id) => Some(upvar_id.closure_expr_id.to_def_id()), PlaceBase::Upvar(upvar_id) => Some(upvar_id.closure_expr_id.to_def_id()),
@ -318,7 +318,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
// We always want to walk the discriminant. We want to make sure, for instance, // We always want to walk the discriminant. We want to make sure, for instance,
// that the discriminant has been initialized. // that the discriminant has been initialized.
self.walk_expr(&discr); self.walk_expr(discr);
} }
// treatment of the discriminant is handled while walking the arms. // treatment of the discriminant is handled while walking the arms.
@ -327,7 +327,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
} }
} }
hir::ExprKind::Array(ref exprs) => { hir::ExprKind::Array(exprs) => {
self.consume_exprs(exprs); self.consume_exprs(exprs);
} }
@ -336,10 +336,10 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
// make sure that the thing we are pointing out stays valid // make sure that the thing we are pointing out stays valid
// for the lifetime `scope_r` of the resulting ptr: // for the lifetime `scope_r` of the resulting ptr:
let bk = ty::BorrowKind::from_mutbl(m); let bk = ty::BorrowKind::from_mutbl(m);
self.borrow_expr(&base, bk); self.borrow_expr(base, bk);
} }
hir::ExprKind::InlineAsm(ref asm) => { hir::ExprKind::InlineAsm(asm) => {
for (op, _op_sp) in asm.operands { for (op, _op_sp) in asm.operands {
match op { match op {
hir::InlineAsmOperand::In { expr, .. } hir::InlineAsmOperand::In { expr, .. }
@ -360,7 +360,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
} }
} }
hir::ExprKind::LlvmInlineAsm(ref ia) => { hir::ExprKind::LlvmInlineAsm(ia) => {
for (o, output) in iter::zip(&ia.inner.outputs, ia.outputs_exprs) { for (o, output) in iter::zip(&ia.inner.outputs, ia.outputs_exprs) {
if o.is_indirect { if o.is_indirect {
self.consume_expr(output); self.consume_expr(output);
@ -368,7 +368,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
self.mutate_expr(output); self.mutate_expr(output);
} }
} }
self.consume_exprs(&ia.inputs_exprs); self.consume_exprs(ia.inputs_exprs);
} }
hir::ExprKind::Continue(..) hir::ExprKind::Continue(..)
@ -376,43 +376,43 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
| hir::ExprKind::ConstBlock(..) | hir::ExprKind::ConstBlock(..)
| hir::ExprKind::Err => {} | hir::ExprKind::Err => {}
hir::ExprKind::Loop(ref blk, ..) => { hir::ExprKind::Loop(blk, ..) => {
self.walk_block(blk); self.walk_block(blk);
} }
hir::ExprKind::Unary(_, ref lhs) => { hir::ExprKind::Unary(_, lhs) => {
self.consume_expr(lhs); self.consume_expr(lhs);
} }
hir::ExprKind::Binary(_, ref lhs, ref rhs) => { hir::ExprKind::Binary(_, lhs, rhs) => {
self.consume_expr(lhs); self.consume_expr(lhs);
self.consume_expr(rhs); self.consume_expr(rhs);
} }
hir::ExprKind::Block(ref blk, _) => { hir::ExprKind::Block(blk, _) => {
self.walk_block(blk); self.walk_block(blk);
} }
hir::ExprKind::Break(_, ref opt_expr) | hir::ExprKind::Ret(ref opt_expr) => { hir::ExprKind::Break(_, ref opt_expr) | hir::ExprKind::Ret(ref opt_expr) => {
if let Some(ref expr) = *opt_expr { if let Some(expr) = *opt_expr {
self.consume_expr(expr); self.consume_expr(expr);
} }
} }
hir::ExprKind::Assign(ref lhs, ref rhs, _) => { hir::ExprKind::Assign(lhs, rhs, _) => {
self.mutate_expr(lhs); self.mutate_expr(lhs);
self.consume_expr(rhs); self.consume_expr(rhs);
} }
hir::ExprKind::Cast(ref base, _) => { hir::ExprKind::Cast(base, _) => {
self.consume_expr(base); self.consume_expr(base);
} }
hir::ExprKind::DropTemps(ref expr) => { hir::ExprKind::DropTemps(expr) => {
self.consume_expr(expr); self.consume_expr(expr);
} }
hir::ExprKind::AssignOp(_, ref lhs, ref rhs) => { hir::ExprKind::AssignOp(_, lhs, rhs) => {
if self.mc.typeck_results.is_method_call(expr) { if self.mc.typeck_results.is_method_call(expr) {
self.consume_expr(lhs); self.consume_expr(lhs);
} else { } else {
@ -421,7 +421,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
self.consume_expr(rhs); self.consume_expr(rhs);
} }
hir::ExprKind::Repeat(ref base, _) => { hir::ExprKind::Repeat(base, _) => {
self.consume_expr(base); self.consume_expr(base);
} }
@ -433,7 +433,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
self.consume_expr(base); self.consume_expr(base);
} }
hir::ExprKind::Yield(ref value, _) => { hir::ExprKind::Yield(value, _) => {
self.consume_expr(value); self.consume_expr(value);
} }
} }
@ -441,7 +441,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
fn walk_stmt(&mut self, stmt: &hir::Stmt<'_>) { fn walk_stmt(&mut self, stmt: &hir::Stmt<'_>) {
match stmt.kind { match stmt.kind {
hir::StmtKind::Local(hir::Local { pat, init: Some(ref expr), .. }) => { hir::StmtKind::Local(hir::Local { pat, init: Some(expr), .. }) => {
self.walk_local(expr, pat, |_| {}); self.walk_local(expr, pat, |_| {});
} }
@ -453,7 +453,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
} }
hir::StmtKind::Expr(ref expr) | hir::StmtKind::Semi(ref expr) => { hir::StmtKind::Expr(ref expr) | hir::StmtKind::Semi(ref expr) => {
self.consume_expr(&expr); self.consume_expr(expr);
} }
} }
} }
@ -462,8 +462,8 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
where where
F: FnMut(&mut Self), F: FnMut(&mut Self),
{ {
self.walk_expr(&expr); self.walk_expr(expr);
let expr_place = return_if_err!(self.mc.cat_expr(&expr)); let expr_place = return_if_err!(self.mc.cat_expr(expr));
f(self); f(self);
self.walk_irrefutable_pat(&expr_place, &pat); self.walk_irrefutable_pat(&expr_place, &pat);
} }
@ -478,7 +478,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
} }
if let Some(ref tail_expr) = blk.expr { if let Some(ref tail_expr) = blk.expr {
self.consume_expr(&tail_expr); self.consume_expr(tail_expr);
} }
} }
@ -489,17 +489,17 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
) { ) {
// Consume the expressions supplying values for each field. // Consume the expressions supplying values for each field.
for field in fields { for field in fields {
self.consume_expr(&field.expr); self.consume_expr(field.expr);
} }
let with_expr = match *opt_with { let with_expr = match *opt_with {
Some(ref w) => &**w, Some(w) => &*w,
None => { None => {
return; return;
} }
}; };
let with_place = return_if_err!(self.mc.cat_expr(&with_expr)); let with_place = return_if_err!(self.mc.cat_expr(with_expr));
// Select just those fields of the `with` // Select just those fields of the `with`
// expression that will actually be used // expression that will actually be used
@ -569,7 +569,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
} }
} }
place_with_id = place_with_id =
return_if_err!(self.mc.cat_expr_adjusted(expr, place_with_id, &adjustment)); return_if_err!(self.mc.cat_expr_adjusted(expr, place_with_id, adjustment));
} }
} }
@ -615,15 +615,15 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
FakeReadCause::ForMatchedPlace(closure_def_id), FakeReadCause::ForMatchedPlace(closure_def_id),
discr_place.hir_id, discr_place.hir_id,
); );
self.walk_pat(discr_place, &arm.pat); self.walk_pat(discr_place, arm.pat);
if let Some(hir::Guard::If(ref e)) = arm.guard { if let Some(hir::Guard::If(e)) = arm.guard {
self.consume_expr(e) self.consume_expr(e)
} else if let Some(hir::Guard::IfLet(_, ref e)) = arm.guard { } else if let Some(hir::Guard::IfLet(_, ref e)) = arm.guard {
self.consume_expr(e) self.consume_expr(e)
} }
self.consume_expr(&arm.body); self.consume_expr(arm.body);
} }
/// Walks a pat that occurs in isolation (i.e., top-level of fn argument or /// Walks a pat that occurs in isolation (i.e., top-level of fn argument or
@ -836,7 +836,7 @@ fn delegate_consume<'a, 'tcx>(
) { ) {
debug!("delegate_consume(place_with_id={:?})", place_with_id); debug!("delegate_consume(place_with_id={:?})", place_with_id);
let mode = copy_or_move(&mc, place_with_id); let mode = copy_or_move(mc, place_with_id);
match mode { match mode {
ConsumeMode::Move => delegate.consume(place_with_id, diag_expr_id), ConsumeMode::Move => delegate.consume(place_with_id, diag_expr_id),

View file

@ -143,7 +143,7 @@ fn require_same_types<'tcx>(
tcx.infer_ctxt().enter(|ref infcx| { tcx.infer_ctxt().enter(|ref infcx| {
let param_env = ty::ParamEnv::empty(); let param_env = ty::ParamEnv::empty();
let mut fulfill_cx = <dyn TraitEngine<'_>>::new(infcx.tcx); let mut fulfill_cx = <dyn TraitEngine<'_>>::new(infcx.tcx);
match infcx.at(&cause, param_env).eq(expected, actual) { match infcx.at(cause, param_env).eq(expected, actual) {
Ok(InferOk { obligations, .. }) => { Ok(InferOk { obligations, .. }) => {
fulfill_cx.register_predicate_obligations(infcx, obligations); fulfill_cx.register_predicate_obligations(infcx, obligations);
} }
@ -187,9 +187,11 @@ fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: DefId) {
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local()); let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local());
match tcx.hir().find(hir_id) { match tcx.hir().find(hir_id) {
Some(Node::Item(hir::Item { kind: hir::ItemKind::Fn(_, ref generics, _), .. })) => { Some(Node::Item(hir::Item { kind: hir::ItemKind::Fn(_, ref generics, _), .. })) => {
let generics_param_span = if !generics.params.is_empty() {
if !generics.params.is_empty() { Some(generics.span) } else { None }; Some(generics.span)
generics_param_span } else {
None
}
} }
_ => { _ => {
span_bug!(tcx.def_span(def_id), "main has a non-function type"); span_bug!(tcx.def_span(def_id), "main has a non-function type");

View file

@ -307,13 +307,13 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
if self.typeck_results.is_method_call(expr) { if self.typeck_results.is_method_call(expr) {
self.cat_overloaded_place(expr, e_base) self.cat_overloaded_place(expr, e_base)
} else { } else {
let base = self.cat_expr(&e_base)?; let base = self.cat_expr(e_base)?;
self.cat_deref(expr, base) self.cat_deref(expr, base)
} }
} }
hir::ExprKind::Field(ref base, _) => { hir::ExprKind::Field(ref base, _) => {
let base = self.cat_expr(&base)?; let base = self.cat_expr(base)?;
debug!("cat_expr(cat_field): id={} expr={:?} base={:?}", expr.hir_id, expr, base); debug!("cat_expr(cat_field): id={} expr={:?} base={:?}", expr.hir_id, expr, base);
let field_idx = self let field_idx = self
@ -340,7 +340,7 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
// dereferencing. // dereferencing.
self.cat_overloaded_place(expr, base) self.cat_overloaded_place(expr, base)
} else { } else {
let base = self.cat_expr(&base)?; let base = self.cat_expr(base)?;
Ok(self.cat_projection(expr, base, expr_ty, ProjectionKind::Index)) Ok(self.cat_projection(expr, base, expr_ty, ProjectionKind::Index))
} }
} }
@ -350,7 +350,7 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
self.cat_res(expr.hir_id, expr.span, expr_ty, res) self.cat_res(expr.hir_id, expr.span, expr_ty, res)
} }
hir::ExprKind::Type(ref e, _) => self.cat_expr(&e), hir::ExprKind::Type(ref e, _) => self.cat_expr(e),
hir::ExprKind::AddrOf(..) hir::ExprKind::AddrOf(..)
| hir::ExprKind::Call(..) | hir::ExprKind::Call(..)
@ -674,31 +674,31 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
op(&place_with_id, pat); op(&place_with_id, pat);
match pat.kind { match pat.kind {
PatKind::Tuple(ref subpats, dots_pos) => { PatKind::Tuple(subpats, dots_pos) => {
// (p1, ..., pN) // (p1, ..., pN)
let total_fields = self.total_fields_in_tuple(pat.hir_id, pat.span)?; let total_fields = self.total_fields_in_tuple(pat.hir_id, pat.span)?;
for (i, subpat) in subpats.iter().enumerate_and_adjust(total_fields, dots_pos) { for (i, subpat) in subpats.iter().enumerate_and_adjust(total_fields, dots_pos) {
let subpat_ty = self.pat_ty_adjusted(&subpat)?; let subpat_ty = self.pat_ty_adjusted(subpat)?;
let projection_kind = ProjectionKind::Field(i as u32, VariantIdx::new(0)); let projection_kind = ProjectionKind::Field(i as u32, VariantIdx::new(0));
let sub_place = let sub_place =
self.cat_projection(pat, place_with_id.clone(), subpat_ty, projection_kind); self.cat_projection(pat, place_with_id.clone(), subpat_ty, projection_kind);
self.cat_pattern_(sub_place, &subpat, op)?; self.cat_pattern_(sub_place, subpat, op)?;
} }
} }
PatKind::TupleStruct(ref qpath, ref subpats, dots_pos) => { PatKind::TupleStruct(ref qpath, subpats, dots_pos) => {
// S(p1, ..., pN) // S(p1, ..., pN)
let variant_index = self.variant_index_for_adt(qpath, pat.hir_id, pat.span)?; let variant_index = self.variant_index_for_adt(qpath, pat.hir_id, pat.span)?;
let total_fields = let total_fields =
self.total_fields_in_adt_variant(pat.hir_id, variant_index, pat.span)?; self.total_fields_in_adt_variant(pat.hir_id, variant_index, pat.span)?;
for (i, subpat) in subpats.iter().enumerate_and_adjust(total_fields, dots_pos) { for (i, subpat) in subpats.iter().enumerate_and_adjust(total_fields, dots_pos) {
let subpat_ty = self.pat_ty_adjusted(&subpat)?; let subpat_ty = self.pat_ty_adjusted(subpat)?;
let projection_kind = ProjectionKind::Field(i as u32, variant_index); let projection_kind = ProjectionKind::Field(i as u32, variant_index);
let sub_place = let sub_place =
self.cat_projection(pat, place_with_id.clone(), subpat_ty, projection_kind); self.cat_projection(pat, place_with_id.clone(), subpat_ty, projection_kind);
self.cat_pattern_(sub_place, &subpat, op)?; self.cat_pattern_(sub_place, subpat, op)?;
} }
} }
@ -708,7 +708,7 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
let variant_index = self.variant_index_for_adt(qpath, pat.hir_id, pat.span)?; let variant_index = self.variant_index_for_adt(qpath, pat.hir_id, pat.span)?;
for fp in field_pats { for fp in field_pats {
let field_ty = self.pat_ty_adjusted(&fp.pat)?; let field_ty = self.pat_ty_adjusted(fp.pat)?;
let field_index = self let field_index = self
.typeck_results .typeck_results
.field_indices() .field_indices()
@ -722,18 +722,18 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
field_ty, field_ty,
ProjectionKind::Field(field_index as u32, variant_index), ProjectionKind::Field(field_index as u32, variant_index),
); );
self.cat_pattern_(field_place, &fp.pat, op)?; self.cat_pattern_(field_place, fp.pat, op)?;
} }
} }
PatKind::Or(pats) => { PatKind::Or(pats) => {
for pat in pats { for pat in pats {
self.cat_pattern_(place_with_id.clone(), &pat, op)?; self.cat_pattern_(place_with_id.clone(), pat, op)?;
} }
} }
PatKind::Binding(.., Some(ref subpat)) => { PatKind::Binding(.., Some(ref subpat)) => {
self.cat_pattern_(place_with_id, &subpat, op)?; self.cat_pattern_(place_with_id, subpat, op)?;
} }
PatKind::Box(ref subpat) | PatKind::Ref(ref subpat, _) => { PatKind::Box(ref subpat) | PatKind::Ref(ref subpat, _) => {
@ -741,7 +741,7 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
// PatKind::Ref since that information is already contained // PatKind::Ref since that information is already contained
// in the type. // in the type.
let subplace = self.cat_deref(pat, place_with_id)?; let subplace = self.cat_deref(pat, place_with_id)?;
self.cat_pattern_(subplace, &subpat, op)?; self.cat_pattern_(subplace, subpat, op)?;
} }
PatKind::Slice(before, ref slice, after) => { PatKind::Slice(before, ref slice, after) => {
@ -759,20 +759,20 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
ProjectionKind::Index, ProjectionKind::Index,
); );
for before_pat in before { for before_pat in before {
self.cat_pattern_(elt_place.clone(), &before_pat, op)?; self.cat_pattern_(elt_place.clone(), before_pat, op)?;
} }
if let Some(ref slice_pat) = *slice { if let Some(ref slice_pat) = *slice {
let slice_pat_ty = self.pat_ty_adjusted(&slice_pat)?; let slice_pat_ty = self.pat_ty_adjusted(slice_pat)?;
let slice_place = self.cat_projection( let slice_place = self.cat_projection(
pat, pat,
place_with_id, place_with_id,
slice_pat_ty, slice_pat_ty,
ProjectionKind::Subslice, ProjectionKind::Subslice,
); );
self.cat_pattern_(slice_place, &slice_pat, op)?; self.cat_pattern_(slice_place, slice_pat, op)?;
} }
for after_pat in after { for after_pat in after {
self.cat_pattern_(elt_place.clone(), &after_pat, op)?; self.cat_pattern_(elt_place.clone(), after_pat, op)?;
} }
} }

View file

@ -30,20 +30,20 @@ impl<'tcx> ExplicitPredicatesMap<'tcx> {
// process predicates and convert to `RequiredPredicates` entry, see below // process predicates and convert to `RequiredPredicates` entry, see below
for &(predicate, span) in predicates.predicates { for &(predicate, span) in predicates.predicates {
match predicate.kind().skip_binder() { match predicate.kind().skip_binder() {
ty::PredicateKind::TypeOutlives(OutlivesPredicate(ref ty, ref reg)) => { ty::PredicateKind::TypeOutlives(OutlivesPredicate(ty, reg)) => {
insert_outlives_predicate( insert_outlives_predicate(
tcx, tcx,
(*ty).into(), ty.into(),
reg, reg,
span, span,
&mut required_predicates, &mut required_predicates,
) )
} }
ty::PredicateKind::RegionOutlives(OutlivesPredicate(ref reg1, ref reg2)) => { ty::PredicateKind::RegionOutlives(OutlivesPredicate(reg1, reg2)) => {
insert_outlives_predicate( insert_outlives_predicate(
tcx, tcx,
(*reg1).into(), reg1.into(),
reg2, reg2,
span, span,
&mut required_predicates, &mut required_predicates,

View file

@ -22,7 +22,7 @@ fn inferred_outlives_of(tcx: TyCtxt<'_>, item_def_id: DefId) -> &[(ty::Predicate
if matches!(tcx.def_kind(item_def_id), hir::def::DefKind::AnonConst) && tcx.lazy_normalization() if matches!(tcx.def_kind(item_def_id), hir::def::DefKind::AnonConst) && tcx.lazy_normalization()
{ {
if let Some(_) = tcx.hir().opt_const_param_default_param_hir_id(id) { if tcx.hir().opt_const_param_default_param_hir_id(id).is_some() {
// In `generics_of` we set the generics' parent to be our parent's parent which means that // In `generics_of` we set the generics' parent to be our parent's parent which means that
// we lose out on the predicates of our actual parent if we dont return those predicates here. // we lose out on the predicates of our actual parent if we dont return those predicates here.
// (See comment in `generics_of` for more information on why the parent shenanigans is necessary) // (See comment in `generics_of` for more information on why the parent shenanigans is necessary)

View file

@ -293,7 +293,7 @@ impl<'a, 'tcx> WrongNumberOfGenericArgs<'a, 'tcx> {
&self, &self,
num_params_to_take: usize, num_params_to_take: usize,
) -> String { ) -> String {
let fn_sig = self.tcx.hir().get_if_local(self.def_id).and_then(|node| fn_sig(node)); let fn_sig = self.tcx.hir().get_if_local(self.def_id).and_then(fn_sig);
let is_used_in_input = |def_id| { let is_used_in_input = |def_id| {
fn_sig.map_or(false, |fn_sig| { fn_sig.map_or(false, |fn_sig| {
fn_sig.decl.inputs.iter().any(|ty| match ty.kind { fn_sig.decl.inputs.iter().any(|ty| match ty.kind {

View file

@ -293,7 +293,7 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
self.add_constraints_from_invariant_substs(current, substs, variance); self.add_constraints_from_invariant_substs(current, substs, variance);
} }
ty::Dynamic(ref data, r) => { ty::Dynamic(data, r) => {
// The type `Foo<T+'a>` is contravariant w/r/t `'a`: // The type `Foo<T+'a>` is contravariant w/r/t `'a`:
let contra = self.contravariant(variance); let contra = self.contravariant(variance);
self.add_constraints_from_region(current, r, contra); self.add_constraints_from_region(current, r, contra);