Auto merge of #115326 - matthiaskrgr:rollup-qsoa8ar, r=matthiaskrgr
Rollup of 8 pull requests Successful merges: - #115164 (MIR validation: reject in-place argument/return for packed fields) - #115240 (codegen_llvm/llvm_type: avoid matching on the Rust type) - #115294 (More precisely detect cycle errors from type_of on opaque) - #115310 (Document panic behavior across editions, and improve xrefs) - #115311 (Revert "Suggest using `Arc` on `!Send`/`!Sync` types") - #115317 (Devacationize oli-obk) - #115319 (don't use SnapshotVec in Graph implementation, as it looks unused; use Vec instead) - #115322 (Tweak output of `to_pretty_impl_header` involving only anon lifetimes) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
4e78abb437
154 changed files with 432 additions and 655 deletions
|
@ -125,8 +125,8 @@ impl<'gcc, 'tcx> FnAbiGccExt<'gcc, 'tcx> for FnAbi<'tcx, Ty<'tcx>> {
|
||||||
PassMode::Ignore => continue,
|
PassMode::Ignore => continue,
|
||||||
PassMode::Direct(_) => arg.layout.immediate_gcc_type(cx),
|
PassMode::Direct(_) => arg.layout.immediate_gcc_type(cx),
|
||||||
PassMode::Pair(..) => {
|
PassMode::Pair(..) => {
|
||||||
argument_tys.push(arg.layout.scalar_pair_element_gcc_type(cx, 0, true));
|
argument_tys.push(arg.layout.scalar_pair_element_gcc_type(cx, 0));
|
||||||
argument_tys.push(arg.layout.scalar_pair_element_gcc_type(cx, 1, true));
|
argument_tys.push(arg.layout.scalar_pair_element_gcc_type(cx, 1));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
PassMode::Indirect { extra_attrs: Some(_), .. } => {
|
PassMode::Indirect { extra_attrs: Some(_), .. } => {
|
||||||
|
|
|
@ -821,7 +821,7 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
|
||||||
|
|
||||||
let mut load = |i, scalar: &abi::Scalar, align| {
|
let mut load = |i, scalar: &abi::Scalar, align| {
|
||||||
let llptr = self.struct_gep(pair_type, place.llval, i as u64);
|
let llptr = self.struct_gep(pair_type, place.llval, i as u64);
|
||||||
let llty = place.layout.scalar_pair_element_gcc_type(self, i, false);
|
let llty = place.layout.scalar_pair_element_gcc_type(self, i);
|
||||||
let load = self.load(llty, llptr, align);
|
let load = self.load(llty, llptr, align);
|
||||||
scalar_load_metadata(self, load, scalar);
|
scalar_load_metadata(self, load, scalar);
|
||||||
if scalar.is_bool() { self.trunc(load, self.type_i1()) } else { load }
|
if scalar.is_bool() { self.trunc(load, self.type_i1()) } else { load }
|
||||||
|
|
|
@ -4,7 +4,7 @@ use gccjit::{Struct, Type};
|
||||||
use crate::rustc_codegen_ssa::traits::{BaseTypeMethods, DerivedTypeMethods, LayoutTypeMethods};
|
use crate::rustc_codegen_ssa::traits::{BaseTypeMethods, DerivedTypeMethods, LayoutTypeMethods};
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::ty::{self, Ty, TypeVisitableExt};
|
use rustc_middle::ty::{self, Ty, TypeVisitableExt};
|
||||||
use rustc_middle::ty::layout::{FnAbiOf, LayoutOf, TyAndLayout};
|
use rustc_middle::ty::layout::{LayoutOf, TyAndLayout};
|
||||||
use rustc_middle::ty::print::with_no_trimmed_paths;
|
use rustc_middle::ty::print::with_no_trimmed_paths;
|
||||||
use rustc_target::abi::{self, Abi, Align, F32, F64, FieldsShape, Int, Integer, Pointer, PointeeInfo, Size, TyAbiInterface, Variants};
|
use rustc_target::abi::{self, Abi, Align, F32, F64, FieldsShape, Int, Integer, Pointer, PointeeInfo, Size, TyAbiInterface, Variants};
|
||||||
use rustc_target::abi::call::{CastTarget, FnAbi, Reg};
|
use rustc_target::abi::call::{CastTarget, FnAbi, Reg};
|
||||||
|
@ -74,8 +74,8 @@ fn uncached_gcc_type<'gcc, 'tcx>(cx: &CodegenCx<'gcc, 'tcx>, layout: TyAndLayout
|
||||||
Abi::ScalarPair(..) => {
|
Abi::ScalarPair(..) => {
|
||||||
return cx.type_struct(
|
return cx.type_struct(
|
||||||
&[
|
&[
|
||||||
layout.scalar_pair_element_gcc_type(cx, 0, false),
|
layout.scalar_pair_element_gcc_type(cx, 0),
|
||||||
layout.scalar_pair_element_gcc_type(cx, 1, false),
|
layout.scalar_pair_element_gcc_type(cx, 1),
|
||||||
],
|
],
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
|
@ -150,7 +150,7 @@ pub trait LayoutGccExt<'tcx> {
|
||||||
fn gcc_type<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>) -> Type<'gcc>;
|
fn gcc_type<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>) -> Type<'gcc>;
|
||||||
fn immediate_gcc_type<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>) -> Type<'gcc>;
|
fn immediate_gcc_type<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>) -> Type<'gcc>;
|
||||||
fn scalar_gcc_type_at<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>, scalar: &abi::Scalar, offset: Size) -> Type<'gcc>;
|
fn scalar_gcc_type_at<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>, scalar: &abi::Scalar, offset: Size) -> Type<'gcc>;
|
||||||
fn scalar_pair_element_gcc_type<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>, index: usize, immediate: bool) -> Type<'gcc>;
|
fn scalar_pair_element_gcc_type<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>, index: usize) -> Type<'gcc>;
|
||||||
fn gcc_field_index(&self, index: usize) -> u64;
|
fn gcc_field_index(&self, index: usize) -> u64;
|
||||||
fn pointee_info_at<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>, offset: Size) -> Option<PointeeInfo>;
|
fn pointee_info_at<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>, offset: Size) -> Option<PointeeInfo>;
|
||||||
}
|
}
|
||||||
|
@ -182,23 +182,16 @@ impl<'tcx> LayoutGccExt<'tcx> for TyAndLayout<'tcx> {
|
||||||
/// of that field's type - this is useful for taking the address of
|
/// of that field's type - this is useful for taking the address of
|
||||||
/// that field and ensuring the struct has the right alignment.
|
/// that field and ensuring the struct has the right alignment.
|
||||||
fn gcc_type<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>) -> Type<'gcc> {
|
fn gcc_type<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>) -> Type<'gcc> {
|
||||||
|
// This must produce the same result for `repr(transparent)` wrappers as for the inner type!
|
||||||
|
// In other words, this should generally not look at the type at all, but only at the
|
||||||
|
// layout.
|
||||||
if let Abi::Scalar(ref scalar) = self.abi {
|
if let Abi::Scalar(ref scalar) = self.abi {
|
||||||
// Use a different cache for scalars because pointers to DSTs
|
// Use a different cache for scalars because pointers to DSTs
|
||||||
// can be either fat or thin (data pointers of fat pointers).
|
// can be either fat or thin (data pointers of fat pointers).
|
||||||
if let Some(&ty) = cx.scalar_types.borrow().get(&self.ty) {
|
if let Some(&ty) = cx.scalar_types.borrow().get(&self.ty) {
|
||||||
return ty;
|
return ty;
|
||||||
}
|
}
|
||||||
let ty =
|
let ty = self.scalar_gcc_type_at(cx, scalar, Size::ZERO);
|
||||||
match *self.ty.kind() {
|
|
||||||
ty::Ref(_, ty, _) | ty::RawPtr(ty::TypeAndMut { ty, .. }) => {
|
|
||||||
cx.type_ptr_to(cx.layout_of(ty).gcc_type(cx))
|
|
||||||
}
|
|
||||||
ty::Adt(def, _) if def.is_box() => {
|
|
||||||
cx.type_ptr_to(cx.layout_of(self.ty.boxed_ty()).gcc_type(cx))
|
|
||||||
}
|
|
||||||
ty::FnPtr(sig) => cx.fn_ptr_backend_type(&cx.fn_abi_of_fn_ptr(sig, ty::List::empty())),
|
|
||||||
_ => self.scalar_gcc_type_at(cx, scalar, Size::ZERO),
|
|
||||||
};
|
|
||||||
cx.scalar_types.borrow_mut().insert(self.ty, ty);
|
cx.scalar_types.borrow_mut().insert(self.ty, ty);
|
||||||
return ty;
|
return ty;
|
||||||
}
|
}
|
||||||
|
@ -272,23 +265,10 @@ impl<'tcx> LayoutGccExt<'tcx> for TyAndLayout<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn scalar_pair_element_gcc_type<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>, index: usize, immediate: bool) -> Type<'gcc> {
|
fn scalar_pair_element_gcc_type<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>, index: usize) -> Type<'gcc> {
|
||||||
// TODO(antoyo): remove llvm hack:
|
// This must produce the same result for `repr(transparent)` wrappers as for the inner type!
|
||||||
// HACK(eddyb) special-case fat pointers until LLVM removes
|
// In other words, this should generally not look at the type at all, but only at the
|
||||||
// pointee types, to avoid bitcasting every `OperandRef::deref`.
|
// layout.
|
||||||
match self.ty.kind() {
|
|
||||||
ty::Ref(..) | ty::RawPtr(_) => {
|
|
||||||
return self.field(cx, index).gcc_type(cx);
|
|
||||||
}
|
|
||||||
// only wide pointer boxes are handled as pointers
|
|
||||||
// thin pointer boxes with scalar allocators are handled by the general logic below
|
|
||||||
ty::Adt(def, args) if def.is_box() && cx.layout_of(args.type_at(1)).is_zst() => {
|
|
||||||
let ptr_ty = Ty::new_mut_ptr(cx.tcx,self.ty.boxed_ty());
|
|
||||||
return cx.layout_of(ptr_ty).scalar_pair_element_gcc_type(cx, index, immediate);
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
|
|
||||||
let (a, b) = match self.abi {
|
let (a, b) = match self.abi {
|
||||||
Abi::ScalarPair(ref a, ref b) => (a, b),
|
Abi::ScalarPair(ref a, ref b) => (a, b),
|
||||||
_ => bug!("TyAndLayout::scalar_pair_element_llty({:?}): not applicable", self),
|
_ => bug!("TyAndLayout::scalar_pair_element_llty({:?}): not applicable", self),
|
||||||
|
@ -367,8 +347,8 @@ impl<'gcc, 'tcx> LayoutTypeMethods<'tcx> for CodegenCx<'gcc, 'tcx> {
|
||||||
layout.gcc_field_index(index)
|
layout.gcc_field_index(index)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn scalar_pair_element_backend_type(&self, layout: TyAndLayout<'tcx>, index: usize, immediate: bool) -> Type<'gcc> {
|
fn scalar_pair_element_backend_type(&self, layout: TyAndLayout<'tcx>, index: usize, _immediate: bool) -> Type<'gcc> {
|
||||||
layout.scalar_pair_element_gcc_type(self, index, immediate)
|
layout.scalar_pair_element_gcc_type(self, index)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cast_backend_type(&self, ty: &CastTarget) -> Type<'gcc> {
|
fn cast_backend_type(&self, ty: &CastTarget) -> Type<'gcc> {
|
||||||
|
|
|
@ -3,7 +3,7 @@ use crate::context::TypeLowering;
|
||||||
use crate::type_::Type;
|
use crate::type_::Type;
|
||||||
use rustc_codegen_ssa::traits::*;
|
use rustc_codegen_ssa::traits::*;
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::ty::layout::{FnAbiOf, LayoutOf, TyAndLayout};
|
use rustc_middle::ty::layout::{LayoutOf, TyAndLayout};
|
||||||
use rustc_middle::ty::print::{with_no_trimmed_paths, with_no_visible_paths};
|
use rustc_middle::ty::print::{with_no_trimmed_paths, with_no_visible_paths};
|
||||||
use rustc_middle::ty::{self, Ty, TypeVisitableExt};
|
use rustc_middle::ty::{self, Ty, TypeVisitableExt};
|
||||||
use rustc_target::abi::HasDataLayout;
|
use rustc_target::abi::HasDataLayout;
|
||||||
|
@ -215,20 +215,16 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyAndLayout<'tcx> {
|
||||||
/// of that field's type - this is useful for taking the address of
|
/// of that field's type - this is useful for taking the address of
|
||||||
/// that field and ensuring the struct has the right alignment.
|
/// that field and ensuring the struct has the right alignment.
|
||||||
fn llvm_type<'a>(&self, cx: &CodegenCx<'a, 'tcx>) -> &'a Type {
|
fn llvm_type<'a>(&self, cx: &CodegenCx<'a, 'tcx>) -> &'a Type {
|
||||||
|
// This must produce the same result for `repr(transparent)` wrappers as for the inner type!
|
||||||
|
// In other words, this should generally not look at the type at all, but only at the
|
||||||
|
// layout.
|
||||||
if let Abi::Scalar(scalar) = self.abi {
|
if let Abi::Scalar(scalar) = self.abi {
|
||||||
// Use a different cache for scalars because pointers to DSTs
|
// Use a different cache for scalars because pointers to DSTs
|
||||||
// can be either fat or thin (data pointers of fat pointers).
|
// can be either fat or thin (data pointers of fat pointers).
|
||||||
if let Some(&llty) = cx.scalar_lltypes.borrow().get(&self.ty) {
|
if let Some(&llty) = cx.scalar_lltypes.borrow().get(&self.ty) {
|
||||||
return llty;
|
return llty;
|
||||||
}
|
}
|
||||||
let llty = match *self.ty.kind() {
|
let llty = self.scalar_llvm_type_at(cx, scalar);
|
||||||
ty::Ref(..) | ty::RawPtr(_) => cx.type_ptr(),
|
|
||||||
ty::Adt(def, _) if def.is_box() => cx.type_ptr(),
|
|
||||||
ty::FnPtr(sig) => {
|
|
||||||
cx.fn_ptr_backend_type(cx.fn_abi_of_fn_ptr(sig, ty::List::empty()))
|
|
||||||
}
|
|
||||||
_ => self.scalar_llvm_type_at(cx, scalar),
|
|
||||||
};
|
|
||||||
cx.scalar_lltypes.borrow_mut().insert(self.ty, llty);
|
cx.scalar_lltypes.borrow_mut().insert(self.ty, llty);
|
||||||
return llty;
|
return llty;
|
||||||
}
|
}
|
||||||
|
@ -303,27 +299,9 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyAndLayout<'tcx> {
|
||||||
index: usize,
|
index: usize,
|
||||||
immediate: bool,
|
immediate: bool,
|
||||||
) -> &'a Type {
|
) -> &'a Type {
|
||||||
// HACK(eddyb) special-case fat pointers until LLVM removes
|
// This must produce the same result for `repr(transparent)` wrappers as for the inner type!
|
||||||
// pointee types, to avoid bitcasting every `OperandRef::deref`.
|
// In other words, this should generally not look at the type at all, but only at the
|
||||||
match *self.ty.kind() {
|
// layout.
|
||||||
ty::Ref(..) | ty::RawPtr(_) => {
|
|
||||||
return self.field(cx, index).llvm_type(cx);
|
|
||||||
}
|
|
||||||
// only wide pointer boxes are handled as pointers
|
|
||||||
// thin pointer boxes with scalar allocators are handled by the general logic below
|
|
||||||
ty::Adt(def, args) if def.is_box() && cx.layout_of(args.type_at(1)).is_zst() => {
|
|
||||||
let ptr_ty = Ty::new_mut_ptr(cx.tcx, self.ty.boxed_ty());
|
|
||||||
return cx.layout_of(ptr_ty).scalar_pair_element_llvm_type(cx, index, immediate);
|
|
||||||
}
|
|
||||||
// `dyn* Trait` has the same ABI as `*mut dyn Trait`
|
|
||||||
ty::Dynamic(bounds, region, ty::DynStar) => {
|
|
||||||
let ptr_ty =
|
|
||||||
Ty::new_mut_ptr(cx.tcx, Ty::new_dynamic(cx.tcx, bounds, region, ty::Dyn));
|
|
||||||
return cx.layout_of(ptr_ty).scalar_pair_element_llvm_type(cx, index, immediate);
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
|
|
||||||
let Abi::ScalarPair(a, b) = self.abi else {
|
let Abi::ScalarPair(a, b) = self.abi else {
|
||||||
bug!("TyAndLayout::scalar_pair_element_llty({:?}): not applicable", self);
|
bug!("TyAndLayout::scalar_pair_element_llty({:?}): not applicable", self);
|
||||||
};
|
};
|
||||||
|
|
|
@ -20,6 +20,8 @@ use rustc_mir_dataflow::{Analysis, ResultsCursor};
|
||||||
use rustc_target::abi::{Size, FIRST_VARIANT};
|
use rustc_target::abi::{Size, FIRST_VARIANT};
|
||||||
use rustc_target::spec::abi::Abi;
|
use rustc_target::spec::abi::Abi;
|
||||||
|
|
||||||
|
use crate::util::is_within_packed;
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||||
enum EdgeKind {
|
enum EdgeKind {
|
||||||
Unwind,
|
Unwind,
|
||||||
|
@ -93,6 +95,7 @@ impl<'tcx> MirPass<'tcx> for Validator {
|
||||||
cfg_checker.visit_body(body);
|
cfg_checker.visit_body(body);
|
||||||
cfg_checker.check_cleanup_control_flow();
|
cfg_checker.check_cleanup_control_flow();
|
||||||
|
|
||||||
|
// Also run the TypeChecker.
|
||||||
for (location, msg) in validate_types(tcx, self.mir_phase, param_env, body) {
|
for (location, msg) in validate_types(tcx, self.mir_phase, param_env, body) {
|
||||||
cfg_checker.fail(location, msg);
|
cfg_checker.fail(location, msg);
|
||||||
}
|
}
|
||||||
|
@ -427,14 +430,34 @@ impl<'a, 'tcx> Visitor<'tcx> for CfgChecker<'a, 'tcx> {
|
||||||
self.check_unwind_edge(location, *unwind);
|
self.check_unwind_edge(location, *unwind);
|
||||||
|
|
||||||
// The call destination place and Operand::Move place used as an argument might be
|
// The call destination place and Operand::Move place used as an argument might be
|
||||||
// passed by a reference to the callee. Consequently they must be non-overlapping.
|
// passed by a reference to the callee. Consequently they must be non-overlapping
|
||||||
// Currently this simply checks for duplicate places.
|
// and cannot be packed. Currently this simply checks for duplicate places.
|
||||||
self.place_cache.clear();
|
self.place_cache.clear();
|
||||||
self.place_cache.insert(destination.as_ref());
|
self.place_cache.insert(destination.as_ref());
|
||||||
|
if is_within_packed(self.tcx, &self.body.local_decls, *destination).is_some() {
|
||||||
|
// This is bad! The callee will expect the memory to be aligned.
|
||||||
|
self.fail(
|
||||||
|
location,
|
||||||
|
format!(
|
||||||
|
"encountered packed place in `Call` terminator destination: {:?}",
|
||||||
|
terminator.kind,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
let mut has_duplicates = false;
|
let mut has_duplicates = false;
|
||||||
for arg in args {
|
for arg in args {
|
||||||
if let Operand::Move(place) = arg {
|
if let Operand::Move(place) = arg {
|
||||||
has_duplicates |= !self.place_cache.insert(place.as_ref());
|
has_duplicates |= !self.place_cache.insert(place.as_ref());
|
||||||
|
if is_within_packed(self.tcx, &self.body.local_decls, *place).is_some() {
|
||||||
|
// This is bad! The callee will expect the memory to be aligned.
|
||||||
|
self.fail(
|
||||||
|
location,
|
||||||
|
format!(
|
||||||
|
"encountered `Move` of a packed place in `Call` terminator: {:?}",
|
||||||
|
terminator.kind,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -442,7 +465,7 @@ impl<'a, 'tcx> Visitor<'tcx> for CfgChecker<'a, 'tcx> {
|
||||||
self.fail(
|
self.fail(
|
||||||
location,
|
location,
|
||||||
format!(
|
format!(
|
||||||
"encountered overlapping memory in `Call` terminator: {:?}",
|
"encountered overlapping memory in `Move` arguments to `Call` terminator: {:?}",
|
||||||
terminator.kind,
|
terminator.kind,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -541,6 +564,8 @@ impl<'a, 'tcx> Visitor<'tcx> for CfgChecker<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A faster version of the validation pass that only checks those things which may break when apply
|
||||||
|
/// generic substitutions.
|
||||||
pub fn validate_types<'tcx>(
|
pub fn validate_types<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
mir_phase: MirPhase,
|
mir_phase: MirPhase,
|
||||||
|
|
|
@ -34,6 +34,7 @@ where
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
// We cannot figure out the layout. Conservatively assume that this is disaligned.
|
||||||
debug!("is_disaligned({:?}) - true", place);
|
debug!("is_disaligned({:?}) - true", place);
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,6 @@
|
||||||
//! the field `next_edge`). Each of those fields is an array that should
|
//! the field `next_edge`). Each of those fields is an array that should
|
||||||
//! be indexed by the direction (see the type `Direction`).
|
//! be indexed by the direction (see the type `Direction`).
|
||||||
|
|
||||||
use crate::snapshot_vec::{SnapshotVec, SnapshotVecDelegate};
|
|
||||||
use rustc_index::bit_set::BitSet;
|
use rustc_index::bit_set::BitSet;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
|
||||||
|
@ -28,8 +27,8 @@ use std::fmt::Debug;
|
||||||
mod tests;
|
mod tests;
|
||||||
|
|
||||||
pub struct Graph<N, E> {
|
pub struct Graph<N, E> {
|
||||||
nodes: SnapshotVec<Node<N>>,
|
nodes: Vec<Node<N>>,
|
||||||
edges: SnapshotVec<Edge<E>>,
|
edges: Vec<Edge<E>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Node<N> {
|
pub struct Node<N> {
|
||||||
|
@ -45,20 +44,6 @@ pub struct Edge<E> {
|
||||||
pub data: E,
|
pub data: E,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<N> SnapshotVecDelegate for Node<N> {
|
|
||||||
type Value = Node<N>;
|
|
||||||
type Undo = ();
|
|
||||||
|
|
||||||
fn reverse(_: &mut Vec<Node<N>>, _: ()) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<N> SnapshotVecDelegate for Edge<N> {
|
|
||||||
type Value = Edge<N>;
|
|
||||||
type Undo = ();
|
|
||||||
|
|
||||||
fn reverse(_: &mut Vec<Edge<N>>, _: ()) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Copy, Clone, PartialEq, Debug)]
|
#[derive(Copy, Clone, PartialEq, Debug)]
|
||||||
pub struct NodeIndex(pub usize);
|
pub struct NodeIndex(pub usize);
|
||||||
|
|
||||||
|
@ -86,11 +71,11 @@ impl NodeIndex {
|
||||||
|
|
||||||
impl<N: Debug, E: Debug> Graph<N, E> {
|
impl<N: Debug, E: Debug> Graph<N, E> {
|
||||||
pub fn new() -> Graph<N, E> {
|
pub fn new() -> Graph<N, E> {
|
||||||
Graph { nodes: SnapshotVec::new(), edges: SnapshotVec::new() }
|
Graph { nodes: Vec::new(), edges: Vec::new() }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn with_capacity(nodes: usize, edges: usize) -> Graph<N, E> {
|
pub fn with_capacity(nodes: usize, edges: usize) -> Graph<N, E> {
|
||||||
Graph { nodes: SnapshotVec::with_capacity(nodes), edges: SnapshotVec::with_capacity(edges) }
|
Graph { nodes: Vec::with_capacity(nodes), edges: Vec::with_capacity(edges) }
|
||||||
}
|
}
|
||||||
|
|
||||||
// # Simple accessors
|
// # Simple accessors
|
||||||
|
|
|
@ -56,6 +56,7 @@ pub fn provide(providers: &mut Providers) {
|
||||||
resolve_bound_vars::provide(providers);
|
resolve_bound_vars::provide(providers);
|
||||||
*providers = Providers {
|
*providers = Providers {
|
||||||
type_of: type_of::type_of,
|
type_of: type_of::type_of,
|
||||||
|
type_of_opaque: type_of::type_of_opaque,
|
||||||
item_bounds: item_bounds::item_bounds,
|
item_bounds: item_bounds::item_bounds,
|
||||||
explicit_item_bounds: item_bounds::explicit_item_bounds,
|
explicit_item_bounds: item_bounds::explicit_item_bounds,
|
||||||
generics_of: generics_of::generics_of,
|
generics_of: generics_of::generics_of,
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
use rustc_errors::{Applicability, StashKey};
|
use rustc_errors::{Applicability, StashKey};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::LocalDefId;
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
use rustc_hir::HirId;
|
use rustc_hir::HirId;
|
||||||
|
use rustc_middle::query::plumbing::CyclePlaceholder;
|
||||||
use rustc_middle::ty::print::with_forced_trimmed_paths;
|
use rustc_middle::ty::print::with_forced_trimmed_paths;
|
||||||
use rustc_middle::ty::util::IntTypeExt;
|
use rustc_middle::ty::util::IntTypeExt;
|
||||||
use rustc_middle::ty::{self, ImplTraitInTraitData, IsSuggestable, Ty, TyCtxt, TypeVisitableExt};
|
use rustc_middle::ty::{self, ImplTraitInTraitData, IsSuggestable, Ty, TyCtxt, TypeVisitableExt};
|
||||||
|
@ -388,8 +389,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Ty
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
Node::Item(item) => {
|
Node::Item(item) => match item.kind {
|
||||||
match item.kind {
|
|
||||||
ItemKind::Static(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(
|
||||||
|
@ -406,9 +406,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Ty
|
||||||
}
|
}
|
||||||
ItemKind::Const(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",
|
|
||||||
)
|
|
||||||
} else {
|
} else {
|
||||||
icx.to_ty(ty)
|
icx.to_ty(ty)
|
||||||
}
|
}
|
||||||
|
@ -416,10 +414,9 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Ty
|
||||||
ItemKind::TyAlias(self_ty, _) => icx.to_ty(self_ty),
|
ItemKind::TyAlias(self_ty, _) => icx.to_ty(self_ty),
|
||||||
ItemKind::Impl(hir::Impl { self_ty, .. }) => match self_ty.find_self_aliases() {
|
ItemKind::Impl(hir::Impl { self_ty, .. }) => match self_ty.find_self_aliases() {
|
||||||
spans if spans.len() > 0 => {
|
spans if spans.len() > 0 => {
|
||||||
let guar = tcx.sess.emit_err(crate::errors::SelfInImplSelf {
|
let guar = tcx
|
||||||
span: spans.into(),
|
.sess
|
||||||
note: (),
|
.emit_err(crate::errors::SelfInImplSelf { span: spans.into(), note: () });
|
||||||
});
|
|
||||||
Ty::new_error(tcx, guar)
|
Ty::new_error(tcx, guar)
|
||||||
}
|
}
|
||||||
_ => icx.to_ty(*self_ty),
|
_ => icx.to_ty(*self_ty),
|
||||||
|
@ -433,25 +430,10 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Ty
|
||||||
let args = ty::GenericArgs::identity_for_item(tcx, def_id);
|
let args = ty::GenericArgs::identity_for_item(tcx, def_id);
|
||||||
Ty::new_adt(tcx, def, args)
|
Ty::new_adt(tcx, def, args)
|
||||||
}
|
}
|
||||||
ItemKind::OpaqueTy(OpaqueTy {
|
ItemKind::OpaqueTy(..) => tcx.type_of_opaque(def_id).map_or_else(
|
||||||
origin: hir::OpaqueTyOrigin::TyAlias { .. },
|
|CyclePlaceholder(guar)| Ty::new_error(tcx, guar),
|
||||||
..
|
|ty| ty.instantiate_identity(),
|
||||||
}) => opaque::find_opaque_ty_constraints_for_tait(tcx, def_id),
|
),
|
||||||
// Opaque types desugared from `impl Trait`.
|
|
||||||
ItemKind::OpaqueTy(&OpaqueTy {
|
|
||||||
origin:
|
|
||||||
hir::OpaqueTyOrigin::FnReturn(owner) | hir::OpaqueTyOrigin::AsyncFn(owner),
|
|
||||||
in_trait,
|
|
||||||
..
|
|
||||||
}) => {
|
|
||||||
if in_trait && !tcx.defaultness(owner).has_value() {
|
|
||||||
span_bug!(
|
|
||||||
tcx.def_span(def_id),
|
|
||||||
"tried to get type of this RPITIT with no definition"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
opaque::find_opaque_ty_constraints_for_rpit(tcx, def_id, owner)
|
|
||||||
}
|
|
||||||
ItemKind::Trait(..)
|
ItemKind::Trait(..)
|
||||||
| ItemKind::TraitAlias(..)
|
| ItemKind::TraitAlias(..)
|
||||||
| ItemKind::Macro(..)
|
| ItemKind::Macro(..)
|
||||||
|
@ -460,14 +442,9 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Ty
|
||||||
| ItemKind::GlobalAsm(..)
|
| ItemKind::GlobalAsm(..)
|
||||||
| ItemKind::ExternCrate(..)
|
| ItemKind::ExternCrate(..)
|
||||||
| ItemKind::Use(..) => {
|
| ItemKind::Use(..) => {
|
||||||
span_bug!(
|
span_bug!(item.span, "compute_type_of_item: unexpected item type: {:?}", item.kind);
|
||||||
item.span,
|
|
||||||
"compute_type_of_item: unexpected item type: {:?}",
|
|
||||||
item.kind
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
Node::ForeignItem(foreign_item) => match foreign_item.kind {
|
Node::ForeignItem(foreign_item) => match foreign_item.kind {
|
||||||
ForeignItemKind::Fn(..) => {
|
ForeignItemKind::Fn(..) => {
|
||||||
|
@ -514,6 +491,51 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Ty
|
||||||
ty::EarlyBinder::bind(output)
|
ty::EarlyBinder::bind(output)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(super) fn type_of_opaque(
|
||||||
|
tcx: TyCtxt<'_>,
|
||||||
|
def_id: DefId,
|
||||||
|
) -> Result<ty::EarlyBinder<Ty<'_>>, CyclePlaceholder> {
|
||||||
|
if let Some(def_id) = def_id.as_local() {
|
||||||
|
use rustc_hir::*;
|
||||||
|
|
||||||
|
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
|
||||||
|
Ok(ty::EarlyBinder::bind(match tcx.hir().get(hir_id) {
|
||||||
|
Node::Item(item) => match item.kind {
|
||||||
|
ItemKind::OpaqueTy(OpaqueTy {
|
||||||
|
origin: hir::OpaqueTyOrigin::TyAlias { .. },
|
||||||
|
..
|
||||||
|
}) => opaque::find_opaque_ty_constraints_for_tait(tcx, def_id),
|
||||||
|
// Opaque types desugared from `impl Trait`.
|
||||||
|
ItemKind::OpaqueTy(&OpaqueTy {
|
||||||
|
origin:
|
||||||
|
hir::OpaqueTyOrigin::FnReturn(owner) | hir::OpaqueTyOrigin::AsyncFn(owner),
|
||||||
|
in_trait,
|
||||||
|
..
|
||||||
|
}) => {
|
||||||
|
if in_trait && !tcx.defaultness(owner).has_value() {
|
||||||
|
span_bug!(
|
||||||
|
tcx.def_span(def_id),
|
||||||
|
"tried to get type of this RPITIT with no definition"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
opaque::find_opaque_ty_constraints_for_rpit(tcx, def_id, owner)
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
span_bug!(item.span, "type_of_opaque: unexpected item type: {:?}", item.kind);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
x => {
|
||||||
|
bug!("unexpected sort of node in type_of_opaque(): {:?}", x);
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
} else {
|
||||||
|
// Foreign opaque type will go through the foreign provider
|
||||||
|
// and load the type from metadata.
|
||||||
|
Ok(tcx.type_of(def_id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn infer_placeholder_type<'a>(
|
fn infer_placeholder_type<'a>(
|
||||||
tcx: TyCtxt<'a>,
|
tcx: TyCtxt<'a>,
|
||||||
def_id: LocalDefId,
|
def_id: LocalDefId,
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use crate::mir;
|
use crate::mir;
|
||||||
|
use crate::query::CyclePlaceholder;
|
||||||
use crate::traits;
|
use crate::traits;
|
||||||
use crate::ty::{self, Ty};
|
use crate::ty::{self, Ty};
|
||||||
use std::mem::{size_of, transmute_copy, MaybeUninit};
|
use std::mem::{size_of, transmute_copy, MaybeUninit};
|
||||||
|
@ -142,6 +143,10 @@ impl EraseType for Result<&'_ ty::List<Ty<'_>>, ty::util::AlwaysRequiresDrop> {
|
||||||
[u8; size_of::<Result<&'static ty::List<Ty<'static>>, ty::util::AlwaysRequiresDrop>>()];
|
[u8; size_of::<Result<&'static ty::List<Ty<'static>>, ty::util::AlwaysRequiresDrop>>()];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl EraseType for Result<ty::EarlyBinder<Ty<'_>>, CyclePlaceholder> {
|
||||||
|
type Result = [u8; size_of::<Result<ty::EarlyBinder<Ty<'_>>, CyclePlaceholder>>()];
|
||||||
|
}
|
||||||
|
|
||||||
impl<T> EraseType for Option<&'_ T> {
|
impl<T> EraseType for Option<&'_ T> {
|
||||||
type Result = [u8; size_of::<Option<&'static ()>>()];
|
type Result = [u8; size_of::<Option<&'static ()>>()];
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ use crate::mir::interpret::{
|
||||||
use crate::mir::interpret::{LitToConstError, LitToConstInput};
|
use crate::mir::interpret::{LitToConstError, LitToConstInput};
|
||||||
use crate::mir::mono::CodegenUnit;
|
use crate::mir::mono::CodegenUnit;
|
||||||
use crate::query::erase::{erase, restore, Erase};
|
use crate::query::erase::{erase, restore, Erase};
|
||||||
use crate::query::plumbing::{query_ensure, query_get_at, DynamicQuery};
|
use crate::query::plumbing::{query_ensure, query_get_at, CyclePlaceholder, DynamicQuery};
|
||||||
use crate::thir;
|
use crate::thir;
|
||||||
use crate::traits::query::{
|
use crate::traits::query::{
|
||||||
CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal,
|
CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal,
|
||||||
|
@ -243,6 +243,16 @@ rustc_queries! {
|
||||||
feedable
|
feedable
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Specialized instance of `type_of` that detects cycles that are due to
|
||||||
|
/// revealing opaque because of an auto trait bound. Unless `CyclePlaceholder` needs
|
||||||
|
/// to be handled separately, call `type_of` instead.
|
||||||
|
query type_of_opaque(key: DefId) -> Result<ty::EarlyBinder<Ty<'tcx>>, CyclePlaceholder> {
|
||||||
|
desc { |tcx|
|
||||||
|
"computing type of opaque `{path}`",
|
||||||
|
path = tcx.def_path_str(key),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
query collect_return_position_impl_trait_in_trait_tys(key: DefId)
|
query collect_return_position_impl_trait_in_trait_tys(key: DefId)
|
||||||
-> Result<&'tcx FxHashMap<DefId, ty::EarlyBinder<Ty<'tcx>>>, ErrorGuaranteed>
|
-> Result<&'tcx FxHashMap<DefId, ty::EarlyBinder<Ty<'tcx>>>, ErrorGuaranteed>
|
||||||
{
|
{
|
||||||
|
|
|
@ -19,7 +19,7 @@ use rustc_query_system::dep_graph::SerializedDepNodeIndex;
|
||||||
pub(crate) use rustc_query_system::query::QueryJobId;
|
pub(crate) use rustc_query_system::query::QueryJobId;
|
||||||
use rustc_query_system::query::*;
|
use rustc_query_system::query::*;
|
||||||
use rustc_query_system::HandleCycleError;
|
use rustc_query_system::HandleCycleError;
|
||||||
use rustc_span::{Span, DUMMY_SP};
|
use rustc_span::{ErrorGuaranteed, Span, DUMMY_SP};
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
|
||||||
pub struct QueryKeyStringCache {
|
pub struct QueryKeyStringCache {
|
||||||
|
@ -52,7 +52,8 @@ pub struct DynamicQuery<'tcx, C: QueryCache> {
|
||||||
pub loadable_from_disk:
|
pub loadable_from_disk:
|
||||||
fn(tcx: TyCtxt<'tcx>, key: &C::Key, index: SerializedDepNodeIndex) -> bool,
|
fn(tcx: TyCtxt<'tcx>, key: &C::Key, index: SerializedDepNodeIndex) -> bool,
|
||||||
pub hash_result: HashResult<C::Value>,
|
pub hash_result: HashResult<C::Value>,
|
||||||
pub value_from_cycle_error: fn(tcx: TyCtxt<'tcx>, cycle: &[QueryInfo<DepKind>]) -> C::Value,
|
pub value_from_cycle_error:
|
||||||
|
fn(tcx: TyCtxt<'tcx>, cycle: &[QueryInfo<DepKind>], guar: ErrorGuaranteed) -> C::Value,
|
||||||
pub format_value: fn(&C::Value) -> String,
|
pub format_value: fn(&C::Value) -> String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -629,3 +630,6 @@ impl<'tcx> TyCtxtAt<'tcx> {
|
||||||
.unwrap_or_else(|| bug!("def_kind: unsupported node: {:?}", def_id))
|
.unwrap_or_else(|| bug!("def_kind: unsupported node: {:?}", def_id))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Debug, HashStable)]
|
||||||
|
pub struct CyclePlaceholder(pub ErrorGuaranteed);
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use crate::dep_graph::DepKind;
|
use crate::dep_graph::DepKind;
|
||||||
|
use crate::query::plumbing::CyclePlaceholder;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::{pluralize, struct_span_err, Applicability, MultiSpan};
|
use rustc_errors::{pluralize, struct_span_err, Applicability, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
|
@ -8,20 +9,38 @@ use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
use rustc_query_system::query::QueryInfo;
|
use rustc_query_system::query::QueryInfo;
|
||||||
use rustc_query_system::Value;
|
use rustc_query_system::Value;
|
||||||
use rustc_span::def_id::LocalDefId;
|
use rustc_span::def_id::LocalDefId;
|
||||||
use rustc_span::Span;
|
use rustc_span::{ErrorGuaranteed, Span};
|
||||||
|
|
||||||
use std::fmt::Write;
|
use std::fmt::Write;
|
||||||
|
|
||||||
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for Ty<'_> {
|
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for Ty<'_> {
|
||||||
fn from_cycle_error(tcx: TyCtxt<'tcx>, _: &[QueryInfo<DepKind>]) -> Self {
|
fn from_cycle_error(
|
||||||
|
tcx: TyCtxt<'tcx>,
|
||||||
|
_: &[QueryInfo<DepKind>],
|
||||||
|
guar: ErrorGuaranteed,
|
||||||
|
) -> Self {
|
||||||
// SAFETY: This is never called when `Self` is not `Ty<'tcx>`.
|
// SAFETY: This is never called when `Self` is not `Ty<'tcx>`.
|
||||||
// FIXME: Represent the above fact in the trait system somehow.
|
// FIXME: Represent the above fact in the trait system somehow.
|
||||||
unsafe { std::mem::transmute::<Ty<'tcx>, Ty<'_>>(Ty::new_misc_error(tcx)) }
|
unsafe { std::mem::transmute::<Ty<'tcx>, Ty<'_>>(Ty::new_error(tcx, guar)) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for Result<ty::EarlyBinder<Ty<'_>>, CyclePlaceholder> {
|
||||||
|
fn from_cycle_error(
|
||||||
|
_tcx: TyCtxt<'tcx>,
|
||||||
|
_: &[QueryInfo<DepKind>],
|
||||||
|
guar: ErrorGuaranteed,
|
||||||
|
) -> Self {
|
||||||
|
Err(CyclePlaceholder(guar))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for ty::SymbolName<'_> {
|
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for ty::SymbolName<'_> {
|
||||||
fn from_cycle_error(tcx: TyCtxt<'tcx>, _: &[QueryInfo<DepKind>]) -> Self {
|
fn from_cycle_error(
|
||||||
|
tcx: TyCtxt<'tcx>,
|
||||||
|
_: &[QueryInfo<DepKind>],
|
||||||
|
_guar: ErrorGuaranteed,
|
||||||
|
) -> Self {
|
||||||
// SAFETY: This is never called when `Self` is not `SymbolName<'tcx>`.
|
// SAFETY: This is never called when `Self` is not `SymbolName<'tcx>`.
|
||||||
// FIXME: Represent the above fact in the trait system somehow.
|
// FIXME: Represent the above fact in the trait system somehow.
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -33,8 +52,12 @@ impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for ty::SymbolName<'_> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for ty::Binder<'_, ty::FnSig<'_>> {
|
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for ty::Binder<'_, ty::FnSig<'_>> {
|
||||||
fn from_cycle_error(tcx: TyCtxt<'tcx>, stack: &[QueryInfo<DepKind>]) -> Self {
|
fn from_cycle_error(
|
||||||
let err = Ty::new_misc_error(tcx);
|
tcx: TyCtxt<'tcx>,
|
||||||
|
stack: &[QueryInfo<DepKind>],
|
||||||
|
guar: ErrorGuaranteed,
|
||||||
|
) -> Self {
|
||||||
|
let err = Ty::new_error(tcx, guar);
|
||||||
|
|
||||||
let arity = if let Some(frame) = stack.get(0)
|
let arity = if let Some(frame) = stack.get(0)
|
||||||
&& frame.query.dep_kind == DepKind::fn_sig
|
&& frame.query.dep_kind == DepKind::fn_sig
|
||||||
|
@ -63,7 +86,11 @@ impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for ty::Binder<'_, ty::FnSig<'_>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for Representability {
|
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for Representability {
|
||||||
fn from_cycle_error(tcx: TyCtxt<'tcx>, cycle: &[QueryInfo<DepKind>]) -> Self {
|
fn from_cycle_error(
|
||||||
|
tcx: TyCtxt<'tcx>,
|
||||||
|
cycle: &[QueryInfo<DepKind>],
|
||||||
|
_guar: ErrorGuaranteed,
|
||||||
|
) -> Self {
|
||||||
let mut item_and_field_ids = Vec::new();
|
let mut item_and_field_ids = Vec::new();
|
||||||
let mut representable_ids = FxHashSet::default();
|
let mut representable_ids = FxHashSet::default();
|
||||||
for info in cycle {
|
for info in cycle {
|
||||||
|
@ -95,22 +122,35 @@ impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for Representability {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for ty::EarlyBinder<Ty<'_>> {
|
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for ty::EarlyBinder<Ty<'_>> {
|
||||||
fn from_cycle_error(tcx: TyCtxt<'tcx>, cycle: &[QueryInfo<DepKind>]) -> Self {
|
fn from_cycle_error(
|
||||||
ty::EarlyBinder::bind(Ty::from_cycle_error(tcx, cycle))
|
tcx: TyCtxt<'tcx>,
|
||||||
|
cycle: &[QueryInfo<DepKind>],
|
||||||
|
guar: ErrorGuaranteed,
|
||||||
|
) -> Self {
|
||||||
|
ty::EarlyBinder::bind(Ty::from_cycle_error(tcx, cycle, guar))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for ty::EarlyBinder<ty::Binder<'_, ty::FnSig<'_>>> {
|
impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for ty::EarlyBinder<ty::Binder<'_, ty::FnSig<'_>>> {
|
||||||
fn from_cycle_error(tcx: TyCtxt<'tcx>, cycle: &[QueryInfo<DepKind>]) -> Self {
|
fn from_cycle_error(
|
||||||
ty::EarlyBinder::bind(ty::Binder::from_cycle_error(tcx, cycle))
|
tcx: TyCtxt<'tcx>,
|
||||||
|
cycle: &[QueryInfo<DepKind>],
|
||||||
|
guar: ErrorGuaranteed,
|
||||||
|
) -> Self {
|
||||||
|
ty::EarlyBinder::bind(ty::Binder::from_cycle_error(tcx, cycle, guar))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx, T> Value<TyCtxt<'tcx>, DepKind> for Result<T, &'_ ty::layout::LayoutError<'_>> {
|
impl<'tcx, T> Value<TyCtxt<'tcx>, DepKind> for Result<T, &'_ ty::layout::LayoutError<'_>> {
|
||||||
fn from_cycle_error(_tcx: TyCtxt<'tcx>, _cycle: &[QueryInfo<DepKind>]) -> Self {
|
fn from_cycle_error(
|
||||||
|
_tcx: TyCtxt<'tcx>,
|
||||||
|
_cycle: &[QueryInfo<DepKind>],
|
||||||
|
_guar: ErrorGuaranteed,
|
||||||
|
) -> Self {
|
||||||
// tcx.arena.alloc cannot be used because we are not allowed to use &'tcx LayoutError under
|
// tcx.arena.alloc cannot be used because we are not allowed to use &'tcx LayoutError under
|
||||||
// min_specialization. Since this is an error path anyways, leaking doesn't matter (and really,
|
// min_specialization. Since this is an error path anyways, leaking doesn't matter (and really,
|
||||||
// tcx.arena.alloc is pretty much equal to leaking).
|
// tcx.arena.alloc is pretty much equal to leaking).
|
||||||
|
// FIXME: `Cycle` should carry the ErrorGuaranteed
|
||||||
Err(Box::leak(Box::new(ty::layout::LayoutError::Cycle)))
|
Err(Box::leak(Box::new(ty::layout::LayoutError::Cycle)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ use rustc_query_system::query::{
|
||||||
};
|
};
|
||||||
use rustc_query_system::HandleCycleError;
|
use rustc_query_system::HandleCycleError;
|
||||||
use rustc_query_system::Value;
|
use rustc_query_system::Value;
|
||||||
use rustc_span::Span;
|
use rustc_span::{ErrorGuaranteed, Span};
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
mod plumbing;
|
mod plumbing;
|
||||||
|
@ -146,8 +146,9 @@ where
|
||||||
self,
|
self,
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
cycle: &[QueryInfo<DepKind>],
|
cycle: &[QueryInfo<DepKind>],
|
||||||
|
guar: ErrorGuaranteed,
|
||||||
) -> Self::Value {
|
) -> Self::Value {
|
||||||
(self.dynamic.value_from_cycle_error)(tcx, cycle)
|
(self.dynamic.value_from_cycle_error)(tcx, cycle, guar)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
|
|
|
@ -605,8 +605,8 @@ macro_rules! define_queries {
|
||||||
} {
|
} {
|
||||||
|_tcx, _key, _prev_index, _index| None
|
|_tcx, _key, _prev_index, _index| None
|
||||||
}),
|
}),
|
||||||
value_from_cycle_error: |tcx, cycle| {
|
value_from_cycle_error: |tcx, cycle, guar| {
|
||||||
let result: queries::$name::Value<'tcx> = Value::from_cycle_error(tcx, cycle);
|
let result: queries::$name::Value<'tcx> = Value::from_cycle_error(tcx, cycle, guar);
|
||||||
erase(result)
|
erase(result)
|
||||||
},
|
},
|
||||||
loadable_from_disk: |_tcx, _key, _index| {
|
loadable_from_disk: |_tcx, _key, _index| {
|
||||||
|
|
|
@ -8,6 +8,7 @@ use crate::query::DepNodeIndex;
|
||||||
use crate::query::{QueryContext, QueryInfo, QueryState};
|
use crate::query::{QueryContext, QueryInfo, QueryState};
|
||||||
|
|
||||||
use rustc_data_structures::fingerprint::Fingerprint;
|
use rustc_data_structures::fingerprint::Fingerprint;
|
||||||
|
use rustc_span::ErrorGuaranteed;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
|
|
||||||
|
@ -57,6 +58,7 @@ pub trait QueryConfig<Qcx: QueryContext>: Copy {
|
||||||
self,
|
self,
|
||||||
tcx: Qcx::DepContext,
|
tcx: Qcx::DepContext,
|
||||||
cycle: &[QueryInfo<Qcx::DepKind>],
|
cycle: &[QueryInfo<Qcx::DepKind>],
|
||||||
|
guar: ErrorGuaranteed,
|
||||||
) -> Self::Value;
|
) -> Self::Value;
|
||||||
|
|
||||||
fn anon(self) -> bool;
|
fn anon(self) -> bool;
|
||||||
|
|
|
@ -148,8 +148,8 @@ where
|
||||||
use HandleCycleError::*;
|
use HandleCycleError::*;
|
||||||
match query.handle_cycle_error() {
|
match query.handle_cycle_error() {
|
||||||
Error => {
|
Error => {
|
||||||
error.emit();
|
let guar = error.emit();
|
||||||
query.value_from_cycle_error(*qcx.dep_context(), &cycle_error.cycle)
|
query.value_from_cycle_error(*qcx.dep_context(), &cycle_error.cycle, guar)
|
||||||
}
|
}
|
||||||
Fatal => {
|
Fatal => {
|
||||||
error.emit();
|
error.emit();
|
||||||
|
@ -157,8 +157,8 @@ where
|
||||||
unreachable!()
|
unreachable!()
|
||||||
}
|
}
|
||||||
DelayBug => {
|
DelayBug => {
|
||||||
error.delay_as_bug();
|
let guar = error.delay_as_bug();
|
||||||
query.value_from_cycle_error(*qcx.dep_context(), &cycle_error.cycle)
|
query.value_from_cycle_error(*qcx.dep_context(), &cycle_error.cycle, guar)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
|
use rustc_span::ErrorGuaranteed;
|
||||||
|
|
||||||
use crate::dep_graph::{DepContext, DepKind};
|
use crate::dep_graph::{DepContext, DepKind};
|
||||||
use crate::query::QueryInfo;
|
use crate::query::QueryInfo;
|
||||||
|
|
||||||
pub trait Value<Tcx: DepContext, D: DepKind>: Sized {
|
pub trait Value<Tcx: DepContext, D: DepKind>: Sized {
|
||||||
fn from_cycle_error(tcx: Tcx, cycle: &[QueryInfo<D>]) -> Self;
|
fn from_cycle_error(tcx: Tcx, cycle: &[QueryInfo<D>], guar: ErrorGuaranteed) -> Self;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Tcx: DepContext, T, D: DepKind> Value<Tcx, D> for T {
|
impl<Tcx: DepContext, T, D: DepKind> Value<Tcx, D> for T {
|
||||||
default fn from_cycle_error(tcx: Tcx, cycle: &[QueryInfo<D>]) -> T {
|
default fn from_cycle_error(tcx: Tcx, cycle: &[QueryInfo<D>], _guar: ErrorGuaranteed) -> T {
|
||||||
tcx.sess().abort_if_errors();
|
tcx.sess().abort_if_errors();
|
||||||
// Ideally we would use `bug!` here. But bug! is only defined in rustc_middle, and it's
|
// Ideally we would use `bug!` here. But bug! is only defined in rustc_middle, and it's
|
||||||
// non-trivial to define it earlier.
|
// non-trivial to define it earlier.
|
||||||
|
|
|
@ -2743,12 +2743,6 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
}
|
}
|
||||||
ObligationCauseCode::BindingObligation(item_def_id, span)
|
ObligationCauseCode::BindingObligation(item_def_id, span)
|
||||||
| ObligationCauseCode::ExprBindingObligation(item_def_id, span, ..) => {
|
| ObligationCauseCode::ExprBindingObligation(item_def_id, span, ..) => {
|
||||||
if self.tcx.is_diagnostic_item(sym::Send, item_def_id)
|
|
||||||
|| self.tcx.lang_items().sync_trait() == Some(item_def_id)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let item_name = tcx.def_path_str(item_def_id);
|
let item_name = tcx.def_path_str(item_def_id);
|
||||||
let short_item_name = with_forced_trimmed_paths!(tcx.def_path_str(item_def_id));
|
let short_item_name = with_forced_trimmed_paths!(tcx.def_path_str(item_def_id));
|
||||||
let mut multispan = MultiSpan::from(span);
|
let mut multispan = MultiSpan::from(span);
|
||||||
|
|
|
@ -2346,14 +2346,15 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
ty::Alias(ty::Opaque, ty::AliasTy { def_id, args, .. }) => {
|
ty::Alias(ty::Opaque, ty::AliasTy { def_id, args, .. }) => {
|
||||||
let ty = self.tcx().type_of(def_id);
|
|
||||||
if ty.skip_binder().references_error() {
|
|
||||||
return Err(SelectionError::OpaqueTypeAutoTraitLeakageUnknown(def_id));
|
|
||||||
}
|
|
||||||
// We can resolve the `impl Trait` to its concrete type,
|
// We can resolve the `impl Trait` to its concrete type,
|
||||||
// which enforces a DAG between the functions requiring
|
// which enforces a DAG between the functions requiring
|
||||||
// the auto trait bounds in question.
|
// the auto trait bounds in question.
|
||||||
t.rebind(vec![ty.instantiate(self.tcx(), args)])
|
match self.tcx().type_of_opaque(def_id) {
|
||||||
|
Ok(ty) => t.rebind(vec![ty.instantiate(self.tcx(), args)]),
|
||||||
|
Err(_) => {
|
||||||
|
return Err(SelectionError::OpaqueTypeAutoTraitLeakageUnknown(def_id));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -472,17 +472,11 @@ pub(crate) fn to_pretty_impl_header(tcx: TyCtxt<'_>, impl_def_id: DefId) -> Opti
|
||||||
let mut types_without_default_bounds = FxIndexSet::default();
|
let mut types_without_default_bounds = FxIndexSet::default();
|
||||||
let sized_trait = tcx.lang_items().sized_trait();
|
let sized_trait = tcx.lang_items().sized_trait();
|
||||||
|
|
||||||
if !args.is_empty() {
|
let arg_names = args.iter().map(|k| k.to_string()).filter(|k| k != "'_").collect::<Vec<_>>();
|
||||||
|
if !arg_names.is_empty() {
|
||||||
types_without_default_bounds.extend(args.types());
|
types_without_default_bounds.extend(args.types());
|
||||||
w.push('<');
|
w.push('<');
|
||||||
w.push_str(
|
w.push_str(&arg_names.join(", "));
|
||||||
&args
|
|
||||||
.iter()
|
|
||||||
.map(|k| k.to_string())
|
|
||||||
.filter(|k| k != "'_")
|
|
||||||
.collect::<Vec<_>>()
|
|
||||||
.join(", "),
|
|
||||||
);
|
|
||||||
w.push('>');
|
w.push('>');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,10 +79,12 @@ macro_rules! vec {
|
||||||
///
|
///
|
||||||
/// The first argument `format!` receives is a format string. This must be a string
|
/// The first argument `format!` receives is a format string. This must be a string
|
||||||
/// literal. The power of the formatting string is in the `{}`s contained.
|
/// literal. The power of the formatting string is in the `{}`s contained.
|
||||||
///
|
|
||||||
/// Additional parameters passed to `format!` replace the `{}`s within the
|
/// Additional parameters passed to `format!` replace the `{}`s within the
|
||||||
/// formatting string in the order given unless named or positional parameters
|
/// formatting string in the order given unless named or positional parameters
|
||||||
/// are used; see [`std::fmt`] for more information.
|
/// are used.
|
||||||
|
///
|
||||||
|
/// See [the formatting syntax documentation in `std::fmt`](../std/fmt/index.html)
|
||||||
|
/// for details.
|
||||||
///
|
///
|
||||||
/// A common use for `format!` is concatenation and interpolation of strings.
|
/// A common use for `format!` is concatenation and interpolation of strings.
|
||||||
/// The same convention is used with [`print!`] and [`write!`] macros,
|
/// The same convention is used with [`print!`] and [`write!`] macros,
|
||||||
|
@ -91,7 +93,6 @@ macro_rules! vec {
|
||||||
/// To convert a single value to a string, use the [`to_string`] method. This
|
/// To convert a single value to a string, use the [`to_string`] method. This
|
||||||
/// will use the [`Display`] formatting trait.
|
/// will use the [`Display`] formatting trait.
|
||||||
///
|
///
|
||||||
/// [`std::fmt`]: ../std/fmt/index.html
|
|
||||||
/// [`print!`]: ../std/macro.print.html
|
/// [`print!`]: ../std/macro.print.html
|
||||||
/// [`write!`]: core::write
|
/// [`write!`]: core::write
|
||||||
/// [`to_string`]: crate::string::ToString
|
/// [`to_string`]: crate::string::ToString
|
||||||
|
|
|
@ -849,7 +849,8 @@ pub(crate) mod builtin {
|
||||||
/// assert_eq!(display, debug);
|
/// assert_eq!(display, debug);
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// For more information, see the documentation in [`std::fmt`].
|
/// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
|
||||||
|
/// for details of the macro argument syntax, and further information.
|
||||||
///
|
///
|
||||||
/// [`Display`]: crate::fmt::Display
|
/// [`Display`]: crate::fmt::Display
|
||||||
/// [`Debug`]: crate::fmt::Debug
|
/// [`Debug`]: crate::fmt::Debug
|
||||||
|
|
|
@ -8,8 +8,8 @@ tests. `panic!` is closely tied with the `unwrap` method of both
|
||||||
[`Option`][ounwrap] and [`Result`][runwrap] enums. Both implementations call
|
[`Option`][ounwrap] and [`Result`][runwrap] enums. Both implementations call
|
||||||
`panic!` when they are set to [`None`] or [`Err`] variants.
|
`panic!` when they are set to [`None`] or [`Err`] variants.
|
||||||
|
|
||||||
When using `panic!()` you can specify a string payload, that is built using
|
When using `panic!()` you can specify a string payload that is built using
|
||||||
the [`format!`] syntax. That payload is used when injecting the panic into
|
[formatting syntax]. That payload is used when injecting the panic into
|
||||||
the calling Rust thread, causing the thread to panic entirely.
|
the calling Rust thread, causing the thread to panic entirely.
|
||||||
|
|
||||||
The behavior of the default `std` hook, i.e. the code that runs directly
|
The behavior of the default `std` hook, i.e. the code that runs directly
|
||||||
|
@ -18,6 +18,7 @@ after the panic is invoked, is to print the message payload to
|
||||||
call. You can override the panic hook using [`std::panic::set_hook()`].
|
call. You can override the panic hook using [`std::panic::set_hook()`].
|
||||||
Inside the hook a panic can be accessed as a `&dyn Any + Send`,
|
Inside the hook a panic can be accessed as a `&dyn Any + Send`,
|
||||||
which contains either a `&str` or `String` for regular `panic!()` invocations.
|
which contains either a `&str` or `String` for regular `panic!()` invocations.
|
||||||
|
(Whether a particular invocation contains the payload at type `&str` or `String` is unspecified and can change.)
|
||||||
To panic with a value of another other type, [`panic_any`] can be used.
|
To panic with a value of another other type, [`panic_any`] can be used.
|
||||||
|
|
||||||
See also the macro [`compile_error!`], for raising errors during compilation.
|
See also the macro [`compile_error!`], for raising errors during compilation.
|
||||||
|
@ -55,7 +56,7 @@ For more detailed information about error handling check out the [book] or the
|
||||||
[`panic_any`]: ../std/panic/fn.panic_any.html
|
[`panic_any`]: ../std/panic/fn.panic_any.html
|
||||||
[`Box`]: ../std/boxed/struct.Box.html
|
[`Box`]: ../std/boxed/struct.Box.html
|
||||||
[`Any`]: crate::any::Any
|
[`Any`]: crate::any::Any
|
||||||
[`format!`]: ../std/macro.format.html
|
[`format!` syntax]: ../std/fmt/index.html
|
||||||
[book]: ../book/ch09-00-error-handling.html
|
[book]: ../book/ch09-00-error-handling.html
|
||||||
[`std::result`]: ../std/result/index.html
|
[`std::result`]: ../std/result/index.html
|
||||||
|
|
||||||
|
@ -64,6 +65,29 @@ For more detailed information about error handling check out the [book] or the
|
||||||
If the main thread panics it will terminate all your threads and end your
|
If the main thread panics it will terminate all your threads and end your
|
||||||
program with code `101`.
|
program with code `101`.
|
||||||
|
|
||||||
|
# Editions
|
||||||
|
|
||||||
|
Behavior of the panic macros changed over editions.
|
||||||
|
|
||||||
|
## 2021 and later
|
||||||
|
|
||||||
|
In Rust 2021 and later, `panic!` always requires a format string and
|
||||||
|
the applicable format arguments, and is the same in `core` and `std`.
|
||||||
|
Use [`std::panic::panic_any(x)`](../std/panic/fn.panic_any.html) to
|
||||||
|
panic with an arbitrary payload.
|
||||||
|
|
||||||
|
## 2018 and 2015
|
||||||
|
|
||||||
|
In Rust Editions prior to 2021, `std::panic!(x)` with a single
|
||||||
|
argument directly uses that argument as a payload.
|
||||||
|
This is true even if the argument is a string literal.
|
||||||
|
For example, `panic!("problem: {reason}")` panics with a
|
||||||
|
payload of literally `"problem: {reason}"` (a `&'static str`).
|
||||||
|
|
||||||
|
`core::panic!(x)` with a single argument requires that `x` be `&str`,
|
||||||
|
but otherwise behaves like `std::panic!`. In particular, the string
|
||||||
|
need not be a literal, and is not interpreted as a format string.
|
||||||
|
|
||||||
# Examples
|
# Examples
|
||||||
|
|
||||||
```should_panic
|
```should_panic
|
||||||
|
|
|
@ -76,12 +76,8 @@ macro marker_impls {
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
#[cfg_attr(not(test), rustc_diagnostic_item = "Send")]
|
#[cfg_attr(not(test), rustc_diagnostic_item = "Send")]
|
||||||
#[rustc_on_unimplemented(
|
#[rustc_on_unimplemented(
|
||||||
on(_Self = "std::rc::Rc<T, A>", note = "use `std::sync::Arc` instead of `std::rc::Rc`"),
|
|
||||||
on(_Self = "alloc::rc::Rc<T, A>", note = "use `alloc::sync::Arc` instead of `alloc::rc::Rc`"),
|
|
||||||
message = "`{Self}` cannot be sent between threads safely",
|
message = "`{Self}` cannot be sent between threads safely",
|
||||||
label = "`{Self}` cannot be sent between threads safely",
|
label = "`{Self}` cannot be sent between threads safely"
|
||||||
note = "consider using `std::sync::Arc<{Self}>`; for more information visit \
|
|
||||||
<https://doc.rust-lang.org/book/ch16-03-shared-state.html>"
|
|
||||||
)]
|
)]
|
||||||
pub unsafe auto trait Send {
|
pub unsafe auto trait Send {
|
||||||
// empty.
|
// empty.
|
||||||
|
@ -632,12 +628,8 @@ impl<T: ?Sized> Copy for &T {}
|
||||||
any(_Self = "core::cell::RefCell<T>", _Self = "std::cell::RefCell<T>"),
|
any(_Self = "core::cell::RefCell<T>", _Self = "std::cell::RefCell<T>"),
|
||||||
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` instead",
|
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` instead",
|
||||||
),
|
),
|
||||||
on(_Self = "std::rc::Rc<T, A>", note = "use `std::sync::Arc` instead of `std::rc::Rc`"),
|
|
||||||
on(_Self = "alloc::rc::Rc<T, A>", note = "use `alloc::sync::Arc` instead of `alloc::rc::Rc`"),
|
|
||||||
message = "`{Self}` cannot be shared between threads safely",
|
message = "`{Self}` cannot be shared between threads safely",
|
||||||
label = "`{Self}` cannot be shared between threads safely",
|
label = "`{Self}` cannot be shared between threads safely"
|
||||||
note = "consider using `std::sync::Arc<{Self}>`; for more information visit \
|
|
||||||
<https://doc.rust-lang.org/book/ch16-03-shared-state.html>"
|
|
||||||
)]
|
)]
|
||||||
pub unsafe auto trait Sync {
|
pub unsafe auto trait Sync {
|
||||||
// FIXME(estebank): once support to add notes in `rustc_on_unimplemented`
|
// FIXME(estebank): once support to add notes in `rustc_on_unimplemented`
|
||||||
|
|
|
@ -41,6 +41,9 @@ macro_rules! panic {
|
||||||
/// Use `print!` only for the primary output of your program. Use
|
/// Use `print!` only for the primary output of your program. Use
|
||||||
/// [`eprint!`] instead to print error and progress messages.
|
/// [`eprint!`] instead to print error and progress messages.
|
||||||
///
|
///
|
||||||
|
/// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
|
||||||
|
/// for details of the macro argument syntax.
|
||||||
|
///
|
||||||
/// [flush]: crate::io::Write::flush
|
/// [flush]: crate::io::Write::flush
|
||||||
/// [`println!`]: crate::println
|
/// [`println!`]: crate::println
|
||||||
/// [`eprint!`]: crate::eprint
|
/// [`eprint!`]: crate::eprint
|
||||||
|
@ -103,6 +106,9 @@ macro_rules! print {
|
||||||
/// Use `println!` only for the primary output of your program. Use
|
/// Use `println!` only for the primary output of your program. Use
|
||||||
/// [`eprintln!`] instead to print error and progress messages.
|
/// [`eprintln!`] instead to print error and progress messages.
|
||||||
///
|
///
|
||||||
|
/// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
|
||||||
|
/// for details of the macro argument syntax.
|
||||||
|
///
|
||||||
/// [`std::fmt`]: crate::fmt
|
/// [`std::fmt`]: crate::fmt
|
||||||
/// [`eprintln!`]: crate::eprintln
|
/// [`eprintln!`]: crate::eprintln
|
||||||
/// [lock]: crate::io::Stdout
|
/// [lock]: crate::io::Stdout
|
||||||
|
@ -150,6 +156,9 @@ macro_rules! println {
|
||||||
/// [`io::stderr`]: crate::io::stderr
|
/// [`io::stderr`]: crate::io::stderr
|
||||||
/// [`io::stdout`]: crate::io::stdout
|
/// [`io::stdout`]: crate::io::stdout
|
||||||
///
|
///
|
||||||
|
/// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
|
||||||
|
/// for details of the macro argument syntax.
|
||||||
|
///
|
||||||
/// # Panics
|
/// # Panics
|
||||||
///
|
///
|
||||||
/// Panics if writing to `io::stderr` fails.
|
/// Panics if writing to `io::stderr` fails.
|
||||||
|
@ -181,6 +190,9 @@ macro_rules! eprint {
|
||||||
/// Use `eprintln!` only for error and progress messages. Use `println!`
|
/// Use `eprintln!` only for error and progress messages. Use `println!`
|
||||||
/// instead for the primary output of your program.
|
/// instead for the primary output of your program.
|
||||||
///
|
///
|
||||||
|
/// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
|
||||||
|
/// for details of the macro argument syntax.
|
||||||
|
///
|
||||||
/// [`io::stderr`]: crate::io::stderr
|
/// [`io::stderr`]: crate::io::stderr
|
||||||
/// [`io::stdout`]: crate::io::stdout
|
/// [`io::stdout`]: crate::io::stdout
|
||||||
/// [`println!`]: crate::println
|
/// [`println!`]: crate::println
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | type C: Clone + Iterator<Item: Send + Iterator<Item: for<'a> Lam<&'a u8
|
||||||
| ^^^^ `<<Self as Case1>::C as Iterator>::Item` cannot be sent between threads safely
|
| ^^^^ `<<Self as Case1>::C as Iterator>::Item` cannot be sent between threads safely
|
||||||
|
|
|
|
||||||
= help: the trait `Send` is not implemented for `<<Self as Case1>::C as Iterator>::Item`
|
= help: the trait `Send` is not implemented for `<<Self as Case1>::C as Iterator>::Item`
|
||||||
= note: consider using `std::sync::Arc<<<Self as Case1>::C as Iterator>::Item>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
help: consider further restricting the associated type
|
help: consider further restricting the associated type
|
||||||
|
|
|
|
||||||
LL | trait Case1 where <<Self as Case1>::C as Iterator>::Item: Send {
|
LL | trait Case1 where <<Self as Case1>::C as Iterator>::Item: Send {
|
||||||
|
@ -30,7 +29,6 @@ LL | type C: Clone + Iterator<Item: Send + Iterator<Item: for<'a> Lam<&'a u8
|
||||||
| ^^^^ `<<Self as Case1>::C as Iterator>::Item` cannot be shared between threads safely
|
| ^^^^ `<<Self as Case1>::C as Iterator>::Item` cannot be shared between threads safely
|
||||||
|
|
|
|
||||||
= help: the trait `Sync` is not implemented for `<<Self as Case1>::C as Iterator>::Item`
|
= help: the trait `Sync` is not implemented for `<<Self as Case1>::C as Iterator>::Item`
|
||||||
= note: consider using `std::sync::Arc<<<Self as Case1>::C as Iterator>::Item>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
help: consider further restricting the associated type
|
help: consider further restricting the associated type
|
||||||
|
|
|
|
||||||
LL | trait Case1 where <<Self as Case1>::C as Iterator>::Item: Sync {
|
LL | trait Case1 where <<Self as Case1>::C as Iterator>::Item: Sync {
|
||||||
|
|
|
@ -14,7 +14,6 @@ LL | is_send(foo::<T>());
|
||||||
| ^^^^^^^^^^ future returned by `foo` is not `Send`
|
| ^^^^^^^^^^ future returned by `foo` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = Result<(), ()>>`, the trait `Send` is not implemented for `impl Future<Output = Result<(), ()>>`
|
= help: within `impl Future<Output = Result<(), ()>>`, the trait `Send` is not implemented for `impl Future<Output = Result<(), ()>>`
|
||||||
= note: consider using `std::sync::Arc<impl Future<Output = Result<(), ()>>>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as it awaits another future which is not `Send`
|
note: future is not `Send` as it awaits another future which is not `Send`
|
||||||
--> $DIR/basic.rs:13:5
|
--> $DIR/basic.rs:13:5
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | is_send(foo(Some(true)));
|
||||||
| ^^^^^^^^^^^^^^^ future returned by `foo` is not `Send`
|
| ^^^^^^^^^^^^^^^ future returned by `foo` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-await-let-else.rs:11:15
|
--> $DIR/async-await-let-else.rs:11:15
|
||||||
|
|
|
|
||||||
|
@ -33,7 +32,6 @@ LL | is_send(foo2(Some(true)));
|
||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: required because it's used within this `async fn` body
|
note: required because it's used within this `async fn` body
|
||||||
--> $DIR/async-await-let-else.rs:27:29
|
--> $DIR/async-await-let-else.rs:27:29
|
||||||
|
|
|
|
||||||
|
@ -66,7 +64,6 @@ LL | is_send(foo3(Some(true)));
|
||||||
| ^^^^^^^^^^^^^^^^ future returned by `foo3` is not `Send`
|
| ^^^^^^^^^^^^^^^^ future returned by `foo3` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-await-let-else.rs:33:29
|
--> $DIR/async-await-let-else.rs:33:29
|
||||||
|
|
|
|
||||||
|
@ -88,7 +85,6 @@ LL | is_send(foo4(Some(true)));
|
||||||
| ^^^^^^^^^^^^^^^^ future returned by `foo4` is not `Send`
|
| ^^^^^^^^^^^^^^^^ future returned by `foo4` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-await-let-else.rs:41:15
|
--> $DIR/async-await-let-else.rs:41:15
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | is_send(foo(Some(true)));
|
||||||
| ^^^^^^^^^^^^^^^ future returned by `foo` is not `Send`
|
| ^^^^^^^^^^^^^^^ future returned by `foo` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-await-let-else.rs:11:15
|
--> $DIR/async-await-let-else.rs:11:15
|
||||||
|
|
|
|
||||||
|
@ -31,7 +30,6 @@ LL | is_send(foo2(Some(true)));
|
||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: required because it's used within this `async fn` body
|
note: required because it's used within this `async fn` body
|
||||||
--> $DIR/async-await-let-else.rs:27:29
|
--> $DIR/async-await-let-else.rs:27:29
|
||||||
|
|
|
|
||||||
|
@ -64,7 +62,6 @@ LL | is_send(foo3(Some(true)));
|
||||||
| ^^^^^^^^^^^^^^^^ future returned by `foo3` is not `Send`
|
| ^^^^^^^^^^^^^^^^ future returned by `foo3` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-await-let-else.rs:33:29
|
--> $DIR/async-await-let-else.rs:33:29
|
||||||
|
|
|
|
||||||
|
@ -85,7 +82,6 @@ LL | is_send(foo4(Some(true)));
|
||||||
| ^^^^^^^^^^^^^^^^ future returned by `foo4` is not `Send`
|
| ^^^^^^^^^^^^^^^^ future returned by `foo4` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-await-let-else.rs:41:15
|
--> $DIR/async-await-let-else.rs:41:15
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | is_send(foo(Some(true)));
|
||||||
| ^^^^^^^^^^^^^^^ future returned by `foo` is not `Send`
|
| ^^^^^^^^^^^^^^^ future returned by `foo` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-await-let-else.rs:11:15
|
--> $DIR/async-await-let-else.rs:11:15
|
||||||
|
|
|
|
||||||
|
@ -28,7 +27,6 @@ LL | is_send(foo2(Some(true)));
|
||||||
| ^^^^^^^^^^^^^^^^ future returned by `foo2` is not `Send`
|
| ^^^^^^^^^^^^^^^^ future returned by `foo2` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-await-let-else.rs:23:27
|
--> $DIR/async-await-let-else.rs:23:27
|
||||||
|
|
|
|
||||||
|
@ -51,7 +49,6 @@ LL | is_send(foo3(Some(true)));
|
||||||
| ^^^^^^^^^^^^^^^^ future returned by `foo3` is not `Send`
|
| ^^^^^^^^^^^^^^^^ future returned by `foo3` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-await-let-else.rs:33:29
|
--> $DIR/async-await-let-else.rs:33:29
|
||||||
|
|
|
|
||||||
|
@ -73,7 +70,6 @@ LL | is_send(foo4(Some(true)));
|
||||||
| ^^^^^^^^^^^^^^^^ future returned by `foo4` is not `Send`
|
| ^^^^^^^^^^^^^^^^ future returned by `foo4` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-await-let-else.rs:41:15
|
--> $DIR/async-await-let-else.rs:41:15
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_send(non_send_temporary_in_match());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_send_temporary_in_match` is not `Send`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_send_temporary_in_match` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-fn-nonsend.rs:36:26
|
--> $DIR/async-fn-nonsend.rs:36:26
|
||||||
|
|
|
|
||||||
|
@ -29,7 +28,6 @@ LL | assert_send(non_sync_with_method_call());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_sync_with_method_call` is not `Send`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_sync_with_method_call` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `dyn std::fmt::Write`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `dyn std::fmt::Write`
|
||||||
= note: consider using `std::sync::Arc<dyn std::fmt::Write>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-fn-nonsend.rs:49:15
|
--> $DIR/async-fn-nonsend.rs:49:15
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_send(non_send_temporary_in_match());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_send_temporary_in_match` is not `Send`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_send_temporary_in_match` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-fn-nonsend.rs:36:26
|
--> $DIR/async-fn-nonsend.rs:36:26
|
||||||
|
|
|
|
||||||
|
@ -26,7 +25,6 @@ LL | assert_send(non_sync_with_method_call());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_sync_with_method_call` is not `Send`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_sync_with_method_call` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `dyn std::fmt::Write`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `dyn std::fmt::Write`
|
||||||
= note: consider using `std::sync::Arc<dyn std::fmt::Write>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-fn-nonsend.rs:49:15
|
--> $DIR/async-fn-nonsend.rs:49:15
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_send(local_dropped_before_await());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `local_dropped_before_await` is not `Send`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `local_dropped_before_await` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-fn-nonsend.rs:27:11
|
--> $DIR/async-fn-nonsend.rs:27:11
|
||||||
|
|
|
|
||||||
|
@ -29,7 +28,6 @@ LL | assert_send(non_send_temporary_in_match());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_send_temporary_in_match` is not `Send`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_send_temporary_in_match` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-fn-nonsend.rs:36:26
|
--> $DIR/async-fn-nonsend.rs:36:26
|
||||||
|
|
|
|
||||||
|
@ -53,7 +51,6 @@ LL | assert_send(non_sync_with_method_call());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_sync_with_method_call` is not `Send`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_sync_with_method_call` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `dyn std::fmt::Write`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `dyn std::fmt::Write`
|
||||||
= note: consider using `std::sync::Arc<dyn std::fmt::Write>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-fn-nonsend.rs:49:15
|
--> $DIR/async-fn-nonsend.rs:49:15
|
||||||
|
|
|
|
||||||
|
@ -78,7 +75,6 @@ LL | assert_send(non_sync_with_method_call_panic());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_sync_with_method_call_panic` is not `Send`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_sync_with_method_call_panic` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `dyn std::fmt::Write`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `dyn std::fmt::Write`
|
||||||
= note: consider using `std::sync::Arc<dyn std::fmt::Write>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-fn-nonsend.rs:56:15
|
--> $DIR/async-fn-nonsend.rs:56:15
|
||||||
|
|
|
|
||||||
|
@ -103,7 +99,6 @@ LL | assert_send(non_sync_with_method_call_infinite_loop());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_sync_with_method_call_infinite_loop` is not `Send`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_sync_with_method_call_infinite_loop` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `dyn std::fmt::Write`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `dyn std::fmt::Write`
|
||||||
= note: consider using `std::sync::Arc<dyn std::fmt::Write>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/async-fn-nonsend.rs:63:15
|
--> $DIR/async-fn-nonsend.rs:63:15
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_send(agent.handle());
|
||||||
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<String>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<String>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/drop-track-field-assign-nonsend.rs:23:39
|
--> $DIR/drop-track-field-assign-nonsend.rs:23:39
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_send(agent.handle());
|
||||||
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<String>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<String>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/drop-track-field-assign-nonsend.rs:23:39
|
--> $DIR/drop-track-field-assign-nonsend.rs:23:39
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_send(agent.handle());
|
||||||
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<String>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<String>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/drop-track-field-assign-nonsend.rs:23:39
|
--> $DIR/drop-track-field-assign-nonsend.rs:23:39
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_send(agent.handle());
|
||||||
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<String>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<String>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/field-assign-nonsend.rs:23:39
|
--> $DIR/field-assign-nonsend.rs:23:39
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_send(agent.handle());
|
||||||
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<String>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<String>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/field-assign-nonsend.rs:23:39
|
--> $DIR/field-assign-nonsend.rs:23:39
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_send(agent.handle());
|
||||||
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<String>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<String>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/field-assign-nonsend.rs:23:39
|
--> $DIR/field-assign-nonsend.rs:23:39
|
||||||
|
|
|
|
||||||
|
|
17
tests/ui/async-await/future-contains-err-issue-115188.rs
Normal file
17
tests/ui/async-await/future-contains-err-issue-115188.rs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// edition: 2021
|
||||||
|
|
||||||
|
// Makes sure we don't spew a bunch of unrelated opaque errors when the reason
|
||||||
|
// for this error is just a missing struct field in `foo`.
|
||||||
|
|
||||||
|
async fn foo() {
|
||||||
|
let y = Wrapper { };
|
||||||
|
//~^ ERROR missing field `t` in initializer of `Wrapper<_>`
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Wrapper<T> { t: T }
|
||||||
|
|
||||||
|
fn is_send<T: Send>(_: T) {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
is_send(foo());
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0063]: missing field `t` in initializer of `Wrapper<_>`
|
||||||
|
--> $DIR/future-contains-err-issue-115188.rs:7:13
|
||||||
|
|
|
||||||
|
LL | let y = Wrapper { };
|
||||||
|
| ^^^^^^^ missing `t`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0063`.
|
|
@ -5,7 +5,6 @@ LL | assert_is_send(test::<T>());
|
||||||
| ^^^^^^^^^^^ future returned by `test` is not `Send`
|
| ^^^^^^^^^^^ future returned by `test` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `impl Future<Output = ()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `impl Future<Output = ()>`
|
||||||
= note: consider using `std::sync::Arc<impl Future<Output = ()>>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as it awaits another future which is not `Send`
|
note: future is not `Send` as it awaits another future which is not `Send`
|
||||||
--> $DIR/missing-send-bound.rs:10:5
|
--> $DIR/missing-send-bound.rs:10:5
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | is_sync(bar());
|
||||||
| ^^^^^ future returned by `bar` is not `Sync`
|
| ^^^^^ future returned by `bar` is not `Sync`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Sync` is not implemented for `Foo`
|
= help: within `impl Future<Output = ()>`, the trait `Sync` is not implemented for `Foo`
|
||||||
= note: consider using `std::sync::Arc<Foo>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Sync` as this value is used across an await
|
note: future is not `Sync` as this value is used across an await
|
||||||
--> $DIR/issue-64130-1-sync.rs:18:11
|
--> $DIR/issue-64130-1-sync.rs:18:11
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | is_sync(bar());
|
||||||
| ^^^^^ future returned by `bar` is not `Sync`
|
| ^^^^^ future returned by `bar` is not `Sync`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Sync` is not implemented for `Foo`
|
= help: within `impl Future<Output = ()>`, the trait `Sync` is not implemented for `Foo`
|
||||||
= note: consider using `std::sync::Arc<Foo>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Sync` as this value is used across an await
|
note: future is not `Sync` as this value is used across an await
|
||||||
--> $DIR/issue-64130-1-sync.rs:18:11
|
--> $DIR/issue-64130-1-sync.rs:18:11
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | is_sync(bar());
|
||||||
| ^^^^^ future returned by `bar` is not `Sync`
|
| ^^^^^ future returned by `bar` is not `Sync`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Sync` is not implemented for `Foo`
|
= help: within `impl Future<Output = ()>`, the trait `Sync` is not implemented for `Foo`
|
||||||
= note: consider using `std::sync::Arc<Foo>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Sync` as this value is used across an await
|
note: future is not `Sync` as this value is used across an await
|
||||||
--> $DIR/issue-64130-1-sync.rs:18:11
|
--> $DIR/issue-64130-1-sync.rs:18:11
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | pub fn foo() -> impl Future + Send {
|
||||||
| ^^^^^^^^^^^^^^^^^^ future created by async block is not `Send`
|
| ^^^^^^^^^^^^^^^^^^ future created by async block is not `Send`
|
||||||
|
|
|
|
||||||
= help: the trait `Sync` is not implemented for `(dyn Any + Send + 'static)`
|
= help: the trait `Sync` is not implemented for `(dyn Any + Send + 'static)`
|
||||||
= note: consider using `std::sync::Arc<(dyn Any + Send + 'static)>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/issue-64130-4-async-move.rs:27:23
|
--> $DIR/issue-64130-4-async-move.rs:27:23
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | is_send(foo());
|
||||||
| ^^^^^ future returned by `foo` is not `Send`
|
| ^^^^^ future returned by `foo` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `MutexGuard<'_, u32>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `MutexGuard<'_, u32>`
|
||||||
= note: consider using `std::sync::Arc<MutexGuard<'_, u32>>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/issue-64130-non-send-future-diags.rs:17:11
|
--> $DIR/issue-64130-non-send-future-diags.rs:17:11
|
||||||
|
|
|
|
||||||
|
|
|
@ -10,7 +10,6 @@ LL | | });
|
||||||
| |_____^ future created by async block is not `Send`
|
| |_____^ future created by async block is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[async block@$DIR/issue-67252-unnamed-future.rs:21:11: 25:6]`, the trait `Send` is not implemented for `*mut ()`
|
= help: within `[async block@$DIR/issue-67252-unnamed-future.rs:21:11: 25:6]`, the trait `Send` is not implemented for `*mut ()`
|
||||||
= note: consider using `std::sync::Arc<*mut ()>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/issue-67252-unnamed-future.rs:23:17
|
--> $DIR/issue-67252-unnamed-future.rs:23:17
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | spawn(async {
|
||||||
| ^^^^^ future created by async block is not `Send`
|
| ^^^^^ future created by async block is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[async block@$DIR/issue-67252-unnamed-future.rs:21:11: 25:6]`, the trait `Send` is not implemented for `*mut ()`
|
= help: within `[async block@$DIR/issue-67252-unnamed-future.rs:21:11: 25:6]`, the trait `Send` is not implemented for `*mut ()`
|
||||||
= note: consider using `std::sync::Arc<*mut ()>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/issue-67252-unnamed-future.rs:23:17
|
--> $DIR/issue-67252-unnamed-future.rs:23:17
|
||||||
|
|
|
|
||||||
|
|
|
@ -10,7 +10,6 @@ LL | | });
|
||||||
| |_____^ future created by async block is not `Send`
|
| |_____^ future created by async block is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[async block@$DIR/issue-67252-unnamed-future.rs:21:11: 25:6]`, the trait `Send` is not implemented for `*mut ()`
|
= help: within `[async block@$DIR/issue-67252-unnamed-future.rs:21:11: 25:6]`, the trait `Send` is not implemented for `*mut ()`
|
||||||
= note: consider using `std::sync::Arc<*mut ()>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/issue-67252-unnamed-future.rs:23:17
|
--> $DIR/issue-67252-unnamed-future.rs:23:17
|
||||||
|
|
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ error: future cannot be sent between threads safely
|
||||||
LL | fn foo<T: Send, U>(ty: T, ty1: U) -> impl Future<Output = (T, U)> + Send {
|
LL | fn foo<T: Send, U>(ty: T, ty1: U) -> impl Future<Output = (T, U)> + Send {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future created by async block is not `Send`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future created by async block is not `Send`
|
||||||
|
|
|
|
||||||
= note: consider using `std::sync::Arc<U>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: captured value is not `Send`
|
note: captured value is not `Send`
|
||||||
--> $DIR/issue-70818.rs:9:18
|
--> $DIR/issue-70818.rs:9:18
|
||||||
|
|
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ error: future cannot be sent between threads safely
|
||||||
LL | fn foo<T: Send, U>(ty: T, ty1: U) -> impl Future<Output = (T, U)> + Send {
|
LL | fn foo<T: Send, U>(ty: T, ty1: U) -> impl Future<Output = (T, U)> + Send {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future created by async block is not `Send`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future created by async block is not `Send`
|
||||||
|
|
|
|
||||||
= note: consider using `std::sync::Arc<U>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: captured value is not `Send`
|
note: captured value is not `Send`
|
||||||
--> $DIR/issue-70818.rs:9:18
|
--> $DIR/issue-70818.rs:9:18
|
||||||
|
|
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ error: future cannot be sent between threads safely
|
||||||
LL | fn foo<T: Send, U>(ty: T, ty1: U) -> impl Future<Output = (T, U)> + Send {
|
LL | fn foo<T: Send, U>(ty: T, ty1: U) -> impl Future<Output = (T, U)> + Send {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future created by async block is not `Send`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future created by async block is not `Send`
|
||||||
|
|
|
|
||||||
= note: consider using `std::sync::Arc<U>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: captured value is not `Send`
|
note: captured value is not `Send`
|
||||||
--> $DIR/issue-70818.rs:9:18
|
--> $DIR/issue-70818.rs:9:18
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | fn foo(x: NotSync) -> impl Future + Send {
|
||||||
| ^^^^^^^^^^^^^^^^^^ `*mut ()` cannot be shared between threads safely
|
| ^^^^^^^^^^^^^^^^^^ `*mut ()` cannot be shared between threads safely
|
||||||
|
|
|
|
||||||
= help: within `NotSync`, the trait `Sync` is not implemented for `*mut ()`
|
= help: within `NotSync`, the trait `Sync` is not implemented for `*mut ()`
|
||||||
= note: consider using `std::sync::Arc<*mut ()>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: required because it appears within the type `PhantomData<*mut ()>`
|
note: required because it appears within the type `PhantomData<*mut ()>`
|
||||||
--> $SRC_DIR/core/src/marker.rs:LL:COL
|
--> $SRC_DIR/core/src/marker.rs:LL:COL
|
||||||
note: required because it appears within the type `NotSync`
|
note: required because it appears within the type `NotSync`
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | fn foo(x: NotSync) -> impl Future + Send {
|
||||||
| ^^^^^^^^^^^^^^^^^^ `*mut ()` cannot be shared between threads safely
|
| ^^^^^^^^^^^^^^^^^^ `*mut ()` cannot be shared between threads safely
|
||||||
|
|
|
|
||||||
= help: within `NotSync`, the trait `Sync` is not implemented for `*mut ()`
|
= help: within `NotSync`, the trait `Sync` is not implemented for `*mut ()`
|
||||||
= note: consider using `std::sync::Arc<*mut ()>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: required because it appears within the type `PhantomData<*mut ()>`
|
note: required because it appears within the type `PhantomData<*mut ()>`
|
||||||
--> $SRC_DIR/core/src/marker.rs:LL:COL
|
--> $SRC_DIR/core/src/marker.rs:LL:COL
|
||||||
note: required because it appears within the type `NotSync`
|
note: required because it appears within the type `NotSync`
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | fn foo(x: NotSync) -> impl Future + Send {
|
||||||
| ^^^^^^^^^^^^^^^^^^ future created by async block is not `Send`
|
| ^^^^^^^^^^^^^^^^^^ future created by async block is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `NotSync`, the trait `Sync` is not implemented for `*mut ()`
|
= help: within `NotSync`, the trait `Sync` is not implemented for `*mut ()`
|
||||||
= note: consider using `std::sync::Arc<*mut ()>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/issue-70935-complex-spans.rs:24:12
|
--> $DIR/issue-70935-complex-spans.rs:24:12
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | fake_spawn(wrong_mutex());
|
||||||
| ^^^^^^^^^^^^^ future returned by `wrong_mutex` is not `Send`
|
| ^^^^^^^^^^^^^ future returned by `wrong_mutex` is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `MutexGuard<'_, i32>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `MutexGuard<'_, i32>`
|
||||||
= note: consider using `std::sync::Arc<MutexGuard<'_, i32>>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/issue-71137.rs:14:26
|
--> $DIR/issue-71137.rs:14:26
|
||||||
|
|
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ LL | | }
|
||||||
LL | | )
|
LL | | )
|
||||||
| |_____________^ future created by async block is not `Send`
|
| |_____________^ future created by async block is not `Send`
|
||||||
|
|
|
|
||||||
= note: consider using `std::sync::Arc<T>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: captured value is not `Send` because `&` references cannot be sent unless their referent is `Sync`
|
note: captured value is not `Send` because `&` references cannot be sent unless their referent is `Sync`
|
||||||
--> $DIR/issue-86507.rs:22:29
|
--> $DIR/issue-86507.rs:22:29
|
||||||
|
|
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ LL | | }
|
||||||
LL | | )
|
LL | | )
|
||||||
| |_____________^ future created by async block is not `Send`
|
| |_____________^ future created by async block is not `Send`
|
||||||
|
|
|
|
||||||
= note: consider using `std::sync::Arc<T>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: captured value is not `Send` because `&` references cannot be sent unless their referent is `Sync`
|
note: captured value is not `Send` because `&` references cannot be sent unless their referent is `Sync`
|
||||||
--> $DIR/issue-86507.rs:22:29
|
--> $DIR/issue-86507.rs:22:29
|
||||||
|
|
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ LL | | }
|
||||||
LL | | )
|
LL | | )
|
||||||
| |_____________^ future created by async block is not `Send`
|
| |_____________^ future created by async block is not `Send`
|
||||||
|
|
|
|
||||||
= note: consider using `std::sync::Arc<T>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: captured value is not `Send` because `&` references cannot be sent unless their referent is `Sync`
|
note: captured value is not `Send` because `&` references cannot be sent unless their referent is `Sync`
|
||||||
--> $DIR/issue-86507.rs:22:29
|
--> $DIR/issue-86507.rs:22:29
|
||||||
|
|
|
|
||||||
|
|
|
@ -9,7 +9,6 @@ LL | | })
|
||||||
| |_____^ future created by async block is not `Send`
|
| |_____^ future created by async block is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[async block@$DIR/issue-65436-raw-ptr-not-send.rs:17:17: 20:6]`, the trait `Send` is not implemented for `*const u8`
|
= help: within `[async block@$DIR/issue-65436-raw-ptr-not-send.rs:17:17: 20:6]`, the trait `Send` is not implemented for `*const u8`
|
||||||
= note: consider using `std::sync::Arc<*const u8>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/issue-65436-raw-ptr-not-send.rs:19:36
|
--> $DIR/issue-65436-raw-ptr-not-send.rs:19:36
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | g(issue_67893::run())
|
||||||
| ^^^^^^^^^^^^^^^^^^ future is not `Send`
|
| ^^^^^^^^^^^^^^^^^^ future is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `MutexGuard<'_, ()>`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `MutexGuard<'_, ()>`
|
||||||
= note: consider using `std::sync::Arc<MutexGuard<'_, ()>>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/auxiliary/issue_67893.rs:12:27
|
--> $DIR/auxiliary/issue_67893.rs:12:27
|
||||||
|
|
|
|
||||||
|
|
|
@ -10,11 +10,10 @@ LL | async fn foo() {
|
||||||
| - within this `impl Future<Output = ()>`
|
| - within this `impl Future<Output = ()>`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `NotSend`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `NotSend`
|
||||||
= note: consider using `std::sync::Arc<NotSend>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
= note: required because it appears within the type `(NotSend,)`
|
= note: required because it appears within the type `(NotSend,)`
|
||||||
= note: required because it captures the following types: `ResumeTy`, `(NotSend,)`, `()`, `impl Future<Output = ()>`
|
= note: required because it captures the following types: `ResumeTy`, `(NotSend,)`, `()`, `impl Future<Output = ()>`
|
||||||
note: required because it's used within this `async fn` body
|
note: required because it's used within this `async fn` body
|
||||||
--> $DIR/partial-drop-partial-reinit.rs:32:16
|
--> $DIR/partial-drop-partial-reinit.rs:31:16
|
||||||
|
|
|
|
||||||
LL | async fn foo() {
|
LL | async fn foo() {
|
||||||
| ________________^
|
| ________________^
|
||||||
|
@ -26,7 +25,7 @@ LL | | bar().await;
|
||||||
LL | | }
|
LL | | }
|
||||||
| |_^
|
| |_^
|
||||||
note: required by a bound in `gimme_send`
|
note: required by a bound in `gimme_send`
|
||||||
--> $DIR/partial-drop-partial-reinit.rs:18:18
|
--> $DIR/partial-drop-partial-reinit.rs:17:18
|
||||||
|
|
|
|
||||||
LL | fn gimme_send<T: Send>(t: T) {
|
LL | fn gimme_send<T: Send>(t: T) {
|
||||||
| ^^^^ required by this bound in `gimme_send`
|
| ^^^^ required by this bound in `gimme_send`
|
||||||
|
|
|
@ -10,11 +10,10 @@ LL | async fn foo() {
|
||||||
| - within this `impl Future<Output = ()>`
|
| - within this `impl Future<Output = ()>`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `NotSend`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `NotSend`
|
||||||
= note: consider using `std::sync::Arc<NotSend>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
= note: required because it appears within the type `(NotSend,)`
|
= note: required because it appears within the type `(NotSend,)`
|
||||||
= note: required because it captures the following types: `ResumeTy`, `(NotSend,)`, `impl Future<Output = ()>`, `()`
|
= note: required because it captures the following types: `ResumeTy`, `(NotSend,)`, `impl Future<Output = ()>`, `()`
|
||||||
note: required because it's used within this `async fn` body
|
note: required because it's used within this `async fn` body
|
||||||
--> $DIR/partial-drop-partial-reinit.rs:32:16
|
--> $DIR/partial-drop-partial-reinit.rs:31:16
|
||||||
|
|
|
|
||||||
LL | async fn foo() {
|
LL | async fn foo() {
|
||||||
| ________________^
|
| ________________^
|
||||||
|
@ -26,7 +25,7 @@ LL | | bar().await;
|
||||||
LL | | }
|
LL | | }
|
||||||
| |_^
|
| |_^
|
||||||
note: required by a bound in `gimme_send`
|
note: required by a bound in `gimme_send`
|
||||||
--> $DIR/partial-drop-partial-reinit.rs:18:18
|
--> $DIR/partial-drop-partial-reinit.rs:17:18
|
||||||
|
|
|
|
||||||
LL | fn gimme_send<T: Send>(t: T) {
|
LL | fn gimme_send<T: Send>(t: T) {
|
||||||
| ^^^^ required by this bound in `gimme_send`
|
| ^^^^ required by this bound in `gimme_send`
|
||||||
|
|
|
@ -12,7 +12,6 @@ fn main() {
|
||||||
//~| NOTE bound introduced by
|
//~| NOTE bound introduced by
|
||||||
//~| NOTE appears within the type
|
//~| NOTE appears within the type
|
||||||
//~| NOTE captures the following types
|
//~| NOTE captures the following types
|
||||||
//~| NOTE consider using `std::sync::Arc<NotSend>`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn gimme_send<T: Send>(t: T) {
|
fn gimme_send<T: Send>(t: T) {
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | fn generic<T, U>(v: Foo<T, U>, f: fn(<Foo<T, U> as WithAssoc>::Output) -> i
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Foo<T, U>` cannot be sent between threads safely
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Foo<T, U>` cannot be sent between threads safely
|
||||||
|
|
|
|
||||||
= help: the trait `Send` is not implemented for `Foo<T, U>`
|
= help: the trait `Send` is not implemented for `Foo<T, U>`
|
||||||
= note: consider using `std::sync::Arc<Foo<T, U>>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: required for `Foo<T, U>` to implement `WithAssoc`
|
note: required for `Foo<T, U>` to implement `WithAssoc`
|
||||||
--> $DIR/issue-83857-ub.rs:15:15
|
--> $DIR/issue-83857-ub.rs:15:15
|
||||||
|
|
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ error[E0277]: `T` cannot be sent between threads safely
|
||||||
LL | impl <T: Sync+'static> Foo for (T,) { }
|
LL | impl <T: Sync+'static> Foo for (T,) { }
|
||||||
| ^^^^ `T` cannot be sent between threads safely
|
| ^^^^ `T` cannot be sent between threads safely
|
||||||
|
|
|
|
||||||
= note: consider using `std::sync::Arc<T>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
= note: required because it appears within the type `(T,)`
|
= note: required because it appears within the type `(T,)`
|
||||||
note: required by a bound in `Foo`
|
note: required by a bound in `Foo`
|
||||||
--> $DIR/builtin-superkinds-double-superkind.rs:4:13
|
--> $DIR/builtin-superkinds-double-superkind.rs:4:13
|
||||||
|
@ -22,7 +21,6 @@ error[E0277]: `T` cannot be shared between threads safely
|
||||||
LL | impl <T: Send> Foo for (T,T) { }
|
LL | impl <T: Send> Foo for (T,T) { }
|
||||||
| ^^^^^ `T` cannot be shared between threads safely
|
| ^^^^^ `T` cannot be shared between threads safely
|
||||||
|
|
|
|
||||||
= note: consider using `std::sync::Arc<T>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
= note: required because it appears within the type `(T, T)`
|
= note: required because it appears within the type `(T, T)`
|
||||||
note: required by a bound in `Foo`
|
note: required by a bound in `Foo`
|
||||||
--> $DIR/builtin-superkinds-double-superkind.rs:4:18
|
--> $DIR/builtin-superkinds-double-superkind.rs:4:18
|
||||||
|
|
|
@ -4,7 +4,6 @@ error[E0277]: `T` cannot be sent between threads safely
|
||||||
LL | impl <T:Sync+'static> RequiresRequiresShareAndSend for X<T> { }
|
LL | impl <T:Sync+'static> RequiresRequiresShareAndSend for X<T> { }
|
||||||
| ^^^^ `T` cannot be sent between threads safely
|
| ^^^^ `T` cannot be sent between threads safely
|
||||||
|
|
|
|
||||||
= note: consider using `std::sync::Arc<T>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: required because it appears within the type `X<T>`
|
note: required because it appears within the type `X<T>`
|
||||||
--> $DIR/builtin-superkinds-in-metadata.rs:9:8
|
--> $DIR/builtin-superkinds-in-metadata.rs:9:8
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | impl Foo for std::rc::Rc<i8> { }
|
||||||
| ^^^^^^^^^^^^^^^ `Rc<i8>` cannot be sent between threads safely
|
| ^^^^^^^^^^^^^^^ `Rc<i8>` cannot be sent between threads safely
|
||||||
|
|
|
|
||||||
= help: the trait `Send` is not implemented for `Rc<i8>`
|
= help: the trait `Send` is not implemented for `Rc<i8>`
|
||||||
= note: use `std::sync::Arc` instead of `std::rc::Rc`
|
|
||||||
note: required by a bound in `Foo`
|
note: required by a bound in `Foo`
|
||||||
--> $DIR/builtin-superkinds-simple.rs:4:13
|
--> $DIR/builtin-superkinds-simple.rs:4:13
|
||||||
|
|
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ error[E0277]: `T` cannot be sent between threads safely
|
||||||
LL | impl <T: Sync+'static> Foo for T { }
|
LL | impl <T: Sync+'static> Foo for T { }
|
||||||
| ^ `T` cannot be sent between threads safely
|
| ^ `T` cannot be sent between threads safely
|
||||||
|
|
|
|
||||||
= note: consider using `std::sync::Arc<T>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: required by a bound in `Foo`
|
note: required by a bound in `Foo`
|
||||||
--> $DIR/builtin-superkinds-typaram-not-send.rs:3:13
|
--> $DIR/builtin-superkinds-typaram-not-send.rs:3:13
|
||||||
|
|
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ error[E0277]: `F` cannot be sent between threads safely
|
||||||
LL | fn foo<F>(blk: F) -> X<F> where F: FnOnce() + 'static {
|
LL | fn foo<F>(blk: F) -> X<F> where F: FnOnce() + 'static {
|
||||||
| ^^^^ `F` cannot be sent between threads safely
|
| ^^^^ `F` cannot be sent between threads safely
|
||||||
|
|
|
|
||||||
= note: consider using `std::sync::Arc<F>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: required by a bound in `X`
|
note: required by a bound in `X`
|
||||||
--> $DIR/closure-bounds-cant-promote-superkind-in-struct.rs:1:43
|
--> $DIR/closure-bounds-cant-promote-superkind-in-struct.rs:1:43
|
||||||
|
|
|
|
||||||
|
|
|
@ -6,7 +6,6 @@ LL | take_const_owned(f);
|
||||||
| |
|
| |
|
||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
= note: consider using `std::sync::Arc<F>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: required by a bound in `take_const_owned`
|
note: required by a bound in `take_const_owned`
|
||||||
--> $DIR/closure-bounds-subtype.rs:4:50
|
--> $DIR/closure-bounds-subtype.rs:4:50
|
||||||
|
|
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ LL | | });
|
||||||
| |_____^ `std::sync::mpsc::Receiver<()>` cannot be shared between threads safely
|
| |_____^ `std::sync::mpsc::Receiver<()>` cannot be shared between threads safely
|
||||||
|
|
|
|
||||||
= help: the trait `Sync` is not implemented for `std::sync::mpsc::Receiver<()>`
|
= help: the trait `Sync` is not implemented for `std::sync::mpsc::Receiver<()>`
|
||||||
= note: consider using `std::sync::Arc<std::sync::mpsc::Receiver<()>>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
= note: required for `&std::sync::mpsc::Receiver<()>` to implement `Send`
|
= note: required for `&std::sync::mpsc::Receiver<()>` to implement `Send`
|
||||||
note: required because it's used within this closure
|
note: required because it's used within this closure
|
||||||
--> $DIR/closure-move-sync.rs:6:27
|
--> $DIR/closure-move-sync.rs:6:27
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | is_send::<Foo>();
|
||||||
| ^^^ `*const u8` cannot be sent between threads safely
|
| ^^^ `*const u8` cannot be sent between threads safely
|
||||||
|
|
|
|
||||||
= help: within `Foo`, the trait `Send` is not implemented for `*const u8`
|
= help: within `Foo`, the trait `Send` is not implemented for `*const u8`
|
||||||
= note: consider using `std::sync::Arc<*const u8>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: required because it appears within the type `Baz`
|
note: required because it appears within the type `Baz`
|
||||||
--> $DIR/E0277-2.rs:9:8
|
--> $DIR/E0277-2.rs:9:8
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_send::<Foo>()
|
||||||
| ^^^ `Foo` cannot be sent between threads safely
|
| ^^^ `Foo` cannot be sent between threads safely
|
||||||
|
|
|
|
||||||
= help: the trait `Send` is not implemented for `Foo`
|
= help: the trait `Send` is not implemented for `Foo`
|
||||||
= note: consider using `std::sync::Arc<Foo>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: required by a bound in `assert_send`
|
note: required by a bound in `assert_send`
|
||||||
--> $DIR/extern-type-diag-not-similar.rs:17:19
|
--> $DIR/extern-type-diag-not-similar.rs:17:19
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_sync::<A>();
|
||||||
| ^ `A` cannot be shared between threads safely
|
| ^ `A` cannot be shared between threads safely
|
||||||
|
|
|
|
||||||
= help: the trait `Sync` is not implemented for `A`
|
= help: the trait `Sync` is not implemented for `A`
|
||||||
= note: consider using `std::sync::Arc<A>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: required by a bound in `assert_sync`
|
note: required by a bound in `assert_sync`
|
||||||
--> $DIR/extern-types-not-sync-send.rs:9:28
|
--> $DIR/extern-types-not-sync-send.rs:9:28
|
||||||
|
|
|
|
||||||
|
@ -19,7 +18,6 @@ LL | assert_send::<A>();
|
||||||
| ^ `A` cannot be sent between threads safely
|
| ^ `A` cannot be sent between threads safely
|
||||||
|
|
|
|
||||||
= help: the trait `Send` is not implemented for `A`
|
= help: the trait `Send` is not implemented for `A`
|
||||||
= note: consider using `std::sync::Arc<A>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: required by a bound in `assert_send`
|
note: required by a bound in `assert_send`
|
||||||
--> $DIR/extern-types-not-sync-send.rs:10:28
|
--> $DIR/extern-types-not-sync-send.rs:10:28
|
||||||
|
|
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ LL | send(format_args!("{:?}", c));
|
||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
= help: within `[core::fmt::rt::Argument<'_>]`, the trait `Sync` is not implemented for `core::fmt::rt::Opaque`
|
= help: within `[core::fmt::rt::Argument<'_>]`, the trait `Sync` is not implemented for `core::fmt::rt::Opaque`
|
||||||
= note: consider using `std::sync::Arc<core::fmt::rt::Opaque>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
= note: required because it appears within the type `&core::fmt::rt::Opaque`
|
= note: required because it appears within the type `&core::fmt::rt::Opaque`
|
||||||
note: required because it appears within the type `Argument<'_>`
|
note: required because it appears within the type `Argument<'_>`
|
||||||
--> $SRC_DIR/core/src/fmt/rt.rs:LL:COL
|
--> $SRC_DIR/core/src/fmt/rt.rs:LL:COL
|
||||||
|
@ -30,7 +29,6 @@ LL | sync(format_args!("{:?}", c));
|
||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
= help: within `Arguments<'_>`, the trait `Sync` is not implemented for `core::fmt::rt::Opaque`
|
= help: within `Arguments<'_>`, the trait `Sync` is not implemented for `core::fmt::rt::Opaque`
|
||||||
= note: consider using `std::sync::Arc<core::fmt::rt::Opaque>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
= note: required because it appears within the type `&core::fmt::rt::Opaque`
|
= note: required because it appears within the type `&core::fmt::rt::Opaque`
|
||||||
note: required because it appears within the type `Argument<'_>`
|
note: required because it appears within the type `Argument<'_>`
|
||||||
--> $SRC_DIR/core/src/fmt/rt.rs:LL:COL
|
--> $SRC_DIR/core/src/fmt/rt.rs:LL:COL
|
||||||
|
|
|
@ -14,7 +14,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<derived_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -57,7 +56,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<significant_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -100,7 +98,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
||||||
= note: consider using `std::sync::Arc<insignificant_dtor::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<derived_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -55,7 +54,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<significant_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -96,7 +94,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
||||||
= note: consider using `std::sync::Arc<insignificant_dtor::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `copy::Client`
|
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `copy::Client`
|
||||||
= note: consider using `std::sync::Arc<copy::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -57,7 +56,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `copy::Client`
|
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `copy::Client`
|
||||||
= note: consider using `std::sync::Arc<copy::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-tracking-parent-expression.rs:38:22
|
--> $DIR/drop-tracking-parent-expression.rs:38:22
|
||||||
|
|
|
|
||||||
|
@ -99,7 +97,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<derived_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -142,7 +139,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<derived_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-tracking-parent-expression.rs:38:22
|
--> $DIR/drop-tracking-parent-expression.rs:38:22
|
||||||
|
|
|
|
||||||
|
@ -184,7 +180,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<significant_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -227,7 +222,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<significant_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-tracking-parent-expression.rs:38:22
|
--> $DIR/drop-tracking-parent-expression.rs:38:22
|
||||||
|
|
|
|
||||||
|
@ -269,7 +263,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
||||||
= note: consider using `std::sync::Arc<insignificant_dtor::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -312,7 +305,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
= help: within `[generator@$DIR/drop-tracking-parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
||||||
= note: consider using `std::sync::Arc<insignificant_dtor::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-tracking-parent-expression.rs:38:22
|
--> $DIR/drop-tracking-parent-expression.rs:38:22
|
||||||
|
|
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ LL | | })
|
||||||
| |_____^ generator is not `Send`
|
| |_____^ generator is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/drop-yield-twice.rs:7:17: 7:19]`, the trait `Send` is not implemented for `Foo`
|
= help: within `[generator@$DIR/drop-yield-twice.rs:7:17: 7:19]`, the trait `Send` is not implemented for `Foo`
|
||||||
= note: consider using `std::sync::Arc<Foo>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/drop-yield-twice.rs:9:9
|
--> $DIR/drop-yield-twice.rs:9:9
|
||||||
|
|
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: the trait `Sync` is not implemented for `copy::unsync::Client`
|
= help: the trait `Sync` is not implemented for `copy::unsync::Client`
|
||||||
= note: consider using `std::sync::Arc<copy::unsync::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/issue-57017.rs:30:28
|
--> $DIR/issue-57017.rs:30:28
|
||||||
|
|
|
|
||||||
|
@ -56,7 +55,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/issue-57017.rs:41:21: 41:28]`, the trait `Send` is not implemented for `copy::unsend::Client`
|
= help: within `[generator@$DIR/issue-57017.rs:41:21: 41:28]`, the trait `Send` is not implemented for `copy::unsend::Client`
|
||||||
= note: consider using `std::sync::Arc<copy::unsend::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/issue-57017.rs:42:28
|
--> $DIR/issue-57017.rs:42:28
|
||||||
|
|
|
|
||||||
|
@ -98,7 +96,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: the trait `Sync` is not implemented for `derived_drop::unsync::Client`
|
= help: the trait `Sync` is not implemented for `derived_drop::unsync::Client`
|
||||||
= note: consider using `std::sync::Arc<derived_drop::unsync::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/issue-57017.rs:30:28
|
--> $DIR/issue-57017.rs:30:28
|
||||||
|
|
|
|
||||||
|
@ -140,7 +137,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/issue-57017.rs:41:21: 41:28]`, the trait `Send` is not implemented for `derived_drop::unsend::Client`
|
= help: within `[generator@$DIR/issue-57017.rs:41:21: 41:28]`, the trait `Send` is not implemented for `derived_drop::unsend::Client`
|
||||||
= note: consider using `std::sync::Arc<derived_drop::unsend::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/issue-57017.rs:42:28
|
--> $DIR/issue-57017.rs:42:28
|
||||||
|
|
|
|
||||||
|
@ -182,7 +178,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: the trait `Sync` is not implemented for `significant_drop::unsync::Client`
|
= help: the trait `Sync` is not implemented for `significant_drop::unsync::Client`
|
||||||
= note: consider using `std::sync::Arc<significant_drop::unsync::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/issue-57017.rs:30:28
|
--> $DIR/issue-57017.rs:30:28
|
||||||
|
|
|
|
||||||
|
@ -224,7 +219,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/issue-57017.rs:41:21: 41:28]`, the trait `Send` is not implemented for `significant_drop::unsend::Client`
|
= help: within `[generator@$DIR/issue-57017.rs:41:21: 41:28]`, the trait `Send` is not implemented for `significant_drop::unsend::Client`
|
||||||
= note: consider using `std::sync::Arc<significant_drop::unsend::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/issue-57017.rs:42:28
|
--> $DIR/issue-57017.rs:42:28
|
||||||
|
|
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ LL | | })
|
||||||
| |_____^ generator is not `Send`
|
| |_____^ generator is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/issue-57478.rs:13:17: 13:19]`, the trait `Send` is not implemented for `Foo`
|
= help: within `[generator@$DIR/issue-57478.rs:13:17: 13:19]`, the trait `Send` is not implemented for `Foo`
|
||||||
= note: consider using `std::sync::Arc<Foo>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/issue-57478.rs:17:9
|
--> $DIR/issue-57478.rs:17:9
|
||||||
|
|
|
|
||||||
|
|
|
@ -24,6 +24,5 @@ fn main() {
|
||||||
type F = impl Future;
|
type F = impl Future;
|
||||||
// Check that statics are inhabited computes they layout.
|
// Check that statics are inhabited computes they layout.
|
||||||
static POOL: Task<F> = Task::new();
|
static POOL: Task<F> = Task::new();
|
||||||
//~^ ERROR: cannot check whether the hidden type of `layout_error[b009]::main::F::{opaque#0}` satisfies auto traits
|
|
||||||
Task::spawn(&POOL, || cb());
|
Task::spawn(&POOL, || cb());
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,24 +4,6 @@ error[E0425]: cannot find value `Foo` in this scope
|
||||||
LL | let a = Foo;
|
LL | let a = Foo;
|
||||||
| ^^^ not found in this scope
|
| ^^^ not found in this scope
|
||||||
|
|
||||||
error: cannot check whether the hidden type of `layout_error[b009]::main::F::{opaque#0}` satisfies auto traits
|
error: aborting due to previous error
|
||||||
--> $DIR/layout-error.rs:26:18
|
|
||||||
|
|
|
||||||
LL | static POOL: Task<F> = Task::new();
|
|
||||||
| ^^^^^^^
|
|
||||||
|
|
|
||||||
note: opaque type is declared here
|
|
||||||
--> $DIR/layout-error.rs:24:14
|
|
||||||
|
|
|
||||||
LL | type F = impl Future;
|
|
||||||
| ^^^^^^^^^^^
|
|
||||||
note: required because it appears within the type `Task<F>`
|
|
||||||
--> $DIR/layout-error.rs:9:12
|
|
||||||
|
|
|
||||||
LL | pub struct Task<F: Future>(F);
|
|
||||||
| ^^^^
|
|
||||||
= note: shared static variables must have a type that implements `Sync`
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0425`.
|
For more information about this error, try `rustc --explain E0425`.
|
||||||
|
|
|
@ -11,7 +11,6 @@ LL | | });
|
||||||
| |_____^ generator is not `Sync`
|
| |_____^ generator is not `Sync`
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/not-send-sync.rs:17:17: 17:19]`, the trait `Sync` is not implemented for `NotSync`
|
= help: within `[generator@$DIR/not-send-sync.rs:17:17: 17:19]`, the trait `Sync` is not implemented for `NotSync`
|
||||||
= note: consider using `std::sync::Arc<NotSync>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Sync` as this value is used across a yield
|
note: generator is not `Sync` as this value is used across a yield
|
||||||
--> $DIR/not-send-sync.rs:20:9
|
--> $DIR/not-send-sync.rs:20:9
|
||||||
|
|
|
|
||||||
|
@ -41,7 +40,6 @@ LL | | });
|
||||||
| |_____^ generator is not `Send`
|
| |_____^ generator is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/not-send-sync.rs:24:17: 24:19]`, the trait `Send` is not implemented for `NotSend`
|
= help: within `[generator@$DIR/not-send-sync.rs:24:17: 24:19]`, the trait `Send` is not implemented for `NotSend`
|
||||||
= note: consider using `std::sync::Arc<NotSend>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/not-send-sync.rs:27:9
|
--> $DIR/not-send-sync.rs:27:9
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_sync(|| {
|
||||||
| ^^^^^^^^^^^ generator is not `Sync`
|
| ^^^^^^^^^^^ generator is not `Sync`
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/not-send-sync.rs:17:17: 17:19]`, the trait `Sync` is not implemented for `NotSync`
|
= help: within `[generator@$DIR/not-send-sync.rs:17:17: 17:19]`, the trait `Sync` is not implemented for `NotSync`
|
||||||
= note: consider using `std::sync::Arc<NotSync>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Sync` as this value is used across a yield
|
note: generator is not `Sync` as this value is used across a yield
|
||||||
--> $DIR/not-send-sync.rs:20:9
|
--> $DIR/not-send-sync.rs:20:9
|
||||||
|
|
|
|
||||||
|
@ -26,7 +25,6 @@ LL | assert_send(|| {
|
||||||
| ^^^^^^^^^^^ generator is not `Send`
|
| ^^^^^^^^^^^ generator is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/not-send-sync.rs:24:17: 24:19]`, the trait `Send` is not implemented for `NotSend`
|
= help: within `[generator@$DIR/not-send-sync.rs:24:17: 24:19]`, the trait `Send` is not implemented for `NotSend`
|
||||||
= note: consider using `std::sync::Arc<NotSend>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/not-send-sync.rs:27:9
|
--> $DIR/not-send-sync.rs:27:9
|
||||||
|
|
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ LL | | });
|
||||||
| |_____^ generator is not `Sync`
|
| |_____^ generator is not `Sync`
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/not-send-sync.rs:17:17: 17:19]`, the trait `Sync` is not implemented for `NotSync`
|
= help: within `[generator@$DIR/not-send-sync.rs:17:17: 17:19]`, the trait `Sync` is not implemented for `NotSync`
|
||||||
= note: consider using `std::sync::Arc<NotSync>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Sync` as this value is used across a yield
|
note: generator is not `Sync` as this value is used across a yield
|
||||||
--> $DIR/not-send-sync.rs:20:9
|
--> $DIR/not-send-sync.rs:20:9
|
||||||
|
|
|
|
||||||
|
@ -41,7 +40,6 @@ LL | | });
|
||||||
| |_____^ generator is not `Send`
|
| |_____^ generator is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/not-send-sync.rs:24:17: 24:19]`, the trait `Send` is not implemented for `NotSend`
|
= help: within `[generator@$DIR/not-send-sync.rs:24:17: 24:19]`, the trait `Send` is not implemented for `NotSend`
|
||||||
= note: consider using `std::sync::Arc<NotSend>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/not-send-sync.rs:27:9
|
--> $DIR/not-send-sync.rs:27:9
|
||||||
|
|
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<derived_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/parent-expression.rs:25:22
|
--> $DIR/parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -57,7 +56,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<significant_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/parent-expression.rs:25:22
|
--> $DIR/parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -100,7 +98,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
||||||
= note: consider using `std::sync::Arc<insignificant_dtor::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/parent-expression.rs:25:22
|
--> $DIR/parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<derived_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/parent-expression.rs:25:22
|
--> $DIR/parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -55,7 +54,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<significant_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/parent-expression.rs:25:22
|
--> $DIR/parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -96,7 +94,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
||||||
= note: consider using `std::sync::Arc<insignificant_dtor::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/parent-expression.rs:25:22
|
--> $DIR/parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `copy::Client`
|
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `copy::Client`
|
||||||
= note: consider using `std::sync::Arc<copy::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/parent-expression.rs:25:22
|
--> $DIR/parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -57,7 +56,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `copy::Client`
|
= help: within `[generator@$DIR/parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `copy::Client`
|
||||||
= note: consider using `std::sync::Arc<copy::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/parent-expression.rs:38:22
|
--> $DIR/parent-expression.rs:38:22
|
||||||
|
|
|
|
||||||
|
@ -99,7 +97,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<derived_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/parent-expression.rs:25:22
|
--> $DIR/parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -142,7 +139,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
= help: within `[generator@$DIR/parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `derived_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<derived_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/parent-expression.rs:38:22
|
--> $DIR/parent-expression.rs:38:22
|
||||||
|
|
|
|
||||||
|
@ -184,7 +180,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<significant_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/parent-expression.rs:25:22
|
--> $DIR/parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -227,7 +222,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
= help: within `[generator@$DIR/parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `significant_drop::Client`
|
||||||
= note: consider using `std::sync::Arc<significant_drop::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/parent-expression.rs:38:22
|
--> $DIR/parent-expression.rs:38:22
|
||||||
|
|
|
|
||||||
|
@ -269,7 +263,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
= help: within `[generator@$DIR/parent-expression.rs:21:21: 21:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
||||||
= note: consider using `std::sync::Arc<insignificant_dtor::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/parent-expression.rs:25:22
|
--> $DIR/parent-expression.rs:25:22
|
||||||
|
|
|
|
||||||
|
@ -312,7 +305,6 @@ LL | | );
|
||||||
| |_____- in this macro invocation
|
| |_____- in this macro invocation
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
= help: within `[generator@$DIR/parent-expression.rs:37:21: 37:28]`, the trait `Send` is not implemented for `insignificant_dtor::Client`
|
||||||
= note: consider using `std::sync::Arc<insignificant_dtor::Client>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/parent-expression.rs:38:22
|
--> $DIR/parent-expression.rs:38:22
|
||||||
|
|
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ LL | | });
|
||||||
| |_____^ generator is not `Send`
|
| |_____^ generator is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/partial-drop.rs:17:17: 17:19]`, the trait `Send` is not implemented for `Foo`
|
= help: within `[generator@$DIR/partial-drop.rs:17:17: 17:19]`, the trait `Send` is not implemented for `Foo`
|
||||||
= note: consider using `std::sync::Arc<Foo>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/partial-drop.rs:21:9
|
--> $DIR/partial-drop.rs:21:9
|
||||||
|
|
|
|
||||||
|
@ -42,7 +41,6 @@ LL | | });
|
||||||
| |_____^ generator is not `Send`
|
| |_____^ generator is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/partial-drop.rs:24:17: 24:19]`, the trait `Send` is not implemented for `Foo`
|
= help: within `[generator@$DIR/partial-drop.rs:24:17: 24:19]`, the trait `Send` is not implemented for `Foo`
|
||||||
= note: consider using `std::sync::Arc<Foo>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/partial-drop.rs:29:9
|
--> $DIR/partial-drop.rs:29:9
|
||||||
|
|
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ LL | | });
|
||||||
| |_____^ generator is not `Send`
|
| |_____^ generator is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/partial-drop.rs:17:17: 17:19]`, the trait `Send` is not implemented for `Foo`
|
= help: within `[generator@$DIR/partial-drop.rs:17:17: 17:19]`, the trait `Send` is not implemented for `Foo`
|
||||||
= note: consider using `std::sync::Arc<Foo>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/partial-drop.rs:21:9
|
--> $DIR/partial-drop.rs:21:9
|
||||||
|
|
|
|
||||||
|
@ -42,7 +41,6 @@ LL | | });
|
||||||
| |_____^ generator is not `Send`
|
| |_____^ generator is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/partial-drop.rs:24:17: 24:19]`, the trait `Send` is not implemented for `Foo`
|
= help: within `[generator@$DIR/partial-drop.rs:24:17: 24:19]`, the trait `Send` is not implemented for `Foo`
|
||||||
= note: consider using `std::sync::Arc<Foo>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/partial-drop.rs:29:9
|
--> $DIR/partial-drop.rs:29:9
|
||||||
|
|
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ LL | | });
|
||||||
| |_____^ generator is not `Sync`
|
| |_____^ generator is not `Sync`
|
||||||
|
|
|
|
||||||
= help: within `[main::{closure#0} upvar_tys=() {NotSync, ()}]`, the trait `Sync` is not implemented for `NotSync`
|
= help: within `[main::{closure#0} upvar_tys=() {NotSync, ()}]`, the trait `Sync` is not implemented for `NotSync`
|
||||||
= note: consider using `std::sync::Arc<NotSync>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Sync` as this value is used across a yield
|
note: generator is not `Sync` as this value is used across a yield
|
||||||
--> $DIR/generator-print-verbose-2.rs:23:9
|
--> $DIR/generator-print-verbose-2.rs:23:9
|
||||||
|
|
|
|
||||||
|
@ -41,7 +40,6 @@ LL | | });
|
||||||
| |_____^ generator is not `Send`
|
| |_____^ generator is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[main::{closure#1} upvar_tys=() {NotSend, ()}]`, the trait `Send` is not implemented for `NotSend`
|
= help: within `[main::{closure#1} upvar_tys=() {NotSend, ()}]`, the trait `Send` is not implemented for `NotSend`
|
||||||
= note: consider using `std::sync::Arc<NotSend>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/generator-print-verbose-2.rs:30:9
|
--> $DIR/generator-print-verbose-2.rs:30:9
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_sync(|| {
|
||||||
| ^^^^^^^^^^^ generator is not `Sync`
|
| ^^^^^^^^^^^ generator is not `Sync`
|
||||||
|
|
|
|
||||||
= help: within `[main::{closure#0} upvar_tys=() [main::{closure#0}]]`, the trait `Sync` is not implemented for `NotSync`
|
= help: within `[main::{closure#0} upvar_tys=() [main::{closure#0}]]`, the trait `Sync` is not implemented for `NotSync`
|
||||||
= note: consider using `std::sync::Arc<NotSync>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Sync` as this value is used across a yield
|
note: generator is not `Sync` as this value is used across a yield
|
||||||
--> $DIR/generator-print-verbose-2.rs:23:9
|
--> $DIR/generator-print-verbose-2.rs:23:9
|
||||||
|
|
|
|
||||||
|
@ -26,7 +25,6 @@ LL | assert_send(|| {
|
||||||
| ^^^^^^^^^^^ generator is not `Send`
|
| ^^^^^^^^^^^ generator is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[main::{closure#1} upvar_tys=() [main::{closure#1}]]`, the trait `Send` is not implemented for `NotSend`
|
= help: within `[main::{closure#1} upvar_tys=() [main::{closure#1}]]`, the trait `Send` is not implemented for `NotSend`
|
||||||
= note: consider using `std::sync::Arc<NotSend>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/generator-print-verbose-2.rs:30:9
|
--> $DIR/generator-print-verbose-2.rs:30:9
|
||||||
|
|
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ LL | | });
|
||||||
| |_____^ generator is not `Sync`
|
| |_____^ generator is not `Sync`
|
||||||
|
|
|
|
||||||
= help: within `[main::{closure#0} upvar_tys=() {NotSync, ()}]`, the trait `Sync` is not implemented for `NotSync`
|
= help: within `[main::{closure#0} upvar_tys=() {NotSync, ()}]`, the trait `Sync` is not implemented for `NotSync`
|
||||||
= note: consider using `std::sync::Arc<NotSync>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Sync` as this value is used across a yield
|
note: generator is not `Sync` as this value is used across a yield
|
||||||
--> $DIR/generator-print-verbose-2.rs:23:9
|
--> $DIR/generator-print-verbose-2.rs:23:9
|
||||||
|
|
|
|
||||||
|
@ -41,7 +40,6 @@ LL | | });
|
||||||
| |_____^ generator is not `Send`
|
| |_____^ generator is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[main::{closure#1} upvar_tys=() {NotSend, ()}]`, the trait `Send` is not implemented for `NotSend`
|
= help: within `[main::{closure#1} upvar_tys=() {NotSend, ()}]`, the trait `Send` is not implemented for `NotSend`
|
||||||
= note: consider using `std::sync::Arc<NotSend>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: generator is not `Send` as this value is used across a yield
|
note: generator is not `Send` as this value is used across a yield
|
||||||
--> $DIR/generator-print-verbose-2.rs:30:9
|
--> $DIR/generator-print-verbose-2.rs:30:9
|
||||||
|
|
|
|
||||||
|
|
|
@ -15,7 +15,6 @@ fn main() {
|
||||||
assert_send(move || {
|
assert_send(move || {
|
||||||
//~^ ERROR generator cannot be sent between threads safely
|
//~^ ERROR generator cannot be sent between threads safely
|
||||||
//~| NOTE generator is not `Send`
|
//~| NOTE generator is not `Send`
|
||||||
//~| NOTE consider using `std::sync::Arc
|
|
||||||
yield;
|
yield;
|
||||||
let _x = x;
|
let _x = x;
|
||||||
});
|
});
|
||||||
|
@ -24,7 +23,6 @@ fn main() {
|
||||||
assert_send(move || {
|
assert_send(move || {
|
||||||
//~^ ERROR generator cannot be sent between threads safely
|
//~^ ERROR generator cannot be sent between threads safely
|
||||||
//~| NOTE generator is not `Send`
|
//~| NOTE generator is not `Send`
|
||||||
//~| NOTE consider using `std::sync::Arc
|
|
||||||
yield;
|
yield;
|
||||||
let _y = y;
|
let _y = y;
|
||||||
});
|
});
|
||||||
|
|
|
@ -5,16 +5,14 @@ LL | assert_send(move || {
|
||||||
| _________________^
|
| _________________^
|
||||||
LL | |
|
LL | |
|
||||||
LL | |
|
LL | |
|
||||||
LL | |
|
|
||||||
LL | | yield;
|
LL | | yield;
|
||||||
LL | | let _x = x;
|
LL | | let _x = x;
|
||||||
LL | | });
|
LL | | });
|
||||||
| |_____^ generator is not `Send`
|
| |_____^ generator is not `Send`
|
||||||
|
|
|
|
||||||
= help: the trait `Sync` is not implemented for `*mut ()`
|
= help: the trait `Sync` is not implemented for `*mut ()`
|
||||||
= note: consider using `std::sync::Arc<*mut ()>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: captured value is not `Send` because `&` references cannot be sent unless their referent is `Sync`
|
note: captured value is not `Send` because `&` references cannot be sent unless their referent is `Sync`
|
||||||
--> $DIR/ref-upvar-not-send.rs:20:18
|
--> $DIR/ref-upvar-not-send.rs:19:18
|
||||||
|
|
|
|
||||||
LL | let _x = x;
|
LL | let _x = x;
|
||||||
| ^ has type `&*mut ()` which is not `Send`, because `*mut ()` is not `Sync`
|
| ^ has type `&*mut ()` which is not `Send`, because `*mut ()` is not `Sync`
|
||||||
|
@ -25,22 +23,20 @@ LL | fn assert_send<T: Send>(_: T) {}
|
||||||
| ^^^^ required by this bound in `assert_send`
|
| ^^^^ required by this bound in `assert_send`
|
||||||
|
|
||||||
error: generator cannot be sent between threads safely
|
error: generator cannot be sent between threads safely
|
||||||
--> $DIR/ref-upvar-not-send.rs:24:17
|
--> $DIR/ref-upvar-not-send.rs:23:17
|
||||||
|
|
|
|
||||||
LL | assert_send(move || {
|
LL | assert_send(move || {
|
||||||
| _________________^
|
| _________________^
|
||||||
LL | |
|
LL | |
|
||||||
LL | |
|
LL | |
|
||||||
LL | |
|
|
||||||
LL | | yield;
|
LL | | yield;
|
||||||
LL | | let _y = y;
|
LL | | let _y = y;
|
||||||
LL | | });
|
LL | | });
|
||||||
| |_____^ generator is not `Send`
|
| |_____^ generator is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `[generator@$DIR/ref-upvar-not-send.rs:24:17: 24:24]`, the trait `Send` is not implemented for `*mut ()`
|
= help: within `[generator@$DIR/ref-upvar-not-send.rs:23:17: 23:24]`, the trait `Send` is not implemented for `*mut ()`
|
||||||
= note: consider using `std::sync::Arc<*mut ()>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
|
||||||
note: captured value is not `Send` because `&mut` references cannot be sent unless their referent is `Send`
|
note: captured value is not `Send` because `&mut` references cannot be sent unless their referent is `Send`
|
||||||
--> $DIR/ref-upvar-not-send.rs:29:18
|
--> $DIR/ref-upvar-not-send.rs:27:18
|
||||||
|
|
|
|
||||||
LL | let _y = y;
|
LL | let _y = y;
|
||||||
| ^ has type `&mut *mut ()` which is not `Send`, because `*mut ()` is not `Send`
|
| ^ has type `&mut *mut ()` which is not `Send`, because `*mut ()` is not `Send`
|
||||||
|
|
|
@ -12,7 +12,6 @@ fn cycle1() -> impl Clone {
|
||||||
//~^ ERROR cycle detected
|
//~^ ERROR cycle detected
|
||||||
//~| ERROR cycle detected
|
//~| ERROR cycle detected
|
||||||
send(cycle2().clone());
|
send(cycle2().clone());
|
||||||
//~^ ERROR: cannot check whether the hidden type of opaque type satisfies auto traits
|
|
||||||
|
|
||||||
Rc::new(Cell::new(5))
|
Rc::new(Cell::new(5))
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue