Migrate OpaqueHiddenType mismatch

This commit is contained in:
111 2022-08-31 20:16:02 +08:00
parent 3e834a7a62
commit 00cd965046
3 changed files with 47 additions and 13 deletions

View File

@ -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

View File

@ -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,
},
}

View File

@ -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,
});
} }
} }