@@ -498,11 +498,20 @@ def vec_contains(builder: LowLevelIRBuilder, vec: Value, target: Value, line: in
498498
499499 step = step_size (item_type )
500500 len_val = vec_len_native (builder , vec )
501- items_start = vec_items (builder , vec )
502- items_end = builder .int_add (items_start , builder .int_mul (len_val , step ))
503501
504502 true , end = BasicBlock (), BasicBlock ()
505503
504+ # Guard against computing &buf->items when buf is NULL (empty vec).
505+ search_body = BasicBlock ()
506+ search_done = BasicBlock ()
507+ zero = Integer (0 , c_pyssize_t_rprimitive )
508+ len_check = builder .add (ComparisonOp (len_val , zero , ComparisonOp .SGT , line = line ))
509+ builder .add (Branch (len_check , search_body , search_done , Branch .BOOL ))
510+ builder .activate_block (search_body )
511+
512+ items_start = vec_items (builder , vec )
513+ items_end = builder .int_add (items_start , builder .int_mul (len_val , step ))
514+
506515 for_loop = builder .begin_for (
507516 items_start , items_end , Integer (step , c_pyssize_t_rprimitive ), signed = False
508517 )
@@ -514,6 +523,7 @@ def vec_contains(builder: LowLevelIRBuilder, vec: Value, target: Value, line: in
514523 for_loop .finish ()
515524
516525 builder .keep_alive ([vec ], line )
526+ builder .goto_and_activate (search_done )
517527
518528 res = Register (bool_rprimitive )
519529 builder .assign (res , Integer (0 , bool_rprimitive ))
0 commit comments