@@ -58,16 +58,9 @@ impl Node for UnaryOpNode {
5858 PriType :: I128 | PriType :: I64 | PriType :: I32 | PriType :: I16 | PriType :: I8 ,
5959 ) ,
6060 TokenType :: MINUS ,
61- ) => {
62- // (
63- // Some(plv!(builder.build_int_neg(exp, "negtmp"))),
64- // Some(pltype.clone()),
65- // TerminatorEnum::None,
66- // )
67- builder
68- . build_int_neg ( exp, "negtmp" )
69- . new_output ( pltype. clone ( ) )
70- }
61+ ) => builder
62+ . build_int_neg ( exp, "negtmp" )
63+ . new_output ( pltype. clone ( ) ) ,
7164 ( PLType :: Primitive ( PriType :: F64 | PriType :: F32 ) , TokenType :: MINUS ) => builder
7265 . build_float_neg ( exp, "negtmp" )
7366 . new_output ( pltype. clone ( ) ) ,
@@ -79,6 +72,7 @@ impl Node for UnaryOpNode {
7972 "nottmp" ,
8073 )
8174 . new_output ( pltype. clone ( ) ) ,
75+ ( _, TokenType :: BIT_NOT ) => builder. build_bit_not ( exp) . new_output ( pltype. clone ( ) ) ,
8276 ( _exp, _op) => {
8377 return Err ( ctx. add_diag ( self . range . new_err ( ErrorCode :: INVALID_UNARY_EXPRESSION ) ) ) ;
8478 }
@@ -185,6 +179,54 @@ impl Node for BinOpNode {
185179 }
186180 let right = ctx. try_load2var ( rrange, re. unwrap ( ) . get_value ( ) , builder) ?;
187181 Ok ( match self . op . 0 {
182+ TokenType :: BIT_AND => {
183+ if !lpltype. borrow ( ) . is_int ( ) || !lpltype. borrow ( ) . is_int ( ) {
184+ return Err ( ctx. add_diag ( self . range . new_err ( ErrorCode :: EXPECT_INT_VALUE ) ) ) ;
185+ }
186+ builder
187+ . build_bit_and ( left, right)
188+ . new_output ( lpltype. clone ( ) )
189+ }
190+ TokenType :: BIT_OR => {
191+ if !lpltype. borrow ( ) . is_int ( ) || !lpltype. borrow ( ) . is_int ( ) {
192+ return Err ( ctx. add_diag ( self . range . new_err ( ErrorCode :: EXPECT_INT_VALUE ) ) ) ;
193+ }
194+ builder
195+ . build_bit_or ( left, right)
196+ . new_output ( lpltype. clone ( ) )
197+ }
198+ TokenType :: BIT_XOR => {
199+ if !lpltype. borrow ( ) . is_int ( ) || !lpltype. borrow ( ) . is_int ( ) {
200+ return Err ( ctx. add_diag ( self . range . new_err ( ErrorCode :: EXPECT_INT_VALUE ) ) ) ;
201+ }
202+ builder
203+ . build_bit_xor ( left, right)
204+ . new_output ( lpltype. clone ( ) )
205+ }
206+ TokenType :: BIT_LEFT_SHIFT => {
207+ if !lpltype. borrow ( ) . is_int ( ) || !lpltype. borrow ( ) . is_int ( ) {
208+ return Err ( ctx. add_diag ( self . range . new_err ( ErrorCode :: EXPECT_INT_VALUE ) ) ) ;
209+ }
210+ builder
211+ . build_bit_left_shift ( left, right)
212+ . new_output ( lpltype. clone ( ) )
213+ }
214+ TokenType :: BIT_RIGHT_SHIFT => {
215+ if !lpltype. borrow ( ) . is_int ( ) || !lpltype. borrow ( ) . is_int ( ) {
216+ return Err ( ctx. add_diag ( self . range . new_err ( ErrorCode :: EXPECT_INT_VALUE ) ) ) ;
217+ }
218+ builder
219+ . build_bit_right_shift_arithmetic ( left, right)
220+ . new_output ( lpltype. clone ( ) )
221+ }
222+ TokenType :: BIT_RIGHT_SHIFT_NO_SIGN => {
223+ if !lpltype. borrow ( ) . is_int ( ) || !lpltype. borrow ( ) . is_int ( ) {
224+ return Err ( ctx. add_diag ( self . range . new_err ( ErrorCode :: EXPECT_INT_VALUE ) ) ) ;
225+ }
226+ builder
227+ . build_bit_right_shift ( left, right)
228+ . new_output ( lpltype. clone ( ) )
229+ }
188230 TokenType :: PLUS => {
189231 handle_calc ! ( ctx, add, float_add, lpltype, left, right, self . range, builder)
190232 }
@@ -214,7 +256,8 @@ impl Node for BinOpNode {
214256 | PriType :: U64
215257 | PriType :: U32
216258 | PriType :: U16
217- | PriType :: U8 ,
259+ | PriType :: U8
260+ | PriType :: BOOL ,
218261 ) => { builder. build_int_compare ( self . op . 0 . get_op ( ) , left, right, "cmptmp" ) }
219262 . new_output ( Arc :: new ( RefCell :: new ( PLType :: Primitive ( PriType :: BOOL ) ) ) ) ,
220263 PLType :: Primitive ( PriType :: F64 | PriType :: F32 ) => {
0 commit comments