Migrate OpaqueHiddenType mismatch
This commit is contained in:
parent
3e834a7a62
commit
00cd965046
@ -1,3 +1,13 @@
|
|||||||
middle_drop_check_overflow =
|
middle_drop_check_overflow =
|
||||||
overflow while adding drop-check rules for {$ty}
|
overflow while adding drop-check rules for {$ty}
|
||||||
.note = {$note}
|
.note = {$note}
|
||||||
|
|
||||||
|
middle_opaque_hidden_type_mismatch =
|
||||||
|
concrete type differs from previous defining opaque type use
|
||||||
|
.label = expected `{$self_ty}`, got `{$other_ty}`
|
||||||
|
|
||||||
|
middle_conflict_types =
|
||||||
|
this expression supplies two conflicting concrete types for the same opaque type
|
||||||
|
|
||||||
|
middle_previous_use_here =
|
||||||
|
previous use here
|
||||||
|
@ -12,3 +12,29 @@ pub struct DropCheckOverflow<'tcx> {
|
|||||||
pub ty: Ty<'tcx>,
|
pub ty: Ty<'tcx>,
|
||||||
pub note: String,
|
pub note: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(middle::opaque_hidden_type_mismatch)]
|
||||||
|
pub struct OpaqueHiddenTypeMismatch<'tcx> {
|
||||||
|
pub self_ty: Ty<'tcx>,
|
||||||
|
pub other_ty: Ty<'tcx>,
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub other_span: Span,
|
||||||
|
#[subdiagnostic]
|
||||||
|
pub sub: TypeMismatchReason,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionSubdiagnostic)]
|
||||||
|
pub enum TypeMismatchReason {
|
||||||
|
#[label(middle::conflict_types)]
|
||||||
|
ConflictType {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
},
|
||||||
|
#[note(middle::previous_use_here)]
|
||||||
|
PreviousUse {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
pub use self::BorrowKind::*;
|
pub use self::BorrowKind::*;
|
||||||
pub use self::IntVarValue::*;
|
pub use self::IntVarValue::*;
|
||||||
pub use self::Variance::*;
|
pub use self::Variance::*;
|
||||||
|
use crate::error::{OpaqueHiddenTypeMismatch, TypeMismatchReason};
|
||||||
use crate::metadata::ModChild;
|
use crate::metadata::ModChild;
|
||||||
use crate::middle::privacy::AccessLevels;
|
use crate::middle::privacy::AccessLevels;
|
||||||
use crate::mir::{Body, GeneratorLayout};
|
use crate::mir::{Body, GeneratorLayout};
|
||||||
@ -1184,20 +1185,17 @@ pub struct OpaqueHiddenType<'tcx> {
|
|||||||
impl<'tcx> OpaqueHiddenType<'tcx> {
|
impl<'tcx> OpaqueHiddenType<'tcx> {
|
||||||
pub fn report_mismatch(&self, other: &Self, tcx: TyCtxt<'tcx>) {
|
pub fn report_mismatch(&self, other: &Self, tcx: TyCtxt<'tcx>) {
|
||||||
// Found different concrete types for the opaque type.
|
// Found different concrete types for the opaque type.
|
||||||
let mut err = tcx.sess.struct_span_err(
|
let sub_diag = if self.span == other.span {
|
||||||
other.span,
|
TypeMismatchReason::ConflictType { span: self.span }
|
||||||
"concrete type differs from previous defining opaque type use",
|
|
||||||
);
|
|
||||||
err.span_label(other.span, format!("expected `{}`, got `{}`", self.ty, other.ty));
|
|
||||||
if self.span == other.span {
|
|
||||||
err.span_label(
|
|
||||||
self.span,
|
|
||||||
"this expression supplies two conflicting concrete types for the same opaque type",
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
err.span_note(self.span, "previous use here");
|
TypeMismatchReason::PreviousUse { span: self.span }
|
||||||
}
|
};
|
||||||
err.emit();
|
tcx.sess.emit_err(OpaqueHiddenTypeMismatch {
|
||||||
|
self_ty: self.ty,
|
||||||
|
other_ty: other.ty,
|
||||||
|
other_span: other.span,
|
||||||
|
sub: sub_diag,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user