@@ -17,6 +17,7 @@ use hir_expand::InFile;
17
17
use intern:: Interned ;
18
18
use la_arena:: ArenaMap ;
19
19
use rustc_hash:: { FxHashMap , FxHashSet } ;
20
+ use stdx:: never;
20
21
use syntax:: { SyntaxNodePtr , TextRange } ;
21
22
use triomphe:: Arc ;
22
23
@@ -896,7 +897,7 @@ impl Evaluator<'_> {
896
897
Owned ( c)
897
898
}
898
899
}
899
- Rvalue :: CheckedBinaryOp ( op, lhs, rhs) => {
900
+ Rvalue :: CheckedBinaryOp ( op, lhs, rhs) => ' binary_op : {
900
901
let lc = self . eval_operand ( lhs, locals) ?;
901
902
let rc = self . eval_operand ( rhs, locals) ?;
902
903
let mut lc = lc. get ( & self ) ?;
@@ -905,10 +906,17 @@ impl Evaluator<'_> {
905
906
while let TyKind :: Ref ( _, _, z) = ty. kind ( Interner ) {
906
907
ty = z. clone ( ) ;
907
908
let size = if ty. kind ( Interner ) == & TyKind :: Str {
908
- let ns = from_bytes ! ( usize , & lc[ self . ptr_size( ) ..self . ptr_size( ) * 2 ] ) ;
909
+ if * op != BinOp :: Eq {
910
+ never ! ( "Only eq is builtin for `str`" ) ;
911
+ }
912
+ let ls = from_bytes ! ( usize , & lc[ self . ptr_size( ) ..self . ptr_size( ) * 2 ] ) ;
913
+ let rs = from_bytes ! ( usize , & rc[ self . ptr_size( ) ..self . ptr_size( ) * 2 ] ) ;
914
+ if ls != rs {
915
+ break ' binary_op Owned ( vec ! [ 0 ] ) ;
916
+ }
909
917
lc = & lc[ ..self . ptr_size ( ) ] ;
910
918
rc = & rc[ ..self . ptr_size ( ) ] ;
911
- ns
919
+ ls
912
920
} else {
913
921
self . size_of_sized ( & ty, locals, "operand of binary op" ) ?
914
922
} ;
@@ -1200,8 +1208,15 @@ impl Evaluator<'_> {
1200
1208
CastKind :: IntToInt
1201
1209
| CastKind :: PointerExposeAddress
1202
1210
| CastKind :: PointerFromExposedAddress => {
1203
- // FIXME: handle signed cast
1204
- let current = pad16 ( self . eval_operand ( operand, locals) ?. get ( & self ) ?, false ) ;
1211
+ let current_ty = self . operand_ty ( operand, locals) ?;
1212
+ let is_signed = match current_ty. kind ( Interner ) {
1213
+ TyKind :: Scalar ( s) => match s {
1214
+ chalk_ir:: Scalar :: Int ( _) => true ,
1215
+ _ => false ,
1216
+ } ,
1217
+ _ => false ,
1218
+ } ;
1219
+ let current = pad16 ( self . eval_operand ( operand, locals) ?. get ( & self ) ?, is_signed) ;
1205
1220
let dest_size =
1206
1221
self . size_of_sized ( target_ty, locals, "destination of int to int cast" ) ?;
1207
1222
Owned ( current[ 0 ..dest_size] . to_vec ( ) )
0 commit comments