Merge from rustc
This commit is contained in:
commit
3ca49cfe9d
@ -7,7 +7,7 @@ Erroneous code example:
|
||||
|
||||
#[start]
|
||||
fn start(_: isize, _: *const *const u8) -> isize where (): Copy {
|
||||
//^ error: start function is not allowed to have a where clause
|
||||
//^ error: `#[start]` function is not allowed to have a where clause
|
||||
0
|
||||
}
|
||||
```
|
||||
|
@ -151,7 +151,12 @@ impl fmt::Display for DiagnosticLocation {
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Hash, Encodable, Decodable)]
|
||||
pub enum DiagnosticId {
|
||||
Error(String),
|
||||
Lint { name: String, has_future_breakage: bool, is_force_warn: bool },
|
||||
Lint {
|
||||
name: String,
|
||||
/// Indicates whether this lint should show up in cargo's future breakage report.
|
||||
has_future_breakage: bool,
|
||||
is_force_warn: bool,
|
||||
},
|
||||
}
|
||||
|
||||
/// A "sub"-diagnostic attached to a parent diagnostic.
|
||||
@ -301,6 +306,7 @@ impl Diagnostic {
|
||||
}
|
||||
}
|
||||
|
||||
/// Indicates whether this diagnostic should show up in cargo's future breakage report.
|
||||
pub fn has_future_breakage(&self) -> bool {
|
||||
match self.code {
|
||||
Some(DiagnosticId::Lint { has_future_breakage, .. }) => has_future_breakage,
|
||||
|
@ -519,7 +519,7 @@ pub struct HandlerFlags {
|
||||
/// If false, warning-level lints are suppressed.
|
||||
/// (rustc: see `--allow warnings` and `--cap-lints`)
|
||||
pub can_emit_warnings: bool,
|
||||
/// If true, error-level diagnostics are upgraded to bug-level.
|
||||
/// If Some, the Nth error-level diagnostic is upgraded to bug-level.
|
||||
/// (rustc: see `-Z treat-err-as-bug`)
|
||||
pub treat_err_as_bug: Option<NonZeroUsize>,
|
||||
/// If true, immediately emit diagnostics that would otherwise be buffered.
|
||||
@ -1719,19 +1719,17 @@ impl HandlerInner {
|
||||
match (
|
||||
self.err_count() + self.lint_err_count,
|
||||
self.delayed_bug_count(),
|
||||
self.flags.treat_err_as_bug.map(|c| c.get()).unwrap_or(0),
|
||||
self.flags.treat_err_as_bug.map(|c| c.get()).unwrap(),
|
||||
) {
|
||||
(1, 0, 1) => panic!("aborting due to `-Z treat-err-as-bug=1`"),
|
||||
(0, 1, 1) => panic!("aborting due delayed bug with `-Z treat-err-as-bug=1`"),
|
||||
(count, delayed_count, as_bug) => {
|
||||
(count, delayed_count, val) => {
|
||||
if delayed_count > 0 {
|
||||
panic!(
|
||||
"aborting after {count} errors and {delayed_count} delayed bugs due to `-Z treat-err-as-bug={as_bug}`",
|
||||
"aborting after {count} errors and {delayed_count} delayed bugs due to `-Z treat-err-as-bug={val}`",
|
||||
)
|
||||
} else {
|
||||
panic!(
|
||||
"aborting after {count} errors due to `-Z treat-err-as-bug={as_bug}`",
|
||||
)
|
||||
panic!("aborting after {count} errors due to `-Z treat-err-as-bug={val}`")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -270,20 +270,20 @@ hir_analysis_simd_ffi_highly_experimental = use of SIMD type{$snip} in FFI is hi
|
||||
hir_analysis_specialization_trait = implementing `rustc_specialization_trait` traits is unstable
|
||||
.help = add `#![feature(min_specialization)]` to the crate attributes to enable
|
||||
|
||||
hir_analysis_start_function_parameters = start function is not allowed to have type parameters
|
||||
.label = start function cannot have type parameters
|
||||
hir_analysis_start_function_parameters = `#[start]` function is not allowed to have type parameters
|
||||
.label = `#[start]` function cannot have type parameters
|
||||
|
||||
hir_analysis_start_function_where = start function is not allowed to have a `where` clause
|
||||
.label = start function cannot have a `where` clause
|
||||
hir_analysis_start_function_where = `#[start]` function is not allowed to have a `where` clause
|
||||
.label = `#[start]` function cannot have a `where` clause
|
||||
|
||||
hir_analysis_start_not_async = `start` is not allowed to be `async`
|
||||
.label = `start` is not allowed to be `async`
|
||||
hir_analysis_start_not_async = `#[start]` function is not allowed to be `async`
|
||||
.label = `#[start]` is not allowed to be `async`
|
||||
|
||||
hir_analysis_start_not_target_feature = `start` is not allowed to have `#[target_feature]`
|
||||
.label = `start` is not allowed to have `#[target_feature]`
|
||||
hir_analysis_start_not_target_feature = `#[start]` function is not allowed to have `#[target_feature]`
|
||||
.label = `#[start]` function is not allowed to have `#[target_feature]`
|
||||
|
||||
hir_analysis_start_not_track_caller = `start` is not allowed to be `#[track_caller]`
|
||||
.label = `start` is not allowed to be `#[track_caller]`
|
||||
hir_analysis_start_not_track_caller = `#[start]` function is not allowed to be `#[track_caller]`
|
||||
.label = `#[start]` function is not allowed to be `#[track_caller]`
|
||||
|
||||
hir_analysis_static_specialize = cannot specialize on `'static` lifetime
|
||||
|
||||
|
@ -18,7 +18,7 @@ use rustc_infer::traits::{Obligation, TraitEngineExt as _};
|
||||
use rustc_lint_defs::builtin::REPR_TRANSPARENT_EXTERNAL_PRIVATE_FIELDS;
|
||||
use rustc_middle::hir::nested_filter;
|
||||
use rustc_middle::middle::stability::EvalResult;
|
||||
use rustc_middle::traits::DefiningAnchor;
|
||||
use rustc_middle::traits::{DefiningAnchor, ObligationCauseCode};
|
||||
use rustc_middle::ty::fold::BottomUpFolder;
|
||||
use rustc_middle::ty::layout::{LayoutError, MAX_SIMD_LANES};
|
||||
use rustc_middle::ty::util::{Discr, IntTypeExt};
|
||||
@ -1626,6 +1626,25 @@ pub(super) fn check_generator_obligations(tcx: TyCtxt<'_>, def_id: LocalDefId) {
|
||||
let obligation = Obligation::new(tcx, cause.clone(), param_env, *predicate);
|
||||
fulfillment_cx.register_predicate_obligation(&infcx, obligation);
|
||||
}
|
||||
|
||||
if (tcx.features().unsized_locals || tcx.features().unsized_fn_params)
|
||||
&& let Some(generator) = tcx.mir_generator_witnesses(def_id)
|
||||
{
|
||||
for field_ty in generator.field_tys.iter() {
|
||||
fulfillment_cx.register_bound(
|
||||
&infcx,
|
||||
param_env,
|
||||
field_ty.ty,
|
||||
tcx.require_lang_item(hir::LangItem::Sized, Some(field_ty.source_info.span)),
|
||||
ObligationCause::new(
|
||||
field_ty.source_info.span,
|
||||
def_id,
|
||||
ObligationCauseCode::SizedGeneratorInterior(def_id),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
let errors = fulfillment_cx.select_all_or_error(&infcx);
|
||||
debug!(?errors);
|
||||
if !errors.is_empty() {
|
||||
|
@ -1,7 +1,7 @@
|
||||
use rustc_errors::StashKey;
|
||||
use rustc_hir::def_id::LocalDefId;
|
||||
use rustc_hir::intravisit::{self, Visitor};
|
||||
use rustc_hir::{self as hir, Expr, ImplItem, Item, Node, TraitItem};
|
||||
use rustc_hir::{self as hir, def, Expr, ImplItem, Item, Node, TraitItem};
|
||||
use rustc_middle::hir::nested_filter;
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt, TypeVisitableExt};
|
||||
use rustc_span::DUMMY_SP;
|
||||
@ -74,9 +74,14 @@ pub(super) fn find_opaque_ty_constraints_for_tait(tcx: TyCtxt<'_>, def_id: Local
|
||||
|
||||
hidden.ty
|
||||
} else {
|
||||
let mut parent_def_id = def_id;
|
||||
while tcx.def_kind(parent_def_id) == def::DefKind::OpaqueTy {
|
||||
// Account for `type Alias = impl Trait<Foo = impl Trait>;` (#116031)
|
||||
parent_def_id = tcx.local_parent(parent_def_id);
|
||||
}
|
||||
let reported = tcx.sess.emit_err(UnconstrainedOpaqueType {
|
||||
span: tcx.def_span(def_id),
|
||||
name: tcx.item_name(tcx.local_parent(def_id).to_def_id()),
|
||||
name: tcx.item_name(parent_def_id.to_def_id()),
|
||||
what: match tcx.hir().get(scope) {
|
||||
_ if scope == hir::CRATE_HIR_ID => "module",
|
||||
Node::Item(hir::Item { kind: hir::ItemKind::Mod(_), .. }) => "module",
|
||||
|
@ -725,6 +725,9 @@ impl<'a, 'tcx> CastCheck<'tcx> {
|
||||
},
|
||||
// array-ptr-cast
|
||||
Ptr(mt) => {
|
||||
if !fcx.type_is_sized_modulo_regions(fcx.param_env, mt.ty) {
|
||||
return Err(CastError::IllegalCast);
|
||||
}
|
||||
self.check_ref_cast(fcx, TypeAndMut { mutbl, ty: inner_ty }, mt)
|
||||
}
|
||||
_ => Err(CastError::NonScalar),
|
||||
@ -735,7 +738,6 @@ impl<'a, 'tcx> CastCheck<'tcx> {
|
||||
}
|
||||
_ => return Err(CastError::NonScalar),
|
||||
};
|
||||
|
||||
if let ty::Adt(adt_def, _) = *self.expr_ty.kind() {
|
||||
if adt_def.did().krate != LOCAL_CRATE {
|
||||
if adt_def.variants().iter().any(VariantDef::is_field_list_non_exhaustive) {
|
||||
@ -743,7 +745,6 @@ impl<'a, 'tcx> CastCheck<'tcx> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
match (t_from, t_cast) {
|
||||
// These types have invariants! can't cast into them.
|
||||
(_, Int(CEnum) | FnPtr) => Err(CastError::NonScalar),
|
||||
|
@ -525,8 +525,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
_ => self.instantiate_value_path(segs, opt_ty, res, expr.span, expr.hir_id).0,
|
||||
};
|
||||
|
||||
if let ty::FnDef(did, ..) = *ty.kind() {
|
||||
if let ty::FnDef(did, callee_args) = *ty.kind() {
|
||||
let fn_sig = ty.fn_sig(tcx);
|
||||
|
||||
// HACK: whenever we get a FnDef in a non-const context, enforce effects to get the
|
||||
// default `host = true` to avoid inference errors later.
|
||||
if tcx.hir().body_const_context(self.body_id).is_none() {
|
||||
self.enforce_context_effects(expr.hir_id, qpath.span(), did, callee_args);
|
||||
}
|
||||
if tcx.fn_sig(did).skip_binder().abi() == RustIntrinsic
|
||||
&& tcx.item_name(did) == sym::transmute
|
||||
{
|
||||
|
@ -664,10 +664,12 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
|
||||
);
|
||||
self.walk_pat(discr_place, arm.pat, arm.guard.is_some());
|
||||
|
||||
if let Some(hir::Guard::If(e)) = arm.guard {
|
||||
self.consume_expr(e)
|
||||
} else if let Some(hir::Guard::IfLet(ref l)) = arm.guard {
|
||||
self.consume_expr(l.init)
|
||||
match arm.guard {
|
||||
Some(hir::Guard::If(ref e)) => self.consume_expr(e),
|
||||
Some(hir::Guard::IfLet(ref l)) => {
|
||||
self.walk_local(l.init, l.pat, None, |t| t.borrow_expr(l.init, ty::ImmBorrow))
|
||||
}
|
||||
None => {}
|
||||
}
|
||||
|
||||
self.consume_expr(arm.body);
|
||||
|
@ -518,8 +518,15 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
self.select_obligations_where_possible(|_| {});
|
||||
|
||||
let mut generators = self.deferred_generator_interiors.borrow_mut();
|
||||
for (_, body_id, interior, kind) in generators.drain(..) {
|
||||
crate::generator_interior::resolve_interior(self, def_id, body_id, interior, kind);
|
||||
for (generator_def_id, body_id, interior, kind) in generators.drain(..) {
|
||||
crate::generator_interior::resolve_interior(
|
||||
self,
|
||||
def_id,
|
||||
generator_def_id,
|
||||
body_id,
|
||||
interior,
|
||||
kind,
|
||||
);
|
||||
self.select_obligations_where_possible(|_| {});
|
||||
}
|
||||
}
|
||||
|
@ -273,11 +273,20 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
//
|
||||
// This check is here because there is currently no way to express a trait bound for `FnDef` types only.
|
||||
if is_const_eval_select && (1..=2).contains(&idx) {
|
||||
if let ty::FnDef(def_id, _) = checked_ty.kind() {
|
||||
if idx == 1 && !self.tcx.is_const_fn_raw(*def_id) {
|
||||
self.tcx
|
||||
.sess
|
||||
.emit_err(errors::ConstSelectMustBeConst { span: provided_arg.span });
|
||||
if let ty::FnDef(def_id, args) = *checked_ty.kind() {
|
||||
if idx == 1 {
|
||||
if !self.tcx.is_const_fn_raw(def_id) {
|
||||
self.tcx.sess.emit_err(errors::ConstSelectMustBeConst {
|
||||
span: provided_arg.span,
|
||||
});
|
||||
} else {
|
||||
self.enforce_context_effects(
|
||||
provided_arg.hir_id,
|
||||
provided_arg.span,
|
||||
def_id,
|
||||
args,
|
||||
)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
self.tcx.sess.emit_err(errors::ConstSelectMustBeFn {
|
||||
|
@ -9,12 +9,13 @@ use rustc_data_structures::fx::{FxHashSet, FxIndexSet};
|
||||
use rustc_errors::{pluralize, DelayDm};
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{CtorKind, DefKind, Res};
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_hir::hir_id::HirIdSet;
|
||||
use rustc_hir::intravisit::{self, Visitor};
|
||||
use rustc_hir::{Arm, Expr, ExprKind, Guard, HirId, Pat, PatKind};
|
||||
use rustc_infer::infer::{DefineOpaqueTypes, RegionVariableOrigin};
|
||||
use rustc_middle::middle::region::{self, Scope, ScopeData, YieldData};
|
||||
use rustc_middle::traits::ObligationCauseCode;
|
||||
use rustc_middle::ty::fold::FnMutDelegate;
|
||||
use rustc_middle::ty::{self, BoundVariableKind, RvalueScopes, Ty, TyCtxt, TypeVisitableExt};
|
||||
use rustc_span::symbol::sym;
|
||||
@ -188,6 +189,7 @@ impl<'a, 'tcx> InteriorVisitor<'a, 'tcx> {
|
||||
pub fn resolve_interior<'a, 'tcx>(
|
||||
fcx: &'a FnCtxt<'a, 'tcx>,
|
||||
def_id: DefId,
|
||||
generator_def_id: LocalDefId,
|
||||
body_id: hir::BodyId,
|
||||
interior: Ty<'tcx>,
|
||||
kind: hir::GeneratorKind,
|
||||
@ -214,6 +216,16 @@ pub fn resolve_interior<'a, 'tcx>(
|
||||
// The types are already kept in insertion order.
|
||||
let types = visitor.types;
|
||||
|
||||
if fcx.tcx.features().unsized_locals || fcx.tcx.features().unsized_fn_params {
|
||||
for interior_ty in &types {
|
||||
fcx.require_type_is_sized(
|
||||
interior_ty.ty,
|
||||
interior_ty.span,
|
||||
ObligationCauseCode::SizedGeneratorInterior(generator_def_id),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// The types in the generator interior contain lifetimes local to the generator itself,
|
||||
// which should not be exposed outside of the generator. Therefore, we replace these
|
||||
// lifetimes with existentially-bound lifetimes, which reflect the exact value of the
|
||||
|
@ -41,6 +41,7 @@ use rustc_hir::intravisit::{self, Visitor};
|
||||
use rustc_infer::infer::UpvarRegion;
|
||||
use rustc_middle::hir::place::{Place, PlaceBase, PlaceWithHirId, Projection, ProjectionKind};
|
||||
use rustc_middle::mir::FakeReadCause;
|
||||
use rustc_middle::traits::ObligationCauseCode;
|
||||
use rustc_middle::ty::{
|
||||
self, ClosureSizeProfileData, Ty, TyCtxt, TypeckResults, UpvarArgs, UpvarCapture,
|
||||
};
|
||||
@ -295,6 +296,20 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
let final_upvar_tys = self.final_upvar_tys(closure_def_id);
|
||||
debug!(?closure_hir_id, ?args, ?final_upvar_tys);
|
||||
|
||||
if self.tcx.features().unsized_locals || self.tcx.features().unsized_fn_params {
|
||||
for capture in
|
||||
self.typeck_results.borrow().closure_min_captures_flattened(closure_def_id)
|
||||
{
|
||||
if let UpvarCapture::ByValue = capture.info.capture_kind {
|
||||
self.require_type_is_sized(
|
||||
capture.place.ty(),
|
||||
capture.get_path_span(self.tcx),
|
||||
ObligationCauseCode::SizedClosureCapture(closure_def_id),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Build a tuple (U0..Un) of the final upvar types U0..Un
|
||||
// and unify the upvar tuple type in the closure with it:
|
||||
let final_tupled_upvars_type = Ty::new_tup(self.tcx, &final_upvar_tys);
|
||||
|
@ -1616,7 +1616,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
// | expected `()`, found closure
|
||||
// |
|
||||
// = note: expected unit type `()`
|
||||
// found closure `[closure@$DIR/issue-20862.rs:2:5: 2:14 x:_]`
|
||||
// found closure `{closure@$DIR/issue-20862.rs:2:5: 2:14 x:_}`
|
||||
//
|
||||
// Also ignore opaque `Future`s that come from async fns.
|
||||
if !self.ignore_span.overlaps(span)
|
||||
|
@ -34,8 +34,8 @@ declare_lint! {
|
||||
Warn,
|
||||
"detects calling `into_iter` on arrays in Rust 2015 and 2018",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reference: "<https://doc.rust-lang.org/nightly/edition-guide/rust-2021/IntoIterator-for-arrays.html>",
|
||||
reason: FutureIncompatibilityReason::EditionSemanticsChange(Edition::Edition2021),
|
||||
reference: "<https://doc.rust-lang.org/nightly/edition-guide/rust-2021/IntoIterator-for-arrays.html>",
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -844,8 +844,8 @@ declare_lint! {
|
||||
Warn,
|
||||
"detects anonymous parameters",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reference: "issue #41686 <https://github.com/rust-lang/rust/issues/41686>",
|
||||
reason: FutureIncompatibilityReason::EditionError(Edition::Edition2018),
|
||||
reference: "issue #41686 <https://github.com/rust-lang/rust/issues/41686>",
|
||||
};
|
||||
}
|
||||
|
||||
@ -1669,8 +1669,8 @@ declare_lint! {
|
||||
Warn,
|
||||
"`...` range patterns are deprecated",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reference: "<https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>",
|
||||
reason: FutureIncompatibilityReason::EditionError(Edition::Edition2021),
|
||||
reference: "<https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>",
|
||||
};
|
||||
}
|
||||
|
||||
@ -1804,8 +1804,8 @@ declare_lint! {
|
||||
Allow,
|
||||
"detects edition keywords being used as an identifier",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reference: "issue #49716 <https://github.com/rust-lang/rust/issues/49716>",
|
||||
reason: FutureIncompatibilityReason::EditionError(Edition::Edition2018),
|
||||
reference: "issue #49716 <https://github.com/rust-lang/rust/issues/49716>",
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,7 @@ use crate::{
|
||||
|
||||
use rustc_hir as hir;
|
||||
use rustc_middle::{traits::util::supertraits, ty};
|
||||
use rustc_session::lint::FutureIncompatibilityReason;
|
||||
use rustc_span::sym;
|
||||
|
||||
declare_lint! {
|
||||
@ -48,6 +49,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"`Deref` implementation usage with a supertrait trait object for output might be shadowed in the future",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #89460 <https://github.com/rust-lang/rust/issues/89460>",
|
||||
};
|
||||
}
|
||||
|
@ -39,6 +39,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"applying forbid to lint-groups",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #81670 <https://github.com/rust-lang/rust/issues/81670>",
|
||||
};
|
||||
}
|
||||
@ -74,6 +75,7 @@ declare_lint! {
|
||||
Deny,
|
||||
"ill-formed attribute inputs that were previously accepted and used in practice",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #57571 <https://github.com/rust-lang/rust/issues/57571>",
|
||||
};
|
||||
crate_level_only
|
||||
@ -110,6 +112,7 @@ declare_lint! {
|
||||
Deny,
|
||||
"conflicts between `#[repr(..)]` hints that were previously accepted and used in practice",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #68585 <https://github.com/rust-lang/rust/issues/68585>",
|
||||
};
|
||||
}
|
||||
@ -1016,8 +1019,8 @@ declare_lint! {
|
||||
Deny,
|
||||
"raw pointers must be aligned before dereferencing",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportInDeps,
|
||||
reference: "issue #68585 <https://github.com/rust-lang/rust/issues/104616>",
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportNow,
|
||||
};
|
||||
}
|
||||
|
||||
@ -1096,6 +1099,7 @@ declare_lint! {
|
||||
Deny,
|
||||
"detect public re-exports of private extern crates",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
|
||||
};
|
||||
}
|
||||
@ -1125,6 +1129,7 @@ declare_lint! {
|
||||
Deny,
|
||||
"type parameter default erroneously allowed in invalid location",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #36887 <https://github.com/rust-lang/rust/issues/36887>",
|
||||
};
|
||||
}
|
||||
@ -1267,6 +1272,7 @@ declare_lint! {
|
||||
Deny,
|
||||
"patterns in functions without body were erroneously allowed",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #35203 <https://github.com/rust-lang/rust/issues/35203>",
|
||||
};
|
||||
}
|
||||
@ -1310,6 +1316,7 @@ declare_lint! {
|
||||
Deny,
|
||||
"detects missing fragment specifiers in unused `macro_rules!` patterns",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #40107 <https://github.com/rust-lang/rust/issues/40107>",
|
||||
};
|
||||
}
|
||||
@ -1351,6 +1358,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"detects generic lifetime arguments in path segments with late bound lifetime parameters",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #42868 <https://github.com/rust-lang/rust/issues/42868>",
|
||||
};
|
||||
}
|
||||
@ -1386,8 +1394,8 @@ declare_lint! {
|
||||
Deny,
|
||||
"trait-object types were treated as different depending on marker-trait order",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportInDeps,
|
||||
reference: "issue #56484 <https://github.com/rust-lang/rust/issues/56484>",
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportNow,
|
||||
};
|
||||
}
|
||||
|
||||
@ -1426,6 +1434,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"distinct impls distinguished only by the leak-check code",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #56105 <https://github.com/rust-lang/rust/issues/56105>",
|
||||
};
|
||||
}
|
||||
@ -1617,8 +1626,8 @@ declare_lint! {
|
||||
Warn,
|
||||
"raw pointer to an inference variable",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reference: "issue #46906 <https://github.com/rust-lang/rust/issues/46906>",
|
||||
reason: FutureIncompatibilityReason::EditionError(Edition::Edition2018),
|
||||
reference: "issue #46906 <https://github.com/rust-lang/rust/issues/46906>",
|
||||
};
|
||||
}
|
||||
|
||||
@ -1685,8 +1694,8 @@ declare_lint! {
|
||||
Warn,
|
||||
"suggest using `dyn Trait` for trait objects",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reference: "<https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>",
|
||||
reason: FutureIncompatibilityReason::EditionError(Edition::Edition2021),
|
||||
reference: "<https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>",
|
||||
};
|
||||
}
|
||||
|
||||
@ -1740,8 +1749,8 @@ declare_lint! {
|
||||
"fully qualified paths that start with a module name \
|
||||
instead of `crate`, `self`, or an extern crate name",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reference: "issue #53130 <https://github.com/rust-lang/rust/issues/53130>",
|
||||
reason: FutureIncompatibilityReason::EditionError(Edition::Edition2018),
|
||||
reference: "issue #53130 <https://github.com/rust-lang/rust/issues/53130>",
|
||||
};
|
||||
}
|
||||
|
||||
@ -1789,6 +1798,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"floating-point literals cannot be used in patterns",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #41620 <https://github.com/rust-lang/rust/issues/41620>",
|
||||
};
|
||||
}
|
||||
@ -1939,6 +1949,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"checks the object safety of where clauses",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #51443 <https://github.com/rust-lang/rust/issues/51443>",
|
||||
};
|
||||
}
|
||||
@ -2005,8 +2016,8 @@ declare_lint! {
|
||||
Deny,
|
||||
"detects proc macro derives using inaccessible names from parent modules",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportInDeps,
|
||||
reference: "issue #83583 <https://github.com/rust-lang/rust/issues/83583>",
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportNow,
|
||||
};
|
||||
}
|
||||
|
||||
@ -2108,6 +2119,7 @@ declare_lint! {
|
||||
"macro-expanded `macro_export` macros from the current crate \
|
||||
cannot be referred to by absolute paths",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #52234 <https://github.com/rust-lang/rust/issues/52234>",
|
||||
};
|
||||
crate_level_only
|
||||
@ -2199,6 +2211,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"constant used in pattern contains value of non-structural-match type in a field or a variant",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #62411 <https://github.com/rust-lang/rust/issues/62411>",
|
||||
};
|
||||
}
|
||||
@ -2253,6 +2266,7 @@ declare_lint! {
|
||||
Allow,
|
||||
"pointers are not structural-match",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #62411 <https://github.com/rust-lang/rust/issues/70861>",
|
||||
};
|
||||
}
|
||||
@ -2291,6 +2305,7 @@ declare_lint! {
|
||||
"constant used in pattern of non-structural-match type and the constant's initializer \
|
||||
expression contains values of non-structural-match types",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #73448 <https://github.com/rust-lang/rust/issues/73448>",
|
||||
};
|
||||
}
|
||||
@ -2348,6 +2363,7 @@ declare_lint! {
|
||||
Deny,
|
||||
"ambiguous associated items",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #57644 <https://github.com/rust-lang/rust/issues/57644>",
|
||||
};
|
||||
}
|
||||
@ -2389,6 +2405,7 @@ declare_lint! {
|
||||
Deny,
|
||||
"a feature gate that doesn't break dependent crates",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #64266 <https://github.com/rust-lang/rust/issues/64266>",
|
||||
};
|
||||
}
|
||||
@ -2617,8 +2634,8 @@ declare_lint! {
|
||||
Deny,
|
||||
"a C-like enum implementing Drop is cast",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportInDeps,
|
||||
reference: "issue #73333 <https://github.com/rust-lang/rust/issues/73333>",
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportNow,
|
||||
};
|
||||
}
|
||||
|
||||
@ -2747,6 +2764,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"detects a generic constant is used in a type without a emitting a warning",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #76200 <https://github.com/rust-lang/rust/issues/76200>",
|
||||
};
|
||||
}
|
||||
@ -2805,6 +2823,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"uninhabited static",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #74840 <https://github.com/rust-lang/rust/issues/74840>",
|
||||
};
|
||||
}
|
||||
@ -2975,8 +2994,8 @@ declare_lint! {
|
||||
Warn,
|
||||
"trailing semicolon in macro body used as expression",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportInDeps,
|
||||
reference: "issue #79813 <https://github.com/rust-lang/rust/issues/79813>",
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportNow,
|
||||
};
|
||||
}
|
||||
|
||||
@ -3022,6 +3041,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"detects derive helper attributes that are used before they are introduced",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #79202 <https://github.com/rust-lang/rust/issues/79202>",
|
||||
};
|
||||
}
|
||||
@ -3090,6 +3110,7 @@ declare_lint! {
|
||||
Deny,
|
||||
"detects usage of `#![cfg_attr(..., crate_type/crate_name = \"...\")]`",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #91632 <https://github.com/rust-lang/rust/issues/91632>",
|
||||
};
|
||||
}
|
||||
@ -3181,6 +3202,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"transparent type contains an external ZST that is marked #[non_exhaustive] or contains private fields",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #78586 <https://github.com/rust-lang/rust/issues/78586>",
|
||||
};
|
||||
}
|
||||
@ -3231,6 +3253,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"unstable syntax can change at any point in the future, causing a hard error!",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #65860 <https://github.com/rust-lang/rust/issues/65860>",
|
||||
};
|
||||
}
|
||||
@ -3662,6 +3685,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"detects invalid `#[doc(...)]` attributes",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #82730 <https://github.com/rust-lang/rust/issues/82730>",
|
||||
};
|
||||
}
|
||||
@ -3708,8 +3732,8 @@ declare_lint! {
|
||||
Deny,
|
||||
"detects usage of old versions of certain proc-macro crates",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportInDeps,
|
||||
reference: "issue #83125 <https://github.com/rust-lang/rust/issues/83125>",
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportNow,
|
||||
};
|
||||
}
|
||||
|
||||
@ -3747,8 +3771,8 @@ declare_lint! {
|
||||
Allow,
|
||||
"detects usage of old versions of or-patterns",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reference: "<https://doc.rust-lang.org/nightly/edition-guide/rust-2021/or-patterns-macro-rules.html>",
|
||||
reason: FutureIncompatibilityReason::EditionError(Edition::Edition2021),
|
||||
reference: "<https://doc.rust-lang.org/nightly/edition-guide/rust-2021/or-patterns-macro-rules.html>",
|
||||
};
|
||||
}
|
||||
|
||||
@ -3796,8 +3820,8 @@ declare_lint! {
|
||||
"detects the usage of trait methods which are ambiguous with traits added to the \
|
||||
prelude in future editions",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reference: "<https://doc.rust-lang.org/nightly/edition-guide/rust-2021/prelude.html>",
|
||||
reason: FutureIncompatibilityReason::EditionError(Edition::Edition2021),
|
||||
reference: "<https://doc.rust-lang.org/nightly/edition-guide/rust-2021/prelude.html>",
|
||||
};
|
||||
}
|
||||
|
||||
@ -3833,8 +3857,8 @@ declare_lint! {
|
||||
Allow,
|
||||
"identifiers that will be parsed as a prefix in Rust 2021",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reference: "<https://doc.rust-lang.org/nightly/edition-guide/rust-2021/reserving-syntax.html>",
|
||||
reason: FutureIncompatibilityReason::EditionError(Edition::Edition2021),
|
||||
reference: "<https://doc.rust-lang.org/nightly/edition-guide/rust-2021/reserving-syntax.html>",
|
||||
};
|
||||
crate_level_only
|
||||
}
|
||||
@ -3881,6 +3905,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"use of unsupported calling convention",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #87678 <https://github.com/rust-lang/rust/issues/87678>",
|
||||
};
|
||||
}
|
||||
@ -4221,8 +4246,8 @@ declare_lint! {
|
||||
Deny,
|
||||
"impl method assumes more implied bounds than its corresponding trait method",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportInDeps,
|
||||
reference: "issue #105572 <https://github.com/rust-lang/rust/issues/105572>",
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportNow,
|
||||
};
|
||||
}
|
||||
|
||||
@ -4253,8 +4278,8 @@ declare_lint! {
|
||||
Warn,
|
||||
"`[u8]` or `str` used in a packed struct with `derive`",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportInDeps,
|
||||
reference: "issue #107457 <https://github.com/rust-lang/rust/issues/107457>",
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportNow,
|
||||
};
|
||||
report_in_external_macro
|
||||
}
|
||||
@ -4415,6 +4440,7 @@ declare_lint! {
|
||||
"impls that are not considered to overlap may be considered to \
|
||||
overlap in the future",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #114040 <https://github.com/rust-lang/rust/issues/114040>",
|
||||
};
|
||||
}
|
||||
@ -4483,7 +4509,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"detects certain glob imports that require reporting an ambiguity error",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseError,
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #114095 <https://github.com/rust-lang/rust/issues/114095>",
|
||||
};
|
||||
}
|
||||
@ -4568,7 +4594,7 @@ declare_lint! {
|
||||
Warn,
|
||||
"elided lifetimes cannot be used in associated constants in impls",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseError,
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #115010 <https://github.com/rust-lang/rust/issues/115010>",
|
||||
};
|
||||
}
|
||||
|
@ -347,12 +347,18 @@ pub struct FutureIncompatibleInfo {
|
||||
/// The reason for future incompatibility
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub enum FutureIncompatibilityReason {
|
||||
/// This will be an error in a future release
|
||||
/// for all editions
|
||||
FutureReleaseError,
|
||||
/// This will be an error in a future release for all editions
|
||||
///
|
||||
/// This will *not* show up in cargo's future breakage report.
|
||||
/// The warning will hence only be seen in local crates, not in dependencies.
|
||||
FutureReleaseErrorDontReportInDeps,
|
||||
/// This will be an error in a future release, and
|
||||
/// Cargo should create a report even for dependencies
|
||||
FutureReleaseErrorReportNow,
|
||||
///
|
||||
/// This is the *only* reason that will make future incompatibility warnings show up in cargo's
|
||||
/// reports. All other future incompatibility warnings are not visible when they occur in a
|
||||
/// dependency.
|
||||
FutureReleaseErrorReportInDeps,
|
||||
/// Code that changes meaning in some way in a
|
||||
/// future release.
|
||||
FutureReleaseSemanticsChange,
|
||||
@ -380,7 +386,7 @@ impl FutureIncompatibleInfo {
|
||||
pub const fn default_fields_for_macro() -> Self {
|
||||
FutureIncompatibleInfo {
|
||||
reference: "",
|
||||
reason: FutureIncompatibilityReason::FutureReleaseError,
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
explain_reason: true,
|
||||
}
|
||||
}
|
||||
@ -718,7 +724,10 @@ macro_rules! declare_lint {
|
||||
);
|
||||
($(#[$attr:meta])* $vis: vis $NAME: ident, $Level: ident, $desc: expr,
|
||||
$(@feature_gate = $gate:expr;)?
|
||||
$(@future_incompatible = FutureIncompatibleInfo { $($field:ident : $val:expr),* $(,)* }; )?
|
||||
$(@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: $reason:expr,
|
||||
$($field:ident : $val:expr),* $(,)*
|
||||
}; )?
|
||||
$(@edition $lint_edition:ident => $edition_level:ident;)?
|
||||
$($v:ident),*) => (
|
||||
$(#[$attr])*
|
||||
@ -730,6 +739,7 @@ macro_rules! declare_lint {
|
||||
$($v: true,)*
|
||||
$(feature_gate: Some($gate),)?
|
||||
$(future_incompatible: Some($crate::FutureIncompatibleInfo {
|
||||
reason: $reason,
|
||||
$($field: $val,)*
|
||||
..$crate::FutureIncompatibleInfo::default_fields_for_macro()
|
||||
}),)?
|
||||
|
@ -314,7 +314,10 @@ pub fn struct_lint_level(
|
||||
// Default allow lints trigger too often for testing.
|
||||
sess.opts.unstable_opts.future_incompat_test && lint.default_level != Level::Allow,
|
||||
|incompat| {
|
||||
matches!(incompat.reason, FutureIncompatibilityReason::FutureReleaseErrorReportNow)
|
||||
matches!(
|
||||
incompat.reason,
|
||||
FutureIncompatibilityReason::FutureReleaseErrorReportInDeps
|
||||
)
|
||||
},
|
||||
);
|
||||
|
||||
@ -404,8 +407,8 @@ pub fn struct_lint_level(
|
||||
|
||||
if let Some(future_incompatible) = future_incompatible {
|
||||
let explanation = match future_incompatible.reason {
|
||||
FutureIncompatibilityReason::FutureReleaseError
|
||||
| FutureIncompatibilityReason::FutureReleaseErrorReportNow => {
|
||||
FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps
|
||||
| FutureIncompatibilityReason::FutureReleaseErrorReportInDeps => {
|
||||
"this was previously accepted by the compiler but is being phased out; \
|
||||
it will become a hard error in a future release!"
|
||||
.to_owned()
|
||||
|
@ -1001,11 +1001,11 @@ impl<'tcx> Debug for Rvalue<'tcx> {
|
||||
AggregateKind::Closure(def_id, args) => ty::tls::with(|tcx| {
|
||||
let name = if tcx.sess.opts.unstable_opts.span_free_formats {
|
||||
let args = tcx.lift(args).unwrap();
|
||||
format!("[closure@{}]", tcx.def_path_str_with_args(def_id, args),)
|
||||
format!("{{closure@{}}}", tcx.def_path_str_with_args(def_id, args),)
|
||||
} else {
|
||||
let span = tcx.def_span(def_id);
|
||||
format!(
|
||||
"[closure@{}]",
|
||||
"{{closure@{}}}",
|
||||
tcx.sess.source_map().span_to_diagnostic_string(span)
|
||||
)
|
||||
};
|
||||
@ -1029,7 +1029,7 @@ impl<'tcx> Debug for Rvalue<'tcx> {
|
||||
}),
|
||||
|
||||
AggregateKind::Generator(def_id, _, _) => ty::tls::with(|tcx| {
|
||||
let name = format!("[generator@{:?}]", tcx.def_span(def_id));
|
||||
let name = format!("{{generator@{:?}}}", tcx.def_span(def_id));
|
||||
let mut struct_fmt = fmt.debug_struct(&name);
|
||||
|
||||
// FIXME(project-rfc-2229#48): This should be a list of capture names/places
|
||||
|
@ -299,6 +299,10 @@ pub enum ObligationCauseCode<'tcx> {
|
||||
SizedYieldType,
|
||||
/// Inline asm operand type must be `Sized`.
|
||||
InlineAsmSized,
|
||||
/// Captured closure type must be `Sized`.
|
||||
SizedClosureCapture(LocalDefId),
|
||||
/// Types live across generator yields must be `Sized`.
|
||||
SizedGeneratorInterior(LocalDefId),
|
||||
/// `[expr; N]` requires `type_of(expr): Copy`.
|
||||
RepeatElementCopy {
|
||||
/// If element is a `const fn` we display a help message suggesting to move the
|
||||
|
@ -795,7 +795,7 @@ pub trait PrettyPrinter<'tcx>:
|
||||
}
|
||||
ty::Str => p!("str"),
|
||||
ty::Generator(did, args, movability) => {
|
||||
p!(write("["));
|
||||
p!(write("{{"));
|
||||
let generator_kind = self.tcx().generator_kind(did).unwrap();
|
||||
let should_print_movability =
|
||||
self.should_print_verbose() || generator_kind == hir::GeneratorKind::Gen;
|
||||
@ -836,13 +836,13 @@ pub trait PrettyPrinter<'tcx>:
|
||||
}
|
||||
}
|
||||
|
||||
p!("]")
|
||||
p!("}}")
|
||||
}
|
||||
ty::GeneratorWitness(types) => {
|
||||
p!(in_binder(&types));
|
||||
}
|
||||
ty::GeneratorWitnessMIR(did, args) => {
|
||||
p!(write("["));
|
||||
p!(write("{{"));
|
||||
if !self.tcx().sess.verbose() {
|
||||
p!("generator witness");
|
||||
// FIXME(eddyb) should use `def_span`.
|
||||
@ -861,10 +861,10 @@ pub trait PrettyPrinter<'tcx>:
|
||||
p!(print_def_path(did, args));
|
||||
}
|
||||
|
||||
p!("]")
|
||||
p!("}}")
|
||||
}
|
||||
ty::Closure(did, args) => {
|
||||
p!(write("["));
|
||||
p!(write("{{"));
|
||||
if !self.should_print_verbose() {
|
||||
p!(write("closure"));
|
||||
// FIXME(eddyb) should use `def_span`.
|
||||
@ -904,7 +904,7 @@ pub trait PrettyPrinter<'tcx>:
|
||||
p!(")");
|
||||
}
|
||||
}
|
||||
p!("]");
|
||||
p!("}}");
|
||||
}
|
||||
ty::Array(ty, sz) => p!("[", print(ty), "; ", print(sz), "]"),
|
||||
ty::Slice(ty) => p!("[", print(ty), "]"),
|
||||
@ -1061,7 +1061,7 @@ pub trait PrettyPrinter<'tcx>:
|
||||
}
|
||||
|
||||
for (assoc_item_def_id, term) in assoc_items {
|
||||
// Skip printing `<[generator@] as Generator<_>>::Return` from async blocks,
|
||||
// Skip printing `<{generator@} as Generator<_>>::Return` from async blocks,
|
||||
// unless we can find out what generator return type it comes from.
|
||||
let term = if let Some(ty) = term.skip_binder().ty()
|
||||
&& let ty::Alias(ty::Projection, proj) = ty.kind()
|
||||
|
@ -2550,7 +2550,7 @@ impl<'tcx> Ty<'tcx> {
|
||||
|
||||
/// Checks whether a type recursively contains any closure
|
||||
///
|
||||
/// Example: `Option<[closure@file.rs:4:20]>` returns true
|
||||
/// Example: `Option<{closure@file.rs:4:20}>` returns true
|
||||
pub fn contains_closure(self) -> bool {
|
||||
struct ContainsClosureVisitor;
|
||||
|
||||
@ -2946,6 +2946,11 @@ impl<'tcx> Ty<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns `true` when the outermost type cannot be further normalized,
|
||||
/// resolved, or substituted. This includes all primitive types, but also
|
||||
/// things like ADTs and trait objects, sice even if their arguments or
|
||||
/// nested types may be further simplified, the outermost [`TyKind`] or
|
||||
/// type constructor remains the same.
|
||||
pub fn is_known_rigid(self) -> bool {
|
||||
match self.kind() {
|
||||
Bool
|
||||
|
@ -115,44 +115,125 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> {
|
||||
let body = self.builder.body;
|
||||
let tcx = self.builder.tcx;
|
||||
let place_ty = place_ref.ty(body, tcx).ty;
|
||||
match place_ty.kind() {
|
||||
ty::Ref(..) | ty::RawPtr(..) => {
|
||||
return Err(MoveError::cannot_move_out_of(
|
||||
self.loc,
|
||||
BorrowedContent { target_place: place_ref.project_deeper(&[elem], tcx) },
|
||||
));
|
||||
match elem {
|
||||
ProjectionElem::Deref => match place_ty.kind() {
|
||||
ty::Ref(..) | ty::RawPtr(..) => {
|
||||
return Err(MoveError::cannot_move_out_of(
|
||||
self.loc,
|
||||
BorrowedContent {
|
||||
target_place: place_ref.project_deeper(&[elem], tcx),
|
||||
},
|
||||
));
|
||||
}
|
||||
ty::Adt(adt, _) => {
|
||||
if !adt.is_box() {
|
||||
bug!("Adt should be a box type when Place is deref");
|
||||
}
|
||||
}
|
||||
ty::Bool
|
||||
| ty::Char
|
||||
| ty::Int(_)
|
||||
| ty::Uint(_)
|
||||
| ty::Float(_)
|
||||
| ty::Foreign(_)
|
||||
| ty::Str
|
||||
| ty::Array(_, _)
|
||||
| ty::Slice(_)
|
||||
| ty::FnDef(_, _)
|
||||
| ty::FnPtr(_)
|
||||
| ty::Dynamic(_, _, _)
|
||||
| ty::Closure(_, _)
|
||||
| ty::Generator(_, _, _)
|
||||
| ty::GeneratorWitness(_)
|
||||
| ty::GeneratorWitnessMIR(_, _)
|
||||
| ty::Never
|
||||
| ty::Tuple(_)
|
||||
| ty::Alias(_, _)
|
||||
| ty::Param(_)
|
||||
| ty::Bound(_, _)
|
||||
| ty::Infer(_)
|
||||
| ty::Error(_)
|
||||
| ty::Placeholder(_) => {
|
||||
bug!("When Place is Deref it's type shouldn't be {place_ty:#?}")
|
||||
}
|
||||
},
|
||||
ProjectionElem::Field(_, _) => match place_ty.kind() {
|
||||
ty::Adt(adt, _) => {
|
||||
if adt.has_dtor(tcx) {
|
||||
return Err(MoveError::cannot_move_out_of(
|
||||
self.loc,
|
||||
InteriorOfTypeWithDestructor { container_ty: place_ty },
|
||||
));
|
||||
}
|
||||
if adt.is_union() {
|
||||
union_path.get_or_insert(base);
|
||||
}
|
||||
}
|
||||
ty::Closure(_, _) | ty::Generator(_, _, _) | ty::Tuple(_) => (),
|
||||
ty::Bool
|
||||
| ty::Char
|
||||
| ty::Int(_)
|
||||
| ty::Uint(_)
|
||||
| ty::Float(_)
|
||||
| ty::Foreign(_)
|
||||
| ty::Str
|
||||
| ty::Array(_, _)
|
||||
| ty::Slice(_)
|
||||
| ty::RawPtr(_)
|
||||
| ty::Ref(_, _, _)
|
||||
| ty::FnDef(_, _)
|
||||
| ty::FnPtr(_)
|
||||
| ty::Dynamic(_, _, _)
|
||||
| ty::GeneratorWitness(_)
|
||||
| ty::GeneratorWitnessMIR(_, _)
|
||||
| ty::Never
|
||||
| ty::Alias(_, _)
|
||||
| ty::Param(_)
|
||||
| ty::Bound(_, _)
|
||||
| ty::Infer(_)
|
||||
| ty::Error(_)
|
||||
| ty::Placeholder(_) => bug!(
|
||||
"When Place contains ProjectionElem::Field it's type shouldn't be {place_ty:#?}"
|
||||
),
|
||||
},
|
||||
ProjectionElem::ConstantIndex { .. } | ProjectionElem::Subslice { .. } => {
|
||||
match place_ty.kind() {
|
||||
ty::Slice(_) => {
|
||||
return Err(MoveError::cannot_move_out_of(
|
||||
self.loc,
|
||||
InteriorOfSliceOrArray {
|
||||
ty: place_ty,
|
||||
is_index: matches!(elem, ProjectionElem::Index(..)),
|
||||
},
|
||||
));
|
||||
}
|
||||
ty::Array(_, _) => (),
|
||||
_ => bug!("Unexpected type {:#?}", place_ty.is_array()),
|
||||
}
|
||||
}
|
||||
ty::Adt(adt, _) if adt.has_dtor(tcx) && !adt.is_box() => {
|
||||
return Err(MoveError::cannot_move_out_of(
|
||||
self.loc,
|
||||
InteriorOfTypeWithDestructor { container_ty: place_ty },
|
||||
));
|
||||
}
|
||||
ty::Adt(adt, _) if adt.is_union() => {
|
||||
union_path.get_or_insert(base);
|
||||
}
|
||||
ty::Slice(_) => {
|
||||
return Err(MoveError::cannot_move_out_of(
|
||||
self.loc,
|
||||
InteriorOfSliceOrArray {
|
||||
ty: place_ty,
|
||||
is_index: matches!(elem, ProjectionElem::Index(..)),
|
||||
},
|
||||
));
|
||||
}
|
||||
|
||||
ty::Array(..) => {
|
||||
if let ProjectionElem::Index(..) = elem {
|
||||
ProjectionElem::Index(_) => match place_ty.kind() {
|
||||
ty::Array(..) => {
|
||||
return Err(MoveError::cannot_move_out_of(
|
||||
self.loc,
|
||||
InteriorOfSliceOrArray { ty: place_ty, is_index: true },
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
_ => {}
|
||||
};
|
||||
|
||||
ty::Slice(_) => {
|
||||
return Err(MoveError::cannot_move_out_of(
|
||||
self.loc,
|
||||
InteriorOfSliceOrArray {
|
||||
ty: place_ty,
|
||||
is_index: matches!(elem, ProjectionElem::Index(..)),
|
||||
},
|
||||
));
|
||||
}
|
||||
_ => bug!("Unexpected type {place_ty:#?}"),
|
||||
},
|
||||
// `OpaqueCast` only transmutes the type, so no moves there and
|
||||
// `Downcast` only changes information about a `Place` without moving
|
||||
// So it's safe to skip these.
|
||||
ProjectionElem::OpaqueCast(_) | ProjectionElem::Downcast(_, _) => (),
|
||||
}
|
||||
if union_path.is_none() {
|
||||
// inlined from add_move_path because of a borrowck conflict with the iterator
|
||||
base =
|
||||
|
@ -407,6 +407,10 @@ passes_invalid_stability =
|
||||
.label = invalid stability version
|
||||
.item = the stability attribute annotates this item
|
||||
|
||||
passes_lang_item_fn_with_target_feature =
|
||||
`{$name}` language item function is not allowed to have `#[target_feature]`
|
||||
.label = `{$name}` language item function is not allowed to have `#[target_feature]`
|
||||
|
||||
passes_lang_item_on_incorrect_target =
|
||||
`{$name}` language item must be applied to a {$expected_target}
|
||||
.label = attribute should be applied to a {$expected_target}, not a {$actual_target}
|
||||
|
@ -118,7 +118,7 @@ impl CheckAttrVisitor<'_> {
|
||||
sym::coverage => self.check_coverage(hir_id, attr, span, target),
|
||||
sym::non_exhaustive => self.check_non_exhaustive(hir_id, attr, span, target),
|
||||
sym::marker => self.check_marker(hir_id, attr, span, target),
|
||||
sym::target_feature => self.check_target_feature(hir_id, attr, span, target),
|
||||
sym::target_feature => self.check_target_feature(hir_id, attr, span, target, attrs),
|
||||
sym::thread_local => self.check_thread_local(attr, span, target),
|
||||
sym::track_caller => {
|
||||
self.check_track_caller(hir_id, attr.span, attrs, span, target)
|
||||
@ -591,10 +591,36 @@ impl CheckAttrVisitor<'_> {
|
||||
attr: &Attribute,
|
||||
span: Span,
|
||||
target: Target,
|
||||
attrs: &[Attribute],
|
||||
) -> bool {
|
||||
match target {
|
||||
Target::Fn
|
||||
| Target::Method(MethodKind::Trait { body: true } | MethodKind::Inherent) => true,
|
||||
Target::Fn => {
|
||||
// `#[target_feature]` is not allowed in language items.
|
||||
if let Some((lang_item, _)) = hir::lang_items::extract(attrs)
|
||||
// Calling functions with `#[target_feature]` is
|
||||
// not unsafe on WASM, see #84988
|
||||
&& !self.tcx.sess.target.is_like_wasm
|
||||
&& !self.tcx.sess.opts.actually_rustdoc
|
||||
{
|
||||
let hir::Node::Item(item) = self.tcx.hir().get(hir_id) else {
|
||||
unreachable!();
|
||||
};
|
||||
let hir::ItemKind::Fn(sig, _, _) = item.kind else {
|
||||
// target is `Fn`
|
||||
unreachable!();
|
||||
};
|
||||
|
||||
self.tcx.sess.emit_err(errors::LangItemWithTargetFeature {
|
||||
attr_span: attr.span,
|
||||
name: lang_item,
|
||||
sig_span: sig.span,
|
||||
});
|
||||
false
|
||||
} else {
|
||||
true
|
||||
}
|
||||
}
|
||||
Target::Method(MethodKind::Trait { body: true } | MethodKind::Inherent) => true,
|
||||
// FIXME: #[target_feature] was previously erroneously allowed on statements and some
|
||||
// crates used this, so only emit a warning.
|
||||
Target::Statement => {
|
||||
|
@ -808,6 +808,16 @@ pub struct MissingLangItem {
|
||||
pub name: Symbol,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(passes_lang_item_fn_with_target_feature)]
|
||||
pub struct LangItemWithTargetFeature {
|
||||
#[primary_span]
|
||||
pub attr_span: Span,
|
||||
pub name: Symbol,
|
||||
#[label]
|
||||
pub sig_span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(passes_lang_item_on_incorrect_target, code = "E0718")]
|
||||
pub struct LangItemOnIncorrectTarget {
|
||||
|
@ -20,7 +20,8 @@ use rustc_hir::lang_items::{extract, GenericRequirement};
|
||||
use rustc_hir::{LangItem, LanguageItems, Target};
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_session::cstore::ExternCrate;
|
||||
use rustc_span::{symbol::kw::Empty, Span};
|
||||
use rustc_span::symbol::kw::Empty;
|
||||
use rustc_span::{sym, Span};
|
||||
|
||||
use rustc_middle::query::Providers;
|
||||
|
||||
@ -157,7 +158,14 @@ impl<'tcx> LanguageItemCollector<'tcx> {
|
||||
self.tcx.hir().get_by_def_id(item_def_id)
|
||||
{
|
||||
let (actual_num, generics_span) = match kind.generics() {
|
||||
Some(generics) => (generics.params.len(), generics.span),
|
||||
Some(generics) => (
|
||||
generics
|
||||
.params
|
||||
.iter()
|
||||
.filter(|p| !self.tcx.has_attr(p.def_id, sym::rustc_host))
|
||||
.count(),
|
||||
generics.span,
|
||||
),
|
||||
None => (0, *item_span),
|
||||
};
|
||||
|
||||
|
@ -38,11 +38,16 @@ pub struct FileEncoder {
|
||||
|
||||
impl FileEncoder {
|
||||
pub fn new<P: AsRef<Path>>(path: P) -> io::Result<Self> {
|
||||
// File::create opens the file for writing only. When -Zmeta-stats is enabled, the metadata
|
||||
// encoder rewinds the file to inspect what was written. So we need to always open the file
|
||||
// for reading and writing.
|
||||
let file = File::options().read(true).write(true).create(true).truncate(true).open(path)?;
|
||||
|
||||
Ok(FileEncoder {
|
||||
buf: vec![0u8; BUF_SIZE].into_boxed_slice().try_into().unwrap(),
|
||||
buffered: 0,
|
||||
flushed: 0,
|
||||
file: File::create(path)?,
|
||||
file,
|
||||
res: Ok(()),
|
||||
})
|
||||
}
|
||||
|
@ -2475,6 +2475,19 @@ pub fn parse_externs(
|
||||
Some((opts, name)) => (Some(opts), name.to_string()),
|
||||
};
|
||||
|
||||
if !crate::utils::is_ascii_ident(&name) {
|
||||
let mut error = handler.early_struct_error(format!(
|
||||
"crate name `{name}` passed to `--extern` is not a valid ASCII identifier"
|
||||
));
|
||||
let adjusted_name = name.replace("-", "_");
|
||||
if crate::utils::is_ascii_ident(&adjusted_name) {
|
||||
error.help(format!(
|
||||
"consider replacing the dashes with underscores: `{adjusted_name}`"
|
||||
));
|
||||
}
|
||||
error.emit();
|
||||
}
|
||||
|
||||
let path = path.map(|p| CanonicalizedPath::new(p));
|
||||
|
||||
let entry = externs.entry(name.to_owned());
|
||||
|
@ -20,7 +20,7 @@ use std::collections::BTreeMap;
|
||||
|
||||
use std::collections::hash_map::DefaultHasher;
|
||||
use std::hash::Hasher;
|
||||
use std::num::NonZeroUsize;
|
||||
use std::num::{IntErrorKind, NonZeroUsize};
|
||||
use std::path::PathBuf;
|
||||
use std::str;
|
||||
|
||||
@ -387,7 +387,7 @@ mod desc {
|
||||
"`all` (default), `except-unused-generics`, `except-unused-functions`, or `off`";
|
||||
pub const parse_instrument_xray: &str = "either a boolean (`yes`, `no`, `on`, `off`, etc), or a comma separated list of settings: `always` or `never` (mutually exclusive), `ignore-loops`, `instruction-threshold=N`, `skip-entry`, `skip-exit`";
|
||||
pub const parse_unpretty: &str = "`string` or `string=string`";
|
||||
pub const parse_treat_err_as_bug: &str = "either no value or a number bigger than 0";
|
||||
pub const parse_treat_err_as_bug: &str = "either no value or a non-negative number";
|
||||
pub const parse_trait_solver: &str =
|
||||
"one of the supported solver modes (`classic`, `next`, or `next-coherence`)";
|
||||
pub const parse_lto: &str =
|
||||
@ -986,10 +986,16 @@ mod parse {
|
||||
|
||||
pub(crate) fn parse_treat_err_as_bug(slot: &mut Option<NonZeroUsize>, v: Option<&str>) -> bool {
|
||||
match v {
|
||||
Some(s) => {
|
||||
*slot = s.parse().ok();
|
||||
slot.is_some()
|
||||
}
|
||||
Some(s) => match s.parse() {
|
||||
Ok(val) => {
|
||||
*slot = Some(val);
|
||||
true
|
||||
}
|
||||
Err(e) => {
|
||||
*slot = None;
|
||||
e.kind() == &IntErrorKind::Zero
|
||||
}
|
||||
},
|
||||
None => {
|
||||
*slot = NonZeroUsize::new(1);
|
||||
true
|
||||
@ -1846,7 +1852,8 @@ written to standard error output)"),
|
||||
trap_unreachable: Option<bool> = (None, parse_opt_bool, [TRACKED],
|
||||
"generate trap instructions for unreachable intrinsics (default: use target setting, usually yes)"),
|
||||
treat_err_as_bug: Option<NonZeroUsize> = (None, parse_treat_err_as_bug, [TRACKED],
|
||||
"treat error number `val` that occurs as bug"),
|
||||
"treat the `val`th error that occurs as bug (default if not specified: 0 - don't treat errors as bugs. \
|
||||
default if specified without a value: 1 - treat the first error as bug)"),
|
||||
trim_diagnostic_paths: bool = (true, parse_bool, [UNTRACKED],
|
||||
"in diagnostics, use heuristics to shorten paths referring to items"),
|
||||
tune_cpu: Option<String> = (None, parse_opt_string, [TRACKED],
|
||||
|
@ -1724,6 +1724,15 @@ impl EarlyErrorHandler {
|
||||
self.handler.struct_fatal(msg).emit()
|
||||
}
|
||||
|
||||
#[allow(rustc::untranslatable_diagnostic)]
|
||||
#[allow(rustc::diagnostic_outside_of_impl)]
|
||||
pub(crate) fn early_struct_error(
|
||||
&self,
|
||||
msg: impl Into<DiagnosticMessage>,
|
||||
) -> DiagnosticBuilder<'_, !> {
|
||||
self.handler.struct_fatal(msg)
|
||||
}
|
||||
|
||||
#[allow(rustc::untranslatable_diagnostic)]
|
||||
#[allow(rustc::diagnostic_outside_of_impl)]
|
||||
pub fn early_warn(&self, msg: impl Into<DiagnosticMessage>) {
|
||||
|
@ -158,3 +158,12 @@ pub fn extra_compiler_flags() -> Option<(Vec<String>, bool)> {
|
||||
|
||||
if !result.is_empty() { Some((result, excluded_cargo_defaults)) } else { None }
|
||||
}
|
||||
|
||||
pub(crate) fn is_ascii_ident(string: &str) -> bool {
|
||||
let mut chars = string.chars();
|
||||
if let Some(start) = chars.next() && (start.is_ascii_alphabetic() || start == '_') {
|
||||
chars.all(|char| char.is_ascii_alphanumeric() || char == '_')
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
@ -3007,6 +3007,24 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
ObligationCauseCode::InlineAsmSized => {
|
||||
err.note("all inline asm arguments must have a statically known size");
|
||||
}
|
||||
ObligationCauseCode::SizedClosureCapture(closure_def_id) => {
|
||||
err.note("all values captured by value by a closure must have a statically known size");
|
||||
let hir::ExprKind::Closure(closure) = self.tcx.hir().get_by_def_id(closure_def_id).expect_expr().kind else {
|
||||
bug!("expected closure in SizedClosureCapture obligation");
|
||||
};
|
||||
if let hir::CaptureBy::Value = closure.capture_clause
|
||||
&& let Some(span) = closure.fn_arg_span
|
||||
{
|
||||
err.span_label(span, "this closure captures all values by move");
|
||||
}
|
||||
}
|
||||
ObligationCauseCode::SizedGeneratorInterior(generator_def_id) => {
|
||||
let what = match self.tcx.generator_kind(generator_def_id) {
|
||||
None | Some(hir::GeneratorKind::Gen) => "yield",
|
||||
Some(hir::GeneratorKind::Async(..)) => "await",
|
||||
};
|
||||
err.note(format!("all values live across `{what}` must have a statically known size"));
|
||||
}
|
||||
ObligationCauseCode::ConstPatternStructural => {
|
||||
err.note("constants used for pattern-matching must derive `PartialEq` and `Eq`");
|
||||
}
|
||||
|
@ -195,6 +195,7 @@
|
||||
//
|
||||
// Language features:
|
||||
// tidy-alphabetical-start
|
||||
#![cfg_attr(not(bootstrap), feature(effects))]
|
||||
#![feature(abi_unadjusted)]
|
||||
#![feature(adt_const_params)]
|
||||
#![feature(allow_internal_unsafe)]
|
||||
|
@ -202,7 +202,7 @@
|
||||
/// [nomicon]: ../../nomicon/phantom-data.html#an-exception-the-special-case-of-the-standard-library-and-its-unstable-may_dangle
|
||||
#[lang = "drop"]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[const_trait]
|
||||
// FIXME(effects) #[const_trait]
|
||||
pub trait Drop {
|
||||
/// Executes the destructor for this type.
|
||||
///
|
||||
|
@ -72,7 +72,7 @@ use crate::marker::Tuple;
|
||||
)]
|
||||
#[fundamental] // so that regex can rely that `&str: !FnMut`
|
||||
#[must_use = "closures are lazy and do nothing unless called"]
|
||||
#[const_trait]
|
||||
// FIXME(effects) #[const_trait]
|
||||
pub trait Fn<Args: Tuple>: FnMut<Args> {
|
||||
/// Performs the call operation.
|
||||
#[unstable(feature = "fn_traits", issue = "29625")]
|
||||
@ -159,7 +159,7 @@ pub trait Fn<Args: Tuple>: FnMut<Args> {
|
||||
)]
|
||||
#[fundamental] // so that regex can rely that `&str: !FnMut`
|
||||
#[must_use = "closures are lazy and do nothing unless called"]
|
||||
#[const_trait]
|
||||
// FIXME(effects) #[const_trait]
|
||||
pub trait FnMut<Args: Tuple>: FnOnce<Args> {
|
||||
/// Performs the call operation.
|
||||
#[unstable(feature = "fn_traits", issue = "29625")]
|
||||
@ -238,7 +238,7 @@ pub trait FnMut<Args: Tuple>: FnOnce<Args> {
|
||||
)]
|
||||
#[fundamental] // so that regex can rely that `&str: !FnMut`
|
||||
#[must_use = "closures are lazy and do nothing unless called"]
|
||||
#[const_trait]
|
||||
// FIXME(effects) #[const_trait]
|
||||
pub trait FnOnce<Args: Tuple> {
|
||||
/// The returned type after the call operator is used.
|
||||
#[lang = "fn_once_output"]
|
||||
|
@ -5,7 +5,7 @@
|
||||
//! the [`Read`] and [`Write`] traits, which provide the
|
||||
//! most general interface for reading and writing input and output.
|
||||
//!
|
||||
//! # Read and Write
|
||||
//! ## Read and Write
|
||||
//!
|
||||
//! Because they are traits, [`Read`] and [`Write`] are implemented by a number
|
||||
//! of other types, and you can implement them for your types too. As such,
|
||||
@ -238,6 +238,47 @@
|
||||
//! contract. The implementation of many of these functions are subject to change over
|
||||
//! time and may call fewer or more syscalls/library functions.
|
||||
//!
|
||||
//! ## I/O Safety
|
||||
//!
|
||||
//! Rust follows an I/O safety discipline that is comparable to its memory safety discipline. This
|
||||
//! means that file descriptors can be *exclusively owned*. (Here, "file descriptor" is meant to
|
||||
//! subsume similar concepts that exist across a wide range of operating systems even if they might
|
||||
//! use a different name, such as "handle".) An exclusively owned file descriptor is one that no
|
||||
//! other code is allowed to access in any way, but the owner is allowed to access and even close
|
||||
//! it any time. A type that owns its file descriptor should usually close it in its `drop`
|
||||
//! function. Types like [`File`] own their file descriptor. Similarly, file descriptors
|
||||
//! can be *borrowed*, granting the temporary right to perform operations on this file descriptor.
|
||||
//! This indicates that the file descriptor will not be closed for the lifetime of the borrow, but
|
||||
//! it does *not* imply any right to close this file descriptor, since it will likely be owned by
|
||||
//! someone else.
|
||||
//!
|
||||
//! The platform-specific parts of the Rust standard library expose types that reflect these
|
||||
//! concepts, see [`os::unix`] and [`os::windows`].
|
||||
//!
|
||||
//! To uphold I/O safety, it is crucial that no code acts on file descriptors it does not own or
|
||||
//! borrow, and no code closes file descriptors it does not own. In other words, a safe function
|
||||
//! that takes a regular integer, treats it as a file descriptor, and acts on it, is *unsound*.
|
||||
//!
|
||||
//! Not upholding I/O safety and acting on a file descriptor without proof of ownership can lead to
|
||||
//! misbehavior and even Undefined Behavior in code that relies on ownership of its file
|
||||
//! descriptors: a closed file descriptor could be re-allocated, so the original owner of that file
|
||||
//! descriptor is now working on the wrong file. Some code might even rely on fully encapsulating
|
||||
//! its file descriptors with no operations being performed by any other part of the program.
|
||||
//!
|
||||
//! Note that exclusive ownership of a file descriptor does *not* imply exclusive ownership of the
|
||||
//! underlying kernel object that the file descriptor references (also called "file description" on
|
||||
//! some operating systems). File descriptors basically work like [`Arc`]: when you receive an owned
|
||||
//! file descriptor, you cannot know whether there are any other file descriptors that reference the
|
||||
//! same kernel object. However, when you create a new kernel object, you know that you are holding
|
||||
//! the only reference to it. Just be careful not to lend it to anyone, since they can obtain a
|
||||
//! clone and then you can no longer know what the reference count is! In that sense, [`OwnedFd`] is
|
||||
//! like `Arc` and [`BorrowedFd<'a>`] is like `&'a Arc` (and similar for the Windows types). In
|
||||
//! particular, given a `BorrowedFd<'a>`, you are not allowed to close the file descriptor -- just
|
||||
//! like how, given a `&'a Arc`, you are not allowed to decrement the reference count and
|
||||
//! potentially free the underlying object. There is no equivalent to `Box` for file descriptors in
|
||||
//! the standard library (that would be a type that guarantees that the reference count is `1`),
|
||||
//! however, it would be possible for a crate to define a type with those semantics.
|
||||
//!
|
||||
//! [`File`]: crate::fs::File
|
||||
//! [`TcpStream`]: crate::net::TcpStream
|
||||
//! [`io::stdout`]: stdout
|
||||
@ -245,6 +286,11 @@
|
||||
//! [`?` operator]: ../../book/appendix-02-operators.html
|
||||
//! [`Result`]: crate::result::Result
|
||||
//! [`.unwrap()`]: crate::result::Result::unwrap
|
||||
//! [`os::unix`]: ../os/unix/io/index.html
|
||||
//! [`os::windows`]: ../os/windows/io/index.html
|
||||
//! [`OwnedFd`]: ../os/fd/struct.OwnedFd.html
|
||||
//! [`BorrowedFd<'a>`]: ../os/fd/struct.BorrowedFd.html
|
||||
//! [`Arc`]: crate::sync::Arc
|
||||
|
||||
#![stable(feature = "rust1", since = "1.0.0")]
|
||||
|
||||
|
@ -15,8 +15,9 @@ use crate::sys_common::{AsInner, FromInner, IntoInner};
|
||||
|
||||
/// A borrowed file descriptor.
|
||||
///
|
||||
/// This has a lifetime parameter to tie it to the lifetime of something that
|
||||
/// owns the file descriptor.
|
||||
/// This has a lifetime parameter to tie it to the lifetime of something that owns the file
|
||||
/// descriptor. For the duration of that lifetime, it is guaranteed that nobody will close the file
|
||||
/// descriptor.
|
||||
///
|
||||
/// This uses `repr(transparent)` and has the representation of a host file
|
||||
/// descriptor, so it can be used in FFI in places where a file descriptor is
|
||||
@ -42,7 +43,8 @@ pub struct BorrowedFd<'fd> {
|
||||
|
||||
/// An owned file descriptor.
|
||||
///
|
||||
/// This closes the file descriptor on drop.
|
||||
/// This closes the file descriptor on drop. It is guaranteed that nobody else will close the file
|
||||
/// descriptor.
|
||||
///
|
||||
/// This uses `repr(transparent)` and has the representation of a host file
|
||||
/// descriptor, so it can be used in FFI in places where a file descriptor is
|
||||
@ -155,7 +157,9 @@ impl FromRawFd for OwnedFd {
|
||||
/// # Safety
|
||||
///
|
||||
/// The resource pointed to by `fd` must be open and suitable for assuming
|
||||
/// ownership. The resource must not require any cleanup other than `close`.
|
||||
/// [ownership][io-safety]. The resource must not require any cleanup other than `close`.
|
||||
///
|
||||
/// [io-safety]: io#io-safety
|
||||
#[inline]
|
||||
unsafe fn from_raw_fd(fd: RawFd) -> Self {
|
||||
assert_ne!(fd, u32::MAX as RawFd);
|
||||
|
@ -84,7 +84,10 @@ pub trait FromRawFd {
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The `fd` passed in must be a valid and open file descriptor.
|
||||
/// The `fd` passed in must be an [owned file descriptor][io-safety];
|
||||
/// in particular, it must be open.
|
||||
///
|
||||
/// [io-safety]: io#io-safety
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
|
@ -31,15 +31,22 @@ pub trait FromRawFd {
|
||||
/// Constructs a new instance of `Self` from the given raw file
|
||||
/// descriptor and metadata.
|
||||
///
|
||||
/// This function **consumes ownership** of the specified file
|
||||
/// descriptor. The returned object will take responsibility for closing
|
||||
/// it when the object goes out of scope.
|
||||
/// This function is typically used to **consume ownership** of the
|
||||
/// specified file descriptor. When used in this way, the returned object
|
||||
/// will take responsibility for closing it when the object goes out of
|
||||
/// scope.
|
||||
///
|
||||
/// This function is also unsafe as the primitives currently returned
|
||||
/// have the contract that they are the sole owner of the file
|
||||
/// descriptor they are wrapping. Usage of this function could
|
||||
/// accidentally allow violating this contract which can cause memory
|
||||
/// unsafety in code that relies on it being true.
|
||||
/// However, consuming ownership is not strictly required. Use a
|
||||
/// [`From<OwnedFd>::from`] implementation for an API which strictly
|
||||
/// consumes ownership.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The `fd` passed in must be an [owned file descriptor][io-safety];
|
||||
/// in particular, it must be open.
|
||||
// FIXME: say something about `metadata`.
|
||||
///
|
||||
/// [io-safety]: io#io-safety
|
||||
#[unstable(feature = "sgx_platform", issue = "56975")]
|
||||
unsafe fn from_raw_fd(fd: RawFd, metadata: Self::Metadata) -> Self;
|
||||
}
|
||||
|
@ -27,15 +27,21 @@ pub trait FromRawFd {
|
||||
/// Constructs a new instance of `Self` from the given raw file
|
||||
/// descriptor.
|
||||
///
|
||||
/// This function **consumes ownership** of the specified file
|
||||
/// descriptor. The returned object will take responsibility for closing
|
||||
/// it when the object goes out of scope.
|
||||
/// This function is typically used to **consume ownership** of the
|
||||
/// specified file descriptor. When used in this way, the returned object
|
||||
/// will take responsibility for closing it when the object goes out of
|
||||
/// scope.
|
||||
///
|
||||
/// This function is also unsafe as the primitives currently returned
|
||||
/// have the contract that they are the sole owner of the file
|
||||
/// descriptor they are wrapping. Usage of this function could
|
||||
/// accidentally allow violating this contract which can cause memory
|
||||
/// unsafety in code that relies on it being true.
|
||||
/// However, consuming ownership is not strictly required. Use a
|
||||
/// [`From<OwnedFd>::from`] implementation for an API which strictly
|
||||
/// consumes ownership.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The `fd` passed in must be an [owned file descriptor][io-safety];
|
||||
/// in particular, it must be open.
|
||||
///
|
||||
/// [io-safety]: io#io-safety
|
||||
unsafe fn from_raw_fd(fd: RawFd) -> Self;
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
//!
|
||||
//! This module provides three types for representing file descriptors,
|
||||
//! with different ownership properties: raw, borrowed, and owned, which are
|
||||
//! analogous to types used for representing pointers:
|
||||
//! analogous to types used for representing pointers. These types reflect the Unix version of [I/O safety].
|
||||
//!
|
||||
//! | Type | Analogous to |
|
||||
//! | ------------------ | ------------ |
|
||||
@ -65,15 +65,16 @@
|
||||
//! to be opened and read from or written must be `unsafe`. Rust's safety guarantees
|
||||
//! only cover what the program itself can do, and not what entities outside
|
||||
//! the program can do to it. `/proc/self/mem` is considered to be such an
|
||||
//! external entity, along with debugging interfaces, and people with physical access to
|
||||
//! the hardware. This is true even in cases where the program is controlling
|
||||
//! the external entity.
|
||||
//! external entity, along with `/proc/self/fd/*`, debugging interfaces, and people with physical
|
||||
//! access to the hardware. This is true even in cases where the program is controlling the external
|
||||
//! entity.
|
||||
//!
|
||||
//! If you desire to comprehensively prevent programs from reaching out and
|
||||
//! causing external entities to reach back in and violate memory safety, it's
|
||||
//! necessary to use *sandboxing*, which is outside the scope of `std`.
|
||||
//!
|
||||
//! [`BorrowedFd<'a>`]: crate::os::unix::io::BorrowedFd
|
||||
//! [I/O safety]: crate::io#io-safety
|
||||
|
||||
#![stable(feature = "rust1", since = "1.0.0")]
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
//!
|
||||
//! This module provides three types for representing raw handles and sockets
|
||||
//! with different ownership properties: raw, borrowed, and owned, which are
|
||||
//! analogous to types used for representing pointers:
|
||||
//! analogous to types used for representing pointers. These types reflect the Windows version of [I/O safety].
|
||||
//!
|
||||
//! | Type | Analogous to |
|
||||
//! | ---------------------- | ------------ |
|
||||
@ -47,6 +47,7 @@
|
||||
//!
|
||||
//! [`BorrowedHandle<'a>`]: crate::os::windows::io::BorrowedHandle
|
||||
//! [`BorrowedSocket<'a>`]: crate::os::windows::io::BorrowedSocket
|
||||
//! [I/O safety]: crate::io#io-safety
|
||||
|
||||
#![stable(feature = "rust1", since = "1.0.0")]
|
||||
|
||||
|
@ -62,7 +62,7 @@ pub trait FromRawHandle {
|
||||
/// # Safety
|
||||
///
|
||||
/// The `handle` passed in must:
|
||||
/// - be a valid an open handle,
|
||||
/// - be an [owned handle][io-safety]; in particular, it must be open.
|
||||
/// - be a handle for a resource that may be freed via [`CloseHandle`]
|
||||
/// (as opposed to `RegCloseKey` or other close functions).
|
||||
///
|
||||
@ -71,6 +71,7 @@ pub trait FromRawHandle {
|
||||
///
|
||||
/// [`CloseHandle`]: https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle
|
||||
/// [here]: https://devblogs.microsoft.com/oldnewthing/20040302-00/?p=40443
|
||||
/// [io-safety]: io#io-safety
|
||||
#[stable(feature = "from_raw_os", since = "1.1.0")]
|
||||
unsafe fn from_raw_handle(handle: RawHandle) -> Self;
|
||||
}
|
||||
@ -207,10 +208,11 @@ pub trait FromRawSocket {
|
||||
/// # Safety
|
||||
///
|
||||
/// The `socket` passed in must:
|
||||
/// - be a valid an open socket,
|
||||
/// - be an [owned socket][io-safety]; in particular, it must be open.
|
||||
/// - be a socket that may be freed via [`closesocket`].
|
||||
///
|
||||
/// [`closesocket`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-closesocket
|
||||
/// [io-safety]: io#io-safety
|
||||
#[stable(feature = "from_raw_os", since = "1.1.0")]
|
||||
unsafe fn from_raw_socket(sock: RawSocket) -> Self;
|
||||
}
|
||||
|
@ -789,7 +789,7 @@ impl Command {
|
||||
/// or [`Command::envs`]. In addition, it will prevent the spawned child process from inheriting
|
||||
/// any environment variable from its parent process.
|
||||
///
|
||||
/// After calling [`Command::env_remove`], the iterator from [`Command::get_envs`] will be
|
||||
/// After calling [`Command::env_clear`], the iterator from [`Command::get_envs`] will be
|
||||
/// empty.
|
||||
///
|
||||
/// You can use [`Command::env_remove`] to clear a single mapping.
|
||||
|
@ -537,7 +537,7 @@ fn env_empty() {
|
||||
#[test]
|
||||
#[cfg(not(windows))]
|
||||
#[cfg_attr(any(target_os = "emscripten", target_env = "sgx"), ignore)]
|
||||
fn main() {
|
||||
fn debug_print() {
|
||||
const PIDFD: &'static str =
|
||||
if cfg!(target_os = "linux") { " create_pidfd: false,\n" } else { "" };
|
||||
|
||||
@ -623,6 +623,51 @@ fn main() {
|
||||
cwd: Some(
|
||||
"/some/path",
|
||||
),
|
||||
{PIDFD}}}"#
|
||||
)
|
||||
);
|
||||
|
||||
let mut command_with_removed_env = Command::new("boring-name");
|
||||
command_with_removed_env.env_remove("FOO").env_remove("BAR");
|
||||
assert_eq!(format!("{command_with_removed_env:?}"), r#"env -u BAR -u FOO "boring-name""#);
|
||||
assert_eq!(
|
||||
format!("{command_with_removed_env:#?}"),
|
||||
format!(
|
||||
r#"Command {{
|
||||
program: "boring-name",
|
||||
args: [
|
||||
"boring-name",
|
||||
],
|
||||
env: CommandEnv {{
|
||||
clear: false,
|
||||
vars: {{
|
||||
"BAR": None,
|
||||
"FOO": None,
|
||||
}},
|
||||
}},
|
||||
{PIDFD}}}"#
|
||||
)
|
||||
);
|
||||
|
||||
let mut command_with_cleared_env = Command::new("boring-name");
|
||||
command_with_cleared_env.env_clear().env("BAR", "val").env_remove("FOO");
|
||||
assert_eq!(format!("{command_with_cleared_env:?}"), r#"env -i BAR="val" "boring-name""#);
|
||||
assert_eq!(
|
||||
format!("{command_with_cleared_env:#?}"),
|
||||
format!(
|
||||
r#"Command {{
|
||||
program: "boring-name",
|
||||
args: [
|
||||
"boring-name",
|
||||
],
|
||||
env: CommandEnv {{
|
||||
clear: true,
|
||||
vars: {{
|
||||
"BAR": Some(
|
||||
"val",
|
||||
),
|
||||
}},
|
||||
}},
|
||||
{PIDFD}}}"#
|
||||
)
|
||||
);
|
||||
|
@ -586,6 +586,23 @@ impl fmt::Debug for Command {
|
||||
if let Some(ref cwd) = self.cwd {
|
||||
write!(f, "cd {cwd:?} && ")?;
|
||||
}
|
||||
if self.env.does_clear() {
|
||||
write!(f, "env -i ")?;
|
||||
// Altered env vars will be printed next, that should exactly work as expected.
|
||||
} else {
|
||||
// Removed env vars need the command to be wrapped in `env`.
|
||||
let mut any_removed = false;
|
||||
for (key, value_opt) in self.get_envs() {
|
||||
if value_opt.is_none() {
|
||||
if !any_removed {
|
||||
write!(f, "env ")?;
|
||||
any_removed = true;
|
||||
}
|
||||
write!(f, "-u {} ", key.to_string_lossy())?;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Altered env vars can just be added in front of the program.
|
||||
for (key, value_opt) in self.get_envs() {
|
||||
if let Some(value) = value_opt {
|
||||
write!(f, "{}={value:?} ", key.to_string_lossy())?;
|
||||
|
@ -318,25 +318,38 @@ pub fn available_parallelism() -> io::Result<NonZeroUsize> {
|
||||
target_os = "solaris",
|
||||
target_os = "illumos",
|
||||
))] {
|
||||
#[allow(unused_assignments)]
|
||||
#[allow(unused_mut)]
|
||||
let mut quota = usize::MAX;
|
||||
|
||||
#[cfg(any(target_os = "android", target_os = "linux"))]
|
||||
{
|
||||
let quota = cgroups::quota().max(1);
|
||||
quota = cgroups::quota().max(1);
|
||||
let mut set: libc::cpu_set_t = unsafe { mem::zeroed() };
|
||||
unsafe {
|
||||
if libc::sched_getaffinity(0, mem::size_of::<libc::cpu_set_t>(), &mut set) == 0 {
|
||||
let count = libc::CPU_COUNT(&set) as usize;
|
||||
let count = count.min(quota);
|
||||
// reported to occur on MIPS kernels older than our minimum supported kernel version for those targets
|
||||
let count = NonZeroUsize::new(count)
|
||||
.expect("CPU count must be > 0. This may be a bug in sched_getaffinity(); try upgrading the kernel.");
|
||||
return Ok(count);
|
||||
|
||||
// According to sched_getaffinity's API it should always be non-zero, but
|
||||
// some old MIPS kernels were buggy and zero-initialized the mask if
|
||||
// none was explicitly set.
|
||||
// In that case we use the sysconf fallback.
|
||||
if let Some(count) = NonZeroUsize::new(count) {
|
||||
return Ok(count)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
match unsafe { libc::sysconf(libc::_SC_NPROCESSORS_ONLN) } {
|
||||
-1 => Err(io::Error::last_os_error()),
|
||||
0 => Err(io::const_io_error!(io::ErrorKind::NotFound, "The number of hardware threads is not known for the target platform")),
|
||||
cpus => Ok(unsafe { NonZeroUsize::new_unchecked(cpus as usize) }),
|
||||
cpus => {
|
||||
let count = cpus as usize;
|
||||
// Cover the unusual situation where we were able to get the quota but not the affinity mask
|
||||
let count = count.min(quota);
|
||||
Ok(unsafe { NonZeroUsize::new_unchecked(count) })
|
||||
}
|
||||
}
|
||||
} else if #[cfg(any(target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd"))] {
|
||||
use crate::ptr;
|
||||
|
@ -80,6 +80,10 @@ impl CommandEnv {
|
||||
self.vars.clear();
|
||||
}
|
||||
|
||||
pub fn does_clear(&self) -> bool {
|
||||
self.clear
|
||||
}
|
||||
|
||||
pub fn have_changed_path(&self) -> bool {
|
||||
self.saw_path || self.clear
|
||||
}
|
||||
|
@ -793,6 +793,7 @@ fn clean_ty_generics<'tcx>(
|
||||
}
|
||||
Some(clean_generic_param_def(param, cx))
|
||||
}
|
||||
ty::GenericParamDefKind::Const { is_host_effect: true, .. } => None,
|
||||
ty::GenericParamDefKind::Const { .. } => Some(clean_generic_param_def(param, cx)),
|
||||
})
|
||||
.collect::<ThinVec<GenericParamDef>>();
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit b4ddf95ad9954118ac0dae835f2966394ad04c02
|
||||
Subproject commit 414d9e3a6d8096f3e276234ce220c868767a8792
|
@ -207,7 +207,8 @@ fn path_segment_certainty(
|
||||
// Checking `res_generics_def_id(..)` before calling `generics_of` avoids an ICE.
|
||||
if cx.tcx.res_generics_def_id(path_segment.res).is_some() {
|
||||
let generics = cx.tcx.generics_of(def_id);
|
||||
let lhs = if (parent_certainty.is_certain() || generics.parent_count == 0) && generics.params.is_empty()
|
||||
let count = generics.params.len() - generics.host_effect_index.is_some() as usize;
|
||||
let lhs = if (parent_certainty.is_certain() || generics.parent_count == 0) && count == 0
|
||||
{
|
||||
Certainty::Certain(None)
|
||||
} else {
|
||||
@ -299,7 +300,7 @@ fn type_is_inferrable_from_arguments(cx: &LateContext<'_>, expr: &Expr<'_>) -> b
|
||||
|
||||
// Check that all type parameters appear in the functions input types.
|
||||
(0..(generics.parent_count + generics.params.len()) as u32).all(|index| {
|
||||
fn_sig
|
||||
Some(index as usize) == generics.host_effect_index || fn_sig
|
||||
.inputs()
|
||||
.iter()
|
||||
.any(|input_ty| contains_param(*input_ty.skip_binder(), index))
|
||||
|
@ -36,7 +36,7 @@ fn main() {
|
||||
issue_10381();
|
||||
|
||||
// `Box::<Option<_>>::default()` would be valid here, but not `Box::default()` or
|
||||
// `Box::<Option<[closure@...]>::default()`
|
||||
// `Box::<Option<{closure@...}>::default()`
|
||||
//
|
||||
// Would have a suggestion after https://github.com/rust-lang/rust/blob/fdd030127cc68afec44a8d3f6341525dd34e50ae/compiler/rustc_middle/src/ty/diagnostics.rs#L554-L563
|
||||
let mut unnameable = Box::new(Option::default());
|
||||
|
@ -36,7 +36,7 @@ fn main() {
|
||||
issue_10381();
|
||||
|
||||
// `Box::<Option<_>>::default()` would be valid here, but not `Box::default()` or
|
||||
// `Box::<Option<[closure@...]>::default()`
|
||||
// `Box::<Option<{closure@...}>::default()`
|
||||
//
|
||||
// Would have a suggestion after https://github.com/rust-lang/rust/blob/fdd030127cc68afec44a8d3f6341525dd34e50ae/compiler/rustc_middle/src/ty/diagnostics.rs#L554-L563
|
||||
let mut unnameable = Box::new(Option::default());
|
||||
|
@ -27,7 +27,7 @@ LL | fn bug<T>() -> impl Iterator<Item = [(); { |x: [u8]| x }]> {
|
||||
| ^^^^^^^^^^^ expected `usize`, found closure
|
||||
|
|
||||
= note: expected type `usize`
|
||||
found closure `[closure@$DIR/ice-6251.rs:4:44: 4:53]`
|
||||
found closure `{closure@$DIR/ice-6251.rs:4:44: 4:53}`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
@ -24,7 +24,7 @@ note: inside closure
|
||||
|
|
||||
LL | || drop(Box::from_raw(ptr)),
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
note: inside `dealloc_while_running::<[closure@$DIR/newtype_pair_retagging.rs:LL:CC]>`
|
||||
note: inside `dealloc_while_running::<{closure@$DIR/newtype_pair_retagging.rs:LL:CC}>`
|
||||
--> $DIR/newtype_pair_retagging.rs:LL:CC
|
||||
|
|
||||
LL | dealloc();
|
||||
|
@ -35,7 +35,7 @@ note: inside closure
|
||||
|
|
||||
LL | || drop(Box::from_raw(ptr)),
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: inside `dealloc_while_running::<[closure@$DIR/newtype_pair_retagging.rs:LL:CC]>`
|
||||
note: inside `dealloc_while_running::<{closure@$DIR/newtype_pair_retagging.rs:LL:CC}>`
|
||||
--> $DIR/newtype_pair_retagging.rs:LL:CC
|
||||
|
|
||||
LL | dealloc();
|
||||
|
@ -24,7 +24,7 @@ note: inside closure
|
||||
|
|
||||
LL | || drop(Box::from_raw(ptr)),
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
note: inside `dealloc_while_running::<[closure@$DIR/newtype_retagging.rs:LL:CC]>`
|
||||
note: inside `dealloc_while_running::<{closure@$DIR/newtype_retagging.rs:LL:CC}>`
|
||||
--> $DIR/newtype_retagging.rs:LL:CC
|
||||
|
|
||||
LL | dealloc();
|
||||
|
@ -35,7 +35,7 @@ note: inside closure
|
||||
|
|
||||
LL | || drop(Box::from_raw(ptr)),
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: inside `dealloc_while_running::<[closure@$DIR/newtype_retagging.rs:LL:CC]>`
|
||||
note: inside `dealloc_while_running::<{closure@$DIR/newtype_retagging.rs:LL:CC}>`
|
||||
--> $DIR/newtype_retagging.rs:LL:CC
|
||||
|
|
||||
LL | dealloc();
|
||||
|
@ -14,7 +14,7 @@ LL | ABORT();
|
||||
= note: inside `std::sys::PLATFORM::abort_internal` at RUSTLIB/std/src/sys/PLATFORM/mod.rs:LL:CC
|
||||
= note: inside `std::panicking::rust_panic_with_hook` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside closure at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::panicking::begin_panic_handler::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<{closure@std::panicking::begin_panic_handler::{closure#0}}, !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::panicking::begin_panic_handler` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `core::panicking::panic_nounwind` at RUSTLIB/core/src/panicking.rs:LL:CC
|
||||
= note: inside `core::panicking::panic_cannot_unwind` at RUSTLIB/core/src/panicking.rs:LL:CC
|
||||
|
@ -14,7 +14,7 @@ LL | ABORT();
|
||||
= note: inside `std::sys::PLATFORM::abort_internal` at RUSTLIB/std/src/sys/PLATFORM/mod.rs:LL:CC
|
||||
= note: inside `std::panicking::rust_panic_with_hook` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside closure at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::panicking::begin_panic_handler::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<{closure@std::panicking::begin_panic_handler::{closure#0}}, !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::panicking::begin_panic_handler` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `core::panicking::panic_nounwind` at RUSTLIB/core/src/panicking.rs:LL:CC
|
||||
= note: inside `core::panicking::panic_cannot_unwind` at RUSTLIB/core/src/panicking.rs:LL:CC
|
||||
|
@ -18,12 +18,12 @@ LL | }; // *deallocate* generator_iterator
|
||||
| ^
|
||||
= note: BACKTRACE (of the first span):
|
||||
= note: inside closure at $DIR/generator-pinned-moved.rs:LL:CC
|
||||
note: inside `<GeneratorIteratorAdapter<[static generator@$DIR/generator-pinned-moved.rs:LL:CC]> as std::iter::Iterator>::next`
|
||||
note: inside `<GeneratorIteratorAdapter<{static generator@$DIR/generator-pinned-moved.rs:LL:CC}> as std::iter::Iterator>::next`
|
||||
--> $DIR/generator-pinned-moved.rs:LL:CC
|
||||
|
|
||||
LL | match me.resume(()) {
|
||||
| ^^^^^^^^^^^^^
|
||||
= note: inside `<std::boxed::Box<GeneratorIteratorAdapter<[static generator@$DIR/generator-pinned-moved.rs:LL:CC]>> as std::iter::Iterator>::next` at RUSTLIB/alloc/src/boxed.rs:LL:CC
|
||||
= note: inside `<std::boxed::Box<GeneratorIteratorAdapter<{static generator@$DIR/generator-pinned-moved.rs:LL:CC}>> as std::iter::Iterator>::next` at RUSTLIB/alloc/src/boxed.rs:LL:CC
|
||||
note: inside `main`
|
||||
--> $DIR/generator-pinned-moved.rs:LL:CC
|
||||
|
|
||||
|
@ -11,7 +11,7 @@ LL | ABORT();
|
||||
= note: inside `std::sys::PLATFORM::abort_internal` at RUSTLIB/std/src/sys/PLATFORM/mod.rs:LL:CC
|
||||
= note: inside `std::panicking::rust_panic_with_hook` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside closure at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::panicking::begin_panic_handler::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<{closure@std::panicking::begin_panic_handler::{closure#0}}, !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::panicking::begin_panic_handler` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `core::panicking::panic_nounwind` at RUSTLIB/core/src/panicking.rs:LL:CC
|
||||
note: inside `main`
|
||||
|
@ -11,7 +11,7 @@ LL | ABORT();
|
||||
= note: inside `std::sys::PLATFORM::abort_internal` at RUSTLIB/std/src/sys/PLATFORM/mod.rs:LL:CC
|
||||
= note: inside `std::panicking::rust_panic_with_hook` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside closure at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::panicking::begin_panic_handler::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<{closure@std::panicking::begin_panic_handler::{closure#0}}, !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::panicking::begin_panic_handler` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `core::panicking::panic_nounwind` at RUSTLIB/core/src/panicking.rs:LL:CC
|
||||
note: inside `main`
|
||||
|
@ -11,9 +11,9 @@ LL | std::panic::catch_unwind(|| unwind()).unwrap_err();
|
||||
= help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
|
||||
= note: BACKTRACE:
|
||||
= note: inside closure at $DIR/bad_unwind.rs:LL:CC
|
||||
= note: inside `std::panicking::r#try::do_call::<[closure@$DIR/bad_unwind.rs:LL:CC], ()>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::panicking::r#try::<(), [closure@$DIR/bad_unwind.rs:LL:CC]>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::panic::catch_unwind::<[closure@$DIR/bad_unwind.rs:LL:CC], ()>` at RUSTLIB/std/src/panic.rs:LL:CC
|
||||
= note: inside `std::panicking::r#try::do_call::<{closure@$DIR/bad_unwind.rs:LL:CC}, ()>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::panicking::r#try::<(), {closure@$DIR/bad_unwind.rs:LL:CC}>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::panic::catch_unwind::<{closure@$DIR/bad_unwind.rs:LL:CC}, ()>` at RUSTLIB/std/src/panic.rs:LL:CC
|
||||
note: inside `main`
|
||||
--> $DIR/bad_unwind.rs:LL:CC
|
||||
|
|
||||
|
@ -16,7 +16,7 @@ LL | ABORT();
|
||||
= note: inside `std::sys::PLATFORM::abort_internal` at RUSTLIB/std/src/sys/PLATFORM/mod.rs:LL:CC
|
||||
= note: inside `std::panicking::rust_panic_with_hook` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside closure at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::panicking::begin_panic_handler::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<{closure@std::panicking::begin_panic_handler::{closure#0}}, !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::panicking::begin_panic_handler` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `core::panicking::panic_nounwind_nobacktrace` at RUSTLIB/core/src/panicking.rs:LL:CC
|
||||
= note: inside `core::panicking::panic_in_cleanup` at RUSTLIB/core/src/panicking.rs:LL:CC
|
||||
|
@ -12,7 +12,7 @@ LL | ABORT();
|
||||
= note: inside `std::panicking::rust_panic` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::panicking::rust_panic_with_hook` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside closure at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::panicking::begin_panic_handler::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<{closure@std::panicking::begin_panic_handler::{closure#0}}, !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::panicking::begin_panic_handler` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
note: inside `main`
|
||||
--> $DIR/panic_abort1.rs:LL:CC
|
||||
|
@ -12,7 +12,7 @@ LL | ABORT();
|
||||
= note: inside `std::panicking::rust_panic` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::panicking::rust_panic_with_hook` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside closure at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::panicking::begin_panic_handler::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<{closure@std::panicking::begin_panic_handler::{closure#0}}, !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::panicking::begin_panic_handler` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
note: inside `main`
|
||||
--> $DIR/panic_abort2.rs:LL:CC
|
||||
|
@ -12,7 +12,7 @@ LL | ABORT();
|
||||
= note: inside `std::panicking::rust_panic` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::panicking::rust_panic_with_hook` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside closure at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::panicking::begin_panic_handler::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<{closure@std::panicking::begin_panic_handler::{closure#0}}, !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::panicking::begin_panic_handler` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
note: inside `main`
|
||||
--> $DIR/panic_abort3.rs:LL:CC
|
||||
|
@ -12,7 +12,7 @@ LL | ABORT();
|
||||
= note: inside `std::panicking::rust_panic` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::panicking::rust_panic_with_hook` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside closure at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::panicking::begin_panic_handler::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<{closure@std::panicking::begin_panic_handler::{closure#0}}, !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::panicking::begin_panic_handler` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
note: inside `main`
|
||||
--> $DIR/panic_abort4.rs:LL:CC
|
||||
|
@ -8,11 +8,11 @@ LL | let fd = cvt_r(|| unsafe { open64(path.as_ptr(), flags, opts.mode a
|
||||
= help: or pass `-Zmiri-isolation-error=warn` to configure Miri to return an error code from isolated operations (if supported for that operation) and continue with a warning
|
||||
= note: BACKTRACE:
|
||||
= note: inside closure at RUSTLIB/std/src/sys/PLATFORM/fs.rs:LL:CC
|
||||
= note: inside `std::sys::PLATFORM::cvt_r::<i32, [closure@std::sys::PLATFORM::fs::File::open_c::{closure#0}]>` at RUSTLIB/std/src/sys/PLATFORM/mod.rs:LL:CC
|
||||
= note: inside `std::sys::PLATFORM::cvt_r::<i32, {closure@std::sys::PLATFORM::fs::File::open_c::{closure#0}}>` at RUSTLIB/std/src/sys/PLATFORM/mod.rs:LL:CC
|
||||
= note: inside `std::sys::PLATFORM::fs::File::open_c` at RUSTLIB/std/src/sys/PLATFORM/fs.rs:LL:CC
|
||||
= note: inside closure at RUSTLIB/std/src/sys/PLATFORM/fs.rs:LL:CC
|
||||
= note: inside `std::sys::PLATFORM::small_c_string::run_with_cstr::<std::sys::PLATFORM::fs::File, [closure@std::sys::PLATFORM::fs::File::open::{closure#0}]>` at RUSTLIB/std/src/sys/PLATFORM/small_c_string.rs:LL:CC
|
||||
= note: inside `std::sys::PLATFORM::small_c_string::run_path_with_cstr::<std::sys::PLATFORM::fs::File, [closure@std::sys::PLATFORM::fs::File::open::{closure#0}]>` at RUSTLIB/std/src/sys/PLATFORM/small_c_string.rs:LL:CC
|
||||
= note: inside `std::sys::PLATFORM::small_c_string::run_with_cstr::<std::sys::PLATFORM::fs::File, {closure@std::sys::PLATFORM::fs::File::open::{closure#0}}>` at RUSTLIB/std/src/sys/PLATFORM/small_c_string.rs:LL:CC
|
||||
= note: inside `std::sys::PLATFORM::small_c_string::run_path_with_cstr::<std::sys::PLATFORM::fs::File, {closure@std::sys::PLATFORM::fs::File::open::{closure#0}}>` at RUSTLIB/std/src/sys/PLATFORM/small_c_string.rs:LL:CC
|
||||
= note: inside `std::sys::PLATFORM::fs::File::open` at RUSTLIB/std/src/sys/PLATFORM/fs.rs:LL:CC
|
||||
= note: inside `std::fs::OpenOptions::_open` at RUSTLIB/std/src/fs.rs:LL:CC
|
||||
= note: inside `std::fs::OpenOptions::open::<&std::path::Path>` at RUSTLIB/std/src/fs.rs:LL:CC
|
||||
|
@ -17,7 +17,7 @@ note: inside closure
|
||||
|
|
||||
LL | drop(unsafe { Box::from_raw(raw) });
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: inside `<[closure@$DIR/deallocate_against_protector1.rs:LL:CC] as std::ops::FnOnce<(&mut i32,)>>::call_once - shim` at RUSTLIB/core/src/ops/function.rs:LL:CC
|
||||
= note: inside `<{closure@$DIR/deallocate_against_protector1.rs:LL:CC} as std::ops::FnOnce<(&mut i32,)>>::call_once - shim` at RUSTLIB/core/src/ops/function.rs:LL:CC
|
||||
note: inside `inner`
|
||||
--> $DIR/deallocate_against_protector1.rs:LL:CC
|
||||
|
|
||||
|
@ -16,7 +16,7 @@ LL | ABORT();
|
||||
= note: inside `std::sys::PLATFORM::abort_internal` at RUSTLIB/std/src/sys/PLATFORM/mod.rs:LL:CC
|
||||
= note: inside `std::panicking::rust_panic_with_hook` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside closure at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::panicking::begin_panic_handler::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<{closure@std::panicking::begin_panic_handler::{closure#0}}, !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::panicking::begin_panic_handler` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `core::panicking::panic_nounwind` at RUSTLIB/core/src/panicking.rs:LL:CC
|
||||
= note: inside `core::panicking::panic_cannot_unwind` at RUSTLIB/core/src/panicking.rs:LL:CC
|
||||
|
@ -28,7 +28,7 @@ note: inside closure
|
||||
|
|
||||
LL | drop(unsafe { Box::from_raw(raw) });
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: inside `<[closure@$DIR/strongly-protected.rs:LL:CC] as std::ops::FnOnce<(&mut i32,)>>::call_once - shim` at RUSTLIB/core/src/ops/function.rs:LL:CC
|
||||
= note: inside `<{closure@$DIR/strongly-protected.rs:LL:CC} as std::ops::FnOnce<(&mut i32,)>>::call_once - shim` at RUSTLIB/core/src/ops/function.rs:LL:CC
|
||||
note: inside `inner`
|
||||
--> $DIR/strongly-protected.rs:LL:CC
|
||||
|
|
||||
|
@ -14,7 +14,7 @@ LL | ABORT();
|
||||
= note: inside `std::sys::PLATFORM::abort_internal` at RUSTLIB/std/src/sys/PLATFORM/mod.rs:LL:CC
|
||||
= note: inside `std::panicking::rust_panic_with_hook` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside closure at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::panicking::begin_panic_handler::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<{closure@std::panicking::begin_panic_handler::{closure#0}}, !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC
|
||||
= note: inside `std::panicking::begin_panic_handler` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `core::panicking::panic_nounwind` at RUSTLIB/core/src/panicking.rs:LL:CC
|
||||
= note: inside `core::panicking::panic_cannot_unwind` at RUSTLIB/core/src/panicking.rs:LL:CC
|
||||
|
@ -15,8 +15,8 @@ pub fn outer_function(x: S, y: S) -> usize {
|
||||
// Check that we do not attempt to load from the spilled arg before it is assigned to
|
||||
// when generating debuginfo.
|
||||
// CHECK-LABEL: @outer_function
|
||||
// CHECK: [[spill:%.*]] = alloca %"[closure@{{.*.rs}}:9:23: 9:25]"
|
||||
// CHECK-NOT: [[ptr_tmp:%.*]] = getelementptr inbounds %"[closure@{{.*.rs}}:9:23: 9:25]", ptr [[spill]]
|
||||
// CHECK: [[spill:%.*]] = alloca %"{closure@{{.*.rs}}:9:23: 9:25}"
|
||||
// CHECK-NOT: [[ptr_tmp:%.*]] = getelementptr inbounds %"{closure@{{.*.rs}}:9:23: 9:25}", ptr [[spill]]
|
||||
// CHECK-NOT: [[load:%.*]] = load ptr, ptr
|
||||
// CHECK: call void @llvm.lifetime.start{{.*}}({{.*}}, ptr [[spill]])
|
||||
// CHECK: [[inner:%.*]] = getelementptr inbounds %"{{.*}}", ptr [[spill]]
|
||||
|
@ -9,7 +9,7 @@
|
||||
storage_conflicts: BitMatrix(0x0) {},
|
||||
} */
|
||||
|
||||
fn a::{closure#0}(_1: Pin<&mut [async fn body@$DIR/async_await.rs:11:14: 11:16]>, _2: &mut Context<'_>) -> Poll<()> {
|
||||
fn a::{closure#0}(_1: Pin<&mut {async fn body@$DIR/async_await.rs:11:14: 11:16}>, _2: &mut Context<'_>) -> Poll<()> {
|
||||
debug _task_context => _4;
|
||||
let mut _0: std::task::Poll<()>;
|
||||
let mut _3: ();
|
||||
@ -17,7 +17,7 @@ fn a::{closure#0}(_1: Pin<&mut [async fn body@$DIR/async_await.rs:11:14: 11:16]>
|
||||
let mut _5: u32;
|
||||
|
||||
bb0: {
|
||||
_5 = discriminant((*(_1.0: &mut [async fn body@$DIR/async_await.rs:11:14: 11:16])));
|
||||
_5 = discriminant((*(_1.0: &mut {async fn body@$DIR/async_await.rs:11:14: 11:16})));
|
||||
switchInt(move _5) -> [0: bb1, 1: bb2, otherwise: bb3];
|
||||
}
|
||||
|
||||
@ -25,7 +25,7 @@ fn a::{closure#0}(_1: Pin<&mut [async fn body@$DIR/async_await.rs:11:14: 11:16]>
|
||||
_4 = move _2;
|
||||
_3 = const ();
|
||||
_0 = Poll::<()>::Ready(move _3);
|
||||
discriminant((*(_1.0: &mut [async fn body@$DIR/async_await.rs:11:14: 11:16]))) = 1;
|
||||
discriminant((*(_1.0: &mut {async fn body@$DIR/async_await.rs:11:14: 11:16}))) = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -45,7 +45,7 @@
|
||||
},
|
||||
} */
|
||||
|
||||
fn b::{closure#0}(_1: Pin<&mut [async fn body@$DIR/async_await.rs:14:18: 17:2]>, _2: &mut Context<'_>) -> Poll<()> {
|
||||
fn b::{closure#0}(_1: Pin<&mut {async fn body@$DIR/async_await.rs:14:18: 17:2}>, _2: &mut Context<'_>) -> Poll<()> {
|
||||
debug _task_context => _38;
|
||||
let mut _0: std::task::Poll<()>;
|
||||
let _3: ();
|
||||
@ -84,7 +84,7 @@ fn b::{closure#0}(_1: Pin<&mut [async fn body@$DIR/async_await.rs:14:18: 17:2]>,
|
||||
let mut _38: &mut std::task::Context<'_>;
|
||||
let mut _39: u32;
|
||||
scope 1 {
|
||||
debug __awaitee => (((*(_1.0: &mut [async fn body@$DIR/async_await.rs:14:18: 17:2])) as variant#3).0: impl std::future::Future<Output = ()>);
|
||||
debug __awaitee => (((*(_1.0: &mut {async fn body@$DIR/async_await.rs:14:18: 17:2})) as variant#3).0: impl std::future::Future<Output = ()>);
|
||||
let _17: ();
|
||||
scope 2 {
|
||||
}
|
||||
@ -93,7 +93,7 @@ fn b::{closure#0}(_1: Pin<&mut [async fn body@$DIR/async_await.rs:14:18: 17:2]>,
|
||||
}
|
||||
}
|
||||
scope 4 {
|
||||
debug __awaitee => (((*(_1.0: &mut [async fn body@$DIR/async_await.rs:14:18: 17:2])) as variant#4).0: impl std::future::Future<Output = ()>);
|
||||
debug __awaitee => (((*(_1.0: &mut {async fn body@$DIR/async_await.rs:14:18: 17:2})) as variant#4).0: impl std::future::Future<Output = ()>);
|
||||
let _33: ();
|
||||
scope 5 {
|
||||
}
|
||||
@ -103,7 +103,7 @@ fn b::{closure#0}(_1: Pin<&mut [async fn body@$DIR/async_await.rs:14:18: 17:2]>,
|
||||
}
|
||||
|
||||
bb0: {
|
||||
_39 = discriminant((*(_1.0: &mut [async fn body@$DIR/async_await.rs:14:18: 17:2])));
|
||||
_39 = discriminant((*(_1.0: &mut {async fn body@$DIR/async_await.rs:14:18: 17:2})));
|
||||
switchInt(move _39) -> [0: bb1, 1: bb28, 3: bb26, 4: bb27, otherwise: bb29];
|
||||
}
|
||||
|
||||
@ -122,7 +122,7 @@ fn b::{closure#0}(_1: Pin<&mut [async fn body@$DIR/async_await.rs:14:18: 17:2]>,
|
||||
bb3: {
|
||||
StorageDead(_5);
|
||||
nop;
|
||||
(((*(_1.0: &mut [async fn body@$DIR/async_await.rs:14:18: 17:2])) as variant#3).0: impl std::future::Future<Output = ()>) = move _4;
|
||||
(((*(_1.0: &mut {async fn body@$DIR/async_await.rs:14:18: 17:2})) as variant#3).0: impl std::future::Future<Output = ()>) = move _4;
|
||||
goto -> bb4;
|
||||
}
|
||||
|
||||
@ -132,7 +132,7 @@ fn b::{closure#0}(_1: Pin<&mut [async fn body@$DIR/async_await.rs:14:18: 17:2]>,
|
||||
StorageLive(_10);
|
||||
StorageLive(_11);
|
||||
StorageLive(_12);
|
||||
_12 = &mut (((*(_1.0: &mut [async fn body@$DIR/async_await.rs:14:18: 17:2])) as variant#3).0: impl std::future::Future<Output = ()>);
|
||||
_12 = &mut (((*(_1.0: &mut {async fn body@$DIR/async_await.rs:14:18: 17:2})) as variant#3).0: impl std::future::Future<Output = ()>);
|
||||
_11 = &mut (*_12);
|
||||
_10 = Pin::<&mut impl Future<Output = ()>>::new_unchecked(move _11) -> [return: bb5, unwind unreachable];
|
||||
}
|
||||
@ -170,7 +170,7 @@ fn b::{closure#0}(_1: Pin<&mut [async fn body@$DIR/async_await.rs:14:18: 17:2]>,
|
||||
StorageLive(_20);
|
||||
_20 = ();
|
||||
_0 = Poll::<()>::Pending;
|
||||
discriminant((*(_1.0: &mut [async fn body@$DIR/async_await.rs:14:18: 17:2]))) = 3;
|
||||
discriminant((*(_1.0: &mut {async fn body@$DIR/async_await.rs:14:18: 17:2}))) = 3;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -218,7 +218,7 @@ fn b::{closure#0}(_1: Pin<&mut [async fn body@$DIR/async_await.rs:14:18: 17:2]>,
|
||||
bb15: {
|
||||
StorageDead(_22);
|
||||
nop;
|
||||
(((*(_1.0: &mut [async fn body@$DIR/async_await.rs:14:18: 17:2])) as variant#4).0: impl std::future::Future<Output = ()>) = move _21;
|
||||
(((*(_1.0: &mut {async fn body@$DIR/async_await.rs:14:18: 17:2})) as variant#4).0: impl std::future::Future<Output = ()>) = move _21;
|
||||
goto -> bb16;
|
||||
}
|
||||
|
||||
@ -228,7 +228,7 @@ fn b::{closure#0}(_1: Pin<&mut [async fn body@$DIR/async_await.rs:14:18: 17:2]>,
|
||||
StorageLive(_26);
|
||||
StorageLive(_27);
|
||||
StorageLive(_28);
|
||||
_28 = &mut (((*(_1.0: &mut [async fn body@$DIR/async_await.rs:14:18: 17:2])) as variant#4).0: impl std::future::Future<Output = ()>);
|
||||
_28 = &mut (((*(_1.0: &mut {async fn body@$DIR/async_await.rs:14:18: 17:2})) as variant#4).0: impl std::future::Future<Output = ()>);
|
||||
_27 = &mut (*_28);
|
||||
_26 = Pin::<&mut impl Future<Output = ()>>::new_unchecked(move _27) -> [return: bb17, unwind unreachable];
|
||||
}
|
||||
@ -266,7 +266,7 @@ fn b::{closure#0}(_1: Pin<&mut [async fn body@$DIR/async_await.rs:14:18: 17:2]>,
|
||||
StorageLive(_36);
|
||||
_36 = ();
|
||||
_0 = Poll::<()>::Pending;
|
||||
discriminant((*(_1.0: &mut [async fn body@$DIR/async_await.rs:14:18: 17:2]))) = 4;
|
||||
discriminant((*(_1.0: &mut {async fn body@$DIR/async_await.rs:14:18: 17:2}))) = 4;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -302,7 +302,7 @@ fn b::{closure#0}(_1: Pin<&mut [async fn body@$DIR/async_await.rs:14:18: 17:2]>,
|
||||
|
||||
bb25: {
|
||||
_0 = Poll::<()>::Ready(move _37);
|
||||
discriminant((*(_1.0: &mut [async fn body@$DIR/async_await.rs:14:18: 17:2]))) = 1;
|
||||
discriminant((*(_1.0: &mut {async fn body@$DIR/async_await.rs:14:18: 17:2}))) = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -21,7 +21,7 @@
|
||||
},
|
||||
} */
|
||||
|
||||
fn main::{closure#0}(_1: *mut [generator@$DIR/generator_drop_cleanup.rs:10:15: 10:17]) -> () {
|
||||
fn main::{closure#0}(_1: *mut {generator@$DIR/generator_drop_cleanup.rs:10:15: 10:17}) -> () {
|
||||
let mut _0: ();
|
||||
let mut _2: ();
|
||||
let _3: std::string::String;
|
||||
|
@ -21,7 +21,7 @@
|
||||
},
|
||||
} */
|
||||
|
||||
fn main::{closure#0}(_1: *mut [generator@$DIR/generator_drop_cleanup.rs:10:15: 10:17]) -> () {
|
||||
fn main::{closure#0}(_1: *mut {generator@$DIR/generator_drop_cleanup.rs:10:15: 10:17}) -> () {
|
||||
let mut _0: ();
|
||||
let mut _2: ();
|
||||
let _3: std::string::String;
|
||||
|
@ -1,6 +1,6 @@
|
||||
// MIR for `main::{closure#0}` before StateTransform
|
||||
|
||||
fn main::{closure#0}(_1: [generator@$DIR/generator_storage_dead_unwind.rs:22:16: 22:18], _2: ()) -> ()
|
||||
fn main::{closure#0}(_1: {generator@$DIR/generator_storage_dead_unwind.rs:22:16: 22:18}, _2: ()) -> ()
|
||||
yields ()
|
||||
{
|
||||
let mut _0: ();
|
||||
|
@ -1,6 +1,6 @@
|
||||
// MIR for `main::{closure#0}` before StateTransform
|
||||
|
||||
fn main::{closure#0}(_1: [generator@$DIR/generator_storage_dead_unwind.rs:22:16: 22:18], _2: ()) -> ()
|
||||
fn main::{closure#0}(_1: {generator@$DIR/generator_storage_dead_unwind.rs:22:16: 22:18}, _2: ()) -> ()
|
||||
yields ()
|
||||
{
|
||||
let mut _0: ();
|
||||
|
@ -21,7 +21,7 @@
|
||||
},
|
||||
} */
|
||||
|
||||
fn main::{closure#0}(_1: Pin<&mut [generator@$DIR/generator_tiny.rs:19:16: 19:24]>, _2: u8) -> GeneratorState<(), ()> {
|
||||
fn main::{closure#0}(_1: Pin<&mut {generator@$DIR/generator_tiny.rs:19:16: 19:24}>, _2: u8) -> GeneratorState<(), ()> {
|
||||
debug _x => _10;
|
||||
let mut _0: std::ops::GeneratorState<(), ()>;
|
||||
let _3: HasDrop;
|
||||
@ -34,18 +34,18 @@ fn main::{closure#0}(_1: Pin<&mut [generator@$DIR/generator_tiny.rs:19:16: 19:24
|
||||
let _10: u8;
|
||||
let mut _11: u32;
|
||||
scope 1 {
|
||||
debug _d => (((*(_1.0: &mut [generator@$DIR/generator_tiny.rs:19:16: 19:24])) as variant#3).0: HasDrop);
|
||||
debug _d => (((*(_1.0: &mut {generator@$DIR/generator_tiny.rs:19:16: 19:24})) as variant#3).0: HasDrop);
|
||||
}
|
||||
|
||||
bb0: {
|
||||
_11 = discriminant((*(_1.0: &mut [generator@$DIR/generator_tiny.rs:19:16: 19:24])));
|
||||
_11 = discriminant((*(_1.0: &mut {generator@$DIR/generator_tiny.rs:19:16: 19:24})));
|
||||
switchInt(move _11) -> [0: bb1, 3: bb5, otherwise: bb6];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
_10 = move _2;
|
||||
nop;
|
||||
(((*(_1.0: &mut [generator@$DIR/generator_tiny.rs:19:16: 19:24])) as variant#3).0: HasDrop) = HasDrop;
|
||||
(((*(_1.0: &mut {generator@$DIR/generator_tiny.rs:19:16: 19:24})) as variant#3).0: HasDrop) = HasDrop;
|
||||
StorageLive(_4);
|
||||
goto -> bb2;
|
||||
}
|
||||
@ -55,7 +55,7 @@ fn main::{closure#0}(_1: Pin<&mut [generator@$DIR/generator_tiny.rs:19:16: 19:24
|
||||
StorageLive(_7);
|
||||
_7 = ();
|
||||
_0 = GeneratorState::<(), ()>::Yielded(move _7);
|
||||
discriminant((*(_1.0: &mut [generator@$DIR/generator_tiny.rs:19:16: 19:24]))) = 3;
|
||||
discriminant((*(_1.0: &mut {generator@$DIR/generator_tiny.rs:19:16: 19:24}))) = 3;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4,8 +4,8 @@ fn foo(_1: T, _2: i32) -> i32 {
|
||||
debug _t => _1;
|
||||
debug q => _2;
|
||||
let mut _0: i32;
|
||||
let _3: [closure@foo<T>::{closure#0}];
|
||||
let mut _4: &[closure@foo<T>::{closure#0}];
|
||||
let _3: {closure@foo<T>::{closure#0}};
|
||||
let mut _4: &{closure@foo<T>::{closure#0}};
|
||||
let mut _5: (i32, i32);
|
||||
let mut _6: i32;
|
||||
let mut _7: i32;
|
||||
@ -21,7 +21,7 @@ fn foo(_1: T, _2: i32) -> i32 {
|
||||
|
||||
bb0: {
|
||||
StorageLive(_3);
|
||||
_3 = [closure@foo::<T>::{closure#0}];
|
||||
_3 = {closure@foo::<T>::{closure#0}};
|
||||
StorageLive(_4);
|
||||
_4 = &_3;
|
||||
StorageLive(_5);
|
||||
|
@ -4,8 +4,8 @@ fn foo(_1: T, _2: &i32) -> i32 {
|
||||
debug _t => _1;
|
||||
debug q => _2;
|
||||
let mut _0: i32;
|
||||
let _3: [closure@foo<T>::{closure#0}];
|
||||
let mut _4: &[closure@foo<T>::{closure#0}];
|
||||
let _3: {closure@foo<T>::{closure#0}};
|
||||
let mut _4: &{closure@foo<T>::{closure#0}};
|
||||
let mut _5: (&i32, &i32);
|
||||
let mut _6: &i32;
|
||||
let mut _7: &i32;
|
||||
@ -24,7 +24,7 @@ fn foo(_1: T, _2: &i32) -> i32 {
|
||||
|
||||
bb0: {
|
||||
StorageLive(_3);
|
||||
_3 = [closure@foo::<T>::{closure#0}];
|
||||
_3 = {closure@foo::<T>::{closure#0}};
|
||||
StorageLive(_4);
|
||||
_4 = &_3;
|
||||
StorageLive(_5);
|
||||
|
@ -4,10 +4,10 @@ fn foo(_1: T, _2: i32) -> (i32, T) {
|
||||
debug t => _1;
|
||||
debug q => _2;
|
||||
let mut _0: (i32, T);
|
||||
let _3: [closure@foo<T>::{closure#0}];
|
||||
let _3: {closure@foo<T>::{closure#0}};
|
||||
let mut _4: &i32;
|
||||
let mut _5: &T;
|
||||
let mut _6: &[closure@foo<T>::{closure#0}];
|
||||
let mut _6: &{closure@foo<T>::{closure#0}};
|
||||
let mut _7: (i32,);
|
||||
let mut _8: i32;
|
||||
let mut _9: i32;
|
||||
@ -30,7 +30,7 @@ fn foo(_1: T, _2: i32) -> (i32, T) {
|
||||
_4 = &_2;
|
||||
StorageLive(_5);
|
||||
_5 = &_1;
|
||||
_3 = [closure@foo::<T>::{closure#0}] { q: move _4, t: move _5 };
|
||||
_3 = {closure@foo::<T>::{closure#0}} { q: move _4, t: move _5 };
|
||||
StorageDead(_5);
|
||||
StorageDead(_4);
|
||||
StorageLive(_6);
|
||||
|
@ -4,30 +4,30 @@
|
||||
fn main() -> () {
|
||||
let mut _0: ();
|
||||
let _1: std::ops::GeneratorState<i32, bool>;
|
||||
let mut _2: std::pin::Pin<&mut [generator@$DIR/inline_generator.rs:16:5: 16:8]>;
|
||||
let mut _3: &mut [generator@$DIR/inline_generator.rs:16:5: 16:8];
|
||||
let mut _4: [generator@$DIR/inline_generator.rs:16:5: 16:8];
|
||||
let mut _2: std::pin::Pin<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}>;
|
||||
let mut _3: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8};
|
||||
let mut _4: {generator@$DIR/inline_generator.rs:16:5: 16:8};
|
||||
+ let mut _5: bool;
|
||||
scope 1 {
|
||||
debug _r => _1;
|
||||
}
|
||||
+ scope 2 (inlined g) {
|
||||
+ }
|
||||
+ scope 3 (inlined Pin::<&mut [generator@$DIR/inline_generator.rs:16:5: 16:8]>::new) {
|
||||
+ scope 3 (inlined Pin::<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}>::new) {
|
||||
+ debug pointer => _3;
|
||||
+ scope 4 {
|
||||
+ scope 5 (inlined Pin::<&mut [generator@$DIR/inline_generator.rs:16:5: 16:8]>::new_unchecked) {
|
||||
+ scope 5 (inlined Pin::<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}>::new_unchecked) {
|
||||
+ debug pointer => _3;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ scope 6 (inlined g::{closure#0}) {
|
||||
+ debug a => _5;
|
||||
+ let mut _6: &mut [generator@$DIR/inline_generator.rs:16:5: 16:8];
|
||||
+ let mut _6: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8};
|
||||
+ let mut _7: u32;
|
||||
+ let mut _8: i32;
|
||||
+ let mut _9: &mut [generator@$DIR/inline_generator.rs:16:5: 16:8];
|
||||
+ let mut _10: &mut [generator@$DIR/inline_generator.rs:16:5: 16:8];
|
||||
+ let mut _9: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8};
|
||||
+ let mut _10: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8};
|
||||
+ }
|
||||
|
||||
bb0: {
|
||||
@ -39,18 +39,18 @@
|
||||
- }
|
||||
-
|
||||
- bb1: {
|
||||
+ _4 = [generator@$DIR/inline_generator.rs:16:5: 16:8 (#0)];
|
||||
+ _4 = {generator@$DIR/inline_generator.rs:16:5: 16:8 (#0)};
|
||||
_3 = &mut _4;
|
||||
- _2 = Pin::<&mut [generator@$DIR/inline_generator.rs:16:5: 16:8]>::new(move _3) -> [return: bb2, unwind unreachable];
|
||||
- _2 = Pin::<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}>::new(move _3) -> [return: bb2, unwind unreachable];
|
||||
- }
|
||||
-
|
||||
- bb2: {
|
||||
+ _2 = Pin::<&mut [generator@$DIR/inline_generator.rs:16:5: 16:8]> { pointer: move _3 };
|
||||
+ _2 = Pin::<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}> { pointer: move _3 };
|
||||
StorageDead(_3);
|
||||
- _1 = <[generator@$DIR/inline_generator.rs:16:5: 16:8] as Generator<bool>>::resume(move _2, const false) -> [return: bb3, unwind unreachable];
|
||||
- _1 = <{generator@$DIR/inline_generator.rs:16:5: 16:8} as Generator<bool>>::resume(move _2, const false) -> [return: bb3, unwind unreachable];
|
||||
+ StorageLive(_5);
|
||||
+ _5 = const false;
|
||||
+ _6 = deref_copy (_2.0: &mut [generator@$DIR/inline_generator.rs:16:5: 16:8]);
|
||||
+ _6 = deref_copy (_2.0: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8});
|
||||
+ _7 = discriminant((*_6));
|
||||
+ switchInt(move _7) -> [0: bb2, 1: bb6, 3: bb7, otherwise: bb8];
|
||||
}
|
||||
@ -82,7 +82,7 @@
|
||||
+
|
||||
+ bb5: {
|
||||
+ _1 = GeneratorState::<i32, bool>::Yielded(move _8);
|
||||
+ _9 = deref_copy (_2.0: &mut [generator@$DIR/inline_generator.rs:16:5: 16:8]);
|
||||
+ _9 = deref_copy (_2.0: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8});
|
||||
+ discriminant((*_9)) = 3;
|
||||
+ goto -> bb1;
|
||||
+ }
|
||||
@ -95,7 +95,7 @@
|
||||
+ StorageLive(_8);
|
||||
+ StorageDead(_8);
|
||||
+ _1 = GeneratorState::<i32, bool>::Complete(_5);
|
||||
+ _10 = deref_copy (_2.0: &mut [generator@$DIR/inline_generator.rs:16:5: 16:8]);
|
||||
+ _10 = deref_copy (_2.0: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8});
|
||||
+ discriminant((*_10)) = 1;
|
||||
+ goto -> bb1;
|
||||
+ }
|
||||
|
@ -4,30 +4,30 @@
|
||||
fn main() -> () {
|
||||
let mut _0: ();
|
||||
let _1: std::ops::GeneratorState<i32, bool>;
|
||||
let mut _2: std::pin::Pin<&mut [generator@$DIR/inline_generator.rs:16:5: 16:8]>;
|
||||
let mut _3: &mut [generator@$DIR/inline_generator.rs:16:5: 16:8];
|
||||
let mut _4: [generator@$DIR/inline_generator.rs:16:5: 16:8];
|
||||
let mut _2: std::pin::Pin<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}>;
|
||||
let mut _3: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8};
|
||||
let mut _4: {generator@$DIR/inline_generator.rs:16:5: 16:8};
|
||||
+ let mut _5: bool;
|
||||
scope 1 {
|
||||
debug _r => _1;
|
||||
}
|
||||
+ scope 2 (inlined g) {
|
||||
+ }
|
||||
+ scope 3 (inlined Pin::<&mut [generator@$DIR/inline_generator.rs:16:5: 16:8]>::new) {
|
||||
+ scope 3 (inlined Pin::<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}>::new) {
|
||||
+ debug pointer => _3;
|
||||
+ scope 4 {
|
||||
+ scope 5 (inlined Pin::<&mut [generator@$DIR/inline_generator.rs:16:5: 16:8]>::new_unchecked) {
|
||||
+ scope 5 (inlined Pin::<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}>::new_unchecked) {
|
||||
+ debug pointer => _3;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ scope 6 (inlined g::{closure#0}) {
|
||||
+ debug a => _5;
|
||||
+ let mut _6: &mut [generator@$DIR/inline_generator.rs:16:5: 16:8];
|
||||
+ let mut _6: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8};
|
||||
+ let mut _7: u32;
|
||||
+ let mut _8: i32;
|
||||
+ let mut _9: &mut [generator@$DIR/inline_generator.rs:16:5: 16:8];
|
||||
+ let mut _10: &mut [generator@$DIR/inline_generator.rs:16:5: 16:8];
|
||||
+ let mut _9: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8};
|
||||
+ let mut _10: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8};
|
||||
+ }
|
||||
|
||||
bb0: {
|
||||
@ -39,18 +39,18 @@
|
||||
- }
|
||||
-
|
||||
- bb1: {
|
||||
+ _4 = [generator@$DIR/inline_generator.rs:16:5: 16:8 (#0)];
|
||||
+ _4 = {generator@$DIR/inline_generator.rs:16:5: 16:8 (#0)};
|
||||
_3 = &mut _4;
|
||||
- _2 = Pin::<&mut [generator@$DIR/inline_generator.rs:16:5: 16:8]>::new(move _3) -> [return: bb2, unwind: bb4];
|
||||
- _2 = Pin::<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}>::new(move _3) -> [return: bb2, unwind: bb4];
|
||||
- }
|
||||
-
|
||||
- bb2: {
|
||||
+ _2 = Pin::<&mut [generator@$DIR/inline_generator.rs:16:5: 16:8]> { pointer: move _3 };
|
||||
+ _2 = Pin::<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}> { pointer: move _3 };
|
||||
StorageDead(_3);
|
||||
- _1 = <[generator@$DIR/inline_generator.rs:16:5: 16:8] as Generator<bool>>::resume(move _2, const false) -> [return: bb3, unwind: bb4];
|
||||
- _1 = <{generator@$DIR/inline_generator.rs:16:5: 16:8} as Generator<bool>>::resume(move _2, const false) -> [return: bb3, unwind: bb4];
|
||||
+ StorageLive(_5);
|
||||
+ _5 = const false;
|
||||
+ _6 = deref_copy (_2.0: &mut [generator@$DIR/inline_generator.rs:16:5: 16:8]);
|
||||
+ _6 = deref_copy (_2.0: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8});
|
||||
+ _7 = discriminant((*_6));
|
||||
+ switchInt(move _7) -> [0: bb3, 1: bb7, 3: bb8, otherwise: bb9];
|
||||
}
|
||||
@ -87,7 +87,7 @@
|
||||
+
|
||||
+ bb6: {
|
||||
+ _1 = GeneratorState::<i32, bool>::Yielded(move _8);
|
||||
+ _9 = deref_copy (_2.0: &mut [generator@$DIR/inline_generator.rs:16:5: 16:8]);
|
||||
+ _9 = deref_copy (_2.0: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8});
|
||||
+ discriminant((*_9)) = 3;
|
||||
+ goto -> bb1;
|
||||
+ }
|
||||
@ -100,7 +100,7 @@
|
||||
+ StorageLive(_8);
|
||||
+ StorageDead(_8);
|
||||
+ _1 = GeneratorState::<i32, bool>::Complete(_5);
|
||||
+ _10 = deref_copy (_2.0: &mut [generator@$DIR/inline_generator.rs:16:5: 16:8]);
|
||||
+ _10 = deref_copy (_2.0: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8});
|
||||
+ discriminant((*_10)) = 1;
|
||||
+ goto -> bb1;
|
||||
+ }
|
||||
|
@ -2,8 +2,8 @@
|
||||
|
||||
fn main() -> () {
|
||||
let mut _0: ();
|
||||
let _1: [closure@$DIR/issue_76997_inline_scopes_parenting.rs:5:13: 5:16];
|
||||
let mut _2: &[closure@$DIR/issue_76997_inline_scopes_parenting.rs:5:13: 5:16];
|
||||
let _1: {closure@$DIR/issue_76997_inline_scopes_parenting.rs:5:13: 5:16};
|
||||
let mut _2: &{closure@$DIR/issue_76997_inline_scopes_parenting.rs:5:13: 5:16};
|
||||
let mut _3: ((),);
|
||||
let mut _4: ();
|
||||
let mut _5: ();
|
||||
@ -19,7 +19,7 @@ fn main() -> () {
|
||||
|
||||
bb0: {
|
||||
StorageLive(_1);
|
||||
_1 = [closure@$DIR/issue_76997_inline_scopes_parenting.rs:5:13: 5:16];
|
||||
_1 = {closure@$DIR/issue_76997_inline_scopes_parenting.rs:5:13: 5:16};
|
||||
StorageLive(_2);
|
||||
_2 = &_1;
|
||||
StorageLive(_3);
|
||||
|
@ -3,9 +3,9 @@
|
||||
fn ezmap(_1: Option<i32>) -> Option<i32> {
|
||||
debug x => _1;
|
||||
let mut _0: std::option::Option<i32>;
|
||||
scope 1 (inlined map::<i32, i32, [closure@$DIR/simple_option_map.rs:17:12: 17:15]>) {
|
||||
scope 1 (inlined map::<i32, i32, {closure@$DIR/simple_option_map.rs:17:12: 17:15}>) {
|
||||
debug slf => _1;
|
||||
debug f => const ZeroSized: [closure@$DIR/simple_option_map.rs:17:12: 17:15];
|
||||
debug f => const ZeroSized: {closure@$DIR/simple_option_map.rs:17:12: 17:15};
|
||||
let mut _2: isize;
|
||||
let _3: i32;
|
||||
let mut _4: i32;
|
||||
|
@ -1,6 +1,6 @@
|
||||
// MIR for `variant_a::{closure#0}` after PreCodegen
|
||||
|
||||
fn variant_a::{closure#0}(_1: &mut [closure@$DIR/slice_filter.rs:7:25: 7:39], _2: &&(usize, usize, usize, usize)) -> bool {
|
||||
fn variant_a::{closure#0}(_1: &mut {closure@$DIR/slice_filter.rs:7:25: 7:39}, _2: &&(usize, usize, usize, usize)) -> bool {
|
||||
let mut _0: bool;
|
||||
let mut _3: &(usize, usize, usize, usize);
|
||||
let _4: &usize;
|
||||
|
@ -1,6 +1,6 @@
|
||||
// MIR for `variant_b::{closure#0}` after PreCodegen
|
||||
|
||||
fn variant_b::{closure#0}(_1: &mut [closure@$DIR/slice_filter.rs:11:25: 11:41], _2: &&(usize, usize, usize, usize)) -> bool {
|
||||
fn variant_b::{closure#0}(_1: &mut {closure@$DIR/slice_filter.rs:11:25: 11:41}, _2: &&(usize, usize, usize, usize)) -> bool {
|
||||
let mut _0: bool;
|
||||
let mut _3: &(usize, usize, usize, usize);
|
||||
let _4: usize;
|
||||
|
@ -1,6 +1,6 @@
|
||||
// MIR for `main::{closure#0}` after SimplifyCfg-elaborate-drops
|
||||
|
||||
fn main::{closure#0}(_1: &[closure@main::{closure#0}], _2: &i32) -> &i32 {
|
||||
fn main::{closure#0}(_1: &{closure@main::{closure#0}}, _2: &i32) -> &i32 {
|
||||
debug x => _2;
|
||||
let mut _0: &i32;
|
||||
let _3: &i32;
|
||||
|
@ -1,6 +1,6 @@
|
||||
// MIR for `main::{closure#0}` after SimplifyCfg-elaborate-drops
|
||||
|
||||
fn main::{closure#0}(_1: &[closure@main::{closure#0}], _2: &i32) -> &i32 {
|
||||
fn main::{closure#0}(_1: &{closure@main::{closure#0}}, _2: &i32) -> &i32 {
|
||||
debug x => _2;
|
||||
let mut _0: &i32;
|
||||
let _3: &i32;
|
||||
|
@ -10,7 +10,7 @@ fn main() -> () {
|
||||
let mut _7: &mut i32;
|
||||
let mut _9: &mut i32;
|
||||
let mut _12: *mut i32;
|
||||
let mut _14: [closure@main::{closure#0}];
|
||||
let mut _14: {closure@main::{closure#0}};
|
||||
let mut _16: for<'a> fn(&'a i32) -> &'a i32;
|
||||
let mut _17: &i32;
|
||||
let _18: &i32;
|
||||
@ -103,7 +103,7 @@ fn main() -> () {
|
||||
StorageDead(_2);
|
||||
StorageLive(_13);
|
||||
StorageLive(_14);
|
||||
_14 = [closure@main::{closure#0}];
|
||||
_14 = {closure@main::{closure#0}};
|
||||
Retag(_14);
|
||||
_13 = move _14 as for<'a> fn(&'a i32) -> &'a i32 (PointerCoercion(ClosureFnPointer(Normal)));
|
||||
StorageDead(_14);
|
||||
|
@ -10,7 +10,7 @@ fn main() -> () {
|
||||
let mut _7: &mut i32;
|
||||
let mut _9: &mut i32;
|
||||
let mut _12: *mut i32;
|
||||
let mut _14: [closure@main::{closure#0}];
|
||||
let mut _14: {closure@main::{closure#0}};
|
||||
let mut _16: for<'a> fn(&'a i32) -> &'a i32;
|
||||
let mut _17: &i32;
|
||||
let _18: &i32;
|
||||
@ -103,7 +103,7 @@ fn main() -> () {
|
||||
StorageDead(_2);
|
||||
StorageLive(_13);
|
||||
StorageLive(_14);
|
||||
_14 = [closure@main::{closure#0}];
|
||||
_14 = {closure@main::{closure#0}};
|
||||
Retag(_14);
|
||||
_13 = move _14 as for<'a> fn(&'a i32) -> &'a i32 (PointerCoercion(ClosureFnPointer(Normal)));
|
||||
StorageDead(_14);
|
||||
|
@ -15,7 +15,7 @@ INCR=$(TMPDIR)/incr
|
||||
all:
|
||||
cp first_crate.rs second_crate.rs $(TMPDIR)
|
||||
$(RUSTC) $(TMPDIR)/first_crate.rs -C incremental=$(INCR) --target $(TARGET) --crate-type lib
|
||||
$(RUSTC) $(TMPDIR)/second_crate.rs -C incremental=$(INCR) --target $(TARGET) --extern first-crate=$(TMPDIR) --crate-type lib
|
||||
$(RUSTC) $(TMPDIR)/second_crate.rs -C incremental=$(INCR) --target $(TARGET) --extern first_crate=$(TMPDIR)/libfirst_crate.rlib --crate-type lib
|
||||
rm $(TMPDIR)/first_crate.rs
|
||||
$(RUSTC) $(TMPDIR)/second_crate.rs -C incremental=$(INCR) --target $(TARGET) --cfg second_run --crate-type lib
|
||||
|
||||
|
@ -5,6 +5,8 @@
|
||||
// To future blessers: make sure that `const_trait_impl` is
|
||||
// stabilized when changing `@!has` to `@has`, and please do
|
||||
// not remove this test.
|
||||
//
|
||||
// FIXME(effects) add `const_trait` to `Fn` so we use `~const`
|
||||
#![feature(const_trait_impl)]
|
||||
#![crate_name = "foo"]
|
||||
|
||||
@ -22,9 +24,9 @@ pub trait Tr<T> {
|
||||
// @has - '//section[@id="method.a"]/h4[@class="code-header"]/a[@class="trait"]' 'Fn'
|
||||
// @!has - '//section[@id="method.a"]/h4[@class="code-header"]/span[@class="where"]' '~const'
|
||||
// @has - '//section[@id="method.a"]/h4[@class="code-header"]/span[@class="where fmt-newline"]' ': Fn'
|
||||
fn a<A: ~const Fn() + ~const Destruct>()
|
||||
fn a<A: /* ~const */ Fn() + ~const Destruct>()
|
||||
where
|
||||
Option<A>: ~const Fn() + ~const Destruct,
|
||||
Option<A>: /* ~const */ Fn() + ~const Destruct,
|
||||
{
|
||||
}
|
||||
}
|
||||
@ -34,13 +36,13 @@ pub trait Tr<T> {
|
||||
// @has - '//section[@id="impl-Tr%3CT%3E-for-T"]/h3[@class="code-header"]/a[@class="trait"]' 'Fn'
|
||||
// @!has - '//section[@id="impl-Tr%3CT%3E-for-T"]/h3[@class="code-header"]/span[@class="where"]' '~const'
|
||||
// @has - '//section[@id="impl-Tr%3CT%3E-for-T"]/h3[@class="code-header"]/span[@class="where fmt-newline"]' ': Fn'
|
||||
impl<T: ~const Fn() + ~const Destruct> const Tr<T> for T
|
||||
impl<T: /* ~const */ Fn() + ~const Destruct> const Tr<T> for T
|
||||
where
|
||||
Option<T>: ~const Fn() + ~const Destruct,
|
||||
Option<T>: /* ~const */ Fn() + ~const Destruct,
|
||||
{
|
||||
fn a<A: ~const Fn() + ~const Destruct>()
|
||||
fn a<A: /* ~const */ Fn() + ~const Destruct>()
|
||||
where
|
||||
Option<A>: ~const Fn() + ~const Destruct,
|
||||
Option<A>: /* ~const */ Fn() + ~const Destruct,
|
||||
{
|
||||
}
|
||||
}
|
||||
@ -49,9 +51,9 @@ where
|
||||
// @has - '//pre[@class="rust item-decl"]/code/a[@class="trait"]' 'Fn'
|
||||
// @!has - '//pre[@class="rust item-decl"]/code/span[@class="where fmt-newline"]' '~const'
|
||||
// @has - '//pre[@class="rust item-decl"]/code/span[@class="where fmt-newline"]' ': Fn'
|
||||
pub const fn foo<F: ~const Fn() + ~const Destruct>()
|
||||
pub const fn foo<F: /* ~const */ Fn() + ~const Destruct>()
|
||||
where
|
||||
Option<F>: ~const Fn() + ~const Destruct,
|
||||
Option<F>: /* ~const */ Fn() + ~const Destruct,
|
||||
{
|
||||
F::a()
|
||||
}
|
||||
@ -61,9 +63,9 @@ impl<T> S<T> {
|
||||
// @has - '//section[@id="method.foo"]/h4[@class="code-header"]/a[@class="trait"]' 'Fn'
|
||||
// @!has - '//section[@id="method.foo"]/h4[@class="code-header"]/span[@class="where"]' '~const'
|
||||
// @has - '//section[@id="method.foo"]/h4[@class="code-header"]/span[@class="where fmt-newline"]' ': Fn'
|
||||
pub const fn foo<B, C: ~const Fn() + ~const Destruct>()
|
||||
pub const fn foo<B, C: /* ~const */ Fn() + ~const Destruct>()
|
||||
where
|
||||
B: ~const Fn() + ~const Destruct,
|
||||
B: /* ~const */ Fn() + ~const Destruct,
|
||||
{
|
||||
B::a()
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user