|
1 | 1 | use crate::ty::print::{with_forced_trimmed_paths, FmtPrinter, PrettyPrinter}; |
2 | | -use crate::ty::{self, BoundRegionKind, Region, Ty, TyCtxt}; |
| 2 | +use crate::ty::{self, Ty, TyCtxt}; |
| 3 | + |
3 | 4 | use rustc_errors::pluralize; |
4 | 5 | use rustc_hir as hir; |
5 | 6 | use rustc_hir::def::{CtorOf, DefKind}; |
6 | | -use rustc_hir::def_id::DefId; |
7 | | -use rustc_macros::{TypeFoldable, TypeVisitable}; |
8 | | -use rustc_span::symbol::Symbol; |
9 | | -use rustc_target::spec::abi; |
| 7 | +use rustc_macros::extension; |
| 8 | +pub use rustc_type_ir::error::ExpectedFound; |
| 9 | + |
10 | 10 | use std::borrow::Cow; |
11 | 11 | use std::hash::{DefaultHasher, Hash, Hasher}; |
12 | 12 | use std::path::PathBuf; |
13 | 13 |
|
14 | | -#[derive(Clone, Copy, Debug, PartialEq, Eq, TypeFoldable, TypeVisitable)] |
15 | | -pub struct ExpectedFound<T> { |
16 | | - pub expected: T, |
17 | | - pub found: T, |
18 | | -} |
19 | | - |
20 | | -impl<T> ExpectedFound<T> { |
21 | | - pub fn new(a_is_expected: bool, a: T, b: T) -> Self { |
22 | | - if a_is_expected { |
23 | | - ExpectedFound { expected: a, found: b } |
24 | | - } else { |
25 | | - ExpectedFound { expected: b, found: a } |
26 | | - } |
27 | | - } |
28 | | -} |
29 | | - |
30 | | -// Data structures used in type unification |
31 | | -#[derive(Copy, Clone, Debug, TypeVisitable, PartialEq, Eq)] |
32 | | -#[rustc_pass_by_value] |
33 | | -pub enum TypeError<'tcx> { |
34 | | - Mismatch, |
35 | | - ConstnessMismatch(ExpectedFound<ty::BoundConstness>), |
36 | | - PolarityMismatch(ExpectedFound<ty::PredicatePolarity>), |
37 | | - SafetyMismatch(ExpectedFound<hir::Safety>), |
38 | | - AbiMismatch(ExpectedFound<abi::Abi>), |
39 | | - Mutability, |
40 | | - ArgumentMutability(usize), |
41 | | - TupleSize(ExpectedFound<usize>), |
42 | | - FixedArraySize(ExpectedFound<u64>), |
43 | | - ArgCount, |
44 | | - FieldMisMatch(Symbol, Symbol), |
45 | | - |
46 | | - RegionsDoesNotOutlive(Region<'tcx>, Region<'tcx>), |
47 | | - RegionsInsufficientlyPolymorphic(BoundRegionKind, Region<'tcx>), |
48 | | - RegionsPlaceholderMismatch, |
49 | | - |
50 | | - Sorts(ExpectedFound<Ty<'tcx>>), |
51 | | - ArgumentSorts(ExpectedFound<Ty<'tcx>>, usize), |
52 | | - IntMismatch(ExpectedFound<ty::IntVarValue>), |
53 | | - FloatMismatch(ExpectedFound<ty::FloatTy>), |
54 | | - Traits(ExpectedFound<DefId>), |
55 | | - VariadicMismatch(ExpectedFound<bool>), |
56 | | - |
57 | | - /// Instantiating a type variable with the given type would have |
58 | | - /// created a cycle (because it appears somewhere within that |
59 | | - /// type). |
60 | | - CyclicTy(Ty<'tcx>), |
61 | | - CyclicConst(ty::Const<'tcx>), |
62 | | - ProjectionMismatched(ExpectedFound<DefId>), |
63 | | - ExistentialMismatch(ExpectedFound<&'tcx ty::List<ty::PolyExistentialPredicate<'tcx>>>), |
64 | | - ConstMismatch(ExpectedFound<ty::Const<'tcx>>), |
65 | | - |
66 | | - IntrinsicCast, |
67 | | - /// Safe `#[target_feature]` functions are not assignable to safe function pointers. |
68 | | - TargetFeatureCast(DefId), |
69 | | -} |
| 14 | +pub type TypeError<'tcx> = rustc_type_ir::error::TypeError<TyCtxt<'tcx>>; |
70 | 15 |
|
71 | | -impl TypeError<'_> { |
72 | | - pub fn involves_regions(self) -> bool { |
73 | | - match self { |
74 | | - TypeError::RegionsDoesNotOutlive(_, _) |
75 | | - | TypeError::RegionsInsufficientlyPolymorphic(_, _) |
76 | | - | TypeError::RegionsPlaceholderMismatch => true, |
77 | | - _ => false, |
78 | | - } |
79 | | - } |
80 | | -} |
81 | | - |
82 | | -/// Explains the source of a type err in a short, human readable way. This is meant to be placed |
83 | | -/// in parentheses after some larger message. You should also invoke `note_and_explain_type_err()` |
84 | | -/// afterwards to present additional details, particularly when it comes to lifetime-related |
85 | | -/// errors. |
| 16 | +#[extension(pub trait TypeErrorToStringExt<'tcx>)] |
| 17 | +/// Explains the source of a type err in a short, human readable way. |
| 18 | +/// This is meant to be placed in parentheses after some larger message. |
| 19 | +/// You should also invoke `note_and_explain_type_err()` afterwards |
| 20 | +/// to present additional details, particularly when it comes to lifetime- |
| 21 | +/// related errors. |
86 | 22 | impl<'tcx> TypeError<'tcx> { |
87 | | - pub fn to_string(self, tcx: TyCtxt<'tcx>) -> Cow<'static, str> { |
88 | | - use self::TypeError::*; |
| 23 | + fn to_string(self, tcx: TyCtxt<'tcx>) -> Cow<'static, str> { |
| 24 | + use IrTypeError::*; |
89 | 25 | fn report_maybe_different(expected: &str, found: &str) -> String { |
90 | 26 | // A naive approach to making sure that we're not reporting silly errors such as: |
91 | 27 | // (expected closure, found closure). |
@@ -131,7 +67,6 @@ impl<'tcx> TypeError<'tcx> { |
131 | 67 | ) |
132 | 68 | .into(), |
133 | 69 | ArgCount => "incorrect number of function parameters".into(), |
134 | | - FieldMisMatch(adt, field) => format!("field type mismatch: {adt}.{field}").into(), |
135 | 70 | RegionsDoesNotOutlive(..) => "lifetime mismatch".into(), |
136 | 71 | // Actually naming the region here is a bit confusing because context is lacking |
137 | 72 | RegionsInsufficientlyPolymorphic(..) => { |
@@ -200,32 +135,6 @@ impl<'tcx> TypeError<'tcx> { |
200 | 135 | } |
201 | 136 | } |
202 | 137 |
|
203 | | -impl<'tcx> TypeError<'tcx> { |
204 | | - pub fn must_include_note(self) -> bool { |
205 | | - use self::TypeError::*; |
206 | | - match self { |
207 | | - CyclicTy(_) | CyclicConst(_) | SafetyMismatch(_) | ConstnessMismatch(_) |
208 | | - | PolarityMismatch(_) | Mismatch | AbiMismatch(_) | FixedArraySize(_) |
209 | | - | ArgumentSorts(..) | Sorts(_) | IntMismatch(_) | FloatMismatch(_) |
210 | | - | VariadicMismatch(_) | TargetFeatureCast(_) => false, |
211 | | - |
212 | | - Mutability |
213 | | - | ArgumentMutability(_) |
214 | | - | TupleSize(_) |
215 | | - | ArgCount |
216 | | - | FieldMisMatch(..) |
217 | | - | RegionsDoesNotOutlive(..) |
218 | | - | RegionsInsufficientlyPolymorphic(..) |
219 | | - | RegionsPlaceholderMismatch |
220 | | - | Traits(_) |
221 | | - | ProjectionMismatched(_) |
222 | | - | ExistentialMismatch(_) |
223 | | - | ConstMismatch(_) |
224 | | - | IntrinsicCast => true, |
225 | | - } |
226 | | - } |
227 | | -} |
228 | | - |
229 | 138 | impl<'tcx> Ty<'tcx> { |
230 | 139 | pub fn sort_string(self, tcx: TyCtxt<'tcx>) -> Cow<'static, str> { |
231 | 140 | match *self.kind() { |
|
0 commit comments