mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 11:07:42 +00:00
Move rustc_infer::infer::error_reporting to rustc_infer::error_reporting::infer
This commit is contained in:
parent
24d2ac0b56
commit
e86fbcfd70
@ -1,7 +1,7 @@
|
|||||||
use rustc_errors::Diag;
|
use rustc_errors::Diag;
|
||||||
use rustc_hir::def_id::LocalDefId;
|
use rustc_hir::def_id::LocalDefId;
|
||||||
|
use rustc_infer::error_reporting::infer::nice_region_error::NiceRegionError;
|
||||||
use rustc_infer::infer::canonical::Canonical;
|
use rustc_infer::infer::canonical::Canonical;
|
||||||
use rustc_infer::infer::error_reporting::nice_region_error::NiceRegionError;
|
|
||||||
use rustc_infer::infer::region_constraints::Constraint;
|
use rustc_infer::infer::region_constraints::Constraint;
|
||||||
use rustc_infer::infer::region_constraints::RegionConstraintData;
|
use rustc_infer::infer::region_constraints::RegionConstraintData;
|
||||||
use rustc_infer::infer::RegionVariableOrigin;
|
use rustc_infer::infer::RegionVariableOrigin;
|
||||||
|
@ -10,11 +10,11 @@ use rustc_hir::GenericBound::Trait;
|
|||||||
use rustc_hir::QPath::Resolved;
|
use rustc_hir::QPath::Resolved;
|
||||||
use rustc_hir::WherePredicate::BoundPredicate;
|
use rustc_hir::WherePredicate::BoundPredicate;
|
||||||
use rustc_hir::{PolyTraitRef, TyKind, WhereBoundPredicate};
|
use rustc_hir::{PolyTraitRef, TyKind, WhereBoundPredicate};
|
||||||
use rustc_infer::infer::error_reporting::nice_region_error::{
|
use rustc_infer::error_reporting::infer::nice_region_error::{
|
||||||
self, find_anon_type, find_param_with_region, suggest_adding_lifetime_params,
|
self, find_anon_type, find_param_with_region, suggest_adding_lifetime_params,
|
||||||
HirTraitObjectVisitor, NiceRegionError, TraitObjectVisitor,
|
HirTraitObjectVisitor, NiceRegionError, TraitObjectVisitor,
|
||||||
};
|
};
|
||||||
use rustc_infer::infer::error_reporting::region::unexpected_hidden_region_diagnostic;
|
use rustc_infer::error_reporting::infer::region::unexpected_hidden_region_diagnostic;
|
||||||
use rustc_infer::infer::{NllRegionVariableOrigin, RelateParamBound};
|
use rustc_infer::infer::{NllRegionVariableOrigin, RelateParamBound};
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::hir::place::PlaceBase;
|
use rustc_middle::hir::place::PlaceBase;
|
||||||
|
@ -82,7 +82,7 @@ use rustc_errors::{pluralize, struct_span_code_err, Diag};
|
|||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
use rustc_hir::intravisit::Visitor;
|
use rustc_hir::intravisit::Visitor;
|
||||||
use rustc_index::bit_set::BitSet;
|
use rustc_index::bit_set::BitSet;
|
||||||
use rustc_infer::infer::error_reporting::ObligationCauseExt as _;
|
use rustc_infer::error_reporting::infer::ObligationCauseExt as _;
|
||||||
use rustc_infer::infer::outlives::env::OutlivesEnvironment;
|
use rustc_infer::infer::outlives::env::OutlivesEnvironment;
|
||||||
use rustc_infer::infer::{self, TyCtxtInferExt as _};
|
use rustc_infer::infer::{self, TyCtxtInferExt as _};
|
||||||
use rustc_infer::traits::ObligationCause;
|
use rustc_infer::traits::ObligationCause;
|
||||||
|
@ -19,7 +19,7 @@ use rustc_hir_analysis::hir_ty_lowering::{
|
|||||||
GenericPathSegment, HirTyLowerer, IsMethodCall, RegionInferReason,
|
GenericPathSegment, HirTyLowerer, IsMethodCall, RegionInferReason,
|
||||||
};
|
};
|
||||||
use rustc_infer::infer::canonical::{Canonical, OriginalQueryValues, QueryResponse};
|
use rustc_infer::infer::canonical::{Canonical, OriginalQueryValues, QueryResponse};
|
||||||
use rustc_infer::infer::error_reporting::TypeAnnotationNeeded::E0282;
|
use rustc_infer::infer::need_type_info::TypeAnnotationNeeded;
|
||||||
use rustc_infer::infer::{DefineOpaqueTypes, InferResult};
|
use rustc_infer::infer::{DefineOpaqueTypes, InferResult};
|
||||||
use rustc_lint::builtin::SELF_CONSTRUCTOR_FROM_OUTER_ITEM;
|
use rustc_lint::builtin::SELF_CONSTRUCTOR_FROM_OUTER_ITEM;
|
||||||
use rustc_middle::ty::adjustment::{Adjust, Adjustment, AutoBorrow, AutoBorrowMutability};
|
use rustc_middle::ty::adjustment::{Adjust, Adjustment, AutoBorrow, AutoBorrowMutability};
|
||||||
@ -1519,7 +1519,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
} else {
|
} else {
|
||||||
let e = self.tainted_by_errors().unwrap_or_else(|| {
|
let e = self.tainted_by_errors().unwrap_or_else(|| {
|
||||||
self.err_ctxt()
|
self.err_ctxt()
|
||||||
.emit_inference_failure_err(self.body_id, sp, ty.into(), E0282, true)
|
.emit_inference_failure_err(
|
||||||
|
self.body_id,
|
||||||
|
sp,
|
||||||
|
ty.into(),
|
||||||
|
TypeAnnotationNeeded::E0282,
|
||||||
|
true,
|
||||||
|
)
|
||||||
.emit()
|
.emit()
|
||||||
});
|
});
|
||||||
let err = Ty::new_error(self.tcx, e);
|
let err = Ty::new_error(self.tcx, e);
|
||||||
|
@ -29,7 +29,7 @@ use rustc_hir_analysis::check::intrinsicck::InlineAsmCtxt;
|
|||||||
use rustc_hir_analysis::check::potentially_plural_count;
|
use rustc_hir_analysis::check::potentially_plural_count;
|
||||||
use rustc_hir_analysis::hir_ty_lowering::HirTyLowerer;
|
use rustc_hir_analysis::hir_ty_lowering::HirTyLowerer;
|
||||||
use rustc_index::IndexVec;
|
use rustc_index::IndexVec;
|
||||||
use rustc_infer::infer::error_reporting::{FailureCode, ObligationCauseExt};
|
use rustc_infer::error_reporting::infer::{FailureCode, ObligationCauseExt};
|
||||||
use rustc_infer::infer::TypeTrace;
|
use rustc_infer::infer::TypeTrace;
|
||||||
use rustc_infer::infer::{DefineOpaqueTypes, InferOk};
|
use rustc_infer::infer::{DefineOpaqueTypes, InferOk};
|
||||||
use rustc_middle::ty::adjustment::AllowTwoPhase;
|
use rustc_middle::ty::adjustment::AllowTwoPhase;
|
||||||
|
@ -15,9 +15,9 @@ use hir::def_id::CRATE_DEF_ID;
|
|||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
use rustc_hir_analysis::hir_ty_lowering::{HirTyLowerer, RegionInferReason};
|
use rustc_hir_analysis::hir_ty_lowering::{HirTyLowerer, RegionInferReason};
|
||||||
|
use rustc_infer::error_reporting::infer::sub_relations::SubRelations;
|
||||||
|
use rustc_infer::error_reporting::infer::TypeErrCtxt;
|
||||||
use rustc_infer::infer;
|
use rustc_infer::infer;
|
||||||
use rustc_infer::infer::error_reporting::sub_relations::SubRelations;
|
|
||||||
use rustc_infer::infer::error_reporting::TypeErrCtxt;
|
|
||||||
use rustc_middle::ty::{self, Const, Ty, TyCtxt, TypeVisitableExt};
|
use rustc_middle::ty::{self, Const, Ty, TyCtxt, TypeVisitableExt};
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use rustc_span::symbol::Ident;
|
use rustc_span::symbol::Ident;
|
||||||
|
@ -12,7 +12,7 @@ use rustc_hir::HirId;
|
|||||||
use rustc_hir_analysis::autoderef::{self, Autoderef};
|
use rustc_hir_analysis::autoderef::{self, Autoderef};
|
||||||
use rustc_infer::infer::canonical::OriginalQueryValues;
|
use rustc_infer::infer::canonical::OriginalQueryValues;
|
||||||
use rustc_infer::infer::canonical::{Canonical, QueryResponse};
|
use rustc_infer::infer::canonical::{Canonical, QueryResponse};
|
||||||
use rustc_infer::infer::error_reporting::TypeAnnotationNeeded::E0282;
|
use rustc_infer::infer::need_type_info::TypeAnnotationNeeded;
|
||||||
use rustc_infer::infer::DefineOpaqueTypes;
|
use rustc_infer::infer::DefineOpaqueTypes;
|
||||||
use rustc_infer::infer::{self, InferOk, TyCtxtInferExt};
|
use rustc_infer::infer::{self, InferOk, TyCtxtInferExt};
|
||||||
use rustc_infer::traits::ObligationCauseCode;
|
use rustc_infer::traits::ObligationCauseCode;
|
||||||
@ -441,7 +441,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
self.body_id,
|
self.body_id,
|
||||||
span,
|
span,
|
||||||
ty.into(),
|
ty.into(),
|
||||||
E0282,
|
TypeAnnotationNeeded::E0282,
|
||||||
!raw_ptr_call,
|
!raw_ptr_call,
|
||||||
);
|
);
|
||||||
if raw_ptr_call {
|
if raw_ptr_call {
|
||||||
|
@ -8,7 +8,7 @@ use rustc_errors::{ErrorGuaranteed, StashKey};
|
|||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::intravisit::{self, Visitor};
|
use rustc_hir::intravisit::{self, Visitor};
|
||||||
use rustc_hir::HirId;
|
use rustc_hir::HirId;
|
||||||
use rustc_infer::infer::error_reporting::TypeAnnotationNeeded::E0282;
|
use rustc_infer::infer::need_type_info::TypeAnnotationNeeded;
|
||||||
use rustc_middle::span_bug;
|
use rustc_middle::span_bug;
|
||||||
use rustc_middle::traits::ObligationCause;
|
use rustc_middle::traits::ObligationCause;
|
||||||
use rustc_middle::ty::adjustment::{Adjust, Adjustment, PointerCoercion};
|
use rustc_middle::ty::adjustment::{Adjust, Adjustment, PointerCoercion};
|
||||||
@ -783,7 +783,7 @@ impl<'cx, 'tcx> Resolver<'cx, 'tcx> {
|
|||||||
self.fcx.tcx.hir().body_owner_def_id(self.body.id()),
|
self.fcx.tcx.hir().body_owner_def_id(self.body.id()),
|
||||||
self.span.to_span(self.fcx.tcx),
|
self.span.to_span(self.fcx.tcx),
|
||||||
p.into(),
|
p.into(),
|
||||||
E0282,
|
TypeAnnotationNeeded::E0282,
|
||||||
false,
|
false,
|
||||||
)
|
)
|
||||||
.emit()
|
.emit()
|
||||||
|
@ -45,17 +45,11 @@
|
|||||||
//! ported to this system, and which relies on string concatenation at the
|
//! ported to this system, and which relies on string concatenation at the
|
||||||
//! time of error detection.
|
//! time of error detection.
|
||||||
|
|
||||||
use super::{InferCtxt, TypeTrace, ValuePairs};
|
use std::borrow::Cow;
|
||||||
|
use std::ops::{ControlFlow, Deref};
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::{cmp, fmt, iter};
|
||||||
|
|
||||||
use crate::errors::{ObligationCauseFailureCode, TypeErrorAdditionalDiags};
|
|
||||||
use crate::infer;
|
|
||||||
use crate::infer::ExpectedFound;
|
|
||||||
use crate::traits::{
|
|
||||||
IfExpressionCause, MatchExpressionArmCause, ObligationCause, ObligationCauseCode,
|
|
||||||
PredicateObligation,
|
|
||||||
};
|
|
||||||
|
|
||||||
use crate::infer::relate::{self, RelateResult, TypeRelation};
|
|
||||||
use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
|
use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
pluralize, Applicability, Diag, DiagCtxtHandle, DiagStyledString, IntoDiagArg, StringPart,
|
pluralize, Applicability, Diag, DiagCtxtHandle, DiagStyledString, IntoDiagArg, StringPart,
|
||||||
@ -68,6 +62,7 @@ use rustc_hir::{self as hir};
|
|||||||
use rustc_macros::extension;
|
use rustc_macros::extension;
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::dep_graph::DepContext;
|
use rustc_middle::dep_graph::DepContext;
|
||||||
|
use rustc_middle::ty::error::ExpectedFound;
|
||||||
use rustc_middle::ty::error::TypeErrorToStringExt;
|
use rustc_middle::ty::error::TypeErrorToStringExt;
|
||||||
use rustc_middle::ty::print::{with_forced_trimmed_paths, PrintError, PrintTraitRefExt as _};
|
use rustc_middle::ty::print::{with_forced_trimmed_paths, PrintError, PrintTraitRefExt as _};
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
@ -76,18 +71,21 @@ use rustc_middle::ty::{
|
|||||||
};
|
};
|
||||||
use rustc_span::{sym, BytePos, DesugaringKind, Pos, Span};
|
use rustc_span::{sym, BytePos, DesugaringKind, Pos, Span};
|
||||||
use rustc_target::spec::abi;
|
use rustc_target::spec::abi;
|
||||||
use std::borrow::Cow;
|
|
||||||
use std::ops::{ControlFlow, Deref};
|
use crate::errors::{ObligationCauseFailureCode, TypeErrorAdditionalDiags};
|
||||||
use std::path::PathBuf;
|
use crate::infer;
|
||||||
use std::{cmp, fmt, iter};
|
use crate::infer::relate::{self, RelateResult, TypeRelation};
|
||||||
|
use crate::infer::{InferCtxt, TypeTrace, ValuePairs};
|
||||||
|
use crate::traits::{
|
||||||
|
IfExpressionCause, MatchExpressionArmCause, ObligationCause, ObligationCauseCode,
|
||||||
|
PredicateObligation,
|
||||||
|
};
|
||||||
|
|
||||||
mod note_and_explain;
|
mod note_and_explain;
|
||||||
mod suggest;
|
mod suggest;
|
||||||
|
|
||||||
pub(crate) mod need_type_info;
|
|
||||||
pub mod sub_relations;
|
|
||||||
pub use need_type_info::TypeAnnotationNeeded;
|
|
||||||
pub mod region;
|
pub mod region;
|
||||||
|
pub mod sub_relations;
|
||||||
|
|
||||||
pub mod nice_region_error;
|
pub mod nice_region_error;
|
||||||
|
|
||||||
@ -1242,7 +1240,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||||||
Some(values) => {
|
Some(values) => {
|
||||||
let values = self.resolve_vars_if_possible(values);
|
let values = self.resolve_vars_if_possible(values);
|
||||||
let (is_simple_error, exp_found) = match values {
|
let (is_simple_error, exp_found) = match values {
|
||||||
ValuePairs::Terms(infer::ExpectedFound { expected, found }) => {
|
ValuePairs::Terms(ExpectedFound { expected, found }) => {
|
||||||
match (expected.unpack(), found.unpack()) {
|
match (expected.unpack(), found.unpack()) {
|
||||||
(ty::TermKind::Ty(expected), ty::TermKind::Ty(found)) => {
|
(ty::TermKind::Ty(expected), ty::TermKind::Ty(found)) => {
|
||||||
let is_simple_err = expected.is_simple_text(self.tcx)
|
let is_simple_err = expected.is_simple_text(self.tcx)
|
||||||
@ -1254,7 +1252,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||||||
|
|
||||||
(
|
(
|
||||||
is_simple_err,
|
is_simple_err,
|
||||||
Mismatch::Variable(infer::ExpectedFound { expected, found }),
|
Mismatch::Variable(ExpectedFound { expected, found }),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
(ty::TermKind::Const(_), ty::TermKind::Const(_)) => {
|
(ty::TermKind::Const(_), ty::TermKind::Const(_)) => {
|
||||||
@ -1263,13 +1261,13 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||||||
_ => (false, Mismatch::Fixed("type")),
|
_ => (false, Mismatch::Fixed("type")),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ValuePairs::PolySigs(infer::ExpectedFound { expected, found }) => {
|
ValuePairs::PolySigs(ExpectedFound { expected, found }) => {
|
||||||
OpaqueTypesVisitor::visit_expected_found(self.tcx, expected, found, span)
|
OpaqueTypesVisitor::visit_expected_found(self.tcx, expected, found, span)
|
||||||
.report(diag);
|
.report(diag);
|
||||||
(false, Mismatch::Fixed("signature"))
|
(false, Mismatch::Fixed("signature"))
|
||||||
}
|
}
|
||||||
ValuePairs::TraitRefs(_) => (false, Mismatch::Fixed("trait")),
|
ValuePairs::TraitRefs(_) => (false, Mismatch::Fixed("trait")),
|
||||||
ValuePairs::Aliases(infer::ExpectedFound { expected, .. }) => {
|
ValuePairs::Aliases(ExpectedFound { expected, .. }) => {
|
||||||
(false, Mismatch::Fixed(self.tcx.def_descr(expected.def_id)))
|
(false, Mismatch::Fixed(self.tcx.def_descr(expected.def_id)))
|
||||||
}
|
}
|
||||||
ValuePairs::Regions(_) => (false, Mismatch::Fixed("lifetime")),
|
ValuePairs::Regions(_) => (false, Mismatch::Fixed("lifetime")),
|
||||||
@ -1303,9 +1301,8 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||||||
};
|
};
|
||||||
if let Some((sp, msg)) = secondary_span {
|
if let Some((sp, msg)) = secondary_span {
|
||||||
if swap_secondary_and_primary {
|
if swap_secondary_and_primary {
|
||||||
let terr = if let Some(infer::ValuePairs::Terms(infer::ExpectedFound {
|
let terr = if let Some(infer::ValuePairs::Terms(ExpectedFound {
|
||||||
expected,
|
expected, ..
|
||||||
..
|
|
||||||
})) = values
|
})) = values
|
||||||
{
|
{
|
||||||
Cow::from(format!("expected this to be `{expected}`"))
|
Cow::from(format!("expected this to be `{expected}`"))
|
@ -1,21 +1,20 @@
|
|||||||
//! Error Reporting for Anonymous Region Lifetime Errors
|
//! Error Reporting for Anonymous Region Lifetime Errors
|
||||||
//! where both the regions are anonymous.
|
//! where both the regions are anonymous.
|
||||||
|
|
||||||
|
use crate::error_reporting::infer::nice_region_error::find_anon_type::find_anon_type;
|
||||||
|
use crate::error_reporting::infer::nice_region_error::util::AnonymousParamInfo;
|
||||||
|
use crate::error_reporting::infer::nice_region_error::NiceRegionError;
|
||||||
use crate::errors::AddLifetimeParamsSuggestion;
|
use crate::errors::AddLifetimeParamsSuggestion;
|
||||||
use crate::errors::LifetimeMismatch;
|
use crate::errors::LifetimeMismatch;
|
||||||
use crate::errors::LifetimeMismatchLabels;
|
use crate::errors::LifetimeMismatchLabels;
|
||||||
use crate::infer::error_reporting::nice_region_error::find_anon_type::find_anon_type;
|
use crate::infer::RegionResolutionError;
|
||||||
use crate::infer::error_reporting::nice_region_error::util::AnonymousParamInfo;
|
|
||||||
use crate::infer::error_reporting::nice_region_error::NiceRegionError;
|
|
||||||
use crate::infer::lexical_region_resolve::RegionResolutionError;
|
|
||||||
use crate::infer::SubregionOrigin;
|
use crate::infer::SubregionOrigin;
|
||||||
use crate::infer::TyCtxt;
|
|
||||||
|
|
||||||
use rustc_errors::Subdiagnostic;
|
use rustc_errors::Subdiagnostic;
|
||||||
use rustc_errors::{Diag, ErrorGuaranteed};
|
use rustc_errors::{Diag, ErrorGuaranteed};
|
||||||
use rustc_hir::def_id::LocalDefId;
|
use rustc_hir::def_id::LocalDefId;
|
||||||
use rustc_hir::Ty;
|
use rustc_hir::Ty;
|
||||||
use rustc_middle::ty::Region;
|
use rustc_middle::ty::{Region, TyCtxt};
|
||||||
|
|
||||||
impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
|
impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
|
||||||
/// Print the error message for lifetime errors when both the concerned regions are anonymous.
|
/// Print the error message for lifetime errors when both the concerned regions are anonymous.
|
@ -1,12 +1,12 @@
|
|||||||
//! Error Reporting for when the lifetime for a type doesn't match the `impl` selected for a predicate
|
//! Error Reporting for when the lifetime for a type doesn't match the `impl` selected for a predicate
|
||||||
//! to hold.
|
//! to hold.
|
||||||
|
|
||||||
|
use crate::error_reporting::infer::nice_region_error::NiceRegionError;
|
||||||
use crate::errors::{note_and_explain, IntroducesStaticBecauseUnmetLifetimeReq};
|
use crate::errors::{note_and_explain, IntroducesStaticBecauseUnmetLifetimeReq};
|
||||||
use crate::errors::{
|
use crate::errors::{
|
||||||
DoesNotOutliveStaticFromImpl, ImplicitStaticLifetimeSubdiag, MismatchedStaticLifetime,
|
DoesNotOutliveStaticFromImpl, ImplicitStaticLifetimeSubdiag, MismatchedStaticLifetime,
|
||||||
};
|
};
|
||||||
use crate::infer::error_reporting::nice_region_error::NiceRegionError;
|
use crate::infer::RegionResolutionError;
|
||||||
use crate::infer::lexical_region_resolve::RegionResolutionError;
|
|
||||||
use crate::infer::{SubregionOrigin, TypeTrace};
|
use crate::infer::{SubregionOrigin, TypeTrace};
|
||||||
use crate::traits::ObligationCauseCode;
|
use crate::traits::ObligationCauseCode;
|
||||||
use rustc_data_structures::fx::FxIndexSet;
|
use rustc_data_structures::fx::FxIndexSet;
|
@ -1,6 +1,6 @@
|
|||||||
use crate::infer::error_reporting::TypeErrCtxt;
|
use crate::error_reporting::infer::TypeErrCtxt;
|
||||||
use crate::infer::lexical_region_resolve::RegionResolutionError;
|
use crate::infer::RegionResolutionError;
|
||||||
use crate::infer::lexical_region_resolve::RegionResolutionError::*;
|
use crate::infer::RegionResolutionError::*;
|
||||||
use rustc_errors::{Diag, ErrorGuaranteed};
|
use rustc_errors::{Diag, ErrorGuaranteed};
|
||||||
use rustc_hir::def_id::LocalDefId;
|
use rustc_hir::def_id::LocalDefId;
|
||||||
use rustc_middle::ty::{self, TyCtxt};
|
use rustc_middle::ty::{self, TyCtxt};
|
@ -1,11 +1,9 @@
|
|||||||
//! Error Reporting for Anonymous Region Lifetime Errors
|
//! Error Reporting for Anonymous Region Lifetime Errors
|
||||||
//! where one region is named and the other is anonymous.
|
//! where one region is named and the other is anonymous.
|
||||||
|
|
||||||
use crate::infer::error_reporting::nice_region_error::NiceRegionError;
|
use crate::error_reporting::infer::nice_region_error::find_anon_type::find_anon_type;
|
||||||
use crate::{
|
use crate::error_reporting::infer::nice_region_error::NiceRegionError;
|
||||||
errors::ExplicitLifetimeRequired,
|
use crate::errors::ExplicitLifetimeRequired;
|
||||||
infer::error_reporting::nice_region_error::find_anon_type::find_anon_type,
|
|
||||||
};
|
|
||||||
use rustc_errors::Diag;
|
use rustc_errors::Diag;
|
||||||
use rustc_middle::ty;
|
use rustc_middle::ty;
|
||||||
use rustc_span::symbol::kw;
|
use rustc_span::symbol::kw;
|
@ -1,9 +1,9 @@
|
|||||||
|
use crate::error_reporting::infer::nice_region_error::NiceRegionError;
|
||||||
use crate::errors::{
|
use crate::errors::{
|
||||||
ActualImplExpectedKind, ActualImplExpectedLifetimeKind, ActualImplExplNotes,
|
ActualImplExpectedKind, ActualImplExpectedLifetimeKind, ActualImplExplNotes,
|
||||||
TraitPlaceholderMismatch, TyOrSig,
|
TraitPlaceholderMismatch, TyOrSig,
|
||||||
};
|
};
|
||||||
use crate::infer::error_reporting::nice_region_error::NiceRegionError;
|
use crate::infer::RegionResolutionError;
|
||||||
use crate::infer::lexical_region_resolve::RegionResolutionError;
|
|
||||||
use crate::infer::ValuePairs;
|
use crate::infer::ValuePairs;
|
||||||
use crate::infer::{SubregionOrigin, TypeTrace};
|
use crate::infer::{SubregionOrigin, TypeTrace};
|
||||||
use crate::traits::{ObligationCause, ObligationCauseCode};
|
use crate::traits::{ObligationCause, ObligationCauseCode};
|
@ -1,9 +1,6 @@
|
|||||||
use crate::{
|
use crate::error_reporting::infer::nice_region_error::NiceRegionError;
|
||||||
errors::PlaceholderRelationLfNotSatisfied,
|
use crate::errors::PlaceholderRelationLfNotSatisfied;
|
||||||
infer::{
|
use crate::infer::{RegionResolutionError, SubregionOrigin};
|
||||||
error_reporting::nice_region_error::NiceRegionError, RegionResolutionError, SubregionOrigin,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
use rustc_data_structures::intern::Interned;
|
use rustc_data_structures::intern::Interned;
|
||||||
use rustc_errors::Diag;
|
use rustc_errors::Diag;
|
||||||
use rustc_middle::ty::{self, RePlaceholder, Region};
|
use rustc_middle::ty::{self, RePlaceholder, Region};
|
@ -1,11 +1,11 @@
|
|||||||
//! Error Reporting for static impl Traits.
|
//! Error Reporting for static impl Traits.
|
||||||
|
|
||||||
|
use crate::error_reporting::infer::nice_region_error::NiceRegionError;
|
||||||
use crate::errors::{
|
use crate::errors::{
|
||||||
ButCallingIntroduces, ButNeedsToSatisfy, DynTraitConstraintSuggestion, MoreTargeted,
|
ButCallingIntroduces, ButNeedsToSatisfy, DynTraitConstraintSuggestion, MoreTargeted,
|
||||||
ReqIntroducedLocations,
|
ReqIntroducedLocations,
|
||||||
};
|
};
|
||||||
use crate::infer::error_reporting::nice_region_error::NiceRegionError;
|
use crate::infer::RegionResolutionError;
|
||||||
use crate::infer::lexical_region_resolve::RegionResolutionError;
|
|
||||||
use crate::infer::{SubregionOrigin, TypeTrace};
|
use crate::infer::{SubregionOrigin, TypeTrace};
|
||||||
use crate::traits::{ObligationCauseCode, UnifyReceiverContext};
|
use crate::traits::{ObligationCauseCode, UnifyReceiverContext};
|
||||||
use rustc_data_structures::fx::FxIndexSet;
|
use rustc_data_structures::fx::FxIndexSet;
|
@ -1,8 +1,8 @@
|
|||||||
//! Error Reporting for `impl` items that do not match the obligations from their `trait`.
|
//! Error Reporting for `impl` items that do not match the obligations from their `trait`.
|
||||||
|
|
||||||
|
use crate::error_reporting::infer::nice_region_error::NiceRegionError;
|
||||||
use crate::errors::{ConsiderBorrowingParamHelp, RelationshipHelp, TraitImplDiff};
|
use crate::errors::{ConsiderBorrowingParamHelp, RelationshipHelp, TraitImplDiff};
|
||||||
use crate::infer::error_reporting::nice_region_error::NiceRegionError;
|
use crate::infer::RegionResolutionError;
|
||||||
use crate::infer::lexical_region_resolve::RegionResolutionError;
|
|
||||||
use crate::infer::{Subtype, ValuePairs};
|
use crate::infer::{Subtype, ValuePairs};
|
||||||
use rustc_errors::ErrorGuaranteed;
|
use rustc_errors::ErrorGuaranteed;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
@ -1,13 +1,13 @@
|
|||||||
//! Helper functions corresponding to lifetime errors due to
|
//! Helper functions corresponding to lifetime errors due to
|
||||||
//! anonymous regions.
|
//! anonymous regions.
|
||||||
|
|
||||||
use crate::infer::error_reporting::nice_region_error::NiceRegionError;
|
|
||||||
use crate::infer::TyCtxt;
|
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::LocalDefId;
|
use rustc_hir::def_id::LocalDefId;
|
||||||
use rustc_middle::ty::{self, Binder, Region, Ty, TypeFoldable};
|
use rustc_middle::ty::{self, Binder, Region, Ty, TyCtxt, TypeFoldable};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
|
use crate::error_reporting::infer::nice_region_error::NiceRegionError;
|
||||||
|
|
||||||
/// Information about the anonymous region we are searching for.
|
/// Information about the anonymous region we are searching for.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct AnonymousParamInfo<'tcx> {
|
pub struct AnonymousParamInfo<'tcx> {
|
421
compiler/rustc_infer/src/error_reporting/infer/note.rs
Normal file
421
compiler/rustc_infer/src/error_reporting/infer/note.rs
Normal file
@ -0,0 +1,421 @@
|
|||||||
|
use crate::error_reporting::infer::{note_and_explain_region, TypeErrCtxt};
|
||||||
|
use crate::errors::{
|
||||||
|
note_and_explain, FulfillReqLifetime, LfBoundNotSatisfied, OutlivesBound, OutlivesContent,
|
||||||
|
RefLongerThanData, RegionOriginNote, WhereClauseSuggestions,
|
||||||
|
};
|
||||||
|
use crate::fluent_generated as fluent;
|
||||||
|
use crate::infer::{self, SubregionOrigin};
|
||||||
|
use rustc_errors::{Diag, Subdiagnostic};
|
||||||
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
|
use rustc_middle::traits::ObligationCauseCode;
|
||||||
|
use rustc_middle::ty::error::TypeError;
|
||||||
|
use rustc_middle::ty::{self, IsSuggestable, Region, Ty};
|
||||||
|
use rustc_span::symbol::kw;
|
||||||
|
|
||||||
|
use super::ObligationCauseAsDiagArg;
|
||||||
|
|
||||||
|
impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
||||||
|
pub(super) fn note_region_origin(&self, err: &mut Diag<'_>, origin: &SubregionOrigin<'tcx>) {
|
||||||
|
match *origin {
|
||||||
|
infer::Subtype(ref trace) => RegionOriginNote::WithRequirement {
|
||||||
|
span: trace.cause.span,
|
||||||
|
requirement: ObligationCauseAsDiagArg(trace.cause.clone()),
|
||||||
|
expected_found: self.values_str(trace.values).map(|(e, f, _)| (e, f)),
|
||||||
|
}
|
||||||
|
.add_to_diag(err),
|
||||||
|
infer::Reborrow(span) => {
|
||||||
|
RegionOriginNote::Plain { span, msg: fluent::infer_reborrow }.add_to_diag(err)
|
||||||
|
}
|
||||||
|
infer::RelateObjectBound(span) => {
|
||||||
|
RegionOriginNote::Plain { span, msg: fluent::infer_relate_object_bound }
|
||||||
|
.add_to_diag(err);
|
||||||
|
}
|
||||||
|
infer::ReferenceOutlivesReferent(ty, span) => {
|
||||||
|
RegionOriginNote::WithName {
|
||||||
|
span,
|
||||||
|
msg: fluent::infer_reference_outlives_referent,
|
||||||
|
name: &self.ty_to_string(ty),
|
||||||
|
continues: false,
|
||||||
|
}
|
||||||
|
.add_to_diag(err);
|
||||||
|
}
|
||||||
|
infer::RelateParamBound(span, ty, opt_span) => {
|
||||||
|
RegionOriginNote::WithName {
|
||||||
|
span,
|
||||||
|
msg: fluent::infer_relate_param_bound,
|
||||||
|
name: &self.ty_to_string(ty),
|
||||||
|
continues: opt_span.is_some(),
|
||||||
|
}
|
||||||
|
.add_to_diag(err);
|
||||||
|
if let Some(span) = opt_span {
|
||||||
|
RegionOriginNote::Plain { span, msg: fluent::infer_relate_param_bound_2 }
|
||||||
|
.add_to_diag(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
infer::RelateRegionParamBound(span) => {
|
||||||
|
RegionOriginNote::Plain { span, msg: fluent::infer_relate_region_param_bound }
|
||||||
|
.add_to_diag(err);
|
||||||
|
}
|
||||||
|
infer::CompareImplItemObligation { span, .. } => {
|
||||||
|
RegionOriginNote::Plain { span, msg: fluent::infer_compare_impl_item_obligation }
|
||||||
|
.add_to_diag(err);
|
||||||
|
}
|
||||||
|
infer::CheckAssociatedTypeBounds { ref parent, .. } => {
|
||||||
|
self.note_region_origin(err, parent);
|
||||||
|
}
|
||||||
|
infer::AscribeUserTypeProvePredicate(span) => {
|
||||||
|
RegionOriginNote::Plain {
|
||||||
|
span,
|
||||||
|
msg: fluent::infer_ascribe_user_type_prove_predicate,
|
||||||
|
}
|
||||||
|
.add_to_diag(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) fn report_concrete_failure(
|
||||||
|
&self,
|
||||||
|
generic_param_scope: LocalDefId,
|
||||||
|
origin: SubregionOrigin<'tcx>,
|
||||||
|
sub: Region<'tcx>,
|
||||||
|
sup: Region<'tcx>,
|
||||||
|
) -> Diag<'a> {
|
||||||
|
let mut err = match origin {
|
||||||
|
infer::Subtype(box trace) => {
|
||||||
|
let terr = TypeError::RegionsDoesNotOutlive(sup, sub);
|
||||||
|
let mut err = self.report_and_explain_type_error(trace, terr);
|
||||||
|
match (*sub, *sup) {
|
||||||
|
(ty::RePlaceholder(_), ty::RePlaceholder(_)) => {}
|
||||||
|
(ty::RePlaceholder(_), _) => {
|
||||||
|
note_and_explain_region(
|
||||||
|
self.tcx,
|
||||||
|
&mut err,
|
||||||
|
generic_param_scope,
|
||||||
|
"",
|
||||||
|
sup,
|
||||||
|
" doesn't meet the lifetime requirements",
|
||||||
|
None,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
(_, ty::RePlaceholder(_)) => {
|
||||||
|
note_and_explain_region(
|
||||||
|
self.tcx,
|
||||||
|
&mut err,
|
||||||
|
generic_param_scope,
|
||||||
|
"the required lifetime does not necessarily outlive ",
|
||||||
|
sub,
|
||||||
|
"",
|
||||||
|
None,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
note_and_explain_region(
|
||||||
|
self.tcx,
|
||||||
|
&mut err,
|
||||||
|
generic_param_scope,
|
||||||
|
"",
|
||||||
|
sup,
|
||||||
|
"...",
|
||||||
|
None,
|
||||||
|
);
|
||||||
|
note_and_explain_region(
|
||||||
|
self.tcx,
|
||||||
|
&mut err,
|
||||||
|
generic_param_scope,
|
||||||
|
"...does not necessarily outlive ",
|
||||||
|
sub,
|
||||||
|
"",
|
||||||
|
None,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err
|
||||||
|
}
|
||||||
|
infer::Reborrow(span) => {
|
||||||
|
let reference_valid = note_and_explain::RegionExplanation::new(
|
||||||
|
self.tcx,
|
||||||
|
generic_param_scope,
|
||||||
|
sub,
|
||||||
|
None,
|
||||||
|
note_and_explain::PrefixKind::RefValidFor,
|
||||||
|
note_and_explain::SuffixKind::Continues,
|
||||||
|
);
|
||||||
|
let content_valid = note_and_explain::RegionExplanation::new(
|
||||||
|
self.tcx,
|
||||||
|
generic_param_scope,
|
||||||
|
sup,
|
||||||
|
None,
|
||||||
|
note_and_explain::PrefixKind::ContentValidFor,
|
||||||
|
note_and_explain::SuffixKind::Empty,
|
||||||
|
);
|
||||||
|
self.dcx().create_err(OutlivesContent {
|
||||||
|
span,
|
||||||
|
notes: reference_valid.into_iter().chain(content_valid).collect(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
infer::RelateObjectBound(span) => {
|
||||||
|
let object_valid = note_and_explain::RegionExplanation::new(
|
||||||
|
self.tcx,
|
||||||
|
generic_param_scope,
|
||||||
|
sub,
|
||||||
|
None,
|
||||||
|
note_and_explain::PrefixKind::TypeObjValidFor,
|
||||||
|
note_and_explain::SuffixKind::Empty,
|
||||||
|
);
|
||||||
|
let pointer_valid = note_and_explain::RegionExplanation::new(
|
||||||
|
self.tcx,
|
||||||
|
generic_param_scope,
|
||||||
|
sup,
|
||||||
|
None,
|
||||||
|
note_and_explain::PrefixKind::SourcePointerValidFor,
|
||||||
|
note_and_explain::SuffixKind::Empty,
|
||||||
|
);
|
||||||
|
self.dcx().create_err(OutlivesBound {
|
||||||
|
span,
|
||||||
|
notes: object_valid.into_iter().chain(pointer_valid).collect(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
infer::RelateParamBound(span, ty, opt_span) => {
|
||||||
|
let prefix = match *sub {
|
||||||
|
ty::ReStatic => note_and_explain::PrefixKind::TypeSatisfy,
|
||||||
|
_ => note_and_explain::PrefixKind::TypeOutlive,
|
||||||
|
};
|
||||||
|
let suffix = if opt_span.is_some() {
|
||||||
|
note_and_explain::SuffixKind::ReqByBinding
|
||||||
|
} else {
|
||||||
|
note_and_explain::SuffixKind::Empty
|
||||||
|
};
|
||||||
|
let note = note_and_explain::RegionExplanation::new(
|
||||||
|
self.tcx,
|
||||||
|
generic_param_scope,
|
||||||
|
sub,
|
||||||
|
opt_span,
|
||||||
|
prefix,
|
||||||
|
suffix,
|
||||||
|
);
|
||||||
|
self.dcx().create_err(FulfillReqLifetime {
|
||||||
|
span,
|
||||||
|
ty: self.resolve_vars_if_possible(ty),
|
||||||
|
note,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
infer::RelateRegionParamBound(span) => {
|
||||||
|
let param_instantiated = note_and_explain::RegionExplanation::new(
|
||||||
|
self.tcx,
|
||||||
|
generic_param_scope,
|
||||||
|
sup,
|
||||||
|
None,
|
||||||
|
note_and_explain::PrefixKind::LfParamInstantiatedWith,
|
||||||
|
note_and_explain::SuffixKind::Empty,
|
||||||
|
);
|
||||||
|
let param_must_outlive = note_and_explain::RegionExplanation::new(
|
||||||
|
self.tcx,
|
||||||
|
generic_param_scope,
|
||||||
|
sub,
|
||||||
|
None,
|
||||||
|
note_and_explain::PrefixKind::LfParamMustOutlive,
|
||||||
|
note_and_explain::SuffixKind::Empty,
|
||||||
|
);
|
||||||
|
self.dcx().create_err(LfBoundNotSatisfied {
|
||||||
|
span,
|
||||||
|
notes: param_instantiated.into_iter().chain(param_must_outlive).collect(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
infer::ReferenceOutlivesReferent(ty, span) => {
|
||||||
|
let pointer_valid = note_and_explain::RegionExplanation::new(
|
||||||
|
self.tcx,
|
||||||
|
generic_param_scope,
|
||||||
|
sub,
|
||||||
|
None,
|
||||||
|
note_and_explain::PrefixKind::PointerValidFor,
|
||||||
|
note_and_explain::SuffixKind::Empty,
|
||||||
|
);
|
||||||
|
let data_valid = note_and_explain::RegionExplanation::new(
|
||||||
|
self.tcx,
|
||||||
|
generic_param_scope,
|
||||||
|
sup,
|
||||||
|
None,
|
||||||
|
note_and_explain::PrefixKind::DataValidFor,
|
||||||
|
note_and_explain::SuffixKind::Empty,
|
||||||
|
);
|
||||||
|
self.dcx().create_err(RefLongerThanData {
|
||||||
|
span,
|
||||||
|
ty: self.resolve_vars_if_possible(ty),
|
||||||
|
notes: pointer_valid.into_iter().chain(data_valid).collect(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
infer::CompareImplItemObligation { span, impl_item_def_id, trait_item_def_id } => {
|
||||||
|
let mut err = self.infcx.report_extra_impl_obligation(
|
||||||
|
span,
|
||||||
|
impl_item_def_id,
|
||||||
|
trait_item_def_id,
|
||||||
|
&format!("`{sup}: {sub}`"),
|
||||||
|
);
|
||||||
|
// We should only suggest rewriting the `where` clause if the predicate is within that `where` clause
|
||||||
|
if let Some(generics) = self.tcx.hir().get_generics(impl_item_def_id)
|
||||||
|
&& generics.where_clause_span.contains(span)
|
||||||
|
{
|
||||||
|
self.suggest_copy_trait_method_bounds(
|
||||||
|
trait_item_def_id,
|
||||||
|
impl_item_def_id,
|
||||||
|
&mut err,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
err
|
||||||
|
}
|
||||||
|
infer::CheckAssociatedTypeBounds { impl_item_def_id, trait_item_def_id, parent } => {
|
||||||
|
let mut err = self.report_concrete_failure(generic_param_scope, *parent, sub, sup);
|
||||||
|
|
||||||
|
// Don't mention the item name if it's an RPITIT, since that'll just confuse
|
||||||
|
// folks.
|
||||||
|
if !self.tcx.is_impl_trait_in_trait(impl_item_def_id.to_def_id()) {
|
||||||
|
let trait_item_span = self.tcx.def_span(trait_item_def_id);
|
||||||
|
let item_name = self.tcx.item_name(impl_item_def_id.to_def_id());
|
||||||
|
err.span_label(
|
||||||
|
trait_item_span,
|
||||||
|
format!("definition of `{item_name}` from trait"),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.suggest_copy_trait_method_bounds(
|
||||||
|
trait_item_def_id,
|
||||||
|
impl_item_def_id,
|
||||||
|
&mut err,
|
||||||
|
);
|
||||||
|
err
|
||||||
|
}
|
||||||
|
infer::AscribeUserTypeProvePredicate(span) => {
|
||||||
|
let instantiated = note_and_explain::RegionExplanation::new(
|
||||||
|
self.tcx,
|
||||||
|
generic_param_scope,
|
||||||
|
sup,
|
||||||
|
None,
|
||||||
|
note_and_explain::PrefixKind::LfInstantiatedWith,
|
||||||
|
note_and_explain::SuffixKind::Empty,
|
||||||
|
);
|
||||||
|
let must_outlive = note_and_explain::RegionExplanation::new(
|
||||||
|
self.tcx,
|
||||||
|
generic_param_scope,
|
||||||
|
sub,
|
||||||
|
None,
|
||||||
|
note_and_explain::PrefixKind::LfMustOutlive,
|
||||||
|
note_and_explain::SuffixKind::Empty,
|
||||||
|
);
|
||||||
|
self.dcx().create_err(LfBoundNotSatisfied {
|
||||||
|
span,
|
||||||
|
notes: instantiated.into_iter().chain(must_outlive).collect(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if sub.is_error() || sup.is_error() {
|
||||||
|
err.downgrade_to_delayed_bug();
|
||||||
|
}
|
||||||
|
err
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn suggest_copy_trait_method_bounds(
|
||||||
|
&self,
|
||||||
|
trait_item_def_id: DefId,
|
||||||
|
impl_item_def_id: LocalDefId,
|
||||||
|
err: &mut Diag<'_>,
|
||||||
|
) {
|
||||||
|
// FIXME(compiler-errors): Right now this is only being used for region
|
||||||
|
// predicate mismatches. Ideally, we'd use it for *all* predicate mismatches,
|
||||||
|
// but right now it's not really very smart when it comes to implicit `Sized`
|
||||||
|
// predicates and bounds on the trait itself.
|
||||||
|
|
||||||
|
let Some(impl_def_id) = self.tcx.associated_item(impl_item_def_id).impl_container(self.tcx)
|
||||||
|
else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
let Some(trait_ref) = self.tcx.impl_trait_ref(impl_def_id) else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
let trait_args = trait_ref
|
||||||
|
.instantiate_identity()
|
||||||
|
// Replace the explicit self type with `Self` for better suggestion rendering
|
||||||
|
.with_self_ty(self.tcx, Ty::new_param(self.tcx, 0, kw::SelfUpper))
|
||||||
|
.args;
|
||||||
|
let trait_item_args = ty::GenericArgs::identity_for_item(self.tcx, impl_item_def_id)
|
||||||
|
.rebase_onto(self.tcx, impl_def_id, trait_args);
|
||||||
|
|
||||||
|
let Ok(trait_predicates) =
|
||||||
|
self.tcx
|
||||||
|
.explicit_predicates_of(trait_item_def_id)
|
||||||
|
.instantiate_own(self.tcx, trait_item_args)
|
||||||
|
.map(|(pred, _)| {
|
||||||
|
if pred.is_suggestable(self.tcx, false) {
|
||||||
|
Ok(pred.to_string())
|
||||||
|
} else {
|
||||||
|
Err(())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<Result<Vec<_>, ()>>()
|
||||||
|
else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
let Some(generics) = self.tcx.hir().get_generics(impl_item_def_id) else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
let suggestion = if trait_predicates.is_empty() {
|
||||||
|
WhereClauseSuggestions::Remove { span: generics.where_clause_span }
|
||||||
|
} else {
|
||||||
|
let space = if generics.where_clause_span.is_empty() { " " } else { "" };
|
||||||
|
WhereClauseSuggestions::CopyPredicates {
|
||||||
|
span: generics.where_clause_span,
|
||||||
|
space,
|
||||||
|
trait_predicates: trait_predicates.join(", "),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
err.subdiagnostic(suggestion);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) fn report_placeholder_failure(
|
||||||
|
&self,
|
||||||
|
generic_param_scope: LocalDefId,
|
||||||
|
placeholder_origin: SubregionOrigin<'tcx>,
|
||||||
|
sub: Region<'tcx>,
|
||||||
|
sup: Region<'tcx>,
|
||||||
|
) -> Diag<'a> {
|
||||||
|
// I can't think how to do better than this right now. -nikomatsakis
|
||||||
|
debug!(?placeholder_origin, ?sub, ?sup, "report_placeholder_failure");
|
||||||
|
match placeholder_origin {
|
||||||
|
infer::Subtype(box ref trace)
|
||||||
|
if matches!(
|
||||||
|
&trace.cause.code().peel_derives(),
|
||||||
|
ObligationCauseCode::WhereClause(..)
|
||||||
|
| ObligationCauseCode::WhereClauseInExpr(..)
|
||||||
|
) =>
|
||||||
|
{
|
||||||
|
// Hack to get around the borrow checker because trace.cause has an `Rc`.
|
||||||
|
if let ObligationCauseCode::WhereClause(_, span)
|
||||||
|
| ObligationCauseCode::WhereClauseInExpr(_, span, ..) =
|
||||||
|
&trace.cause.code().peel_derives()
|
||||||
|
&& !span.is_dummy()
|
||||||
|
{
|
||||||
|
let span = *span;
|
||||||
|
self.report_concrete_failure(generic_param_scope, placeholder_origin, sub, sup)
|
||||||
|
.with_span_note(span, "the lifetime requirement is introduced here")
|
||||||
|
} else {
|
||||||
|
unreachable!(
|
||||||
|
"control flow ensures we have a `BindingObligation` or `WhereClauseInExpr` here..."
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
infer::Subtype(box trace) => {
|
||||||
|
let terr = TypeError::RegionsPlaceholderMismatch;
|
||||||
|
return self.report_and_explain_type_error(trace, terr);
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
return self.report_concrete_failure(
|
||||||
|
generic_param_scope,
|
||||||
|
placeholder_origin,
|
||||||
|
sub,
|
||||||
|
sup,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -18,12 +18,12 @@ use rustc_type_ir::Upcast as _;
|
|||||||
|
|
||||||
use super::nice_region_error::find_anon_type;
|
use super::nice_region_error::find_anon_type;
|
||||||
use super::{nice_region_error, ObligationCauseAsDiagArg};
|
use super::{nice_region_error, ObligationCauseAsDiagArg};
|
||||||
|
use crate::error_reporting::infer::{ObligationCauseExt as _, TypeErrCtxt};
|
||||||
use crate::errors::{
|
use crate::errors::{
|
||||||
self, note_and_explain, FulfillReqLifetime, LfBoundNotSatisfied, OutlivesBound,
|
self, note_and_explain, FulfillReqLifetime, LfBoundNotSatisfied, OutlivesBound,
|
||||||
OutlivesContent, RefLongerThanData, RegionOriginNote, WhereClauseSuggestions,
|
OutlivesContent, RefLongerThanData, RegionOriginNote, WhereClauseSuggestions,
|
||||||
};
|
};
|
||||||
use crate::fluent_generated as fluent;
|
use crate::fluent_generated as fluent;
|
||||||
use crate::infer::error_reporting::{ObligationCauseExt as _, TypeErrCtxt};
|
|
||||||
use crate::infer::region_constraints::GenericKind;
|
use crate::infer::region_constraints::GenericKind;
|
||||||
use crate::infer::{self, InferCtxt, RegionResolutionError, RegionVariableOrigin, SubregionOrigin};
|
use crate::infer::{self, InferCtxt, RegionResolutionError, RegionVariableOrigin, SubregionOrigin};
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
use crate::infer::error_reporting::hir::Path;
|
use crate::error_reporting::infer::hir::Path;
|
||||||
use core::ops::ControlFlow;
|
use core::ops::ControlFlow;
|
||||||
use hir::def::CtorKind;
|
use hir::def::CtorKind;
|
||||||
use hir::intravisit::{walk_expr, walk_stmt, Visitor};
|
use hir::intravisit::{walk_expr, walk_stmt, Visitor};
|
1
compiler/rustc_infer/src/error_reporting/mod.rs
Normal file
1
compiler/rustc_infer/src/error_reporting/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
pub mod infer;
|
@ -15,11 +15,10 @@ use rustc_span::symbol::kw;
|
|||||||
use rustc_span::Symbol;
|
use rustc_span::Symbol;
|
||||||
use rustc_span::{symbol::Ident, BytePos, Span};
|
use rustc_span::{symbol::Ident, BytePos, Span};
|
||||||
|
|
||||||
|
use crate::error_reporting::infer::nice_region_error::placeholder_error::Highlighted;
|
||||||
|
use crate::error_reporting::infer::ObligationCauseAsDiagArg;
|
||||||
use crate::fluent_generated as fluent;
|
use crate::fluent_generated as fluent;
|
||||||
use crate::infer::error_reporting::{
|
use crate::infer::need_type_info::UnderspecifiedArgKind;
|
||||||
need_type_info::UnderspecifiedArgKind, nice_region_error::placeholder_error::Highlighted,
|
|
||||||
ObligationCauseAsDiagArg,
|
|
||||||
};
|
|
||||||
|
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
use crate::error_reporting::infer::nice_region_error::find_anon_type;
|
||||||
use crate::fluent_generated as fluent;
|
use crate::fluent_generated as fluent;
|
||||||
use crate::infer::error_reporting::nice_region_error::find_anon_type;
|
|
||||||
use rustc_errors::{Diag, EmissionGuarantee, IntoDiagArg, SubdiagMessageOp, Subdiagnostic};
|
use rustc_errors::{Diag, EmissionGuarantee, IntoDiagArg, SubdiagMessageOp, Subdiagnostic};
|
||||||
use rustc_hir::def_id::LocalDefId;
|
use rustc_hir::def_id::LocalDefId;
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
|
@ -11,9 +11,9 @@ pub use BoundRegionConversionTime::*;
|
|||||||
pub use RegionVariableOrigin::*;
|
pub use RegionVariableOrigin::*;
|
||||||
pub use SubregionOrigin::*;
|
pub use SubregionOrigin::*;
|
||||||
|
|
||||||
|
use crate::error_reporting::infer::TypeErrCtxt;
|
||||||
use crate::infer::relate::RelateResult;
|
use crate::infer::relate::RelateResult;
|
||||||
use crate::traits::{self, ObligationCause, ObligationInspector, PredicateObligation, TraitEngine};
|
use crate::traits::{self, ObligationCause, ObligationInspector, PredicateObligation, TraitEngine};
|
||||||
use error_reporting::TypeErrCtxt;
|
|
||||||
use free_regions::RegionRelations;
|
use free_regions::RegionRelations;
|
||||||
use lexical_region_resolve::LexicalRegionResolutions;
|
use lexical_region_resolve::LexicalRegionResolutions;
|
||||||
use opaque_types::OpaqueTypeStorage;
|
use opaque_types::OpaqueTypeStorage;
|
||||||
@ -54,7 +54,6 @@ use type_variable::TypeVariableOrigin;
|
|||||||
pub mod at;
|
pub mod at;
|
||||||
pub mod canonical;
|
pub mod canonical;
|
||||||
mod context;
|
mod context;
|
||||||
pub mod error_reporting;
|
|
||||||
pub mod free_regions;
|
pub mod free_regions;
|
||||||
mod freshen;
|
mod freshen;
|
||||||
mod lexical_region_resolve;
|
mod lexical_region_resolve;
|
||||||
@ -66,6 +65,8 @@ pub mod relate;
|
|||||||
pub mod resolve;
|
pub mod resolve;
|
||||||
pub(crate) mod snapshot;
|
pub(crate) mod snapshot;
|
||||||
pub mod type_variable;
|
pub mod type_variable;
|
||||||
|
// FIXME(error_reporting): Where should we put this?
|
||||||
|
pub mod need_type_info;
|
||||||
|
|
||||||
#[must_use]
|
#[must_use]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
|
use crate::error_reporting::infer::TypeErrCtxt;
|
||||||
use crate::errors::{
|
use crate::errors::{
|
||||||
AmbiguousImpl, AmbiguousReturn, AnnotationRequired, InferenceBadError,
|
AmbiguousImpl, AmbiguousReturn, AnnotationRequired, InferenceBadError,
|
||||||
SourceKindMultiSuggestion, SourceKindSubdiag,
|
SourceKindMultiSuggestion, SourceKindSubdiag,
|
||||||
};
|
};
|
||||||
use crate::infer::error_reporting::TypeErrCtxt;
|
|
||||||
use crate::infer::InferCtxt;
|
use crate::infer::InferCtxt;
|
||||||
use rustc_errors::{codes::*, Diag, IntoDiagArg};
|
use rustc_errors::{codes::*, Diag, IntoDiagArg};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
@ -34,6 +34,7 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate tracing;
|
extern crate tracing;
|
||||||
|
|
||||||
|
pub mod error_reporting;
|
||||||
mod errors;
|
mod errors;
|
||||||
pub mod infer;
|
pub mod infer;
|
||||||
pub mod traits;
|
pub mod traits;
|
||||||
|
@ -8,7 +8,8 @@ use rustc_hir::def::{DefKind, Res};
|
|||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::intravisit::Visitor as _;
|
use rustc_hir::intravisit::Visitor as _;
|
||||||
use rustc_hir::LangItem;
|
use rustc_hir::LangItem;
|
||||||
use rustc_infer::infer::error_reporting::{TypeAnnotationNeeded, TypeErrCtxt};
|
use rustc_infer::error_reporting::infer::TypeErrCtxt;
|
||||||
|
use rustc_infer::infer::need_type_info::TypeAnnotationNeeded;
|
||||||
use rustc_infer::infer::{BoundRegionConversionTime, InferCtxt};
|
use rustc_infer::infer::{BoundRegionConversionTime, InferCtxt};
|
||||||
use rustc_infer::traits::util::elaborate;
|
use rustc_infer::traits::util::elaborate;
|
||||||
use rustc_infer::traits::{
|
use rustc_infer::traits::{
|
||||||
|
@ -4,7 +4,6 @@ use crate::error_reporting::traits::infer_ctxt_ext::InferCtxtExt;
|
|||||||
use crate::errors::{
|
use crate::errors::{
|
||||||
AsyncClosureNotFn, ClosureFnMutLabel, ClosureFnOnceLabel, ClosureKindMismatch,
|
AsyncClosureNotFn, ClosureFnMutLabel, ClosureFnOnceLabel, ClosureKindMismatch,
|
||||||
};
|
};
|
||||||
use crate::infer::error_reporting::TyCategory;
|
|
||||||
use crate::infer::InferCtxtExt as _;
|
use crate::infer::InferCtxtExt as _;
|
||||||
use crate::infer::{self, InferCtxt};
|
use crate::infer::{self, InferCtxt};
|
||||||
use crate::traits::query::evaluate_obligation::InferCtxtExt as _;
|
use crate::traits::query::evaluate_obligation::InferCtxtExt as _;
|
||||||
@ -25,7 +24,8 @@ use rustc_hir::def_id::{DefId, LocalDefId};
|
|||||||
use rustc_hir::intravisit::Visitor;
|
use rustc_hir::intravisit::Visitor;
|
||||||
use rustc_hir::Node;
|
use rustc_hir::Node;
|
||||||
use rustc_hir::{self as hir, LangItem};
|
use rustc_hir::{self as hir, LangItem};
|
||||||
use rustc_infer::infer::error_reporting::TypeErrCtxt;
|
use rustc_infer::error_reporting::infer::TyCategory;
|
||||||
|
use rustc_infer::error_reporting::infer::TypeErrCtxt;
|
||||||
use rustc_infer::infer::{InferOk, TypeTrace};
|
use rustc_infer::infer::{InferOk, TypeTrace};
|
||||||
use rustc_macros::extension;
|
use rustc_macros::extension;
|
||||||
use rustc_middle::traits::select::OverflowError;
|
use rustc_middle::traits::select::OverflowError;
|
||||||
|
@ -11,7 +11,7 @@ use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
|
|||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::intravisit::Visitor;
|
use rustc_hir::intravisit::Visitor;
|
||||||
use rustc_hir::{self as hir, LangItem};
|
use rustc_hir::{self as hir, LangItem};
|
||||||
use rustc_infer::infer::error_reporting::TypeErrCtxt;
|
use rustc_infer::error_reporting::infer::TypeErrCtxt;
|
||||||
use rustc_infer::traits::{
|
use rustc_infer::traits::{
|
||||||
Obligation, ObligationCause, ObligationCauseCode, PredicateObligation, SelectionError,
|
Obligation, ObligationCause, ObligationCauseCode, PredicateObligation, SelectionError,
|
||||||
};
|
};
|
||||||
|
@ -3,7 +3,6 @@ use crate::error_reporting::traits::fulfillment_errors::InferCtxtPrivExt;
|
|||||||
use crate::errors::{
|
use crate::errors::{
|
||||||
EmptyOnClauseInOnUnimplemented, InvalidOnClauseInOnUnimplemented, NoValueInOnUnimplemented,
|
EmptyOnClauseInOnUnimplemented, InvalidOnClauseInOnUnimplemented, NoValueInOnUnimplemented,
|
||||||
};
|
};
|
||||||
use crate::infer::error_reporting::TypeErrCtxt;
|
|
||||||
use crate::infer::InferCtxtExt;
|
use crate::infer::InferCtxtExt;
|
||||||
use rustc_ast::AttrArgs;
|
use rustc_ast::AttrArgs;
|
||||||
use rustc_ast::AttrArgsEq;
|
use rustc_ast::AttrArgsEq;
|
||||||
@ -14,6 +13,7 @@ use rustc_data_structures::fx::FxHashMap;
|
|||||||
use rustc_errors::{codes::*, struct_span_code_err, ErrorGuaranteed};
|
use rustc_errors::{codes::*, struct_span_code_err, ErrorGuaranteed};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
|
use rustc_infer::error_reporting::infer::TypeErrCtxt;
|
||||||
use rustc_macros::{extension, LintDiagnostic};
|
use rustc_macros::{extension, LintDiagnostic};
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::ty::print::PrintTraitRefExt as _;
|
use rustc_middle::ty::print::PrintTraitRefExt as _;
|
||||||
|
@ -5,7 +5,7 @@ use rustc_errors::{
|
|||||||
};
|
};
|
||||||
use rustc_hir::def::Namespace;
|
use rustc_hir::def::Namespace;
|
||||||
use rustc_hir::def_id::LOCAL_CRATE;
|
use rustc_hir::def_id::LOCAL_CRATE;
|
||||||
use rustc_infer::infer::error_reporting::TypeErrCtxt;
|
use rustc_infer::error_reporting::infer::TypeErrCtxt;
|
||||||
use rustc_infer::traits::{Obligation, PredicateObligation};
|
use rustc_infer::traits::{Obligation, PredicateObligation};
|
||||||
use rustc_macros::extension;
|
use rustc_macros::extension;
|
||||||
use rustc_middle::ty::print::{FmtPrinter, Print};
|
use rustc_middle::ty::print::{FmtPrinter, Print};
|
||||||
|
@ -23,7 +23,7 @@ use rustc_hir::intravisit::Visitor;
|
|||||||
use rustc_hir::is_range_literal;
|
use rustc_hir::is_range_literal;
|
||||||
use rustc_hir::lang_items::LangItem;
|
use rustc_hir::lang_items::LangItem;
|
||||||
use rustc_hir::{CoroutineDesugaring, CoroutineKind, CoroutineSource, Expr, HirId, Node};
|
use rustc_hir::{CoroutineDesugaring, CoroutineKind, CoroutineSource, Expr, HirId, Node};
|
||||||
use rustc_infer::infer::error_reporting::TypeErrCtxt;
|
use rustc_infer::error_reporting::infer::TypeErrCtxt;
|
||||||
use rustc_infer::infer::{BoundRegionConversionTime, DefineOpaqueTypes, InferOk};
|
use rustc_infer::infer::{BoundRegionConversionTime, DefineOpaqueTypes, InferOk};
|
||||||
use rustc_macros::extension;
|
use rustc_macros::extension;
|
||||||
use rustc_middle::hir::map;
|
use rustc_middle::hir::map;
|
||||||
|
@ -3,7 +3,7 @@ error[E0308]: mismatched types
|
|||||||
|
|
|
|
||||||
LL | const S: A = B;
|
LL | const S: A = B;
|
||||||
| ^ expected `A`, found `B`
|
| ^ expected `A`, found `B`
|
||||||
-Ztrack-diagnostics: created at compiler/rustc_infer/src/infer/error_reporting/mod.rs:LL:CC
|
-Ztrack-diagnostics: created at compiler/rustc_infer/src/error_reporting/infer/mod.rs:LL:CC
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ error[E0308]: mismatched types
|
|||||||
|
|
|
|
||||||
LL | const S: A = B;
|
LL | const S: A = B;
|
||||||
| ^ expected `A`, found `B`
|
| ^ expected `A`, found `B`
|
||||||
-Ztrack-diagnostics: created at compiler/rustc_infer/src/infer/error_reporting/mod.rs:LL:CC
|
-Ztrack-diagnostics: created at compiler/rustc_infer/src/error_reporting/infer/mod.rs:LL:CC
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user