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
- Traits ( ExpectedFound < DefId > ) ,
53
- VariadicMismatch ( ExpectedFound < bool > ) ,
54
-
55
- /// Instantiating a type variable with the given type would have
56
- /// created a cycle (because it appears somewhere within that
57
- /// type).
58
- CyclicTy ( Ty < ' tcx > ) ,
59
- CyclicConst ( ty:: Const < ' tcx > ) ,
60
- ProjectionMismatched ( ExpectedFound < DefId > ) ,
61
- ExistentialMismatch ( ExpectedFound < & ' tcx ty:: List < ty:: PolyExistentialPredicate < ' tcx > > > ) ,
62
- ConstMismatch ( ExpectedFound < ty:: Const < ' tcx > > ) ,
63
-
64
- IntrinsicCast ,
65
- /// Safe `#[target_feature]` functions are not assignable to safe function pointers.
66
- TargetFeatureCast ( DefId ) ,
67
- }
68
-
69
- impl TypeError < ' _ > {
70
- pub fn involves_regions ( self ) -> bool {
71
- match self {
72
- TypeError :: RegionsDoesNotOutlive ( _, _)
73
- | TypeError :: RegionsInsufficientlyPolymorphic ( _, _)
74
- | TypeError :: RegionsPlaceholderMismatch => true ,
75
- _ => false ,
76
- }
77
- }
78
- }
14
+ pub type TypeError < ' tcx > = rustc_type_ir:: error:: TypeError < TyCtxt < ' tcx > > ;
79
15
80
- /// Explains the source of a type err in a short, human readable way. This is meant to be placed
81
- /// in parentheses after some larger message. You should also invoke `note_and_explain_type_err()`
82
- /// afterwards to present additional details, particularly when it comes to lifetime-related
83
- /// errors.
16
+ /// Explains the source of a type err in a short, human readable way.
17
+ /// This is meant to be placed in parentheses after some larger message.
18
+ /// You should also invoke `note_and_explain_type_err()` afterwards
19
+ /// to present additional details, particularly when it comes to lifetime-
20
+ /// related errors.
21
+ #[ extension( pub trait TypeErrorToStringExt <' tcx>) ]
84
22
impl < ' tcx > TypeError < ' tcx > {
85
- pub fn to_string ( self , tcx : TyCtxt < ' tcx > ) -> Cow < ' static , str > {
86
- use self :: TypeError :: * ;
23
+ fn to_string ( self , tcx : TyCtxt < ' tcx > ) -> Cow < ' static , str > {
87
24
fn report_maybe_different ( expected : & str , found : & str ) -> String {
88
25
// A naive approach to making sure that we're not reporting silly errors such as:
89
26
// (expected closure, found closure).
@@ -95,53 +32,56 @@ impl<'tcx> TypeError<'tcx> {
95
32
}
96
33
97
34
match self {
98
- CyclicTy ( _) => "cyclic type of infinite size" . into ( ) ,
99
- CyclicConst ( _) => "encountered a self-referencing constant" . into ( ) ,
100
- Mismatch => "types differ" . into ( ) ,
101
- 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) => {
102
39
format ! ( "expected {} bound, found {} bound" , values. expected, values. found) . into ( )
103
40
}
104
- PolarityMismatch ( values) => {
41
+ TypeError :: PolarityMismatch ( values) => {
105
42
format ! ( "expected {} polarity, found {} polarity" , values. expected, values. found)
106
43
. into ( )
107
44
}
108
- SafetyMismatch ( values) => {
45
+ TypeError :: SafetyMismatch ( values) => {
109
46
format ! ( "expected {} fn, found {} fn" , values. expected, values. found) . into ( )
110
47
}
111
- AbiMismatch ( values) => {
48
+ TypeError :: AbiMismatch ( values) => {
112
49
format ! ( "expected {} fn, found {} fn" , values. expected, values. found) . into ( )
113
50
}
114
- ArgumentMutability ( _) | Mutability => "types differ in mutability" . into ( ) ,
115
- TupleSize ( values) => format ! (
51
+ TypeError :: ArgumentMutability ( _) | TypeError :: Mutability => {
52
+ "types differ in mutability" . into ( )
53
+ }
54
+ TypeError :: TupleSize ( values) => format ! (
116
55
"expected a tuple with {} element{}, found one with {} element{}" ,
117
56
values. expected,
118
57
pluralize!( values. expected) ,
119
58
values. found,
120
59
pluralize!( values. found)
121
60
)
122
61
. into ( ) ,
123
- FixedArraySize ( values) => format ! (
62
+ TypeError :: FixedArraySize ( values) => format ! (
124
63
"expected an array with a fixed size of {} element{}, found one with {} element{}" ,
125
64
values. expected,
126
65
pluralize!( values. expected) ,
127
66
values. found,
128
67
pluralize!( values. found)
129
68
)
130
69
. into ( ) ,
131
- ArgCount => "incorrect number of function parameters" . into ( ) ,
132
- FieldMisMatch ( adt, field) => format ! ( "field type mismatch: {adt}.{field}" ) . into ( ) ,
133
- RegionsDoesNotOutlive ( ..) => "lifetime mismatch" . into ( ) ,
70
+ TypeError :: ArgCount => "incorrect number of function parameters" . into ( ) ,
71
+ TypeError :: RegionsDoesNotOutlive ( ..) => "lifetime mismatch" . into ( ) ,
134
72
// Actually naming the region here is a bit confusing because context is lacking
135
- RegionsInsufficientlyPolymorphic ( ..) => {
73
+ TypeError :: RegionsInsufficientlyPolymorphic ( ..) => {
74
+ "one type is more general than the other" . into ( )
75
+ }
76
+ TypeError :: RegionsPlaceholderMismatch => {
136
77
"one type is more general than the other" . into ( )
137
78
}
138
- RegionsPlaceholderMismatch => "one type is more general than the other" . into ( ) ,
139
- ArgumentSorts ( values, _) | Sorts ( values) => {
79
+ TypeError :: ArgumentSorts ( values, _) | TypeError :: Sorts ( values) => {
140
80
let expected = values. expected . sort_string ( tcx) ;
141
81
let found = values. found . sort_string ( tcx) ;
142
82
report_maybe_different ( & expected, & found) . into ( )
143
83
}
144
- Traits ( values) => {
84
+ TypeError :: Traits ( values) => {
145
85
let ( mut expected, mut found) = with_forced_trimmed_paths ! ( (
146
86
tcx. def_path_str( values. expected) ,
147
87
tcx. def_path_str( values. found) ,
@@ -153,59 +93,34 @@ impl<'tcx> TypeError<'tcx> {
153
93
report_maybe_different ( & format ! ( "trait `{expected}`" ) , & format ! ( "trait `{found}`" ) )
154
94
. into ( )
155
95
}
156
- VariadicMismatch ( ref values) => format ! (
96
+ TypeError :: VariadicMismatch ( ref values) => format ! (
157
97
"expected {} fn, found {} function" ,
158
98
if values. expected { "variadic" } else { "non-variadic" } ,
159
99
if values. found { "variadic" } else { "non-variadic" }
160
100
)
161
101
. into ( ) ,
162
- ProjectionMismatched ( ref values) => format ! (
102
+ TypeError :: ProjectionMismatched ( ref values) => format ! (
163
103
"expected `{}`, found `{}`" ,
164
104
tcx. def_path_str( values. expected) ,
165
105
tcx. def_path_str( values. found)
166
106
)
167
107
. into ( ) ,
168
- ExistentialMismatch ( ref values) => report_maybe_different (
108
+ TypeError :: ExistentialMismatch ( ref values) => report_maybe_different (
169
109
& format ! ( "trait `{}`" , values. expected) ,
170
110
& format ! ( "trait `{}`" , values. found) ,
171
111
)
172
112
. into ( ) ,
173
- ConstMismatch ( ref values) => {
113
+ TypeError :: ConstMismatch ( ref values) => {
174
114
format ! ( "expected `{}`, found `{}`" , values. expected, values. found) . into ( )
175
115
}
176
- IntrinsicCast => "cannot coerce intrinsics to function pointers" . into ( ) ,
177
- TargetFeatureCast ( _) => {
116
+ TypeError :: IntrinsicCast => "cannot coerce intrinsics to function pointers" . into ( ) ,
117
+ TypeError :: TargetFeatureCast ( _) => {
178
118
"cannot coerce functions with `#[target_feature]` to safe function pointers" . into ( )
179
119
}
180
120
}
181
121
}
182
122
}
183
123
184
- impl < ' tcx > TypeError < ' tcx > {
185
- pub fn must_include_note ( self ) -> bool {
186
- use self :: TypeError :: * ;
187
- match self {
188
- CyclicTy ( _) | CyclicConst ( _) | SafetyMismatch ( _) | ConstnessMismatch ( _)
189
- | PolarityMismatch ( _) | Mismatch | AbiMismatch ( _) | FixedArraySize ( _)
190
- | ArgumentSorts ( ..) | Sorts ( _) | VariadicMismatch ( _) | TargetFeatureCast ( _) => false ,
191
-
192
- Mutability
193
- | ArgumentMutability ( _)
194
- | TupleSize ( _)
195
- | ArgCount
196
- | FieldMisMatch ( ..)
197
- | RegionsDoesNotOutlive ( ..)
198
- | RegionsInsufficientlyPolymorphic ( ..)
199
- | RegionsPlaceholderMismatch
200
- | Traits ( _)
201
- | ProjectionMismatched ( _)
202
- | ExistentialMismatch ( _)
203
- | ConstMismatch ( _)
204
- | IntrinsicCast => true ,
205
- }
206
- }
207
- }
208
-
209
124
impl < ' tcx > Ty < ' tcx > {
210
125
pub fn sort_string ( self , tcx : TyCtxt < ' tcx > ) -> Cow < ' static , str > {
211
126
match * self . kind ( ) {
0 commit comments