Rollup merge of #73783 - estebank:impl-dyn-trait-static-lifetime, r=nikomatsakis
Detect when `'static` obligation might come from an `impl` Partly address #71341.
This commit is contained in:
commit
fe9babbaed
|
@ -633,4 +633,5 @@ E0771: include_str!("./error_codes/E0771.md"),
|
|||
E0755, // `#[ffi_pure]` is only allowed on foreign functions
|
||||
E0756, // `#[ffi_const]` is only allowed on foreign functions
|
||||
E0757, // `#[ffi_const]` functions cannot be `#[ffi_pure]`
|
||||
E0772, // `'static' obligation coming from `impl dyn Trait {}` or `impl Foo for dyn Bar {}`.
|
||||
}
|
||||
|
|
|
@ -2198,7 +2198,17 @@ pub enum IsAsync {
|
|||
NotAsync,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)]
|
||||
#[derive(
|
||||
Copy,
|
||||
Clone,
|
||||
PartialEq,
|
||||
RustcEncodable,
|
||||
RustcDecodable,
|
||||
Debug,
|
||||
HashStable_Generic,
|
||||
Eq,
|
||||
Hash
|
||||
)]
|
||||
pub enum Defaultness {
|
||||
Default { has_value: bool },
|
||||
Final,
|
||||
|
|
|
@ -36,12 +36,13 @@ use crate::traits::{Obligation, PredicateObligations};
|
|||
|
||||
use rustc_ast::ast;
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_middle::traits::ObligationCause;
|
||||
use rustc_middle::ty::error::TypeError;
|
||||
use rustc_middle::ty::relate::{self, Relate, RelateResult, TypeRelation};
|
||||
use rustc_middle::ty::subst::SubstsRef;
|
||||
use rustc_middle::ty::{self, InferConst, ToPredicate, Ty, TyCtxt, TypeFoldable};
|
||||
use rustc_middle::ty::{IntType, UintType};
|
||||
use rustc_span::{Span, DUMMY_SP};
|
||||
use rustc_span::DUMMY_SP;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct CombineFields<'infcx, 'tcx> {
|
||||
|
@ -367,10 +368,11 @@ impl<'infcx, 'tcx> CombineFields<'infcx, 'tcx> {
|
|||
};
|
||||
|
||||
debug!("generalize: for_universe = {:?}", for_universe);
|
||||
debug!("generalize: trace = {:?}", self.trace);
|
||||
|
||||
let mut generalize = Generalizer {
|
||||
infcx: self.infcx,
|
||||
span: self.trace.cause.span,
|
||||
cause: &self.trace.cause,
|
||||
for_vid_sub_root: self.infcx.inner.borrow_mut().type_variables().sub_root_var(for_vid),
|
||||
for_universe,
|
||||
ambient_variance,
|
||||
|
@ -414,7 +416,7 @@ struct Generalizer<'cx, 'tcx> {
|
|||
infcx: &'cx InferCtxt<'cx, 'tcx>,
|
||||
|
||||
/// The span, used when creating new type variables and things.
|
||||
span: Span,
|
||||
cause: &'cx ObligationCause<'tcx>,
|
||||
|
||||
/// The vid of the type variable that is in the process of being
|
||||
/// instantiated; if we find this within the type we are folding,
|
||||
|
@ -639,7 +641,7 @@ impl TypeRelation<'tcx> for Generalizer<'_, 'tcx> {
|
|||
|
||||
// FIXME: This is non-ideal because we don't give a
|
||||
// very descriptive origin for this region variable.
|
||||
Ok(self.infcx.next_region_var_in_universe(MiscVariable(self.span), self.for_universe))
|
||||
Ok(self.infcx.next_region_var_in_universe(MiscVariable(self.cause.span), self.for_universe))
|
||||
}
|
||||
|
||||
fn consts(
|
||||
|
|
|
@ -2010,7 +2010,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
|||
infer::MiscVariable(_) => String::new(),
|
||||
infer::PatternRegion(_) => " for pattern".to_string(),
|
||||
infer::AddrOfRegion(_) => " for borrow expression".to_string(),
|
||||
infer::Autoref(_) => " for autoref".to_string(),
|
||||
infer::Autoref(_, _) => " for autoref".to_string(),
|
||||
infer::Coercion(_) => " for automatic coercion".to_string(),
|
||||
infer::LateBoundRegion(_, br, infer::FnCall) => {
|
||||
format!(" for lifetime parameter {}in function call", br_string(br))
|
||||
|
|
|
@ -2,227 +2,504 @@
|
|||
|
||||
use crate::infer::error_reporting::nice_region_error::NiceRegionError;
|
||||
use crate::infer::lexical_region_resolve::RegionResolutionError;
|
||||
use rustc_errors::{struct_span_err, Applicability, ErrorReported};
|
||||
use rustc_hir::{GenericBound, ItemKind, Lifetime, LifetimeName, TyKind};
|
||||
use rustc_middle::ty::RegionKind;
|
||||
use crate::infer::{SubregionOrigin, TypeTrace};
|
||||
use crate::traits::{ObligationCauseCode, UnifyReceiverContext};
|
||||
use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder, ErrorReported};
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_hir::intravisit::{walk_ty, ErasedMap, NestedVisitorMap, Visitor};
|
||||
use rustc_hir::{
|
||||
self as hir, GenericBound, ImplItem, Item, ItemKind, Lifetime, LifetimeName, Node, TraitItem,
|
||||
TyKind,
|
||||
};
|
||||
use rustc_middle::ty::{self, AssocItemContainer, RegionKind, Ty, TypeFoldable, TypeVisitor};
|
||||
use rustc_span::symbol::Ident;
|
||||
use rustc_span::{MultiSpan, Span};
|
||||
|
||||
impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
|
||||
/// Print the error message for lifetime errors when the return type is a static impl Trait.
|
||||
/// Print the error message for lifetime errors when the return type is a static `impl Trait`,
|
||||
/// `dyn Trait` or if a method call on a trait object introduces a static requirement.
|
||||
pub(super) fn try_report_static_impl_trait(&self) -> Option<ErrorReported> {
|
||||
debug!("try_report_static_impl_trait(error={:?})", self.error);
|
||||
if let Some(RegionResolutionError::SubSupConflict(
|
||||
_,
|
||||
var_origin,
|
||||
ref sub_origin,
|
||||
sub_r,
|
||||
ref sup_origin,
|
||||
sup_r,
|
||||
)) = self.error
|
||||
{
|
||||
debug!(
|
||||
"try_report_static_impl_trait(var={:?}, sub={:?} {:?} sup={:?} {:?})",
|
||||
var_origin, sub_origin, sub_r, sup_origin, sup_r
|
||||
);
|
||||
let anon_reg_sup = self.tcx().is_suitable_region(sup_r)?;
|
||||
debug!("try_report_static_impl_trait: anon_reg_sup={:?}", anon_reg_sup);
|
||||
let fn_returns = self.tcx().return_type_impl_or_dyn_traits(anon_reg_sup.def_id);
|
||||
if fn_returns.is_empty() {
|
||||
let tcx = self.tcx();
|
||||
let (var_origin, sub_origin, sub_r, sup_origin, sup_r) = match self.error.as_ref()? {
|
||||
RegionResolutionError::SubSupConflict(
|
||||
_,
|
||||
var_origin,
|
||||
sub_origin,
|
||||
sub_r,
|
||||
sup_origin,
|
||||
sup_r,
|
||||
) if **sub_r == RegionKind::ReStatic => {
|
||||
(var_origin, sub_origin, sub_r, sup_origin, sup_r)
|
||||
}
|
||||
RegionResolutionError::ConcreteFailure(
|
||||
SubregionOrigin::Subtype(box TypeTrace { cause, .. }),
|
||||
sub_r,
|
||||
sup_r,
|
||||
) if **sub_r == RegionKind::ReStatic => {
|
||||
// This is for an implicit `'static` requirement coming from `impl dyn Trait {}`.
|
||||
if let ObligationCauseCode::UnifyReceiver(ctxt) = &cause.code {
|
||||
let param = self.find_param_with_region(sup_r, sub_r)?;
|
||||
let lifetime = if sup_r.has_name() {
|
||||
format!("lifetime `{}`", sup_r)
|
||||
} else {
|
||||
"an anonymous lifetime `'_`".to_string()
|
||||
};
|
||||
let mut err = struct_span_err!(
|
||||
tcx.sess,
|
||||
cause.span,
|
||||
E0772,
|
||||
"{} has {} but calling `{}` introduces an implicit `'static` lifetime \
|
||||
requirement",
|
||||
param
|
||||
.param
|
||||
.pat
|
||||
.simple_ident()
|
||||
.map(|s| format!("`{}`", s))
|
||||
.unwrap_or_else(|| "`fn` parameter".to_string()),
|
||||
lifetime,
|
||||
ctxt.assoc_item.ident,
|
||||
);
|
||||
err.span_label(param.param_ty_span, &format!("this data with {}...", lifetime));
|
||||
err.span_label(
|
||||
cause.span,
|
||||
&format!(
|
||||
"...is captured and required to live as long as `'static` here \
|
||||
because of an implicit lifetime bound on the {}",
|
||||
match ctxt.assoc_item.container {
|
||||
AssocItemContainer::TraitContainer(id) =>
|
||||
format!("`impl` of `{}`", tcx.def_path_str(id)),
|
||||
AssocItemContainer::ImplContainer(_) =>
|
||||
"inherent `impl`".to_string(),
|
||||
},
|
||||
),
|
||||
);
|
||||
if self.find_impl_on_dyn_trait(&mut err, param.param_ty, &ctxt) {
|
||||
err.emit();
|
||||
return Some(ErrorReported);
|
||||
} else {
|
||||
err.cancel();
|
||||
}
|
||||
}
|
||||
return None;
|
||||
}
|
||||
debug!("try_report_static_impl_trait: fn_return={:?}", fn_returns);
|
||||
if *sub_r == RegionKind::ReStatic {
|
||||
let sp = var_origin.span();
|
||||
let return_sp = sub_origin.span();
|
||||
let param_info = self.find_param_with_region(sup_r, sub_r)?;
|
||||
let (lifetime_name, lifetime) = if sup_r.has_name() {
|
||||
(sup_r.to_string(), format!("lifetime `{}`", sup_r))
|
||||
} else {
|
||||
("'_".to_owned(), "an anonymous lifetime `'_`".to_string())
|
||||
};
|
||||
let mut err = struct_span_err!(
|
||||
self.tcx().sess,
|
||||
sp,
|
||||
E0759,
|
||||
"cannot infer an appropriate lifetime"
|
||||
);
|
||||
_ => return None,
|
||||
};
|
||||
debug!(
|
||||
"try_report_static_impl_trait(var={:?}, sub={:?} {:?} sup={:?} {:?})",
|
||||
var_origin, sub_origin, sub_r, sup_origin, sup_r
|
||||
);
|
||||
let anon_reg_sup = tcx.is_suitable_region(sup_r)?;
|
||||
debug!("try_report_static_impl_trait: anon_reg_sup={:?}", anon_reg_sup);
|
||||
let sp = var_origin.span();
|
||||
let return_sp = sub_origin.span();
|
||||
let param = self.find_param_with_region(sup_r, sub_r)?;
|
||||
let (lifetime_name, lifetime) = if sup_r.has_name() {
|
||||
(sup_r.to_string(), format!("lifetime `{}`", sup_r))
|
||||
} else {
|
||||
("'_".to_owned(), "an anonymous lifetime `'_`".to_string())
|
||||
};
|
||||
let param_name = param
|
||||
.param
|
||||
.pat
|
||||
.simple_ident()
|
||||
.map(|s| format!("`{}`", s))
|
||||
.unwrap_or_else(|| "`fn` parameter".to_string());
|
||||
let mut err = struct_span_err!(
|
||||
tcx.sess,
|
||||
sp,
|
||||
E0759,
|
||||
"{} has {} but it needs to satisfy a `'static` lifetime requirement",
|
||||
param_name,
|
||||
lifetime,
|
||||
);
|
||||
err.span_label(param.param_ty_span, &format!("this data with {}...", lifetime));
|
||||
debug!("try_report_static_impl_trait: param_info={:?}", param);
|
||||
|
||||
// We try to make the output have fewer overlapping spans if possible.
|
||||
if (sp == sup_origin.span() || !return_sp.overlaps(sup_origin.span()))
|
||||
&& sup_origin.span() != return_sp
|
||||
{
|
||||
// FIXME: account for `async fn` like in `async-await/issues/issue-62097.rs`
|
||||
|
||||
// Customize the spans and labels depending on their relative order so
|
||||
// that split sentences flow correctly.
|
||||
if sup_origin.span().overlaps(return_sp) && sp == sup_origin.span() {
|
||||
// Avoid the following:
|
||||
//
|
||||
// error: cannot infer an appropriate lifetime
|
||||
// --> $DIR/must_outlive_least_region_or_bound.rs:18:50
|
||||
// |
|
||||
// LL | fn foo(x: &i32) -> Box<dyn Debug> { Box::new(x) }
|
||||
// | ---- ---------^-
|
||||
//
|
||||
// and instead show:
|
||||
//
|
||||
// error: cannot infer an appropriate lifetime
|
||||
// --> $DIR/must_outlive_least_region_or_bound.rs:18:50
|
||||
// |
|
||||
// LL | fn foo(x: &i32) -> Box<dyn Debug> { Box::new(x) }
|
||||
// | ---- ^
|
||||
err.span_label(
|
||||
param_info.param_ty_span,
|
||||
&format!("this data with {}...", lifetime),
|
||||
sup_origin.span(),
|
||||
"...is captured here, requiring it to live as long as `'static`",
|
||||
);
|
||||
debug!("try_report_static_impl_trait: param_info={:?}", param_info);
|
||||
|
||||
// We try to make the output have fewer overlapping spans if possible.
|
||||
if (sp == sup_origin.span() || !return_sp.overlaps(sup_origin.span()))
|
||||
&& sup_origin.span() != return_sp
|
||||
{
|
||||
// FIXME: account for `async fn` like in `async-await/issues/issue-62097.rs`
|
||||
|
||||
// Customize the spans and labels depending on their relative order so
|
||||
// that split sentences flow correctly.
|
||||
if sup_origin.span().overlaps(return_sp) && sp == sup_origin.span() {
|
||||
// Avoid the following:
|
||||
//
|
||||
// error: cannot infer an appropriate lifetime
|
||||
// --> $DIR/must_outlive_least_region_or_bound.rs:18:50
|
||||
// |
|
||||
// LL | fn foo(x: &i32) -> Box<dyn Debug> { Box::new(x) }
|
||||
// | ---- ---------^-
|
||||
//
|
||||
// and instead show:
|
||||
//
|
||||
// error: cannot infer an appropriate lifetime
|
||||
// --> $DIR/must_outlive_least_region_or_bound.rs:18:50
|
||||
// |
|
||||
// LL | fn foo(x: &i32) -> Box<dyn Debug> { Box::new(x) }
|
||||
// | ---- ^
|
||||
err.span_label(
|
||||
sup_origin.span(),
|
||||
"...is captured here, requiring it to live as long as `'static`",
|
||||
);
|
||||
} else {
|
||||
err.span_label(sup_origin.span(), "...is captured here...");
|
||||
if return_sp < sup_origin.span() {
|
||||
err.span_note(
|
||||
return_sp,
|
||||
"...and is required to live as long as `'static` here",
|
||||
);
|
||||
} else {
|
||||
err.span_label(
|
||||
return_sp,
|
||||
"...and is required to live as long as `'static` here",
|
||||
);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
err.span_label(sup_origin.span(), "...is captured here...");
|
||||
if return_sp < sup_origin.span() {
|
||||
err.span_note(
|
||||
return_sp,
|
||||
"...and is required to live as long as `'static` here",
|
||||
);
|
||||
} else {
|
||||
err.span_label(
|
||||
return_sp,
|
||||
"...is captured and required to live as long as `'static` here",
|
||||
"...and is required to live as long as `'static` here",
|
||||
);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
err.span_label(
|
||||
return_sp,
|
||||
"...is captured and required to live as long as `'static` here",
|
||||
);
|
||||
}
|
||||
|
||||
// FIXME: account for the need of parens in `&(dyn Trait + '_)`
|
||||
let consider = "consider changing the";
|
||||
let declare = "to declare that the";
|
||||
let arg = match param_info.param.pat.simple_ident() {
|
||||
Some(simple_ident) => format!("argument `{}`", simple_ident),
|
||||
None => "the argument".to_string(),
|
||||
};
|
||||
let explicit =
|
||||
format!("you can add an explicit `{}` lifetime bound", lifetime_name);
|
||||
let explicit_static =
|
||||
format!("explicit `'static` bound to the lifetime of {}", arg);
|
||||
let captures = format!("captures data from {}", arg);
|
||||
let add_static_bound =
|
||||
"alternatively, add an explicit `'static` bound to this reference";
|
||||
let plus_lt = format!(" + {}", lifetime_name);
|
||||
for fn_return in fn_returns {
|
||||
if fn_return.span.desugaring_kind().is_some() {
|
||||
// Skip `async` desugaring `impl Future`.
|
||||
continue;
|
||||
}
|
||||
match fn_return.kind {
|
||||
TyKind::OpaqueDef(item_id, _) => {
|
||||
let item = self.tcx().hir().item(item_id.id);
|
||||
let opaque = if let ItemKind::OpaqueTy(opaque) = &item.kind {
|
||||
opaque
|
||||
} else {
|
||||
err.emit();
|
||||
return Some(ErrorReported);
|
||||
};
|
||||
let fn_returns = tcx.return_type_impl_or_dyn_traits(anon_reg_sup.def_id);
|
||||
|
||||
if let Some(span) = opaque
|
||||
.bounds
|
||||
.iter()
|
||||
.filter_map(|arg| match arg {
|
||||
GenericBound::Outlives(Lifetime {
|
||||
name: LifetimeName::Static,
|
||||
span,
|
||||
..
|
||||
}) => Some(*span),
|
||||
_ => None,
|
||||
})
|
||||
.next()
|
||||
{
|
||||
err.span_suggestion_verbose(
|
||||
span,
|
||||
&format!("{} `impl Trait`'s {}", consider, explicit_static),
|
||||
lifetime_name.clone(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
err.span_suggestion_verbose(
|
||||
param_info.param_ty_span,
|
||||
add_static_bound,
|
||||
param_info.param_ty.to_string(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
} else if let Some(_) = opaque
|
||||
.bounds
|
||||
.iter()
|
||||
.filter_map(|arg| match arg {
|
||||
GenericBound::Outlives(Lifetime { name, span, .. })
|
||||
if name.ident().to_string() == lifetime_name =>
|
||||
{
|
||||
Some(*span)
|
||||
}
|
||||
_ => None,
|
||||
})
|
||||
.next()
|
||||
{
|
||||
} else {
|
||||
err.span_suggestion_verbose(
|
||||
fn_return.span.shrink_to_hi(),
|
||||
&format!(
|
||||
"{declare} `impl Trait` {captures}, {explicit}",
|
||||
declare = declare,
|
||||
captures = captures,
|
||||
explicit = explicit,
|
||||
),
|
||||
plus_lt.clone(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
}
|
||||
TyKind::TraitObject(_, lt) => match lt.name {
|
||||
LifetimeName::ImplicitObjectLifetimeDefault => {
|
||||
err.span_suggestion_verbose(
|
||||
fn_return.span.shrink_to_hi(),
|
||||
&format!(
|
||||
"{declare} trait object {captures}, {explicit}",
|
||||
declare = declare,
|
||||
captures = captures,
|
||||
explicit = explicit,
|
||||
),
|
||||
plus_lt.clone(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
name if name.ident().to_string() != lifetime_name => {
|
||||
// With this check we avoid suggesting redundant bounds. This
|
||||
// would happen if there are nested impl/dyn traits and only
|
||||
// one of them has the bound we'd suggest already there, like
|
||||
// in `impl Foo<X = dyn Bar> + '_`.
|
||||
err.span_suggestion_verbose(
|
||||
lt.span,
|
||||
&format!("{} trait object's {}", consider, explicit_static),
|
||||
lifetime_name.clone(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
err.span_suggestion_verbose(
|
||||
param_info.param_ty_span,
|
||||
add_static_bound,
|
||||
param_info.param_ty.to_string(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
let mut override_error_code = None;
|
||||
if let SubregionOrigin::Subtype(box TypeTrace { cause, .. }) = &sup_origin {
|
||||
if let ObligationCauseCode::UnifyReceiver(ctxt) = &cause.code {
|
||||
// Handle case of `impl Foo for dyn Bar { fn qux(&self) {} }` introducing a
|
||||
// `'static` lifetime when called as a method on a binding: `bar.qux()`.
|
||||
if self.find_impl_on_dyn_trait(&mut err, param.param_ty, &ctxt) {
|
||||
override_error_code = Some(ctxt.assoc_item.ident);
|
||||
}
|
||||
err.emit();
|
||||
return Some(ErrorReported);
|
||||
}
|
||||
}
|
||||
None
|
||||
if let SubregionOrigin::Subtype(box TypeTrace { cause, .. }) = &sub_origin {
|
||||
if let ObligationCauseCode::ItemObligation(item_def_id) = cause.code {
|
||||
// Same case of `impl Foo for dyn Bar { fn qux(&self) {} }` introducing a `'static`
|
||||
// lifetime as above, but called using a fully-qualified path to the method:
|
||||
// `Foo::qux(bar)`.
|
||||
let mut v = TraitObjectVisitor(vec![]);
|
||||
v.visit_ty(param.param_ty);
|
||||
if let Some((ident, self_ty)) =
|
||||
self.get_impl_ident_and_self_ty_from_trait(item_def_id, &v.0[..])
|
||||
{
|
||||
if self.suggest_constrain_dyn_trait_in_impl(&mut err, &v.0[..], ident, self_ty)
|
||||
{
|
||||
override_error_code = Some(ident);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if let (Some(ident), true) = (override_error_code, fn_returns.is_empty()) {
|
||||
// Provide a more targetted error code and description.
|
||||
err.code(rustc_errors::error_code!(E0772));
|
||||
err.set_primary_message(&format!(
|
||||
"{} has {} but calling `{}` introduces an implicit `'static` lifetime \
|
||||
requirement",
|
||||
param_name, lifetime, ident,
|
||||
));
|
||||
}
|
||||
|
||||
debug!("try_report_static_impl_trait: fn_return={:?}", fn_returns);
|
||||
// FIXME: account for the need of parens in `&(dyn Trait + '_)`
|
||||
let consider = "consider changing the";
|
||||
let declare = "to declare that the";
|
||||
let arg = match param.param.pat.simple_ident() {
|
||||
Some(simple_ident) => format!("argument `{}`", simple_ident),
|
||||
None => "the argument".to_string(),
|
||||
};
|
||||
let explicit = format!("you can add an explicit `{}` lifetime bound", lifetime_name);
|
||||
let explicit_static = format!("explicit `'static` bound to the lifetime of {}", arg);
|
||||
let captures = format!("captures data from {}", arg);
|
||||
let add_static_bound = "alternatively, add an explicit `'static` bound to this reference";
|
||||
let plus_lt = format!(" + {}", lifetime_name);
|
||||
for fn_return in fn_returns {
|
||||
if fn_return.span.desugaring_kind().is_some() {
|
||||
// Skip `async` desugaring `impl Future`.
|
||||
continue;
|
||||
}
|
||||
match fn_return.kind {
|
||||
TyKind::OpaqueDef(item_id, _) => {
|
||||
let item = tcx.hir().item(item_id.id);
|
||||
let opaque = if let ItemKind::OpaqueTy(opaque) = &item.kind {
|
||||
opaque
|
||||
} else {
|
||||
err.emit();
|
||||
return Some(ErrorReported);
|
||||
};
|
||||
|
||||
if let Some(span) = opaque
|
||||
.bounds
|
||||
.iter()
|
||||
.filter_map(|arg| match arg {
|
||||
GenericBound::Outlives(Lifetime {
|
||||
name: LifetimeName::Static,
|
||||
span,
|
||||
..
|
||||
}) => Some(*span),
|
||||
_ => None,
|
||||
})
|
||||
.next()
|
||||
{
|
||||
err.span_suggestion_verbose(
|
||||
span,
|
||||
&format!("{} `impl Trait`'s {}", consider, explicit_static),
|
||||
lifetime_name.clone(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
err.span_suggestion_verbose(
|
||||
param.param_ty_span,
|
||||
add_static_bound,
|
||||
param.param_ty.to_string(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
} else if let Some(_) = opaque
|
||||
.bounds
|
||||
.iter()
|
||||
.filter_map(|arg| match arg {
|
||||
GenericBound::Outlives(Lifetime { name, span, .. })
|
||||
if name.ident().to_string() == lifetime_name =>
|
||||
{
|
||||
Some(*span)
|
||||
}
|
||||
_ => None,
|
||||
})
|
||||
.next()
|
||||
{
|
||||
} else {
|
||||
err.span_suggestion_verbose(
|
||||
fn_return.span.shrink_to_hi(),
|
||||
&format!(
|
||||
"{declare} `impl Trait` {captures}, {explicit}",
|
||||
declare = declare,
|
||||
captures = captures,
|
||||
explicit = explicit,
|
||||
),
|
||||
plus_lt.clone(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
}
|
||||
TyKind::TraitObject(_, lt) => match lt.name {
|
||||
LifetimeName::ImplicitObjectLifetimeDefault => {
|
||||
err.span_suggestion_verbose(
|
||||
fn_return.span.shrink_to_hi(),
|
||||
&format!(
|
||||
"{declare} trait object {captures}, {explicit}",
|
||||
declare = declare,
|
||||
captures = captures,
|
||||
explicit = explicit,
|
||||
),
|
||||
plus_lt.clone(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
name if name.ident().to_string() != lifetime_name => {
|
||||
// With this check we avoid suggesting redundant bounds. This
|
||||
// would happen if there are nested impl/dyn traits and only
|
||||
// one of them has the bound we'd suggest already there, like
|
||||
// in `impl Foo<X = dyn Bar> + '_`.
|
||||
err.span_suggestion_verbose(
|
||||
lt.span,
|
||||
&format!("{} trait object's {}", consider, explicit_static),
|
||||
lifetime_name.clone(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
err.span_suggestion_verbose(
|
||||
param.param_ty_span,
|
||||
add_static_bound,
|
||||
param.param_ty.to_string(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
err.emit();
|
||||
Some(ErrorReported)
|
||||
}
|
||||
|
||||
fn get_impl_ident_and_self_ty_from_trait(
|
||||
&self,
|
||||
def_id: DefId,
|
||||
trait_objects: &[DefId],
|
||||
) -> Option<(Ident, &'tcx hir::Ty<'tcx>)> {
|
||||
let tcx = self.tcx();
|
||||
match tcx.hir().get_if_local(def_id) {
|
||||
Some(Node::ImplItem(ImplItem { ident, hir_id, .. })) => {
|
||||
match tcx.hir().find(tcx.hir().get_parent_item(*hir_id)) {
|
||||
Some(Node::Item(Item { kind: ItemKind::Impl { self_ty, .. }, .. })) => {
|
||||
Some((*ident, self_ty))
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
Some(Node::TraitItem(TraitItem { ident, hir_id, .. })) => {
|
||||
let parent_id = tcx.hir().get_parent_item(*hir_id);
|
||||
match tcx.hir().find(parent_id) {
|
||||
Some(Node::Item(Item { kind: ItemKind::Trait(..), .. })) => {
|
||||
// The method being called is defined in the `trait`, but the `'static`
|
||||
// obligation comes from the `impl`. Find that `impl` so that we can point
|
||||
// at it in the suggestion.
|
||||
let trait_did = tcx.hir().local_def_id(parent_id).to_def_id();
|
||||
match tcx
|
||||
.hir()
|
||||
.trait_impls(trait_did)
|
||||
.iter()
|
||||
.filter_map(|impl_node| {
|
||||
let impl_did = tcx.hir().local_def_id(*impl_node);
|
||||
match tcx.hir().get_if_local(impl_did.to_def_id()) {
|
||||
Some(Node::Item(Item {
|
||||
kind: ItemKind::Impl { self_ty, .. },
|
||||
..
|
||||
})) if trait_objects.iter().all(|did| {
|
||||
// FIXME: we should check `self_ty` against the receiver
|
||||
// type in the `UnifyReceiver` context, but for now, use
|
||||
// this imperfect proxy. This will fail if there are
|
||||
// multiple `impl`s for the same trait like
|
||||
// `impl Foo for Box<dyn Bar>` and `impl Foo for dyn Bar`.
|
||||
// In that case, only the first one will get suggestions.
|
||||
let mut hir_v = HirTraitObjectVisitor(vec![], *did);
|
||||
hir_v.visit_ty(self_ty);
|
||||
!hir_v.0.is_empty()
|
||||
}) =>
|
||||
{
|
||||
Some(self_ty)
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
})
|
||||
.next()
|
||||
{
|
||||
Some(self_ty) => Some((*ident, self_ty)),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// When we call a method coming from an `impl Foo for dyn Bar`, `dyn Bar` introduces a default
|
||||
/// `'static` obligation. Suggest relaxing that implicit bound.
|
||||
fn find_impl_on_dyn_trait(
|
||||
&self,
|
||||
err: &mut DiagnosticBuilder<'_>,
|
||||
ty: Ty<'_>,
|
||||
ctxt: &UnifyReceiverContext<'tcx>,
|
||||
) -> bool {
|
||||
let tcx = self.tcx();
|
||||
|
||||
// Find the method being called.
|
||||
let instance = match ty::Instance::resolve(
|
||||
tcx,
|
||||
ctxt.param_env,
|
||||
ctxt.assoc_item.def_id,
|
||||
self.infcx.resolve_vars_if_possible(&ctxt.substs),
|
||||
) {
|
||||
Ok(Some(instance)) => instance,
|
||||
_ => return false,
|
||||
};
|
||||
|
||||
let mut v = TraitObjectVisitor(vec![]);
|
||||
v.visit_ty(ty);
|
||||
|
||||
// Get the `Ident` of the method being called and the corresponding `impl` (to point at
|
||||
// `Bar` in `impl Foo for dyn Bar {}` and the definition of the method being called).
|
||||
let (ident, self_ty) =
|
||||
match self.get_impl_ident_and_self_ty_from_trait(instance.def_id(), &v.0[..]) {
|
||||
Some((ident, self_ty)) => (ident, self_ty),
|
||||
None => return false,
|
||||
};
|
||||
|
||||
// Find the trait object types in the argument, so we point at *only* the trait object.
|
||||
self.suggest_constrain_dyn_trait_in_impl(err, &v.0[..], ident, self_ty)
|
||||
}
|
||||
|
||||
fn suggest_constrain_dyn_trait_in_impl(
|
||||
&self,
|
||||
err: &mut DiagnosticBuilder<'_>,
|
||||
found_dids: &[DefId],
|
||||
ident: Ident,
|
||||
self_ty: &hir::Ty<'_>,
|
||||
) -> bool {
|
||||
let mut suggested = false;
|
||||
for found_did in found_dids {
|
||||
let mut hir_v = HirTraitObjectVisitor(vec![], *found_did);
|
||||
hir_v.visit_ty(&self_ty);
|
||||
for span in &hir_v.0 {
|
||||
let mut multi_span: MultiSpan = vec![*span].into();
|
||||
multi_span.push_span_label(
|
||||
*span,
|
||||
"this has an implicit `'static` lifetime requirement".to_string(),
|
||||
);
|
||||
multi_span.push_span_label(
|
||||
ident.span,
|
||||
"calling this method introduces the `impl`'s 'static` requirement".to_string(),
|
||||
);
|
||||
err.span_note(multi_span, "the used `impl` has a `'static` requirement");
|
||||
err.span_suggestion_verbose(
|
||||
span.shrink_to_hi(),
|
||||
"consider relaxing the implicit `'static` requirement",
|
||||
" + '_".to_string(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
suggested = true;
|
||||
}
|
||||
}
|
||||
suggested
|
||||
}
|
||||
}
|
||||
|
||||
/// Collect all the trait objects in a type that could have received an implicit `'static` lifetime.
|
||||
struct TraitObjectVisitor(Vec<DefId>);
|
||||
|
||||
impl TypeVisitor<'_> for TraitObjectVisitor {
|
||||
fn visit_ty(&mut self, t: Ty<'_>) -> bool {
|
||||
match t.kind {
|
||||
ty::Dynamic(preds, RegionKind::ReStatic) => {
|
||||
if let Some(def_id) = preds.principal_def_id() {
|
||||
self.0.push(def_id);
|
||||
}
|
||||
false
|
||||
}
|
||||
_ => t.super_visit_with(self),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Collect all `hir::Ty<'_>` `Span`s for trait objects with an implicit lifetime.
|
||||
struct HirTraitObjectVisitor(Vec<Span>, DefId);
|
||||
|
||||
impl<'tcx> Visitor<'tcx> for HirTraitObjectVisitor {
|
||||
type Map = ErasedMap<'tcx>;
|
||||
|
||||
fn nested_visit_map(&mut self) -> NestedVisitorMap<Self::Map> {
|
||||
NestedVisitorMap::None
|
||||
}
|
||||
|
||||
fn visit_ty(&mut self, t: &'tcx hir::Ty<'tcx>) {
|
||||
match t.kind {
|
||||
TyKind::TraitObject(
|
||||
poly_trait_refs,
|
||||
Lifetime { name: LifetimeName::ImplicitObjectLifetimeDefault, .. },
|
||||
) => {
|
||||
for ptr in poly_trait_refs {
|
||||
if Some(self.1) == ptr.trait_ref.trait_def_id() {
|
||||
self.0.push(ptr.span);
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
walk_ty(self, t);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,20 +7,18 @@ use rustc_hir::def_id::LocalDefId;
|
|||
use rustc_middle::ty::{self, DefIdTree, Region, Ty};
|
||||
use rustc_span::Span;
|
||||
|
||||
// The struct contains the information about the anonymous region
|
||||
// we are searching for.
|
||||
/// Information about the anonymous region we are searching for.
|
||||
#[derive(Debug)]
|
||||
pub(super) struct AnonymousParamInfo<'tcx> {
|
||||
// the parameter corresponding to the anonymous region
|
||||
/// The parameter corresponding to the anonymous region.
|
||||
pub param: &'tcx hir::Param<'tcx>,
|
||||
// the type corresponding to the anonymopus region parameter
|
||||
/// The type corresponding to the anonymous region parameter.
|
||||
pub param_ty: Ty<'tcx>,
|
||||
// the ty::BoundRegion corresponding to the anonymous region
|
||||
/// The ty::BoundRegion corresponding to the anonymous region.
|
||||
pub bound_region: ty::BoundRegion,
|
||||
// param_ty_span contains span of parameter type
|
||||
/// The `Span` of the parameter type.
|
||||
pub param_ty_span: Span,
|
||||
// corresponds to id the argument is the first parameter
|
||||
// in the declaration
|
||||
/// Signals that the argument is the first parameter in the declaration.
|
||||
pub is_first: bool,
|
||||
}
|
||||
|
||||
|
|
|
@ -463,7 +463,7 @@ pub enum RegionVariableOrigin {
|
|||
AddrOfRegion(Span),
|
||||
|
||||
/// Regions created as part of an autoref of a method receiver
|
||||
Autoref(Span),
|
||||
Autoref(Span, ty::AssocItem),
|
||||
|
||||
/// Regions created as part of an automatic coercion
|
||||
Coercion(Span),
|
||||
|
@ -1800,15 +1800,15 @@ impl<'tcx> SubregionOrigin<'tcx> {
|
|||
impl RegionVariableOrigin {
|
||||
pub fn span(&self) -> Span {
|
||||
match *self {
|
||||
MiscVariable(a) => a,
|
||||
PatternRegion(a) => a,
|
||||
AddrOfRegion(a) => a,
|
||||
Autoref(a) => a,
|
||||
Coercion(a) => a,
|
||||
EarlyBoundRegion(a, ..) => a,
|
||||
LateBoundRegion(a, ..) => a,
|
||||
MiscVariable(a)
|
||||
| PatternRegion(a)
|
||||
| AddrOfRegion(a)
|
||||
| Autoref(a, _)
|
||||
| Coercion(a)
|
||||
| EarlyBoundRegion(a, ..)
|
||||
| LateBoundRegion(a, ..)
|
||||
| UpvarRegion(_, a) => a,
|
||||
BoundRegionInCoherence(_) => rustc_span::DUMMY_SP,
|
||||
UpvarRegion(_, a) => a,
|
||||
NLL(..) => bug!("NLL variable used with `span`"),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
//! This API is completely unstable and subject to change.
|
||||
|
||||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/")]
|
||||
#![feature(bindings_after_at)]
|
||||
#![feature(bool_to_option)]
|
||||
#![feature(box_patterns)]
|
||||
#![feature(box_syntax)]
|
||||
|
|
|
@ -169,6 +169,13 @@ impl<'tcx> ObligationCause<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
|
||||
pub struct UnifyReceiverContext<'tcx> {
|
||||
pub assoc_item: ty::AssocItem,
|
||||
pub param_env: ty::ParamEnv<'tcx>,
|
||||
pub substs: SubstsRef<'tcx>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
|
||||
pub enum ObligationCauseCode<'tcx> {
|
||||
/// Not well classified or should be obvious from the span.
|
||||
|
@ -300,6 +307,8 @@ pub enum ObligationCauseCode<'tcx> {
|
|||
/// Method receiver
|
||||
MethodReceiver,
|
||||
|
||||
UnifyReceiver(Box<UnifyReceiverContext<'tcx>>),
|
||||
|
||||
/// `return` with no expression
|
||||
ReturnNoExpression,
|
||||
|
||||
|
|
|
@ -213,12 +213,26 @@ impl<'a, 'tcx> Lift<'tcx> for traits::ObligationCauseCode<'a> {
|
|||
super::StartFunctionType => Some(super::StartFunctionType),
|
||||
super::IntrinsicType => Some(super::IntrinsicType),
|
||||
super::MethodReceiver => Some(super::MethodReceiver),
|
||||
super::UnifyReceiver(ref ctxt) => tcx.lift(ctxt).map(|ctxt| super::UnifyReceiver(ctxt)),
|
||||
super::BlockTailExpression(id) => Some(super::BlockTailExpression(id)),
|
||||
super::TrivialBound => Some(super::TrivialBound),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> Lift<'tcx> for traits::UnifyReceiverContext<'a> {
|
||||
type Lifted = traits::UnifyReceiverContext<'tcx>;
|
||||
fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
|
||||
tcx.lift(&self.param_env).and_then(|param_env| {
|
||||
tcx.lift(&self.substs).map(|substs| traits::UnifyReceiverContext {
|
||||
assoc_item: self.assoc_item,
|
||||
param_env,
|
||||
substs,
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> Lift<'tcx> for traits::DerivedObligationCause<'a> {
|
||||
type Lifted = traits::DerivedObligationCause<'tcx>;
|
||||
fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
|
||||
|
|
|
@ -136,7 +136,7 @@ pub struct ResolverOutputs {
|
|||
pub extern_prelude: FxHashMap<Symbol, bool>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Debug, HashStable)]
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Debug, HashStable, Hash)]
|
||||
pub enum AssocItemContainer {
|
||||
TraitContainer(DefId),
|
||||
ImplContainer(DefId),
|
||||
|
@ -184,7 +184,7 @@ pub enum ImplPolarity {
|
|||
Reservation,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, HashStable)]
|
||||
#[derive(Copy, Clone, Debug, PartialEq, HashStable, Eq, Hash)]
|
||||
pub struct AssocItem {
|
||||
pub def_id: DefId,
|
||||
#[stable_hasher(project(name))]
|
||||
|
@ -199,7 +199,7 @@ pub struct AssocItem {
|
|||
pub fn_has_self_parameter: bool,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, PartialEq, Debug, HashStable)]
|
||||
#[derive(Copy, Clone, PartialEq, Debug, HashStable, Eq, Hash)]
|
||||
pub enum AssocKind {
|
||||
Const,
|
||||
Fn,
|
||||
|
@ -316,7 +316,7 @@ impl<'tcx> AssociatedItems<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Copy, RustcEncodable, RustcDecodable, HashStable)]
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Copy, RustcEncodable, RustcDecodable, HashStable, Hash)]
|
||||
pub enum Visibility {
|
||||
/// Visible everywhere (including in other crates).
|
||||
Public,
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
use crate::infer::{InferCtxt, TyCtxtInferExt};
|
||||
use crate::traits::{
|
||||
FulfillmentContext, ImplSource, Obligation, ObligationCause, SelectionContext, TraitEngine,
|
||||
Unimplemented,
|
||||
};
|
||||
use rustc_errors::ErrorReported;
|
||||
use rustc_middle::ty::fold::TypeFoldable;
|
||||
|
@ -58,6 +59,18 @@ pub fn codegen_fulfill_obligation<'tcx>(
|
|||
);
|
||||
return Err(ErrorReported);
|
||||
}
|
||||
Err(Unimplemented) => {
|
||||
// This can trigger when we probe for the source of a `'static` lifetime requirement
|
||||
// on a trait object: `impl Foo for dyn Trait {}` has an implicit `'static` bound.
|
||||
infcx.tcx.sess.delay_span_bug(
|
||||
rustc_span::DUMMY_SP,
|
||||
&format!(
|
||||
"Encountered error `Unimplemented` selecting `{:?}` during codegen",
|
||||
trait_ref
|
||||
),
|
||||
);
|
||||
return Err(ErrorReported);
|
||||
}
|
||||
Err(e) => {
|
||||
bug!("Encountered error `{:?}` selecting `{:?}` during codegen", e, trait_ref)
|
||||
}
|
||||
|
|
|
@ -1706,6 +1706,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
|||
| ObligationCauseCode::IntrinsicType
|
||||
| ObligationCauseCode::MethodReceiver
|
||||
| ObligationCauseCode::ReturnNoExpression
|
||||
| ObligationCauseCode::UnifyReceiver(..)
|
||||
| ObligationCauseCode::MiscObligation => {}
|
||||
ObligationCauseCode::SliceOrArrayElem => {
|
||||
err.note("slice and array elements must have `Sized` type");
|
||||
|
|
|
@ -6,6 +6,7 @@ use crate::hir::def_id::DefId;
|
|||
use crate::hir::GenericArg;
|
||||
use rustc_hir as hir;
|
||||
use rustc_infer::infer::{self, InferOk};
|
||||
use rustc_middle::traits::{ObligationCauseCode, UnifyReceiverContext};
|
||||
use rustc_middle::ty::adjustment::{Adjust, Adjustment, PointerCast};
|
||||
use rustc_middle::ty::adjustment::{AllowTwoPhase, AutoBorrow, AutoBorrowMutability};
|
||||
use rustc_middle::ty::fold::TypeFoldable;
|
||||
|
@ -91,7 +92,11 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
|
|||
// signature (which is also done during probing).
|
||||
let method_sig_rcvr =
|
||||
self.normalize_associated_types_in(self.span, &method_sig.inputs()[0]);
|
||||
self.unify_receivers(self_ty, method_sig_rcvr);
|
||||
debug!(
|
||||
"confirm: self_ty={:?} method_sig_rcvr={:?} method_sig={:?} method_predicates={:?}",
|
||||
self_ty, method_sig_rcvr, method_sig, method_predicates
|
||||
);
|
||||
self.unify_receivers(self_ty, method_sig_rcvr, &pick, all_substs);
|
||||
|
||||
let (method_sig, method_predicates) =
|
||||
self.normalize_associated_types_in(self.span, &(method_sig, method_predicates));
|
||||
|
@ -150,7 +155,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
|
|||
self.structurally_resolved_type(autoderef.span(), autoderef.final_ty(false));
|
||||
|
||||
if let Some(mutbl) = pick.autoref {
|
||||
let region = self.next_region_var(infer::Autoref(self.span));
|
||||
let region = self.next_region_var(infer::Autoref(self.span, pick.item));
|
||||
target = self.tcx.mk_ref(region, ty::TypeAndMut { mutbl, ty: target });
|
||||
let mutbl = match mutbl {
|
||||
hir::Mutability::Not => AutoBorrowMutability::Not,
|
||||
|
@ -334,8 +339,26 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
|
|||
)
|
||||
}
|
||||
|
||||
fn unify_receivers(&mut self, self_ty: Ty<'tcx>, method_self_ty: Ty<'tcx>) {
|
||||
match self.at(&self.misc(self.span), self.param_env).sup(method_self_ty, self_ty) {
|
||||
fn unify_receivers(
|
||||
&mut self,
|
||||
self_ty: Ty<'tcx>,
|
||||
method_self_ty: Ty<'tcx>,
|
||||
pick: &probe::Pick<'tcx>,
|
||||
substs: SubstsRef<'tcx>,
|
||||
) {
|
||||
debug!(
|
||||
"unify_receivers: self_ty={:?} method_self_ty={:?} span={:?} pick={:?}",
|
||||
self_ty, method_self_ty, self.span, pick
|
||||
);
|
||||
let cause = self.cause(
|
||||
self.span,
|
||||
ObligationCauseCode::UnifyReceiver(Box::new(UnifyReceiverContext {
|
||||
assoc_item: pick.item,
|
||||
param_env: self.param_env,
|
||||
substs,
|
||||
})),
|
||||
);
|
||||
match self.at(&cause, self.param_env).sup(method_self_ty, self_ty) {
|
||||
Ok(InferOk { obligations, value: () }) => {
|
||||
self.register_predicates(obligations);
|
||||
}
|
||||
|
|
|
@ -35,7 +35,7 @@ fn baz<'a,'b>(x: &'a u32, y: &'b u32) -> (&'a u32, &'b u32) {
|
|||
|
||||
#[cfg(transmute)] // one instantiations: BAD
|
||||
fn baz<'a,'b>(x: &'a u32) -> &'static u32 {
|
||||
bar(foo, x) //[transmute]~ ERROR E0495
|
||||
bar(foo, x) //[transmute]~ ERROR E0759
|
||||
}
|
||||
|
||||
#[cfg(krisskross)] // two instantiations, mixing and matching: BAD
|
||||
|
|
|
@ -1,26 +1,11 @@
|
|||
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
|
||||
error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/project-fn-ret-contravariant.rs:38:8
|
||||
|
|
||||
LL | bar(foo, x)
|
||||
| ^^^
|
||||
|
|
||||
note: first, the lifetime cannot outlive the lifetime `'a` as defined on the function body at 37:8...
|
||||
--> $DIR/project-fn-ret-contravariant.rs:37:8
|
||||
|
|
||||
LL | fn baz<'a,'b>(x: &'a u32) -> &'static u32 {
|
||||
| ^^
|
||||
note: ...so that reference does not outlive borrowed content
|
||||
--> $DIR/project-fn-ret-contravariant.rs:38:13
|
||||
|
|
||||
| ------- this data with lifetime `'a`...
|
||||
LL | bar(foo, x)
|
||||
| ^
|
||||
= note: but, the lifetime must be valid for the static lifetime...
|
||||
note: ...so that reference does not outlive borrowed content
|
||||
--> $DIR/project-fn-ret-contravariant.rs:38:4
|
||||
|
|
||||
LL | bar(foo, x)
|
||||
| ^^^^^^^^^^^
|
||||
| ----^^^---- ...is captured and required to live as long as `'static` here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
For more information about this error, try `rustc --explain E0759`.
|
||||
|
|
|
@ -46,7 +46,7 @@ fn baz<'a, 'b>(x: Type<'a>) -> Type<'static> {
|
|||
// Cannot instantiate `foo` with any lifetime other than `'a`,
|
||||
// since it is provided as input.
|
||||
|
||||
bar(foo, x) //[transmute]~ ERROR E0495
|
||||
bar(foo, x) //[transmute]~ ERROR E0759
|
||||
}
|
||||
|
||||
#[cfg(krisskross)] // two instantiations, mixing and matching: BAD
|
||||
|
|
|
@ -1,30 +1,12 @@
|
|||
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
|
||||
error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/project-fn-ret-invariant.rs:49:9
|
||||
|
|
||||
LL | bar(foo, x)
|
||||
| ^^^
|
||||
|
|
||||
note: first, the lifetime cannot outlive the lifetime `'a` as defined on the function body at 45:8...
|
||||
--> $DIR/project-fn-ret-invariant.rs:45:8
|
||||
|
|
||||
LL | fn baz<'a, 'b>(x: Type<'a>) -> Type<'static> {
|
||||
| ^^
|
||||
note: ...so that the expression is assignable
|
||||
--> $DIR/project-fn-ret-invariant.rs:49:14
|
||||
|
|
||||
| -------- this data with lifetime `'a`...
|
||||
...
|
||||
LL | bar(foo, x)
|
||||
| ^
|
||||
= note: expected `Type<'_>`
|
||||
found `Type<'a>`
|
||||
= note: but, the lifetime must be valid for the static lifetime...
|
||||
note: ...so that the expression is assignable
|
||||
--> $DIR/project-fn-ret-invariant.rs:49:5
|
||||
|
|
||||
LL | bar(foo, x)
|
||||
| ^^^^^^^^^^^
|
||||
= note: expected `Type<'static>`
|
||||
found `Type<'_>`
|
||||
| ----^^^---- ...is captured and required to live as long as `'static` here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
For more information about this error, try `rustc --explain E0759`.
|
||||
|
|
|
@ -9,7 +9,7 @@ where
|
|||
struct Struct;
|
||||
|
||||
impl Struct {
|
||||
pub async fn run_dummy_fn(&self) { //~ ERROR cannot infer
|
||||
pub async fn run_dummy_fn(&self) { //~ ERROR E0759
|
||||
foo(|| self.bar()).await;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `self` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/issue-62097.rs:12:31
|
||||
|
|
||||
LL | pub async fn run_dummy_fn(&self) {
|
||||
|
|
|
@ -17,7 +17,7 @@ fn static_val<T: StaticTrait>(_: T) {
|
|||
}
|
||||
|
||||
fn with_dyn_debug_static<'a>(x: Box<dyn Debug + 'a>) {
|
||||
static_val(x); //~ ERROR cannot infer
|
||||
static_val(x); //~ ERROR E0759
|
||||
}
|
||||
|
||||
fn not_static_val<T: NotStaticTrait>(_: T) {
|
||||
|
|
|
@ -1,30 +1,17 @@
|
|||
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
|
||||
error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/dyn-trait.rs:20:16
|
||||
|
|
||||
LL | static_val(x);
|
||||
| ^
|
||||
|
|
||||
note: first, the lifetime cannot outlive the lifetime `'a` as defined on the function body at 19:26...
|
||||
--> $DIR/dyn-trait.rs:19:26
|
||||
|
|
||||
LL | fn with_dyn_debug_static<'a>(x: Box<dyn Debug + 'a>) {
|
||||
| ^^
|
||||
note: ...so that the expression is assignable
|
||||
--> $DIR/dyn-trait.rs:20:16
|
||||
|
|
||||
| ------------------- this data with lifetime `'a`...
|
||||
LL | static_val(x);
|
||||
| ^
|
||||
= note: expected `std::boxed::Box<dyn std::fmt::Debug>`
|
||||
found `std::boxed::Box<(dyn std::fmt::Debug + 'a)>`
|
||||
= note: but, the lifetime must be valid for the static lifetime...
|
||||
note: ...so that the types are compatible
|
||||
| ^ ...is captured here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/dyn-trait.rs:20:5
|
||||
|
|
||||
LL | static_val(x);
|
||||
| ^^^^^^^^^^
|
||||
= note: expected `StaticTrait`
|
||||
found `StaticTrait`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
For more information about this error, try `rustc --explain E0759`.
|
||||
|
|
|
@ -12,7 +12,7 @@ LL | fn elided(x: &i32) -> impl Copy + '_ { x }
|
|||
| ^^^^^^^^^^^^^^
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:6:32
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:5:32
|
||||
|
|
||||
LL | fn explicit<'a>(x: &'a i32) -> impl Copy { x }
|
||||
| -- ^^^^^^^^^ opaque type requires that `'a` must outlive `'static`
|
||||
|
@ -26,7 +26,7 @@ LL | fn explicit<'a>(x: &'a i32) -> impl Copy + 'a { x }
|
|||
| ^^^^^^^^^^^^^^
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:9:46
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:7:46
|
||||
|
|
||||
LL | fn elided2(x: &i32) -> impl Copy + 'static { x }
|
||||
| - ^ returning this value requires that `'1` must outlive `'static`
|
||||
|
@ -36,7 +36,7 @@ LL | fn elided2(x: &i32) -> impl Copy + 'static { x }
|
|||
= help: consider replacing `'1` with `'static`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:12:55
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:9:55
|
||||
|
|
||||
LL | fn explicit2<'a>(x: &'a i32) -> impl Copy + 'static { x }
|
||||
| -- lifetime `'a` defined here ^ returning this value requires that `'a` must outlive `'static`
|
||||
|
@ -45,7 +45,7 @@ LL | fn explicit2<'a>(x: &'a i32) -> impl Copy + 'static { x }
|
|||
= help: consider replacing `'a` with `'static`
|
||||
|
||||
error[E0621]: explicit lifetime required in the type of `x`
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:15:41
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:11:41
|
||||
|
|
||||
LL | fn foo<'a>(x: &i32) -> impl Copy + 'a { x }
|
||||
| ---- ^ lifetime `'a` required
|
||||
|
@ -53,7 +53,7 @@ LL | fn foo<'a>(x: &i32) -> impl Copy + 'a { x }
|
|||
| help: add explicit lifetime `'a` to the type of `x`: `&'a i32`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:30:24
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:22:24
|
||||
|
|
||||
LL | fn elided5(x: &i32) -> (Box<dyn Debug>, impl Debug) { (Box::new(x), x) }
|
||||
| - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ opaque type requires that `'1` must outlive `'static`
|
||||
|
@ -61,7 +61,7 @@ LL | fn elided5(x: &i32) -> (Box<dyn Debug>, impl Debug) { (Box::new(x), x) }
|
|||
| let's call the lifetime of this reference `'1`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:37:69
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:28:69
|
||||
|
|
||||
LL | fn with_bound<'a>(x: &'a i32) -> impl LifetimeTrait<'a> + 'static { x }
|
||||
| -- lifetime `'a` defined here ^ returning this value requires that `'a` must outlive `'static`
|
||||
|
@ -70,7 +70,7 @@ LL | fn with_bound<'a>(x: &'a i32) -> impl LifetimeTrait<'a> + 'static { x }
|
|||
= help: consider replacing `'a` with `'static`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:42:61
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:32:61
|
||||
|
|
||||
LL | fn move_lifetime_into_fn<'a, 'b>(x: &'a u32, y: &'b u32) -> impl Fn(&'a u32) {
|
||||
| -- -- lifetime `'b` defined here ^^^^^^^^^^^^^^^^ opaque type requires that `'b` must outlive `'a`
|
||||
|
@ -80,7 +80,7 @@ LL | fn move_lifetime_into_fn<'a, 'b>(x: &'a u32, y: &'b u32) -> impl Fn(&'a u32
|
|||
= help: consider adding the following bound: `'b: 'a`
|
||||
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:47:51
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:37:51
|
||||
|
|
||||
LL | fn ty_param_wont_outlive_static<T:Debug>(x: T) -> impl Debug + 'static {
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
|
@ -1,41 +1,31 @@
|
|||
use std::fmt::Debug;
|
||||
|
||||
fn elided(x: &i32) -> impl Copy { x }
|
||||
//~^ ERROR cannot infer an appropriate lifetime
|
||||
fn elided(x: &i32) -> impl Copy { x } //~ ERROR E0759
|
||||
|
||||
fn explicit<'a>(x: &'a i32) -> impl Copy { x }
|
||||
//~^ ERROR cannot infer an appropriate lifetime
|
||||
fn explicit<'a>(x: &'a i32) -> impl Copy { x } //~ ERROR E0759
|
||||
|
||||
fn elided2(x: &i32) -> impl Copy + 'static { x }
|
||||
//~^ ERROR cannot infer an appropriate lifetime
|
||||
fn elided2(x: &i32) -> impl Copy + 'static { x } //~ ERROR E0759
|
||||
|
||||
fn explicit2<'a>(x: &'a i32) -> impl Copy + 'static { x }
|
||||
//~^ ERROR cannot infer an appropriate lifetime
|
||||
fn explicit2<'a>(x: &'a i32) -> impl Copy + 'static { x } //~ ERROR E0759
|
||||
|
||||
fn foo<'a>(x: &i32) -> impl Copy + 'a { x }
|
||||
//~^ ERROR explicit lifetime required in the type of `x`
|
||||
|
||||
fn elided3(x: &i32) -> Box<dyn Debug> { Box::new(x) }
|
||||
//~^ ERROR cannot infer an appropriate lifetime
|
||||
fn elided3(x: &i32) -> Box<dyn Debug> { Box::new(x) } //~ ERROR E0759
|
||||
|
||||
fn explicit3<'a>(x: &'a i32) -> Box<dyn Debug> { Box::new(x) }
|
||||
//~^ ERROR cannot infer an appropriate lifetime
|
||||
fn explicit3<'a>(x: &'a i32) -> Box<dyn Debug> { Box::new(x) } //~ ERROR E0759
|
||||
|
||||
fn elided4(x: &i32) -> Box<dyn Debug + 'static> { Box::new(x) }
|
||||
//~^ ERROR cannot infer an appropriate lifetime
|
||||
fn elided4(x: &i32) -> Box<dyn Debug + 'static> { Box::new(x) } //~ ERROR E0759
|
||||
|
||||
fn explicit4<'a>(x: &'a i32) -> Box<dyn Debug + 'static> { Box::new(x) }
|
||||
//~^ ERROR cannot infer an appropriate lifetime
|
||||
fn explicit4<'a>(x: &'a i32) -> Box<dyn Debug + 'static> { Box::new(x) } //~ ERROR E0759
|
||||
|
||||
fn elided5(x: &i32) -> (Box<dyn Debug>, impl Debug) { (Box::new(x), x) }
|
||||
//~^ ERROR cannot infer an appropriate lifetime
|
||||
//~| ERROR cannot infer an appropriate lifetime
|
||||
fn elided5(x: &i32) -> (Box<dyn Debug>, impl Debug) { (Box::new(x), x) } //~ ERROR E0759
|
||||
//~^ ERROR E0759
|
||||
|
||||
trait LifetimeTrait<'a> {}
|
||||
impl<'a> LifetimeTrait<'a> for &'a i32 {}
|
||||
|
||||
fn with_bound<'a>(x: &'a i32) -> impl LifetimeTrait<'a> + 'static { x }
|
||||
//~^ ERROR cannot infer an appropriate lifetime
|
||||
fn with_bound<'a>(x: &'a i32) -> impl LifetimeTrait<'a> + 'static { x } //~ ERROR E0759
|
||||
|
||||
// Tests that a closure type containing 'b cannot be returned from a type where
|
||||
// only 'a was expected.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:3:35
|
||||
|
|
||||
LL | fn elided(x: &i32) -> impl Copy { x }
|
||||
|
@ -16,8 +16,8 @@ help: to declare that the `impl Trait` captures data from argument `x`, you can
|
|||
LL | fn elided(x: &i32) -> impl Copy + '_ { x }
|
||||
| ^^^^
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:6:44
|
||||
error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:5:44
|
||||
|
|
||||
LL | fn explicit<'a>(x: &'a i32) -> impl Copy { x }
|
||||
| ------- ^ ...is captured here...
|
||||
|
@ -25,7 +25,7 @@ LL | fn explicit<'a>(x: &'a i32) -> impl Copy { x }
|
|||
| this data with lifetime `'a`...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:6:32
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:5:32
|
||||
|
|
||||
LL | fn explicit<'a>(x: &'a i32) -> impl Copy { x }
|
||||
| ^^^^^^^^^
|
||||
|
@ -34,8 +34,8 @@ help: to declare that the `impl Trait` captures data from argument `x`, you can
|
|||
LL | fn explicit<'a>(x: &'a i32) -> impl Copy + 'a { x }
|
||||
| ^^^^
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:9:46
|
||||
error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:7:46
|
||||
|
|
||||
LL | fn elided2(x: &i32) -> impl Copy + 'static { x }
|
||||
| ---- ^ ...is captured here...
|
||||
|
@ -43,7 +43,7 @@ LL | fn elided2(x: &i32) -> impl Copy + 'static { x }
|
|||
| this data with an anonymous lifetime `'_`...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:9:24
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:7:24
|
||||
|
|
||||
LL | fn elided2(x: &i32) -> impl Copy + 'static { x }
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -56,8 +56,8 @@ help: alternatively, add an explicit `'static` bound to this reference
|
|||
LL | fn elided2(x: &'static i32) -> impl Copy + 'static { x }
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:12:55
|
||||
error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:9:55
|
||||
|
|
||||
LL | fn explicit2<'a>(x: &'a i32) -> impl Copy + 'static { x }
|
||||
| ------- ^ ...is captured here...
|
||||
|
@ -65,7 +65,7 @@ LL | fn explicit2<'a>(x: &'a i32) -> impl Copy + 'static { x }
|
|||
| this data with lifetime `'a`...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:12:33
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:9:33
|
||||
|
|
||||
LL | fn explicit2<'a>(x: &'a i32) -> impl Copy + 'static { x }
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -79,15 +79,15 @@ LL | fn explicit2<'a>(x: &'static i32) -> impl Copy + 'static { x }
|
|||
| ^^^^^^^^^^^^
|
||||
|
||||
error[E0621]: explicit lifetime required in the type of `x`
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:15:24
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:11:24
|
||||
|
|
||||
LL | fn foo<'a>(x: &i32) -> impl Copy + 'a { x }
|
||||
| ---- ^^^^^^^^^^^^^^ lifetime `'a` required
|
||||
| |
|
||||
| help: add explicit lifetime `'a` to the type of `x`: `&'a i32`
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:30:65
|
||||
error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:22:65
|
||||
|
|
||||
LL | fn elided5(x: &i32) -> (Box<dyn Debug>, impl Debug) { (Box::new(x), x) }
|
||||
| ---- this data with an anonymous lifetime `'_`... ^ ...is captured here, requiring it to live as long as `'static`
|
||||
|
@ -101,14 +101,14 @@ help: to declare that the `impl Trait` captures data from argument `x`, you can
|
|||
LL | fn elided5(x: &i32) -> (Box<dyn Debug>, impl Debug + '_) { (Box::new(x), x) }
|
||||
| ^^^^
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:30:69
|
||||
error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:22:69
|
||||
|
|
||||
LL | fn elided5(x: &i32) -> (Box<dyn Debug>, impl Debug) { (Box::new(x), x) }
|
||||
| ---- this data with an anonymous lifetime `'_`... ^ ...is captured here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:30:41
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:22:41
|
||||
|
|
||||
LL | fn elided5(x: &i32) -> (Box<dyn Debug>, impl Debug) { (Box::new(x), x) }
|
||||
| ^^^^^^^^^^
|
||||
|
@ -121,14 +121,14 @@ help: to declare that the `impl Trait` captures data from argument `x`, you can
|
|||
LL | fn elided5(x: &i32) -> (Box<dyn Debug>, impl Debug + '_) { (Box::new(x), x) }
|
||||
| ^^^^
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:37:69
|
||||
error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:28:69
|
||||
|
|
||||
LL | fn with_bound<'a>(x: &'a i32) -> impl LifetimeTrait<'a> + 'static { x }
|
||||
| ------- this data with lifetime `'a`... ^ ...is captured here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:37:34
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:28:34
|
||||
|
|
||||
LL | fn with_bound<'a>(x: &'a i32) -> impl LifetimeTrait<'a> + 'static { x }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -142,7 +142,7 @@ LL | fn with_bound<'a>(x: &'static i32) -> impl LifetimeTrait<'a> + 'static { x
|
|||
| ^^^^^^^^^^^^
|
||||
|
||||
error[E0623]: lifetime mismatch
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:42:61
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:32:61
|
||||
|
|
||||
LL | fn move_lifetime_into_fn<'a, 'b>(x: &'a u32, y: &'b u32) -> impl Fn(&'a u32) {
|
||||
| ------- ^^^^^^^^^^^^^^^^
|
||||
|
@ -151,15 +151,15 @@ LL | fn move_lifetime_into_fn<'a, 'b>(x: &'a u32, y: &'b u32) -> impl Fn(&'a u32
|
|||
| this parameter and the return type are declared with different lifetimes...
|
||||
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:47:51
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:37:51
|
||||
|
|
||||
LL | fn ty_param_wont_outlive_static<T:Debug>(x: T) -> impl Debug + 'static {
|
||||
| -- ^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
||||
| |
|
||||
| help: consider adding an explicit lifetime bound...: `T: 'static +`
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:18:50
|
||||
error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:14:50
|
||||
|
|
||||
LL | fn elided3(x: &i32) -> Box<dyn Debug> { Box::new(x) }
|
||||
| ---- ^ ...is captured here, requiring it to live as long as `'static`
|
||||
|
@ -171,8 +171,8 @@ help: to declare that the trait object captures data from argument `x`, you can
|
|||
LL | fn elided3(x: &i32) -> Box<dyn Debug + '_> { Box::new(x) }
|
||||
| ^^^^
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:21:59
|
||||
error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:16:59
|
||||
|
|
||||
LL | fn explicit3<'a>(x: &'a i32) -> Box<dyn Debug> { Box::new(x) }
|
||||
| ------- ^ ...is captured here, requiring it to live as long as `'static`
|
||||
|
@ -184,8 +184,8 @@ help: to declare that the trait object captures data from argument `x`, you can
|
|||
LL | fn explicit3<'a>(x: &'a i32) -> Box<dyn Debug + 'a> { Box::new(x) }
|
||||
| ^^^^
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:24:60
|
||||
error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:18:60
|
||||
|
|
||||
LL | fn elided4(x: &i32) -> Box<dyn Debug + 'static> { Box::new(x) }
|
||||
| ---- ^ ...is captured here, requiring it to live as long as `'static`
|
||||
|
@ -201,8 +201,8 @@ help: alternatively, add an explicit `'static` bound to this reference
|
|||
LL | fn elided4(x: &'static i32) -> Box<dyn Debug + 'static> { Box::new(x) }
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:27:69
|
||||
error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:20:69
|
||||
|
|
||||
LL | fn explicit4<'a>(x: &'a i32) -> Box<dyn Debug + 'static> { Box::new(x) }
|
||||
| ------- this data with lifetime `'a`... ^ ...is captured here, requiring it to live as long as `'static`
|
||||
|
|
|
@ -12,7 +12,7 @@ LL | fn iter_values_anon(&self) -> impl Iterator<Item=u32> + '_ {
|
|||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/static-return-lifetime-infered.rs:10:37
|
||||
--> $DIR/static-return-lifetime-infered.rs:9:37
|
||||
|
|
||||
LL | fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> {
|
||||
| -- ^^^^^^^^^^^^^^^^^^^^^^^ opaque type requires that `'a` must outlive `'static`
|
||||
|
|
|
@ -4,13 +4,11 @@ struct A {
|
|||
|
||||
impl A {
|
||||
fn iter_values_anon(&self) -> impl Iterator<Item=u32> {
|
||||
self.x.iter().map(|a| a.0)
|
||||
self.x.iter().map(|a| a.0) //~ ERROR E0759
|
||||
}
|
||||
//~^^ ERROR cannot infer an appropriate lifetime
|
||||
fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> {
|
||||
self.x.iter().map(|a| a.0)
|
||||
self.x.iter().map(|a| a.0) //~ ERROR E0759
|
||||
}
|
||||
//~^^ ERROR cannot infer an appropriate lifetime
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `self` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/static-return-lifetime-infered.rs:7:16
|
||||
|
|
||||
LL | fn iter_values_anon(&self) -> impl Iterator<Item=u32> {
|
||||
|
@ -18,8 +18,8 @@ help: to declare that the `impl Trait` captures data from argument `self`, you c
|
|||
LL | fn iter_values_anon(&self) -> impl Iterator<Item=u32> + '_ {
|
||||
| ^^^^
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
--> $DIR/static-return-lifetime-infered.rs:11:16
|
||||
error[E0759]: `self` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/static-return-lifetime-infered.rs:10:16
|
||||
|
|
||||
LL | fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> {
|
||||
| -------- this data with lifetime `'a`...
|
||||
|
@ -29,7 +29,7 @@ LL | self.x.iter().map(|a| a.0)
|
|||
| ...is captured here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/static-return-lifetime-infered.rs:10:37
|
||||
--> $DIR/static-return-lifetime-infered.rs:9:37
|
||||
|
|
||||
LL | fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
use std::any::Any;
|
||||
|
||||
fn foo<T: Any>(value: &T) -> Box<dyn Any> {
|
||||
Box::new(value) as Box<dyn Any>
|
||||
//~^ ERROR cannot infer an appropriate lifetime
|
||||
Box::new(value) as Box<dyn Any> //~ ERROR E0759
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `value` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/issue-16922.rs:4:14
|
||||
|
|
||||
LL | fn foo<T: Any>(value: &T) -> Box<dyn Any> {
|
||||
|
|
|
@ -1,28 +1,11 @@
|
|||
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
|
||||
error[E0759]: `fn` parameter has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/constant-in-expr-inherent-1.rs:8:5
|
||||
|
|
||||
LL | <Foo<'a>>::C
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
note: first, the lifetime cannot outlive the lifetime `'a` as defined on the function body at 7:8...
|
||||
--> $DIR/constant-in-expr-inherent-1.rs:7:8
|
||||
|
|
||||
LL | fn foo<'a>(_: &'a u32) -> &'static u32 {
|
||||
| ^^
|
||||
note: ...so that the types are compatible
|
||||
--> $DIR/constant-in-expr-inherent-1.rs:8:5
|
||||
|
|
||||
| ------- this data with lifetime `'a`...
|
||||
LL | <Foo<'a>>::C
|
||||
| ^^^^^^^^^^^^
|
||||
= note: expected `Foo<'_>`
|
||||
found `Foo<'a>`
|
||||
= note: but, the lifetime must be valid for the static lifetime...
|
||||
note: ...so that reference does not outlive borrowed content
|
||||
--> $DIR/constant-in-expr-inherent-1.rs:8:5
|
||||
|
|
||||
LL | <Foo<'a>>::C
|
||||
| ^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^ ...is captured and required to live as long as `'static` here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
For more information about this error, try `rustc --explain E0759`.
|
||||
|
|
|
@ -15,7 +15,7 @@ fn load(ss: &mut SomeStruct) -> Box<dyn SomeTrait> {
|
|||
// `Box<SomeTrait>` defaults to a `'static` bound, so this return
|
||||
// is illegal.
|
||||
|
||||
ss.r //~ ERROR cannot infer an appropriate lifetime
|
||||
ss.r //~ ERROR E0759
|
||||
}
|
||||
|
||||
fn store(ss: &mut SomeStruct, b: Box<dyn SomeTrait>) {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `ss` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/object-lifetime-default-from-box-error.rs:18:5
|
||||
|
|
||||
LL | fn load(ss: &mut SomeStruct) -> Box<dyn SomeTrait> {
|
||||
|
|
|
@ -5,18 +5,18 @@ trait Foo {}
|
|||
impl<'a> Foo for &'a [u8] {}
|
||||
|
||||
fn a(v: &[u8]) -> Box<dyn Foo + 'static> {
|
||||
let x: Box<dyn Foo + 'static> = Box::new(v); //~ ERROR cannot infer an appropriate lifetime
|
||||
let x: Box<dyn Foo + 'static> = Box::new(v); //~ ERROR E0759
|
||||
x
|
||||
}
|
||||
|
||||
fn b(v: &[u8]) -> Box<dyn Foo + 'static> {
|
||||
Box::new(v) //~ ERROR cannot infer an appropriate lifetime
|
||||
Box::new(v) //~ ERROR E0759
|
||||
}
|
||||
|
||||
fn c(v: &[u8]) -> Box<dyn Foo> {
|
||||
// same as previous case due to RFC 599
|
||||
|
||||
Box::new(v) //~ ERROR cannot infer an appropriate lifetime
|
||||
Box::new(v) //~ ERROR E0759
|
||||
}
|
||||
|
||||
fn d<'a,'b>(v: &'a [u8]) -> Box<dyn Foo+'b> {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `v` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/region-object-lifetime-in-coercion.rs:8:46
|
||||
|
|
||||
LL | fn a(v: &[u8]) -> Box<dyn Foo + 'static> {
|
||||
|
@ -15,7 +15,7 @@ help: alternatively, add an explicit `'static` bound to this reference
|
|||
LL | fn a(v: &'static [u8]) -> Box<dyn Foo + 'static> {
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `v` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/region-object-lifetime-in-coercion.rs:13:14
|
||||
|
|
||||
LL | fn b(v: &[u8]) -> Box<dyn Foo + 'static> {
|
||||
|
@ -32,7 +32,7 @@ help: alternatively, add an explicit `'static` bound to this reference
|
|||
LL | fn b(v: &'static [u8]) -> Box<dyn Foo + 'static> {
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `v` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/region-object-lifetime-in-coercion.rs:19:14
|
||||
|
|
||||
LL | fn c(v: &[u8]) -> Box<dyn Foo> {
|
||||
|
|
|
@ -4,7 +4,7 @@ struct Dog {
|
|||
|
||||
impl Dog {
|
||||
pub fn chase_cat(&mut self) {
|
||||
let p: &'static mut usize = &mut self.cats_chased; //~ ERROR cannot infer
|
||||
let p: &'static mut usize = &mut self.cats_chased; //~ ERROR E0759
|
||||
*p += 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,29 +1,11 @@
|
|||
error[E0495]: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
|
||||
error[E0759]: `self` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/regions-addr-of-self.rs:7:37
|
||||
|
|
||||
LL | pub fn chase_cat(&mut self) {
|
||||
| --------- this data with an anonymous lifetime `'_`...
|
||||
LL | let p: &'static mut usize = &mut self.cats_chased;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 6:5...
|
||||
--> $DIR/regions-addr-of-self.rs:6:5
|
||||
|
|
||||
LL | / pub fn chase_cat(&mut self) {
|
||||
LL | | let p: &'static mut usize = &mut self.cats_chased;
|
||||
LL | | *p += 1;
|
||||
LL | | }
|
||||
| |_____^
|
||||
note: ...so that reference does not outlive borrowed content
|
||||
--> $DIR/regions-addr-of-self.rs:7:37
|
||||
|
|
||||
LL | let p: &'static mut usize = &mut self.cats_chased;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: but, the lifetime must be valid for the static lifetime...
|
||||
note: ...so that reference does not outlive borrowed content
|
||||
--> $DIR/regions-addr-of-self.rs:7:37
|
||||
|
|
||||
LL | let p: &'static mut usize = &mut self.cats_chased;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ ...is captured and required to live as long as `'static` here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
For more information about this error, try `rustc --explain E0759`.
|
||||
|
|
|
@ -7,7 +7,7 @@ trait X { }
|
|||
impl<'a, T> X for B<'a, T> {}
|
||||
|
||||
fn g<'a, T: 'static>(v: Box<dyn A<T> + 'a>) -> Box<dyn X + 'static> {
|
||||
box B(&*v) as Box<dyn X> //~ ERROR cannot infer
|
||||
box B(&*v) as Box<dyn X> //~ ERROR E0759
|
||||
}
|
||||
|
||||
fn main() { }
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `v` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/regions-close-object-into-object-2.rs:10:11
|
||||
|
|
||||
LL | fn g<'a, T: 'static>(v: Box<dyn A<T> + 'a>) -> Box<dyn X + 'static> {
|
||||
|
|
|
@ -7,7 +7,7 @@ trait X { }
|
|||
impl<'a, T> X for B<'a, T> {}
|
||||
|
||||
fn i<'a, T, U>(v: Box<dyn A<U>+'a>) -> Box<dyn X + 'static> {
|
||||
box B(&*v) as Box<dyn X> //~ ERROR cannot infer
|
||||
box B(&*v) as Box<dyn X> //~ ERROR E0759
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `v` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/regions-close-object-into-object-4.rs:10:11
|
||||
|
|
||||
LL | fn i<'a, T, U>(v: Box<dyn A<U>+'a>) -> Box<dyn X + 'static> {
|
||||
|
|
|
@ -6,7 +6,7 @@ fn borrowed_proc<'a>(x: &'a isize) -> Box<dyn FnMut()->(isize) + 'a> {
|
|||
|
||||
fn static_proc(x: &isize) -> Box<dyn FnMut() -> (isize) + 'static> {
|
||||
// This is illegal, because the region bound on `proc` is 'static.
|
||||
Box::new(move || { *x }) //~ ERROR cannot infer an appropriate lifetime
|
||||
Box::new(move || { *x }) //~ ERROR E0759
|
||||
}
|
||||
|
||||
fn main() { }
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/regions-proc-bound-capture.rs:9:14
|
||||
|
|
||||
LL | fn static_proc(x: &isize) -> Box<dyn FnMut() -> (isize) + 'static> {
|
||||
|
|
|
@ -6,7 +6,7 @@ struct Foo;
|
|||
|
||||
impl Foo {
|
||||
async fn f(self: Pin<&Self>) -> impl Clone { self }
|
||||
//~^ ERROR cannot infer an appropriate lifetime
|
||||
//~^ ERROR E0759
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `self` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_impl_trait-async.rs:8:16
|
||||
|
|
||||
LL | async fn f(self: Pin<&Self>) -> impl Clone { self }
|
||||
|
|
|
@ -3,7 +3,7 @@ use std::pin::Pin;
|
|||
struct Foo;
|
||||
|
||||
impl Foo {
|
||||
fn f(self: Pin<&Self>) -> impl Clone { self } //~ ERROR cannot infer an appropriate lifetime
|
||||
fn f(self: Pin<&Self>) -> impl Clone { self } //~ ERROR E0759
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `self` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/arbitrary_self_types_pin_lifetime_impl_trait.rs:6:44
|
||||
|
|
||||
LL | fn f(self: Pin<&Self>) -> impl Clone { self }
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
error[E0597]: `val` does not live long enough
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound-needing-more-suggestions.rs:21:9
|
||||
|
|
||||
LL | fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32>>) -> impl OtherTrait<'a> {
|
||||
| -- lifetime `'a` defined here ------------------- opaque type requires that `val` is borrowed for `'a`
|
||||
LL | val.use_self()
|
||||
| ^^^ borrowed value does not live long enough
|
||||
LL | }
|
||||
| - `val` dropped here while still borrowed
|
||||
|
|
||||
help: you can add a bound to the opaque type to make it last less than `'static` and match `'a`
|
||||
|
|
||||
LL | fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32>>) -> impl OtherTrait<'a> + 'a {
|
||||
| ^^^^
|
||||
|
||||
error[E0515]: cannot return value referencing function parameter `val`
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound-needing-more-suggestions.rs:43:9
|
||||
|
|
||||
LL | val.use_self()
|
||||
| ---^^^^^^^^^^^
|
||||
| |
|
||||
| returns a value referencing data owned by the current function
|
||||
| `val` is borrowed here
|
||||
|
||||
error[E0515]: cannot return value referencing function parameter `val`
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound-needing-more-suggestions.rs:109:9
|
||||
|
|
||||
LL | val.use_self()
|
||||
| ---^^^^^^^^^^^
|
||||
| |
|
||||
| returns a value referencing data owned by the current function
|
||||
| `val` is borrowed here
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0515, E0597.
|
||||
For more information about an error, try `rustc --explain E0515`.
|
|
@ -0,0 +1,113 @@
|
|||
// FIXME: the following cases need to suggest more things to make users reach a working end state.
|
||||
|
||||
mod bav {
|
||||
trait OtherTrait<'a> {}
|
||||
impl<'a> OtherTrait<'a> for &'a () {}
|
||||
|
||||
trait ObjectTrait {
|
||||
type Assoc: Bar;
|
||||
}
|
||||
trait MyTrait {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
trait Bar {}
|
||||
|
||||
impl MyTrait for Box<dyn ObjectTrait<Assoc = i32>> {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
impl Bar for i32 {}
|
||||
|
||||
fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32>>) -> impl OtherTrait<'a> {
|
||||
val.use_self() //~ ERROR E0597
|
||||
}
|
||||
}
|
||||
|
||||
mod bap {
|
||||
trait OtherTrait<'a> {}
|
||||
impl<'a> OtherTrait<'a> for &'a () {}
|
||||
|
||||
trait ObjectTrait {
|
||||
type Assoc: Bar;
|
||||
}
|
||||
trait MyTrait {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
trait Bar {}
|
||||
|
||||
impl MyTrait for Box<dyn ObjectTrait<Assoc = i32>> {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
impl Bar for i32 {}
|
||||
|
||||
fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32>>) -> impl OtherTrait<'a> + 'a {
|
||||
val.use_self() //~ ERROR E0515
|
||||
}
|
||||
}
|
||||
|
||||
// This case in particular requires the user to write all of the bounds we have in `mod bax`.
|
||||
mod bay {
|
||||
trait OtherTrait<'a> {}
|
||||
impl<'a> OtherTrait<'a> for &'a () {}
|
||||
|
||||
trait ObjectTrait {
|
||||
type Assoc: Bar;
|
||||
}
|
||||
trait MyTrait {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
trait Bar {}
|
||||
|
||||
impl MyTrait for Box<dyn ObjectTrait<Assoc = i32>> {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
impl Bar for i32 {}
|
||||
|
||||
fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32> + 'a>) -> &'a () {
|
||||
val.use_self() //~ ERROR E0772
|
||||
}
|
||||
}
|
||||
|
||||
mod bax {
|
||||
trait OtherTrait<'a> {}
|
||||
impl<'a> OtherTrait<'a> for &'a () {}
|
||||
|
||||
trait ObjectTrait {
|
||||
type Assoc: Bar;
|
||||
}
|
||||
trait MyTrait<'a> {
|
||||
fn use_self(&'a self) -> &'a () { panic!() }
|
||||
}
|
||||
trait Bar {}
|
||||
|
||||
impl<'a> MyTrait<'a> for Box<dyn ObjectTrait<Assoc = i32> + 'a> {
|
||||
fn use_self(&'a self) -> &'a () { panic!() }
|
||||
}
|
||||
impl Bar for i32 {}
|
||||
|
||||
fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32> + 'a>) -> &'a () {
|
||||
val.use_self()
|
||||
}
|
||||
}
|
||||
|
||||
mod baw {
|
||||
trait OtherTrait<'a> {}
|
||||
impl<'a> OtherTrait<'a> for &'a () {}
|
||||
|
||||
trait ObjectTrait {
|
||||
type Assoc: Bar;
|
||||
}
|
||||
trait MyTrait {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
trait Bar {}
|
||||
|
||||
impl<'a> MyTrait for Box<dyn ObjectTrait<Assoc = Box<dyn Bar>>> {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
|
||||
fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = Box<dyn Bar>>>) -> impl OtherTrait<'a> + 'a{
|
||||
val.use_self() //~ ERROR E0515
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -0,0 +1,57 @@
|
|||
error[E0597]: `val` does not live long enough
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound-needing-more-suggestions.rs:21:9
|
||||
|
|
||||
LL | fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32>>) -> impl OtherTrait<'a> {
|
||||
| -- lifetime `'a` defined here ------------------- opaque type requires that `val` is borrowed for `'a`
|
||||
LL | val.use_self()
|
||||
| ^^^ borrowed value does not live long enough
|
||||
LL | }
|
||||
| - `val` dropped here while still borrowed
|
||||
|
|
||||
help: you can add a bound to the opaque type to make it last less than `'static` and match `'a`
|
||||
|
|
||||
LL | fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32>>) -> impl OtherTrait<'a> + 'a {
|
||||
| ^^^^
|
||||
|
||||
error[E0515]: cannot return value referencing function parameter `val`
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound-needing-more-suggestions.rs:43:9
|
||||
|
|
||||
LL | val.use_self()
|
||||
| ---^^^^^^^^^^^
|
||||
| |
|
||||
| returns a value referencing data owned by the current function
|
||||
| `val` is borrowed here
|
||||
|
||||
error[E0515]: cannot return value referencing function parameter `val`
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound-needing-more-suggestions.rs:109:9
|
||||
|
|
||||
LL | val.use_self()
|
||||
| ---^^^^^^^^^^^
|
||||
| |
|
||||
| returns a value referencing data owned by the current function
|
||||
| `val` is borrowed here
|
||||
|
||||
error[E0772]: `val` has lifetime `'a` but calling `use_self` introduces an implicit `'static` lifetime requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound-needing-more-suggestions.rs:66:13
|
||||
|
|
||||
LL | fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32> + 'a>) -> &'a () {
|
||||
| -------------------------------------- this data with lifetime `'a`...
|
||||
LL | val.use_self()
|
||||
| ^^^^^^^^ ...is captured and required to live as long as `'static` here
|
||||
|
|
||||
note: the used `impl` has a `'static` requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound-needing-more-suggestions.rs:60:30
|
||||
|
|
||||
LL | impl MyTrait for Box<dyn ObjectTrait<Assoc = i32>> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ this has an implicit `'static` lifetime requirement
|
||||
LL | fn use_self(&self) -> &() { panic!() }
|
||||
| -------- calling this method introduces the `impl`'s 'static` requirement
|
||||
help: consider relaxing the implicit `'static` requirement
|
||||
|
|
||||
LL | impl MyTrait for Box<dyn ObjectTrait<Assoc = i32> + '_> {
|
||||
| ^^^^
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0515, E0597.
|
||||
For more information about an error, try `rustc --explain E0515`.
|
|
@ -0,0 +1,112 @@
|
|||
// run-rustfix
|
||||
#![allow(dead_code)]
|
||||
|
||||
mod foo {
|
||||
trait OtherTrait<'a> {}
|
||||
impl<'a> OtherTrait<'a> for &'a () {}
|
||||
|
||||
trait ObjectTrait<T> {}
|
||||
trait MyTrait<T> {
|
||||
fn use_self<K>(&self) -> &();
|
||||
}
|
||||
trait Irrelevant {}
|
||||
|
||||
impl<T> MyTrait<T> for dyn ObjectTrait<T> + '_ {
|
||||
fn use_self<K>(&self) -> &() { panic!() }
|
||||
}
|
||||
impl<T> Irrelevant for dyn ObjectTrait<T> {}
|
||||
|
||||
fn use_it<'a, T>(val: &'a dyn ObjectTrait<T>) -> impl OtherTrait<'a> + 'a {
|
||||
val.use_self::<T>() //~ ERROR E0759
|
||||
}
|
||||
}
|
||||
|
||||
mod bar {
|
||||
trait ObjectTrait {}
|
||||
trait MyTrait {
|
||||
fn use_self(&self) -> &();
|
||||
}
|
||||
trait Irrelevant {}
|
||||
|
||||
impl MyTrait for dyn ObjectTrait + '_ {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
impl Irrelevant for dyn ObjectTrait {}
|
||||
|
||||
fn use_it<'a>(val: &'a dyn ObjectTrait) -> &'a () {
|
||||
val.use_self() //~ ERROR E0772
|
||||
}
|
||||
}
|
||||
|
||||
mod baz {
|
||||
trait ObjectTrait {}
|
||||
trait MyTrait {
|
||||
fn use_self(&self) -> &();
|
||||
}
|
||||
trait Irrelevant {}
|
||||
|
||||
impl MyTrait for Box<dyn ObjectTrait + '_> {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
impl Irrelevant for Box<dyn ObjectTrait> {}
|
||||
|
||||
fn use_it<'a>(val: &'a Box<dyn ObjectTrait + 'a>) -> &'a () {
|
||||
val.use_self() //~ ERROR E0772
|
||||
}
|
||||
}
|
||||
|
||||
mod bat {
|
||||
trait OtherTrait<'a> {}
|
||||
impl<'a> OtherTrait<'a> for &'a () {}
|
||||
|
||||
trait ObjectTrait {}
|
||||
|
||||
impl dyn ObjectTrait + '_ {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
|
||||
fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a {
|
||||
val.use_self() //~ ERROR E0772
|
||||
}
|
||||
}
|
||||
|
||||
mod ban {
|
||||
trait OtherTrait<'a> {}
|
||||
impl<'a> OtherTrait<'a> for &'a () {}
|
||||
|
||||
trait ObjectTrait {}
|
||||
trait MyTrait {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
trait Irrelevant {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
|
||||
impl MyTrait for dyn ObjectTrait + '_ {}
|
||||
|
||||
fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a {
|
||||
val.use_self() //~ ERROR E0759
|
||||
}
|
||||
}
|
||||
|
||||
mod bal {
|
||||
trait OtherTrait<'a> {}
|
||||
impl<'a> OtherTrait<'a> for &'a () {}
|
||||
|
||||
trait ObjectTrait {}
|
||||
trait MyTrait {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
trait Irrelevant {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
|
||||
impl MyTrait for dyn ObjectTrait + '_ {}
|
||||
impl Irrelevant for dyn ObjectTrait {}
|
||||
|
||||
fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a {
|
||||
MyTrait::use_self(val) //~ ERROR E0759
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -0,0 +1,42 @@
|
|||
error[E0521]: borrowed data escapes outside of function
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:20:9
|
||||
|
|
||||
LL | fn use_it<'a, T>(val: &'a dyn ObjectTrait<T>) -> impl OtherTrait<'a> + 'a {
|
||||
| --- `val` is a reference that is only valid in the function body
|
||||
LL | val.use_self::<T>()
|
||||
| ^^^^^^^^^^^^^^^^^^^ `val` escapes the function body here
|
||||
|
|
||||
= help: consider replacing `'a` with `'static`
|
||||
|
||||
error[E0521]: borrowed data escapes outside of function
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:69:9
|
||||
|
|
||||
LL | fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a {
|
||||
| --- `val` is a reference that is only valid in the function body
|
||||
LL | val.use_self()
|
||||
| ^^^^^^^^^^^^^^ `val` escapes the function body here
|
||||
|
|
||||
= help: consider replacing `'a` with `'static`
|
||||
|
||||
error[E0521]: borrowed data escapes outside of function
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:88:9
|
||||
|
|
||||
LL | fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> {
|
||||
| --- `val` is a reference that is only valid in the function body
|
||||
LL | val.use_self()
|
||||
| ^^^^^^^^^^^^^^ `val` escapes the function body here
|
||||
|
|
||||
= help: consider replacing `'a` with `'static`
|
||||
|
||||
error[E0521]: borrowed data escapes outside of function
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:108:9
|
||||
|
|
||||
LL | fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a {
|
||||
| --- `val` is a reference that is only valid in the function body
|
||||
LL | MyTrait::use_self(val)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ `val` escapes the function body here
|
||||
|
|
||||
= help: consider replacing `'a` with `'static`
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
|
@ -0,0 +1,112 @@
|
|||
// run-rustfix
|
||||
#![allow(dead_code)]
|
||||
|
||||
mod foo {
|
||||
trait OtherTrait<'a> {}
|
||||
impl<'a> OtherTrait<'a> for &'a () {}
|
||||
|
||||
trait ObjectTrait<T> {}
|
||||
trait MyTrait<T> {
|
||||
fn use_self<K>(&self) -> &();
|
||||
}
|
||||
trait Irrelevant {}
|
||||
|
||||
impl<T> MyTrait<T> for dyn ObjectTrait<T> {
|
||||
fn use_self<K>(&self) -> &() { panic!() }
|
||||
}
|
||||
impl<T> Irrelevant for dyn ObjectTrait<T> {}
|
||||
|
||||
fn use_it<'a, T>(val: &'a dyn ObjectTrait<T>) -> impl OtherTrait<'a> + 'a {
|
||||
val.use_self::<T>() //~ ERROR E0759
|
||||
}
|
||||
}
|
||||
|
||||
mod bar {
|
||||
trait ObjectTrait {}
|
||||
trait MyTrait {
|
||||
fn use_self(&self) -> &();
|
||||
}
|
||||
trait Irrelevant {}
|
||||
|
||||
impl MyTrait for dyn ObjectTrait {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
impl Irrelevant for dyn ObjectTrait {}
|
||||
|
||||
fn use_it<'a>(val: &'a dyn ObjectTrait) -> &'a () {
|
||||
val.use_self() //~ ERROR E0772
|
||||
}
|
||||
}
|
||||
|
||||
mod baz {
|
||||
trait ObjectTrait {}
|
||||
trait MyTrait {
|
||||
fn use_self(&self) -> &();
|
||||
}
|
||||
trait Irrelevant {}
|
||||
|
||||
impl MyTrait for Box<dyn ObjectTrait> {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
impl Irrelevant for Box<dyn ObjectTrait> {}
|
||||
|
||||
fn use_it<'a>(val: &'a Box<dyn ObjectTrait + 'a>) -> &'a () {
|
||||
val.use_self() //~ ERROR E0772
|
||||
}
|
||||
}
|
||||
|
||||
mod bat {
|
||||
trait OtherTrait<'a> {}
|
||||
impl<'a> OtherTrait<'a> for &'a () {}
|
||||
|
||||
trait ObjectTrait {}
|
||||
|
||||
impl dyn ObjectTrait {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
|
||||
fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a {
|
||||
val.use_self() //~ ERROR E0772
|
||||
}
|
||||
}
|
||||
|
||||
mod ban {
|
||||
trait OtherTrait<'a> {}
|
||||
impl<'a> OtherTrait<'a> for &'a () {}
|
||||
|
||||
trait ObjectTrait {}
|
||||
trait MyTrait {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
trait Irrelevant {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
|
||||
impl MyTrait for dyn ObjectTrait {}
|
||||
|
||||
fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> {
|
||||
val.use_self() //~ ERROR E0759
|
||||
}
|
||||
}
|
||||
|
||||
mod bal {
|
||||
trait OtherTrait<'a> {}
|
||||
impl<'a> OtherTrait<'a> for &'a () {}
|
||||
|
||||
trait ObjectTrait {}
|
||||
trait MyTrait {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
trait Irrelevant {
|
||||
fn use_self(&self) -> &() { panic!() }
|
||||
}
|
||||
|
||||
impl MyTrait for dyn ObjectTrait {}
|
||||
impl Irrelevant for dyn ObjectTrait {}
|
||||
|
||||
fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a {
|
||||
MyTrait::use_self(val) //~ ERROR E0759
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -0,0 +1,134 @@
|
|||
error[E0759]: `val` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:20:13
|
||||
|
|
||||
LL | fn use_it<'a, T>(val: &'a dyn ObjectTrait<T>) -> impl OtherTrait<'a> + 'a {
|
||||
| ---------------------- this data with lifetime `'a`...
|
||||
LL | val.use_self::<T>()
|
||||
| ^^^^^^^^ ...is captured and required to live as long as `'static` here
|
||||
|
|
||||
note: the used `impl` has a `'static` requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:14:32
|
||||
|
|
||||
LL | impl<T> MyTrait<T> for dyn ObjectTrait<T> {
|
||||
| ^^^^^^^^^^^^^^ this has an implicit `'static` lifetime requirement
|
||||
LL | fn use_self<K>(&self) -> &() { panic!() }
|
||||
| -------- calling this method introduces the `impl`'s 'static` requirement
|
||||
help: consider relaxing the implicit `'static` requirement
|
||||
|
|
||||
LL | impl<T> MyTrait<T> for dyn ObjectTrait<T> + '_ {
|
||||
| ^^^^
|
||||
|
||||
error[E0772]: `val` has lifetime `'a` but calling `use_self` introduces an implicit `'static` lifetime requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:69:13
|
||||
|
|
||||
LL | fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a {
|
||||
| ------------------- this data with lifetime `'a`...
|
||||
LL | val.use_self()
|
||||
| ^^^^^^^^ ...is captured and required to live as long as `'static` here because of an implicit lifetime bound on the inherent `impl`
|
||||
|
|
||||
note: the used `impl` has a `'static` requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:64:14
|
||||
|
|
||||
LL | impl dyn ObjectTrait {
|
||||
| ^^^^^^^^^^^ this has an implicit `'static` lifetime requirement
|
||||
LL | fn use_self(&self) -> &() { panic!() }
|
||||
| -------- calling this method introduces the `impl`'s 'static` requirement
|
||||
help: consider relaxing the implicit `'static` requirement
|
||||
|
|
||||
LL | impl dyn ObjectTrait + '_ {
|
||||
| ^^^^
|
||||
|
||||
error[E0759]: `val` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:88:13
|
||||
|
|
||||
LL | fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> {
|
||||
| ------------------- this data with lifetime `'a`...
|
||||
LL | val.use_self()
|
||||
| ^^^^^^^^ ...is captured and required to live as long as `'static` here
|
||||
|
|
||||
note: the used `impl` has a `'static` requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:85:26
|
||||
|
|
||||
LL | fn use_self(&self) -> &() { panic!() }
|
||||
| -------- calling this method introduces the `impl`'s 'static` requirement
|
||||
...
|
||||
LL | impl MyTrait for dyn ObjectTrait {}
|
||||
| ^^^^^^^^^^^ this has an implicit `'static` lifetime requirement
|
||||
help: consider relaxing the implicit `'static` requirement
|
||||
|
|
||||
LL | impl MyTrait for dyn ObjectTrait + '_ {}
|
||||
| ^^^^
|
||||
help: to declare that the `impl Trait` captures data from argument `val`, you can add an explicit `'a` lifetime bound
|
||||
|
|
||||
LL | fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a {
|
||||
| ^^^^
|
||||
|
||||
error[E0759]: `val` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:108:27
|
||||
|
|
||||
LL | fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a {
|
||||
| ------------------- this data with lifetime `'a`...
|
||||
LL | MyTrait::use_self(val)
|
||||
| ^^^ ...is captured here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:108:9
|
||||
|
|
||||
LL | MyTrait::use_self(val)
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
note: the used `impl` has a `'static` requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:104:26
|
||||
|
|
||||
LL | fn use_self(&self) -> &() { panic!() }
|
||||
| -------- calling this method introduces the `impl`'s 'static` requirement
|
||||
...
|
||||
LL | impl MyTrait for dyn ObjectTrait {}
|
||||
| ^^^^^^^^^^^ this has an implicit `'static` lifetime requirement
|
||||
help: consider relaxing the implicit `'static` requirement
|
||||
|
|
||||
LL | impl MyTrait for dyn ObjectTrait + '_ {}
|
||||
| ^^^^
|
||||
|
||||
error[E0772]: `val` has lifetime `'a` but calling `use_self` introduces an implicit `'static` lifetime requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:37:13
|
||||
|
|
||||
LL | fn use_it<'a>(val: &'a dyn ObjectTrait) -> &'a () {
|
||||
| ------------------- this data with lifetime `'a`...
|
||||
LL | val.use_self()
|
||||
| ^^^^^^^^ ...is captured and required to live as long as `'static` here
|
||||
|
|
||||
note: the used `impl` has a `'static` requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:31:26
|
||||
|
|
||||
LL | impl MyTrait for dyn ObjectTrait {
|
||||
| ^^^^^^^^^^^ this has an implicit `'static` lifetime requirement
|
||||
LL | fn use_self(&self) -> &() { panic!() }
|
||||
| -------- calling this method introduces the `impl`'s 'static` requirement
|
||||
help: consider relaxing the implicit `'static` requirement
|
||||
|
|
||||
LL | impl MyTrait for dyn ObjectTrait + '_ {
|
||||
| ^^^^
|
||||
|
||||
error[E0772]: `val` has lifetime `'a` but calling `use_self` introduces an implicit `'static` lifetime requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:54:13
|
||||
|
|
||||
LL | fn use_it<'a>(val: &'a Box<dyn ObjectTrait + 'a>) -> &'a () {
|
||||
| ----------------------------- this data with lifetime `'a`...
|
||||
LL | val.use_self()
|
||||
| ^^^^^^^^ ...is captured and required to live as long as `'static` here
|
||||
|
|
||||
note: the used `impl` has a `'static` requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:48:30
|
||||
|
|
||||
LL | impl MyTrait for Box<dyn ObjectTrait> {
|
||||
| ^^^^^^^^^^^ this has an implicit `'static` lifetime requirement
|
||||
LL | fn use_self(&self) -> &() { panic!() }
|
||||
| -------- calling this method introduces the `impl`'s 'static` requirement
|
||||
help: consider relaxing the implicit `'static` requirement
|
||||
|
|
||||
LL | impl MyTrait for Box<dyn ObjectTrait + '_> {
|
||||
| ^^^^
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0759`.
|
|
@ -16,7 +16,7 @@ fn foo<G, T>(g: G, dest: &mut T) -> impl FnOnce()
|
|||
where
|
||||
G: Get<T>
|
||||
{
|
||||
move || { //~ ERROR cannot infer an appropriate lifetime
|
||||
move || { //~ ERROR `dest`
|
||||
*dest = g.get();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ LL | fn baz<G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
|
|||
| |
|
||||
| help: consider introducing lifetime `'a` here: `'a,`
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `dest` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/missing-lifetimes-in-signature.rs:19:5
|
||||
|
|
||||
LL | fn foo<G, T>(g: G, dest: &mut T) -> impl FnOnce()
|
||||
|
|
|
@ -27,7 +27,7 @@ impl Bar {
|
|||
fn iter(&self) -> impl Iterator<Item = Box<dyn Foo>> {
|
||||
Iter {
|
||||
current: None,
|
||||
remaining: self.0.iter(), //~ ERROR cannot infer an appropriate lifetime
|
||||
remaining: self.0.iter(), //~ ERROR E0759
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ impl Baz {
|
|||
fn iter(&self) -> impl Iterator<Item = Box<dyn Foo>> + '_ {
|
||||
Iter {
|
||||
current: None,
|
||||
remaining: self.0.iter(), //~ ERROR cannot infer an appropriate lifetime
|
||||
remaining: self.0.iter(), //~ ERROR E0759
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -49,7 +49,7 @@ impl Bat {
|
|||
fn iter<'a>(&'a self) -> impl Iterator<Item = Box<dyn Foo>> + 'a {
|
||||
Iter {
|
||||
current: None,
|
||||
remaining: self.0.iter(), //~ ERROR cannot infer an appropriate lifetime
|
||||
remaining: self.0.iter(), //~ ERROR E0759
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -60,7 +60,7 @@ impl Ban {
|
|||
fn iter<'a>(&'a self) -> impl Iterator<Item = Box<dyn Foo>> {
|
||||
Iter {
|
||||
current: None,
|
||||
remaining: self.0.iter(), //~ ERROR cannot infer an appropriate lifetime
|
||||
remaining: self.0.iter(), //~ ERROR E0759
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `self` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/trait-object-nested-in-impl-trait.rs:30:31
|
||||
|
|
||||
LL | fn iter(&self) -> impl Iterator<Item = Box<dyn Foo>> {
|
||||
|
@ -23,7 +23,7 @@ help: to declare that the trait object captures data from argument `self`, you c
|
|||
LL | fn iter(&self) -> impl Iterator<Item = Box<dyn Foo + '_>> {
|
||||
| ^^^^
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `self` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/trait-object-nested-in-impl-trait.rs:41:31
|
||||
|
|
||||
LL | fn iter(&self) -> impl Iterator<Item = Box<dyn Foo>> + '_ {
|
||||
|
@ -44,7 +44,7 @@ help: to declare that the trait object captures data from argument `self`, you c
|
|||
LL | fn iter(&self) -> impl Iterator<Item = Box<dyn Foo + '_>> + '_ {
|
||||
| ^^^^
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `self` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/trait-object-nested-in-impl-trait.rs:52:31
|
||||
|
|
||||
LL | fn iter<'a>(&'a self) -> impl Iterator<Item = Box<dyn Foo>> + 'a {
|
||||
|
@ -65,7 +65,7 @@ help: to declare that the trait object captures data from argument `self`, you c
|
|||
LL | fn iter<'a>(&'a self) -> impl Iterator<Item = Box<dyn Foo + 'a>> + 'a {
|
||||
| ^^^^
|
||||
|
||||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `self` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/trait-object-nested-in-impl-trait.rs:63:31
|
||||
|
|
||||
LL | fn iter<'a>(&'a self) -> impl Iterator<Item = Box<dyn Foo>> {
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
fn a<T>(items: &[T]) -> Box<dyn Iterator<Item=&T>> {
|
||||
// ^^^^^^^^^^^^^^^^^^^^^ bound *here* defaults to `'static`
|
||||
Box::new(items.iter()) //~ ERROR cannot infer an appropriate lifetime
|
||||
Box::new(items.iter()) //~ ERROR E0759
|
||||
}
|
||||
|
||||
fn b<T>(items: &[T]) -> Box<dyn Iterator<Item=&T> + '_> {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0759]: cannot infer an appropriate lifetime
|
||||
error[E0759]: `items` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/dyn-trait-underscore.rs:8:20
|
||||
|
|
||||
LL | fn a<T>(items: &[T]) -> Box<dyn Iterator<Item=&T>> {
|
||||
|
|
Loading…
Reference in New Issue