@@ -17,6 +17,7 @@ use hir_expand::InFile;
1717use intern:: Interned ;
1818use la_arena:: ArenaMap ;
1919use rustc_hash:: { FxHashMap , FxHashSet } ;
20+ use stdx:: never;
2021use syntax:: { SyntaxNodePtr , TextRange } ;
2122use triomphe:: Arc ;
2223
@@ -896,7 +897,7 @@ impl Evaluator<'_> {
896897 Owned ( c)
897898 }
898899 }
899- Rvalue :: CheckedBinaryOp ( op, lhs, rhs) => {
900+ Rvalue :: CheckedBinaryOp ( op, lhs, rhs) => ' binary_op : {
900901 let lc = self . eval_operand ( lhs, locals) ?;
901902 let rc = self . eval_operand ( rhs, locals) ?;
902903 let mut lc = lc. get ( & self ) ?;
@@ -905,10 +906,17 @@ impl Evaluator<'_> {
905906 while let TyKind :: Ref ( _, _, z) = ty. kind ( Interner ) {
906907 ty = z. clone ( ) ;
907908 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+ }
909917 lc = & lc[ ..self . ptr_size ( ) ] ;
910918 rc = & rc[ ..self . ptr_size ( ) ] ;
911- ns
919+ ls
912920 } else {
913921 self . size_of_sized ( & ty, locals, "operand of binary op" ) ?
914922 } ;
@@ -1200,8 +1208,15 @@ impl Evaluator<'_> {
12001208 CastKind :: IntToInt
12011209 | CastKind :: PointerExposeAddress
12021210 | 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) ;
12051220 let dest_size =
12061221 self . size_of_sized ( target_ty, locals, "destination of int to int cast" ) ?;
12071222 Owned ( current[ 0 ..dest_size] . to_vec ( ) )
0 commit comments