@@ -6,7 +6,9 @@ use stdx::never;
6
6
7
7
use crate :: {
8
8
Adjustment , Binders , DynTy , InferenceDiagnostic , Interner , PlaceholderIndex ,
9
- QuantifiedWhereClauses , Ty , TyExt , TyKind , TypeFlags , WhereClause , from_chalk_trait_id,
9
+ QuantifiedWhereClauses , Ty , TyExt , TyKind , TypeFlags , WhereClause ,
10
+ db:: HirDatabase ,
11
+ from_chalk_trait_id,
10
12
infer:: { coerce:: CoerceNever , unify:: InferenceTable } ,
11
13
} ;
12
14
@@ -30,7 +32,7 @@ pub(crate) enum CastTy {
30
32
}
31
33
32
34
impl CastTy {
33
- pub ( crate ) fn from_ty ( table : & mut InferenceTable < ' _ > , t : & Ty ) -> Option < Self > {
35
+ pub ( crate ) fn from_ty ( db : & dyn HirDatabase , t : & Ty ) -> Option < Self > {
34
36
match t. kind ( Interner ) {
35
37
TyKind :: Scalar ( Scalar :: Bool ) => Some ( Self :: Int ( Int :: Bool ) ) ,
36
38
TyKind :: Scalar ( Scalar :: Char ) => Some ( Self :: Int ( Int :: Char ) ) ,
@@ -43,8 +45,8 @@ impl CastTy {
43
45
let ( AdtId :: EnumId ( id) , _) = t. as_adt ( ) ? else {
44
46
return None ;
45
47
} ;
46
- let enum_data = id. enum_variants ( table . db ) ;
47
- if enum_data. is_payload_free ( table . db ) { Some ( Self :: Int ( Int :: CEnum ) ) } else { None }
48
+ let enum_data = id. enum_variants ( db) ;
49
+ if enum_data. is_payload_free ( db) { Some ( Self :: Int ( Int :: CEnum ) ) } else { None }
48
50
}
49
51
TyKind :: Raw ( m, ty) => Some ( Self :: Ptr ( ty. clone ( ) , * m) ) ,
50
52
TyKind :: Function ( _) => Some ( Self :: FnPtr ) ,
@@ -142,58 +144,50 @@ impl CastCheck {
142
144
where
143
145
F : FnMut ( ExprId , Vec < Adjustment > ) ,
144
146
{
145
- let ( t_from, t_cast) =
146
- match ( CastTy :: from_ty ( table, & self . expr_ty ) , CastTy :: from_ty ( table, & self . cast_ty ) ) {
147
- ( Some ( t_from) , Some ( t_cast) ) => ( t_from, t_cast) ,
148
- ( None , Some ( t_cast) ) => match self . expr_ty . kind ( Interner ) {
149
- TyKind :: FnDef ( ..) => {
150
- let sig = self . expr_ty . callable_sig ( table. db ) . expect ( "FnDef had no sig" ) ;
151
- let sig = table. eagerly_normalize_and_resolve_shallow_in ( sig) ;
152
- let fn_ptr = TyKind :: Function ( sig. to_fn_ptr ( ) ) . intern ( Interner ) ;
153
- if let Ok ( ( adj, _) ) = table. coerce ( & self . expr_ty , & fn_ptr, CoerceNever :: Yes )
154
- {
155
- apply_adjustments ( self . source_expr , adj) ;
156
- } else {
157
- return Err ( CastError :: IllegalCast ) ;
158
- }
159
-
160
- ( CastTy :: FnPtr , t_cast)
147
+ let ( t_from, t_cast) = match (
148
+ CastTy :: from_ty ( table. db , & self . expr_ty ) ,
149
+ CastTy :: from_ty ( table. db , & self . cast_ty ) ,
150
+ ) {
151
+ ( Some ( t_from) , Some ( t_cast) ) => ( t_from, t_cast) ,
152
+ ( None , Some ( t_cast) ) => match self . expr_ty . kind ( Interner ) {
153
+ TyKind :: FnDef ( ..) => {
154
+ let sig = self . expr_ty . callable_sig ( table. db ) . expect ( "FnDef had no sig" ) ;
155
+ let sig = table. eagerly_normalize_and_resolve_shallow_in ( sig) ;
156
+ let fn_ptr = TyKind :: Function ( sig. to_fn_ptr ( ) ) . intern ( Interner ) ;
157
+ if let Ok ( ( adj, _) ) = table. coerce ( & self . expr_ty , & fn_ptr, CoerceNever :: Yes ) {
158
+ apply_adjustments ( self . source_expr , adj) ;
159
+ } else {
160
+ return Err ( CastError :: IllegalCast ) ;
161
161
}
162
- TyKind :: Ref ( mutbl, _, inner_ty) => {
163
- return match t_cast {
164
- CastTy :: Int ( _) | CastTy :: Float => match inner_ty. kind ( Interner ) {
165
- TyKind :: Scalar (
166
- Scalar :: Int ( _) | Scalar :: Uint ( _) | Scalar :: Float ( _) ,
167
- )
168
- | TyKind :: InferenceVar (
169
- _,
170
- TyVariableKind :: Integer | TyVariableKind :: Float ,
171
- ) => Err ( CastError :: NeedDeref ) ,
172
-
173
- _ => Err ( CastError :: NeedViaPtr ) ,
174
- } ,
175
- // array-ptr-cast
176
- CastTy :: Ptr ( t, m) => {
177
- let t = table. eagerly_normalize_and_resolve_shallow_in ( t) ;
178
- if !table. is_sized ( & t) {
179
- return Err ( CastError :: IllegalCast ) ;
180
- }
181
- self . check_ref_cast (
182
- table,
183
- inner_ty,
184
- * mutbl,
185
- & t,
186
- m,
187
- apply_adjustments,
188
- )
162
+
163
+ ( CastTy :: FnPtr , t_cast)
164
+ }
165
+ TyKind :: Ref ( mutbl, _, inner_ty) => {
166
+ return match t_cast {
167
+ CastTy :: Int ( _) | CastTy :: Float => match inner_ty. kind ( Interner ) {
168
+ TyKind :: Scalar ( Scalar :: Int ( _) | Scalar :: Uint ( _) | Scalar :: Float ( _) )
169
+ | TyKind :: InferenceVar (
170
+ _,
171
+ TyVariableKind :: Integer | TyVariableKind :: Float ,
172
+ ) => Err ( CastError :: NeedDeref ) ,
173
+
174
+ _ => Err ( CastError :: NeedViaPtr ) ,
175
+ } ,
176
+ // array-ptr-cast
177
+ CastTy :: Ptr ( t, m) => {
178
+ let t = table. eagerly_normalize_and_resolve_shallow_in ( t) ;
179
+ if !table. is_sized ( & t) {
180
+ return Err ( CastError :: IllegalCast ) ;
189
181
}
190
- _ => Err ( CastError :: NonScalar ) ,
191
- } ;
192
- }
193
- _ => return Err ( CastError :: NonScalar ) ,
194
- } ,
182
+ self . check_ref_cast ( table , inner_ty , * mutbl , & t , m , apply_adjustments )
183
+ }
184
+ _ => Err ( CastError :: NonScalar ) ,
185
+ } ;
186
+ }
195
187
_ => return Err ( CastError :: NonScalar ) ,
196
- } ;
188
+ } ,
189
+ _ => return Err ( CastError :: NonScalar ) ,
190
+ } ;
197
191
198
192
// rustc checks whether the `expr_ty` is foreign adt with `non_exhaustive` sym
199
193
0 commit comments