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:
commit
b27661eb33
61 changed files with 458 additions and 506 deletions
|
@ -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, ®ioncx, &borrow_set)
|
let flow_borrows = Borrows::new(tcx, body, ®ioncx, &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,
|
||||||
);
|
);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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."
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) => {
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.");
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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(¬e);
|
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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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(),
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 (¶m.kind, arg) {
|
match (¶m.kind, arg) {
|
||||||
(GenericParamDefKind::Lifetime, GenericArg::Lifetime(lt)) => {
|
(GenericParamDefKind::Lifetime, GenericArg::Lifetime(lt)) => {
|
||||||
self.astconv.ast_region_to_region(<, 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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
|
|
@ -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, ¶m.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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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(¶m) {
|
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(¶m) {
|
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 }>`
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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, <, 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, ¶m.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,
|
||||||
¶m.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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(¶m.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(¶m_place, ¶m.pat);
|
self.walk_irrefutable_pat(¶m_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),
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue