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::Direct(_) => arg.layout.immediate_gcc_type(cx),
|
||||
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, 1, 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));
|
||||
continue;
|
||||
}
|
||||
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 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);
|
||||
scalar_load_metadata(self, load, scalar);
|
||||
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 rustc_middle::bug;
|
||||
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_target::abi::{self, Abi, Align, F32, F64, FieldsShape, Int, Integer, Pointer, PointeeInfo, Size, TyAbiInterface, Variants};
|
||||
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(..) => {
|
||||
return cx.type_struct(
|
||||
&[
|
||||
layout.scalar_pair_element_gcc_type(cx, 0, false),
|
||||
layout.scalar_pair_element_gcc_type(cx, 1, false),
|
||||
layout.scalar_pair_element_gcc_type(cx, 0),
|
||||
layout.scalar_pair_element_gcc_type(cx, 1),
|
||||
],
|
||||
false,
|
||||
);
|
||||
|
@ -150,7 +150,7 @@ pub trait LayoutGccExt<'tcx> {
|
|||
fn 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_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 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
|
||||
/// that field and ensuring the struct has the right alignment.
|
||||
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 {
|
||||
// Use a different cache for scalars because pointers to DSTs
|
||||
// can be either fat or thin (data pointers of fat pointers).
|
||||
if let Some(&ty) = cx.scalar_types.borrow().get(&self.ty) {
|
||||
return ty;
|
||||
}
|
||||
let ty =
|
||||
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),
|
||||
};
|
||||
let ty = self.scalar_gcc_type_at(cx, scalar, Size::ZERO);
|
||||
cx.scalar_types.borrow_mut().insert(self.ty, 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> {
|
||||
// TODO(antoyo): remove llvm hack:
|
||||
// HACK(eddyb) special-case fat pointers until LLVM removes
|
||||
// pointee types, to avoid bitcasting every `OperandRef::deref`.
|
||||
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);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
fn scalar_pair_element_gcc_type<'gcc>(&self, cx: &CodegenCx<'gcc, 'tcx>, index: usize) -> 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.
|
||||
let (a, b) = match self.abi {
|
||||
Abi::ScalarPair(ref a, ref b) => (a, b),
|
||||
_ => 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)
|
||||
}
|
||||
|
||||
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)
|
||||
fn scalar_pair_element_backend_type(&self, layout: TyAndLayout<'tcx>, index: usize, _immediate: bool) -> Type<'gcc> {
|
||||
layout.scalar_pair_element_gcc_type(self, index)
|
||||
}
|
||||
|
||||
fn cast_backend_type(&self, ty: &CastTarget) -> Type<'gcc> {
|
||||
|
|
|
@ -3,7 +3,7 @@ use crate::context::TypeLowering;
|
|||
use crate::type_::Type;
|
||||
use rustc_codegen_ssa::traits::*;
|
||||
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::{self, Ty, TypeVisitableExt};
|
||||
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
|
||||
/// that field and ensuring the struct has the right alignment.
|
||||
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 {
|
||||
// Use a different cache for scalars because pointers to DSTs
|
||||
// can be either fat or thin (data pointers of fat pointers).
|
||||
if let Some(&llty) = cx.scalar_lltypes.borrow().get(&self.ty) {
|
||||
return llty;
|
||||
}
|
||||
let llty = match *self.ty.kind() {
|
||||
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),
|
||||
};
|
||||
let llty = self.scalar_llvm_type_at(cx, scalar);
|
||||
cx.scalar_lltypes.borrow_mut().insert(self.ty, llty);
|
||||
return llty;
|
||||
}
|
||||
|
@ -303,27 +299,9 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyAndLayout<'tcx> {
|
|||
index: usize,
|
||||
immediate: bool,
|
||||
) -> &'a Type {
|
||||
// HACK(eddyb) special-case fat pointers until LLVM removes
|
||||
// pointee types, to avoid bitcasting every `OperandRef::deref`.
|
||||
match *self.ty.kind() {
|
||||
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);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
// 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.
|
||||
let Abi::ScalarPair(a, b) = self.abi else {
|
||||
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::spec::abi::Abi;
|
||||
|
||||
use crate::util::is_within_packed;
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||
enum EdgeKind {
|
||||
Unwind,
|
||||
|
@ -93,6 +95,7 @@ impl<'tcx> MirPass<'tcx> for Validator {
|
|||
cfg_checker.visit_body(body);
|
||||
cfg_checker.check_cleanup_control_flow();
|
||||
|
||||
// Also run the TypeChecker.
|
||||
for (location, msg) in validate_types(tcx, self.mir_phase, param_env, body) {
|
||||
cfg_checker.fail(location, msg);
|
||||
}
|
||||
|
@ -427,14 +430,34 @@ impl<'a, 'tcx> Visitor<'tcx> for CfgChecker<'a, 'tcx> {
|
|||
self.check_unwind_edge(location, *unwind);
|
||||
|
||||
// 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.
|
||||
// Currently this simply checks for duplicate places.
|
||||
// passed by a reference to the callee. Consequently they must be non-overlapping
|
||||
// and cannot be packed. Currently this simply checks for duplicate places.
|
||||
self.place_cache.clear();
|
||||
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;
|
||||
for arg in args {
|
||||
if let Operand::Move(place) = arg {
|
||||
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(
|
||||
location,
|
||||
format!(
|
||||
"encountered overlapping memory in `Call` terminator: {:?}",
|
||||
"encountered overlapping memory in `Move` arguments to `Call` terminator: {:?}",
|
||||
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>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
mir_phase: MirPhase,
|
||||
|
|
|
@ -34,6 +34,7 @@ where
|
|||
false
|
||||
}
|
||||
_ => {
|
||||
// We cannot figure out the layout. Conservatively assume that this is disaligned.
|
||||
debug!("is_disaligned({:?}) - true", place);
|
||||
true
|
||||
}
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
//! the field `next_edge`). Each of those fields is an array that should
|
||||
//! be indexed by the direction (see the type `Direction`).
|
||||
|
||||
use crate::snapshot_vec::{SnapshotVec, SnapshotVecDelegate};
|
||||
use rustc_index::bit_set::BitSet;
|
||||
use std::fmt::Debug;
|
||||
|
||||
|
@ -28,8 +27,8 @@ use std::fmt::Debug;
|
|||
mod tests;
|
||||
|
||||
pub struct Graph<N, E> {
|
||||
nodes: SnapshotVec<Node<N>>,
|
||||
edges: SnapshotVec<Edge<E>>,
|
||||
nodes: Vec<Node<N>>,
|
||||
edges: Vec<Edge<E>>,
|
||||
}
|
||||
|
||||
pub struct Node<N> {
|
||||
|
@ -45,20 +44,6 @@ pub struct Edge<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)]
|
||||
pub struct NodeIndex(pub usize);
|
||||
|
||||
|
@ -86,11 +71,11 @@ impl NodeIndex {
|
|||
|
||||
impl<N: Debug, E: Debug> 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> {
|
||||
Graph { nodes: SnapshotVec::with_capacity(nodes), edges: SnapshotVec::with_capacity(edges) }
|
||||
Graph { nodes: Vec::with_capacity(nodes), edges: Vec::with_capacity(edges) }
|
||||
}
|
||||
|
||||
// # Simple accessors
|
||||
|
|
|
@ -56,6 +56,7 @@ pub fn provide(providers: &mut Providers) {
|
|||
resolve_bound_vars::provide(providers);
|
||||
*providers = Providers {
|
||||
type_of: type_of::type_of,
|
||||
type_of_opaque: type_of::type_of_opaque,
|
||||
item_bounds: item_bounds::item_bounds,
|
||||
explicit_item_bounds: item_bounds::explicit_item_bounds,
|
||||
generics_of: generics_of::generics_of,
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
use rustc_errors::{Applicability, StashKey};
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def_id::LocalDefId;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_hir::HirId;
|
||||
use rustc_middle::query::plumbing::CyclePlaceholder;
|
||||
use rustc_middle::ty::print::with_forced_trimmed_paths;
|
||||
use rustc_middle::ty::util::IntTypeExt;
|
||||
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) => {
|
||||
match item.kind {
|
||||
Node::Item(item) => match item.kind {
|
||||
ItemKind::Static(ty, .., body_id) => {
|
||||
if is_suggestable_infer_ty(ty) {
|
||||
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) => {
|
||||
if is_suggestable_infer_ty(ty) {
|
||||
infer_placeholder_type(
|
||||
tcx, def_id, body_id, ty.span, item.ident, "constant",
|
||||
)
|
||||
infer_placeholder_type(tcx, def_id, body_id, ty.span, item.ident, "constant")
|
||||
} else {
|
||||
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::Impl(hir::Impl { self_ty, .. }) => match self_ty.find_self_aliases() {
|
||||
spans if spans.len() > 0 => {
|
||||
let guar = tcx.sess.emit_err(crate::errors::SelfInImplSelf {
|
||||
span: spans.into(),
|
||||
note: (),
|
||||
});
|
||||
let guar = tcx
|
||||
.sess
|
||||
.emit_err(crate::errors::SelfInImplSelf { span: spans.into(), note: () });
|
||||
Ty::new_error(tcx, guar)
|
||||
}
|
||||
_ => 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);
|
||||
Ty::new_adt(tcx, def, args)
|
||||
}
|
||||
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)
|
||||
}
|
||||
ItemKind::OpaqueTy(..) => tcx.type_of_opaque(def_id).map_or_else(
|
||||
|CyclePlaceholder(guar)| Ty::new_error(tcx, guar),
|
||||
|ty| ty.instantiate_identity(),
|
||||
),
|
||||
ItemKind::Trait(..)
|
||||
| ItemKind::TraitAlias(..)
|
||||
| ItemKind::Macro(..)
|
||||
|
@ -460,14 +442,9 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Ty
|
|||
| ItemKind::GlobalAsm(..)
|
||||
| ItemKind::ExternCrate(..)
|
||||
| ItemKind::Use(..) => {
|
||||
span_bug!(
|
||||
item.span,
|
||||
"compute_type_of_item: unexpected item type: {:?}",
|
||||
item.kind
|
||||
);
|
||||
}
|
||||
}
|
||||
span_bug!(item.span, "compute_type_of_item: unexpected item type: {:?}", item.kind);
|
||||
}
|
||||
},
|
||||
|
||||
Node::ForeignItem(foreign_item) => match foreign_item.kind {
|
||||
ForeignItemKind::Fn(..) => {
|
||||
|
@ -514,6 +491,51 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Ty
|
|||
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>(
|
||||
tcx: TyCtxt<'a>,
|
||||
def_id: LocalDefId,
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use crate::mir;
|
||||
use crate::query::CyclePlaceholder;
|
||||
use crate::traits;
|
||||
use crate::ty::{self, Ty};
|
||||
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>>()];
|
||||
}
|
||||
|
||||
impl EraseType for Result<ty::EarlyBinder<Ty<'_>>, CyclePlaceholder> {
|
||||
type Result = [u8; size_of::<Result<ty::EarlyBinder<Ty<'_>>, CyclePlaceholder>>()];
|
||||
}
|
||||
|
||||
impl<T> EraseType for Option<&'_ T> {
|
||||
type Result = [u8; size_of::<Option<&'static ()>>()];
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ use crate::mir::interpret::{
|
|||
use crate::mir::interpret::{LitToConstError, LitToConstInput};
|
||||
use crate::mir::mono::CodegenUnit;
|
||||
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::traits::query::{
|
||||
CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal,
|
||||
|
@ -243,6 +243,16 @@ rustc_queries! {
|
|||
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)
|
||||
-> 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;
|
||||
use rustc_query_system::query::*;
|
||||
use rustc_query_system::HandleCycleError;
|
||||
use rustc_span::{Span, DUMMY_SP};
|
||||
use rustc_span::{ErrorGuaranteed, Span, DUMMY_SP};
|
||||
use std::ops::Deref;
|
||||
|
||||
pub struct QueryKeyStringCache {
|
||||
|
@ -52,7 +52,8 @@ pub struct DynamicQuery<'tcx, C: QueryCache> {
|
|||
pub loadable_from_disk:
|
||||
fn(tcx: TyCtxt<'tcx>, key: &C::Key, index: SerializedDepNodeIndex) -> bool,
|
||||
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,
|
||||
}
|
||||
|
||||
|
@ -629,3 +630,6 @@ impl<'tcx> TyCtxtAt<'tcx> {
|
|||
.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::query::plumbing::CyclePlaceholder;
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_errors::{pluralize, struct_span_err, Applicability, MultiSpan};
|
||||
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::Value;
|
||||
use rustc_span::def_id::LocalDefId;
|
||||
use rustc_span::Span;
|
||||
use rustc_span::{ErrorGuaranteed, Span};
|
||||
|
||||
use std::fmt::Write;
|
||||
|
||||
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>`.
|
||||
// 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<'_> {
|
||||
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>`.
|
||||
// FIXME: Represent the above fact in the trait system somehow.
|
||||
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<'_>> {
|
||||
fn from_cycle_error(tcx: TyCtxt<'tcx>, stack: &[QueryInfo<DepKind>]) -> Self {
|
||||
let err = Ty::new_misc_error(tcx);
|
||||
fn from_cycle_error(
|
||||
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)
|
||||
&& 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 {
|
||||
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 representable_ids = FxHashSet::default();
|
||||
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<'_>> {
|
||||
fn from_cycle_error(tcx: TyCtxt<'tcx>, cycle: &[QueryInfo<DepKind>]) -> Self {
|
||||
ty::EarlyBinder::bind(Ty::from_cycle_error(tcx, cycle))
|
||||
fn from_cycle_error(
|
||||
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<'_>>> {
|
||||
fn from_cycle_error(tcx: TyCtxt<'tcx>, cycle: &[QueryInfo<DepKind>]) -> Self {
|
||||
ty::EarlyBinder::bind(ty::Binder::from_cycle_error(tcx, cycle))
|
||||
fn from_cycle_error(
|
||||
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<'_>> {
|
||||
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
|
||||
// min_specialization. Since this is an error path anyways, leaking doesn't matter (and really,
|
||||
// tcx.arena.alloc is pretty much equal to leaking).
|
||||
// FIXME: `Cycle` should carry the ErrorGuaranteed
|
||||
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::Value;
|
||||
use rustc_span::Span;
|
||||
use rustc_span::{ErrorGuaranteed, Span};
|
||||
|
||||
#[macro_use]
|
||||
mod plumbing;
|
||||
|
@ -146,8 +146,9 @@ where
|
|||
self,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
cycle: &[QueryInfo<DepKind>],
|
||||
guar: ErrorGuaranteed,
|
||||
) -> Self::Value {
|
||||
(self.dynamic.value_from_cycle_error)(tcx, cycle)
|
||||
(self.dynamic.value_from_cycle_error)(tcx, cycle, guar)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
|
|
|
@ -605,8 +605,8 @@ macro_rules! define_queries {
|
|||
} {
|
||||
|_tcx, _key, _prev_index, _index| None
|
||||
}),
|
||||
value_from_cycle_error: |tcx, cycle| {
|
||||
let result: queries::$name::Value<'tcx> = 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, guar);
|
||||
erase(result)
|
||||
},
|
||||
loadable_from_disk: |_tcx, _key, _index| {
|
||||
|
|
|
@ -8,6 +8,7 @@ use crate::query::DepNodeIndex;
|
|||
use crate::query::{QueryContext, QueryInfo, QueryState};
|
||||
|
||||
use rustc_data_structures::fingerprint::Fingerprint;
|
||||
use rustc_span::ErrorGuaranteed;
|
||||
use std::fmt::Debug;
|
||||
use std::hash::Hash;
|
||||
|
||||
|
@ -57,6 +58,7 @@ pub trait QueryConfig<Qcx: QueryContext>: Copy {
|
|||
self,
|
||||
tcx: Qcx::DepContext,
|
||||
cycle: &[QueryInfo<Qcx::DepKind>],
|
||||
guar: ErrorGuaranteed,
|
||||
) -> Self::Value;
|
||||
|
||||
fn anon(self) -> bool;
|
||||
|
|
|
@ -148,8 +148,8 @@ where
|
|||
use HandleCycleError::*;
|
||||
match query.handle_cycle_error() {
|
||||
Error => {
|
||||
error.emit();
|
||||
query.value_from_cycle_error(*qcx.dep_context(), &cycle_error.cycle)
|
||||
let guar = error.emit();
|
||||
query.value_from_cycle_error(*qcx.dep_context(), &cycle_error.cycle, guar)
|
||||
}
|
||||
Fatal => {
|
||||
error.emit();
|
||||
|
@ -157,8 +157,8 @@ where
|
|||
unreachable!()
|
||||
}
|
||||
DelayBug => {
|
||||
error.delay_as_bug();
|
||||
query.value_from_cycle_error(*qcx.dep_context(), &cycle_error.cycle)
|
||||
let guar = error.delay_as_bug();
|
||||
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::query::QueryInfo;
|
||||
|
||||
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 {
|
||||
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();
|
||||
// Ideally we would use `bug!` here. But bug! is only defined in rustc_middle, and it's
|
||||
// non-trivial to define it earlier.
|
||||
|
|
|
@ -2743,12 +2743,6 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
|||
}
|
||||
ObligationCauseCode::BindingObligation(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 short_item_name = with_forced_trimmed_paths!(tcx.def_path_str(item_def_id));
|
||||
let mut multispan = MultiSpan::from(span);
|
||||
|
|
|
@ -2346,14 +2346,15 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
|
|||
}
|
||||
|
||||
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,
|
||||
// which enforces a DAG between the functions requiring
|
||||
// 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 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());
|
||||
w.push('<');
|
||||
w.push_str(
|
||||
&args
|
||||
.iter()
|
||||
.map(|k| k.to_string())
|
||||
.filter(|k| k != "'_")
|
||||
.collect::<Vec<_>>()
|
||||
.join(", "),
|
||||
);
|
||||
w.push_str(&arg_names.join(", "));
|
||||
w.push('>');
|
||||
}
|
||||
|
||||
|
|
|
@ -79,10 +79,12 @@ macro_rules! vec {
|
|||
///
|
||||
/// 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.
|
||||
///
|
||||
/// Additional parameters passed to `format!` replace the `{}`s within the
|
||||
/// 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.
|
||||
/// 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
|
||||
/// will use the [`Display`] formatting trait.
|
||||
///
|
||||
/// [`std::fmt`]: ../std/fmt/index.html
|
||||
/// [`print!`]: ../std/macro.print.html
|
||||
/// [`write!`]: core::write
|
||||
/// [`to_string`]: crate::string::ToString
|
||||
|
|
|
@ -849,7 +849,8 @@ pub(crate) mod builtin {
|
|||
/// 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
|
||||
/// [`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
|
||||
`panic!` when they are set to [`None`] or [`Err`] variants.
|
||||
|
||||
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
|
||||
When using `panic!()` you can specify a string payload that is built using
|
||||
[formatting syntax]. That payload is used when injecting the panic into
|
||||
the calling Rust thread, causing the thread to panic entirely.
|
||||
|
||||
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()`].
|
||||
Inside the hook a panic can be accessed as a `&dyn Any + Send`,
|
||||
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.
|
||||
|
||||
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
|
||||
[`Box`]: ../std/boxed/struct.Box.html
|
||||
[`Any`]: crate::any::Any
|
||||
[`format!`]: ../std/macro.format.html
|
||||
[`format!` syntax]: ../std/fmt/index.html
|
||||
[book]: ../book/ch09-00-error-handling.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
|
||||
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
|
||||
|
||||
```should_panic
|
||||
|
|
|
@ -76,12 +76,8 @@ macro marker_impls {
|
|||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[cfg_attr(not(test), rustc_diagnostic_item = "Send")]
|
||||
#[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",
|
||||
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>"
|
||||
label = "`{Self}` cannot be sent between threads safely"
|
||||
)]
|
||||
pub unsafe auto trait Send {
|
||||
// empty.
|
||||
|
@ -632,12 +628,8 @@ impl<T: ?Sized> Copy for &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",
|
||||
),
|
||||
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",
|
||||
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>"
|
||||
label = "`{Self}` cannot be shared between threads safely"
|
||||
)]
|
||||
pub unsafe auto trait Sync {
|
||||
// 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
|
||||
/// [`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
|
||||
/// [`println!`]: crate::println
|
||||
/// [`eprint!`]: crate::eprint
|
||||
|
@ -103,6 +106,9 @@ macro_rules! print {
|
|||
/// Use `println!` only for the primary output of your program. Use
|
||||
/// [`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
|
||||
/// [`eprintln!`]: crate::eprintln
|
||||
/// [lock]: crate::io::Stdout
|
||||
|
@ -150,6 +156,9 @@ macro_rules! println {
|
|||
/// [`io::stderr`]: crate::io::stderr
|
||||
/// [`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 if writing to `io::stderr` fails.
|
||||
|
@ -181,6 +190,9 @@ macro_rules! eprint {
|
|||
/// Use `eprintln!` only for error and progress messages. Use `println!`
|
||||
/// 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::stdout`]: crate::io::stdout
|
||||
/// [`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
|
||||
|
|
||||
= 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
|
||||
|
|
||||
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
|
||||
|
|
||||
= 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
|
||||
|
|
||||
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`
|
||||
|
|
||||
= 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`
|
||||
--> $DIR/basic.rs:13:5
|
||||
|
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | is_send(foo(Some(true)));
|
|||
| ^^^^^^^^^^^^^^^ future returned by `foo` is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $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
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/async-fn-nonsend.rs:63:15
|
||||
|
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_send(agent.handle());
|
|||
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/field-assign-nonsend.rs:23:39
|
||||
|
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_send(agent.handle());
|
|||
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/field-assign-nonsend.rs:23:39
|
||||
|
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_send(agent.handle());
|
|||
| ^^^^^^^^^^^^^^ future returned by `handle` is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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`
|
||||
--> $DIR/missing-send-bound.rs:10:5
|
||||
|
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | is_sync(bar());
|
|||
| ^^^^^ future returned by `bar` is not `Sync`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/issue-64130-1-sync.rs:18:11
|
||||
|
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | is_sync(bar());
|
|||
| ^^^^^ future returned by `bar` is not `Sync`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/issue-64130-1-sync.rs:18:11
|
||||
|
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | is_sync(bar());
|
|||
| ^^^^^ future returned by `bar` is not `Sync`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/issue-64130-4-async-move.rs:27:23
|
||||
|
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | is_send(foo());
|
|||
| ^^^^^ future returned by `foo` is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/issue-64130-non-send-future-diags.rs:17:11
|
||||
|
|
||||
|
|
|
@ -10,7 +10,6 @@ LL | | });
|
|||
| |_____^ 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 ()`
|
||||
= 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
|
||||
--> $DIR/issue-67252-unnamed-future.rs:23:17
|
||||
|
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | spawn(async {
|
|||
| ^^^^^ 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 ()`
|
||||
= 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
|
||||
--> $DIR/issue-67252-unnamed-future.rs:23:17
|
||||
|
|
||||
|
|
|
@ -10,7 +10,6 @@ LL | | });
|
|||
| |_____^ 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 ()`
|
||||
= 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
|
||||
--> $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 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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`
|
||||
--> $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 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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`
|
||||
--> $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 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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`
|
||||
--> $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
|
||||
|
|
||||
= 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 ()>`
|
||||
--> $SRC_DIR/core/src/marker.rs:LL:COL
|
||||
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
|
||||
|
|
||||
= 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 ()>`
|
||||
--> $SRC_DIR/core/src/marker.rs:LL:COL
|
||||
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`
|
||||
|
|
||||
= 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
|
||||
--> $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`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/issue-71137.rs:14:26
|
||||
|
|
||||
|
|
|
@ -8,7 +8,6 @@ LL | | }
|
|||
LL | | )
|
||||
| |_____________^ 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`
|
||||
--> $DIR/issue-86507.rs:22:29
|
||||
|
|
||||
|
|
|
@ -8,7 +8,6 @@ LL | | }
|
|||
LL | | )
|
||||
| |_____________^ 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`
|
||||
--> $DIR/issue-86507.rs:22:29
|
||||
|
|
||||
|
|
|
@ -8,7 +8,6 @@ LL | | }
|
|||
LL | | )
|
||||
| |_____________^ 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`
|
||||
--> $DIR/issue-86507.rs:22:29
|
||||
|
|
||||
|
|
|
@ -9,7 +9,6 @@ LL | | })
|
|||
| |_____^ 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`
|
||||
= 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
|
||||
--> $DIR/issue-65436-raw-ptr-not-send.rs:19:36
|
||||
|
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | g(issue_67893::run())
|
|||
| ^^^^^^^^^^^^^^^^^^ future is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/auxiliary/issue_67893.rs:12:27
|
||||
|
|
||||
|
|
|
@ -10,11 +10,10 @@ LL | async fn foo() {
|
|||
| - within this `impl Future<Output = ()>`
|
||||
|
|
||||
= 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 captures the following types: `ResumeTy`, `(NotSend,)`, `()`, `impl Future<Output = ()>`
|
||||
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() {
|
||||
| ________________^
|
||||
|
@ -26,7 +25,7 @@ LL | | bar().await;
|
|||
LL | | }
|
||||
| |_^
|
||||
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) {
|
||||
| ^^^^ required by this bound in `gimme_send`
|
||||
|
|
|
@ -10,11 +10,10 @@ LL | async fn foo() {
|
|||
| - within this `impl Future<Output = ()>`
|
||||
|
|
||||
= 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 captures the following types: `ResumeTy`, `(NotSend,)`, `impl Future<Output = ()>`, `()`
|
||||
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() {
|
||||
| ________________^
|
||||
|
@ -26,7 +25,7 @@ LL | | bar().await;
|
|||
LL | | }
|
||||
| |_^
|
||||
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) {
|
||||
| ^^^^ required by this bound in `gimme_send`
|
||||
|
|
|
@ -12,7 +12,6 @@ fn main() {
|
|||
//~| NOTE bound introduced by
|
||||
//~| NOTE appears within the type
|
||||
//~| NOTE captures the following types
|
||||
//~| NOTE consider using `std::sync::Arc<NotSend>`
|
||||
}
|
||||
|
||||
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
|
||||
|
|
||||
= 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`
|
||||
--> $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,) { }
|
||||
| ^^^^ `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 by a bound in `Foo`
|
||||
--> $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) { }
|
||||
| ^^^^^ `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 by a bound in `Foo`
|
||||
--> $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> { }
|
||||
| ^^^^ `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>`
|
||||
--> $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
|
||||
|
|
||||
= 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`
|
||||
--> $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 { }
|
||||
| ^ `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`
|
||||
--> $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 {
|
||||
| ^^^^ `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`
|
||||
--> $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
|
||||
|
|
||||
= 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`
|
||||
--> $DIR/closure-bounds-subtype.rs:4:50
|
||||
|
|
||||
|
|
|
@ -11,7 +11,6 @@ LL | | });
|
|||
| |_____^ `std::sync::mpsc::Receiver<()>` cannot be shared between threads safely
|
||||
|
|
||||
= 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 because it's used within this closure
|
||||
--> $DIR/closure-move-sync.rs:6:27
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | is_send::<Foo>();
|
|||
| ^^^ `*const u8` cannot be sent between threads safely
|
||||
|
|
||||
= 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`
|
||||
--> $DIR/E0277-2.rs:9:8
|
||||
|
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_send::<Foo>()
|
|||
| ^^^ `Foo` cannot be sent between threads safely
|
||||
|
|
||||
= 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`
|
||||
--> $DIR/extern-type-diag-not-similar.rs:17:19
|
||||
|
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_sync::<A>();
|
|||
| ^ `A` cannot be shared between threads safely
|
||||
|
|
||||
= 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`
|
||||
--> $DIR/extern-types-not-sync-send.rs:9:28
|
||||
|
|
||||
|
@ -19,7 +18,6 @@ LL | assert_send::<A>();
|
|||
| ^ `A` cannot be sent between threads safely
|
||||
|
|
||||
= 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`
|
||||
--> $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
|
||||
|
|
||||
= 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 `Argument<'_>`
|
||||
--> $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
|
||||
|
|
||||
= 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 `Argument<'_>`
|
||||
--> $SRC_DIR/core/src/fmt/rt.rs:LL:COL
|
||||
|
|
|
@ -14,7 +14,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -57,7 +56,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -100,7 +98,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||
|
|
||||
|
|
|
@ -14,7 +14,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -55,7 +54,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -96,7 +94,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||
|
|
||||
|
|
|
@ -14,7 +14,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -57,7 +56,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/drop-tracking-parent-expression.rs:38:22
|
||||
|
|
||||
|
@ -99,7 +97,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -142,7 +139,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/drop-tracking-parent-expression.rs:38:22
|
||||
|
|
||||
|
@ -184,7 +180,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -227,7 +222,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/drop-tracking-parent-expression.rs:38:22
|
||||
|
|
||||
|
@ -269,7 +263,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/drop-tracking-parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -312,7 +305,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/drop-tracking-parent-expression.rs:38:22
|
||||
|
|
||||
|
|
|
@ -11,7 +11,6 @@ LL | | })
|
|||
| |_____^ generator is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/drop-yield-twice.rs:9:9
|
||||
|
|
||||
|
|
|
@ -14,7 +14,6 @@ LL | | );
|
|||
| |_____- in this macro invocation
|
||||
|
|
||||
= 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
|
||||
--> $DIR/issue-57017.rs:30:28
|
||||
|
|
||||
|
@ -56,7 +55,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/issue-57017.rs:42:28
|
||||
|
|
||||
|
@ -98,7 +96,6 @@ LL | | );
|
|||
| |_____- in this macro invocation
|
||||
|
|
||||
= 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
|
||||
--> $DIR/issue-57017.rs:30:28
|
||||
|
|
||||
|
@ -140,7 +137,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/issue-57017.rs:42:28
|
||||
|
|
||||
|
@ -182,7 +178,6 @@ LL | | );
|
|||
| |_____- in this macro invocation
|
||||
|
|
||||
= 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
|
||||
--> $DIR/issue-57017.rs:30:28
|
||||
|
|
||||
|
@ -224,7 +219,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/issue-57017.rs:42:28
|
||||
|
|
||||
|
|
|
@ -11,7 +11,6 @@ LL | | })
|
|||
| |_____^ generator is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/issue-57478.rs:17:9
|
||||
|
|
||||
|
|
|
@ -24,6 +24,5 @@ fn main() {
|
|||
type F = impl Future;
|
||||
// Check that statics are inhabited computes they layout.
|
||||
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());
|
||||
}
|
||||
|
|
|
@ -4,24 +4,6 @@ error[E0425]: cannot find value `Foo` in this scope
|
|||
LL | let a = Foo;
|
||||
| ^^^ not found in this scope
|
||||
|
||||
error: cannot check whether the hidden type of `layout_error[b009]::main::F::{opaque#0}` satisfies auto traits
|
||||
--> $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
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0425`.
|
||||
|
|
|
@ -11,7 +11,6 @@ LL | | });
|
|||
| |_____^ generator is not `Sync`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/not-send-sync.rs:20:9
|
||||
|
|
||||
|
@ -41,7 +40,6 @@ LL | | });
|
|||
| |_____^ generator is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/not-send-sync.rs:27:9
|
||||
|
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_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`
|
||||
= 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
|
||||
--> $DIR/not-send-sync.rs:20:9
|
||||
|
|
||||
|
@ -26,7 +25,6 @@ LL | assert_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`
|
||||
= 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
|
||||
--> $DIR/not-send-sync.rs:27:9
|
||||
|
|
||||
|
|
|
@ -11,7 +11,6 @@ LL | | });
|
|||
| |_____^ generator is not `Sync`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/not-send-sync.rs:20:9
|
||||
|
|
||||
|
@ -41,7 +40,6 @@ LL | | });
|
|||
| |_____^ generator is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/not-send-sync.rs:27:9
|
||||
|
|
||||
|
|
|
@ -14,7 +14,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -57,7 +56,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -100,7 +98,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/parent-expression.rs:25:22
|
||||
|
|
||||
|
|
|
@ -14,7 +14,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -55,7 +54,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -96,7 +94,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/parent-expression.rs:25:22
|
||||
|
|
||||
|
|
|
@ -14,7 +14,6 @@ LL | | );
|
|||
| |_____- in this macro invocation
|
||||
|
|
||||
= 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
|
||||
--> $DIR/parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -57,7 +56,6 @@ LL | | );
|
|||
| |_____- in this macro invocation
|
||||
|
|
||||
= 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
|
||||
--> $DIR/parent-expression.rs:38:22
|
||||
|
|
||||
|
@ -99,7 +97,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -142,7 +139,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/parent-expression.rs:38:22
|
||||
|
|
||||
|
@ -184,7 +180,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -227,7 +222,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/parent-expression.rs:38:22
|
||||
|
|
||||
|
@ -269,7 +263,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/parent-expression.rs:25:22
|
||||
|
|
||||
|
@ -312,7 +305,6 @@ LL | | );
|
|||
| |_____- 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`
|
||||
= 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
|
||||
--> $DIR/parent-expression.rs:38:22
|
||||
|
|
||||
|
|
|
@ -11,7 +11,6 @@ LL | | });
|
|||
| |_____^ generator is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/partial-drop.rs:21:9
|
||||
|
|
||||
|
@ -42,7 +41,6 @@ LL | | });
|
|||
| |_____^ generator is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/partial-drop.rs:29:9
|
||||
|
|
||||
|
|
|
@ -11,7 +11,6 @@ LL | | });
|
|||
| |_____^ generator is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/partial-drop.rs:21:9
|
||||
|
|
||||
|
@ -42,7 +41,6 @@ LL | | });
|
|||
| |_____^ generator is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/partial-drop.rs:29:9
|
||||
|
|
||||
|
|
|
@ -11,7 +11,6 @@ LL | | });
|
|||
| |_____^ generator is not `Sync`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/generator-print-verbose-2.rs:23:9
|
||||
|
|
||||
|
@ -41,7 +40,6 @@ LL | | });
|
|||
| |_____^ generator is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/generator-print-verbose-2.rs:30:9
|
||||
|
|
||||
|
|
|
@ -5,7 +5,6 @@ LL | assert_sync(|| {
|
|||
| ^^^^^^^^^^^ generator is not `Sync`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/generator-print-verbose-2.rs:23:9
|
||||
|
|
||||
|
@ -26,7 +25,6 @@ LL | assert_send(|| {
|
|||
| ^^^^^^^^^^^ generator is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/generator-print-verbose-2.rs:30:9
|
||||
|
|
||||
|
|
|
@ -11,7 +11,6 @@ LL | | });
|
|||
| |_____^ generator is not `Sync`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/generator-print-verbose-2.rs:23:9
|
||||
|
|
||||
|
@ -41,7 +40,6 @@ LL | | });
|
|||
| |_____^ generator is not `Send`
|
||||
|
|
||||
= 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
|
||||
--> $DIR/generator-print-verbose-2.rs:30:9
|
||||
|
|
||||
|
|
|
@ -15,7 +15,6 @@ fn main() {
|
|||
assert_send(move || {
|
||||
//~^ ERROR generator cannot be sent between threads safely
|
||||
//~| NOTE generator is not `Send`
|
||||
//~| NOTE consider using `std::sync::Arc
|
||||
yield;
|
||||
let _x = x;
|
||||
});
|
||||
|
@ -24,7 +23,6 @@ fn main() {
|
|||
assert_send(move || {
|
||||
//~^ ERROR generator cannot be sent between threads safely
|
||||
//~| NOTE generator is not `Send`
|
||||
//~| NOTE consider using `std::sync::Arc
|
||||
yield;
|
||||
let _y = y;
|
||||
});
|
||||
|
|
|
@ -5,16 +5,14 @@ LL | assert_send(move || {
|
|||
| _________________^
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | yield;
|
||||
LL | | let _x = x;
|
||||
LL | | });
|
||||
| |_____^ generator is not `Send`
|
||||
|
|
||||
= 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`
|
||||
--> $DIR/ref-upvar-not-send.rs:20:18
|
||||
--> $DIR/ref-upvar-not-send.rs:19:18
|
||||
|
|
||||
LL | let _x = x;
|
||||
| ^ 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`
|
||||
|
||||
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 | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | yield;
|
||||
LL | | let _y = y;
|
||||
LL | | });
|
||||
| |_____^ 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 ()`
|
||||
= note: consider using `std::sync::Arc<*mut ()>`; for more information visit <https://doc.rust-lang.org/book/ch16-03-shared-state.html>
|
||||
= help: within `[generator@$DIR/ref-upvar-not-send.rs:23:17: 23:24]`, the trait `Send` is not implemented for `*mut ()`
|
||||
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;
|
||||
| ^ 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
|
||||
send(cycle2().clone());
|
||||
//~^ ERROR: cannot check whether the hidden type of opaque type satisfies auto traits
|
||||
|
||||
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