11use 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+
34use rustc_errors:: pluralize;
45use rustc_hir as hir;
56use 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+
1010use std:: borrow:: Cow ;
1111use std:: hash:: { DefaultHasher , Hash , Hasher } ;
1212use std:: path:: PathBuf ;
1313
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- }
70-
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- }
14+ pub type TypeError < ' tcx > = rustc_type_ir:: error:: TypeError < TyCtxt < ' tcx > > ;
8115
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.
8622impl < ' 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 > {
8924 fn report_maybe_different ( expected : & str , found : & str ) -> String {
9025 // A naive approach to making sure that we're not reporting silly errors such as:
9126 // (expected closure, found closure).
@@ -97,53 +32,56 @@ impl<'tcx> TypeError<'tcx> {
9732 }
9833
9934 match self {
100- CyclicTy ( _) => "cyclic type of infinite size" . into ( ) ,
101- CyclicConst ( _) => "encountered a self-referencing constant" . into ( ) ,
102- Mismatch => "types differ" . into ( ) ,
103- ConstnessMismatch ( values) => {
35+ TypeError :: CyclicTy ( _) => "cyclic type of infinite size" . into ( ) ,
36+ TypeError :: CyclicConst ( _) => "encountered a self-referencing constant" . into ( ) ,
37+ TypeError :: Mismatch => "types differ" . into ( ) ,
38+ TypeError :: ConstnessMismatch ( values) => {
10439 format ! ( "expected {} bound, found {} bound" , values. expected, values. found) . into ( )
10540 }
106- PolarityMismatch ( values) => {
41+ TypeError :: PolarityMismatch ( values) => {
10742 format ! ( "expected {} polarity, found {} polarity" , values. expected, values. found)
10843 . into ( )
10944 }
110- SafetyMismatch ( values) => {
45+ TypeError :: SafetyMismatch ( values) => {
11146 format ! ( "expected {} fn, found {} fn" , values. expected, values. found) . into ( )
11247 }
113- AbiMismatch ( values) => {
48+ TypeError :: AbiMismatch ( values) => {
11449 format ! ( "expected {} fn, found {} fn" , values. expected, values. found) . into ( )
11550 }
116- ArgumentMutability ( _) | Mutability => "types differ in mutability" . into ( ) ,
117- TupleSize ( values) => format ! (
51+ TypeError :: ArgumentMutability ( _) | TypeError :: Mutability => {
52+ "types differ in mutability" . into ( )
53+ }
54+ TypeError :: TupleSize ( values) => format ! (
11855 "expected a tuple with {} element{}, found one with {} element{}" ,
11956 values. expected,
12057 pluralize!( values. expected) ,
12158 values. found,
12259 pluralize!( values. found)
12360 )
12461 . into ( ) ,
125- FixedArraySize ( values) => format ! (
62+ TypeError :: FixedArraySize ( values) => format ! (
12663 "expected an array with a fixed size of {} element{}, found one with {} element{}" ,
12764 values. expected,
12865 pluralize!( values. expected) ,
12966 values. found,
13067 pluralize!( values. found)
13168 )
13269 . into ( ) ,
133- ArgCount => "incorrect number of function parameters" . into ( ) ,
134- FieldMisMatch ( adt, field) => format ! ( "field type mismatch: {adt}.{field}" ) . into ( ) ,
135- RegionsDoesNotOutlive ( ..) => "lifetime mismatch" . into ( ) ,
70+ TypeError :: ArgCount => "incorrect number of function parameters" . into ( ) ,
71+ TypeError :: RegionsDoesNotOutlive ( ..) => "lifetime mismatch" . into ( ) ,
13672 // Actually naming the region here is a bit confusing because context is lacking
137- RegionsInsufficientlyPolymorphic ( ..) => {
73+ TypeError :: RegionsInsufficientlyPolymorphic ( ..) => {
74+ "one type is more general than the other" . into ( )
75+ }
76+ TypeError :: RegionsPlaceholderMismatch => {
13877 "one type is more general than the other" . into ( )
13978 }
140- RegionsPlaceholderMismatch => "one type is more general than the other" . into ( ) ,
141- ArgumentSorts ( values, _) | Sorts ( values) => {
79+ TypeError :: ArgumentSorts ( values, _) | TypeError :: Sorts ( values) => {
14280 let expected = values. expected . sort_string ( tcx) ;
14381 let found = values. found . sort_string ( tcx) ;
14482 report_maybe_different ( & expected, & found) . into ( )
14583 }
146- Traits ( values) => {
84+ TypeError :: Traits ( values) => {
14785 let ( mut expected, mut found) = with_forced_trimmed_paths ! ( (
14886 tcx. def_path_str( values. expected) ,
14987 tcx. def_path_str( values. found) ,
@@ -155,7 +93,7 @@ impl<'tcx> TypeError<'tcx> {
15593 report_maybe_different ( & format ! ( "trait `{expected}`" ) , & format ! ( "trait `{found}`" ) )
15694 . into ( )
15795 }
158- IntMismatch ( ref values) => {
96+ TypeError :: IntMismatch ( ref values) => {
15997 let expected = match values. expected {
16098 ty:: IntVarValue :: IntType ( ty) => ty. name_str ( ) ,
16199 ty:: IntVarValue :: UintType ( ty) => ty. name_str ( ) ,
@@ -166,66 +104,40 @@ impl<'tcx> TypeError<'tcx> {
166104 } ;
167105 format ! ( "expected `{expected}`, found `{found}`" ) . into ( )
168106 }
169- FloatMismatch ( ref values) => format ! (
107+ TypeError :: FloatMismatch ( ref values) => format ! (
170108 "expected `{}`, found `{}`" ,
171109 values. expected. name_str( ) ,
172110 values. found. name_str( )
173111 )
174112 . into ( ) ,
175- VariadicMismatch ( ref values) => format ! (
113+ TypeError :: VariadicMismatch ( ref values) => format ! (
176114 "expected {} fn, found {} function" ,
177115 if values. expected { "variadic" } else { "non-variadic" } ,
178116 if values. found { "variadic" } else { "non-variadic" }
179117 )
180118 . into ( ) ,
181- ProjectionMismatched ( ref values) => format ! (
119+ TypeError :: ProjectionMismatched ( ref values) => format ! (
182120 "expected `{}`, found `{}`" ,
183121 tcx. def_path_str( values. expected) ,
184122 tcx. def_path_str( values. found)
185123 )
186124 . into ( ) ,
187- ExistentialMismatch ( ref values) => report_maybe_different (
125+ TypeError :: ExistentialMismatch ( ref values) => report_maybe_different (
188126 & format ! ( "trait `{}`" , values. expected) ,
189127 & format ! ( "trait `{}`" , values. found) ,
190128 )
191129 . into ( ) ,
192- ConstMismatch ( ref values) => {
130+ TypeError :: ConstMismatch ( ref values) => {
193131 format ! ( "expected `{}`, found `{}`" , values. expected, values. found) . into ( )
194132 }
195- IntrinsicCast => "cannot coerce intrinsics to function pointers" . into ( ) ,
196- TargetFeatureCast ( _) => {
133+ TypeError :: IntrinsicCast => "cannot coerce intrinsics to function pointers" . into ( ) ,
134+ TypeError :: TargetFeatureCast ( _) => {
197135 "cannot coerce functions with `#[target_feature]` to safe function pointers" . into ( )
198136 }
199137 }
200138 }
201139}
202140
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-
229141impl < ' tcx > Ty < ' tcx > {
230142 pub fn sort_string ( self , tcx : TyCtxt < ' tcx > ) -> Cow < ' static , str > {
231143 match * self . kind ( ) {
0 commit comments