@@ -713,11 +713,8 @@ impl<'s, 't> Parser<'s, 't> {
713713 }
714714
715715 // Lift expression, based on type
716- let lift = self . lift_expr (
717- expr,
718- self . nodes [ self . scope ] . vars [ def] . ty ( ) ,
719- self . nodes [ self . scope ] . vars [ def] . final_field ,
720- ) ?;
716+ let var_t = self . nodes [ self . scope ] . vars [ def] . ty ( & self . name_to_type , & self . types ) ;
717+ let lift = self . lift_expr ( expr, var_t, self . nodes [ self . scope ] . vars [ def] . final_field ) ?;
721718 // Update
722719 self . scope . update ( name, lift, & mut self . nodes ) ;
723720 // Return un-lifted expr
@@ -757,7 +754,8 @@ impl<'s, 't> Parser<'s, 't> {
757754
758755 fn widen_int ( & mut self , expr : Node , t : Ty < ' t > ) -> Node {
759756 if t. is_float ( ) && expr. ty ( & self . nodes ) . is_some_and ( |i| i. is_int ( ) ) {
760- self . peep ( ToFloat :: new ( expr, & mut self . nodes ) )
757+ let f = ToFloat :: new ( expr, & mut self . nodes ) ;
758+ self . peep ( f)
761759 } else {
762760 expr
763761 }
@@ -832,7 +830,7 @@ impl<'s, 't> Parser<'s, 't> {
832830 if self . x_scopes . len ( ) > 1 {
833831 return Err ( self . error_syntax ( "struct declarations can only appear in top level scope" ) ) ;
834832 }
835- let type_name = self . require_id ( ) ?;
833+ let type_name = self . types . get_str ( self . require_id ( ) ?) ;
836834 let t = self . name_to_type . get ( type_name) ;
837835 if t. is_some_and ( |t| !t. to_mem_ptr ( ) . is_some_and ( |tmp| tmp. is_fref ( ) ) ) {
838836 return Err ( self . error_syntax ( & format ! ( "struct '{type_name}' cannot be redefined" ) ) ) ;
@@ -862,7 +860,7 @@ impl<'s, 't> Parser<'s, 't> {
862860 } ) ;
863861 self . alias += 1 ;
864862 }
865- let ts = self . types . get_struct ( type_name, fs) ;
863+ let ts = self . types . get_struct ( type_name, & fs) ;
866864 self . name_to_type
867865 . insert ( type_name, * self . types . get_mem_ptr ( ts, false ) ) ;
868866 self . inits . insert (
@@ -967,7 +965,7 @@ impl<'s, 't> Parser<'s, 't> {
967965
968966 /// Fixup forward refs lazily. Basically a Union-Find flavored read
969967 /// barrier.
970- fn lazy_f_ref ( & mut self , t : Ty < ' t > ) -> PResult < Ty < ' t > > {
968+ fn lazy_f_ref ( & mut self , _t : Ty < ' t > ) -> PResult < Ty < ' t > > {
971969 //if( !t.isFRef() ) return t;
972970 //Type def = Parser.TYPES.get(((TypeMemPtr)t)._obj._name);
973971 Err ( "Not yet implemented" . to_string ( ) )
@@ -1194,12 +1192,16 @@ impl<'s, 't> Parser<'s, 't> {
11941192 '-' => self . nodes . create ( ( Op :: Sub , vec ! [ None , Some ( rvalue) , None ] ) ) ,
11951193 '*' => self . nodes . create ( ( Op :: Mul , vec ! [ None , Some ( rvalue) , None ] ) ) ,
11961194 '/' => self . nodes . create ( ( Op :: Div , vec ! [ None , Some ( rvalue) , None ] ) ) ,
1197- '\u{1}' => self
1198- . nodes
1199- . create ( ( Op :: Add , vec ! [ None , Some ( rvalue) , Some ( * self . int_con( 1 ) ) ] ) ) ,
1200- '\u{FFFF}' => self
1201- . nodes
1202- . create ( ( Op :: Add , vec ! [ None , Some ( rvalue) , Some ( * self . int_con( -1 ) ) ] ) ) ,
1195+ '\u{1}' => {
1196+ let rhs = self . int_con ( 1 ) ;
1197+ self . nodes
1198+ . create ( ( Op :: Add , vec ! [ None , Some ( rvalue) , Some ( * rhs) ] ) )
1199+ }
1200+ '\u{FFFF}' => {
1201+ let rhs = self . int_con ( -1 ) ;
1202+ self . nodes
1203+ . create ( ( Op :: Add , vec ! [ None , Some ( rvalue) , Some ( * rhs) ] ) )
1204+ }
12031205 _ => return Err ( "Not yet implemented" . to_string ( ) ) ,
12041206 } ;
12051207 // Return pre-value (x+=1) or post-value (x++)
@@ -1213,8 +1215,9 @@ impl<'s, 't> Parser<'s, 't> {
12131215 rvalue. keep ( & mut self . nodes ) ; // Keep post-value across peeps
12141216 }
12151217 let n_ty = self . nodes [ self . scope ] . vars [ n] . ty ( & self . name_to_type , self . types ) ;
1216- let op = self . zs_mask ( self . peep ( op) , n_ty) ?;
1217- self . scope . update ( n, op, & mut self . nodes ) ;
1218+ let op = self . peep ( op) ;
1219+ let op = self . zs_mask ( op, n_ty) ?;
1220+ self . scope . update_var_index ( n, Some ( op) , & mut self . nodes ) ;
12181221 Ok ( if pre {
12191222 op
12201223 } else {
@@ -1451,7 +1454,11 @@ impl<'s, 't> Parser<'s, 't> {
14511454
14521455 let index = self . parse_asgn ( ) ?;
14531456 self . require ( "]" ) ?;
1454- let offset = Shl :: new ( index, Some ( self . int_con ( base. ary_scale ( ) ) ) , & mut self . nodes ) ;
1457+ let offset = Shl :: new (
1458+ index,
1459+ Some ( * self . int_con ( base. ary_scale ( ) ) ) ,
1460+ & mut self . nodes ,
1461+ ) ;
14551462
14561463 self . peep ( Add :: new ( * b, self . peep ( offset) , & mut self . nodes ) )
14571464 } else {
@@ -1506,12 +1513,12 @@ impl<'s, 't> Parser<'s, 't> {
15061513 // ary[idx]++ or ptr.fld++
15071514 let inc = self . matchx ( "++" ) ;
15081515 if inc || self . matchx ( "--" ) {
1509- if f. final_field && ! f. fname = = "[]" {
1516+ if f. final_field && f. fname ! = "[]" {
15101517 return Err ( format ! ( "Cannot reassign final '{}'" , f. fname) ) ;
15111518 }
15121519 let delta = self . int_con ( if inc { 1 } else { -1 } ) ;
15131520 let inc = self . peep ( Add :: new ( load, * delta, & mut self . nodes ) ) ;
1514- let val = self . zs_mask ( inc, tf) ;
1521+ let val = self . zs_mask ( inc, tf) ? ;
15151522 let st = Store :: new (
15161523 name,
15171524 f. alias ,
@@ -1548,11 +1555,15 @@ impl<'s, 't> Parser<'s, 't> {
15481555 if let Some ( t0) = t. to_int ( ) {
15491556 if !self . types . isa ( tval, t0) {
15501557 if t0. min ( ) == 0 {
1551- self . peep ( And :: new ( val, self . int_con ( t0. max ( ) ) ) ) // Unsigned
1558+ return Ok ( self . peep ( And :: new (
1559+ val,
1560+ Some ( * self . int_con ( t0. max ( ) ) ) ,
1561+ & mut self . nodes ,
1562+ ) ) ) ; // Unsigned
15521563 }
15531564 // Signed extension
15541565 let shift = t0. max ( ) . leading_zeros ( ) - 1 ;
1555- let shf = self . int_con ( shift) ;
1566+ let shf = self . int_con ( shift as i64 ) ;
15561567 if shf. ty ( & self . nodes ) == Some ( * self . types . int_zero ) {
15571568 return Ok ( val) ;
15581569 }
0 commit comments