@@ -3039,4 +3039,48 @@ mod test {
30393039 } ) ;
30403040 assert_eq ! ( 1 , exec_ctx. exec_hugr_u64( hugr, "main" ) ) ;
30413041 }
3042+
3043+ #[ rstest]
3044+ fn exec_discard_part_borrowed ( mut exec_ctx : TestContext ) {
3045+ use hugr_passes:: replace_types:: { DelegatingLinearizer , Linearizer } ;
3046+ // Builds a HUGR that:
3047+ // - Creates a borrow array [1,2,3]
3048+ // - Borrows index 1
3049+ // - Discards the borrow array using the ReplaceTypes linearizer
3050+ // And then runs this, i.e. to check that it does not panic.
3051+ let inn_arr_ty = borrow_array_type ( 2 , usize_t ( ) ) ;
3052+ let arr_ty = borrow_array_type ( 3 , inn_arr_ty. clone ( ) ) ;
3053+ let hugr = SimpleHugrConfig :: new ( )
3054+ . with_outs ( int_type ( 6 ) )
3055+ . with_extensions ( exec_registry ( ) )
3056+ . finish ( |mut builder| {
3057+ let inner_arrays = [ 1 , 3 , 5 ] . map ( |i| {
3058+ let elems = [ i, i + 1 ] . map ( |v| builder. add_load_value ( ConstUsize :: new ( v) ) ) ;
3059+ builder. add_new_borrow_array ( usize_t ( ) , elems) . unwrap ( )
3060+ } ) ;
3061+ let outer = builder
3062+ . add_new_borrow_array ( inn_arr_ty. clone ( ) , inner_arrays)
3063+ . unwrap ( ) ;
3064+ let idx = builder. add_load_value ( ConstUsize :: new ( 0 ) ) ;
3065+ let ( outer, inner) = builder
3066+ . add_borrow_array_borrow ( inn_arr_ty, 3 , outer, idx)
3067+ . unwrap ( ) ;
3068+ builder
3069+ . add_borrow_array_discard ( usize_t ( ) , 2 , inner)
3070+ . unwrap ( ) ;
3071+ let dl = DelegatingLinearizer :: default ( ) ;
3072+ let nt = dl. copy_discard_op ( & arr_ty, 0 ) . unwrap ( ) ;
3073+ nt. add ( & mut builder, [ outer] ) . unwrap ( ) ;
3074+ let res = builder. add_load_value ( ConstInt :: new_u ( 6 , 17 ) . unwrap ( ) ) ;
3075+ builder. finish_hugr_with_outputs ( [ res] ) . unwrap ( )
3076+ } ) ;
3077+ exec_ctx. add_extensions ( |cge| {
3078+ cge. add_default_prelude_extensions ( )
3079+ . add_logic_extensions ( )
3080+ . add_conversion_extensions ( )
3081+ . add_default_borrow_array_extensions ( DefaultPreludeCodegen )
3082+ . add_default_int_extensions ( )
3083+ } ) ;
3084+ assert_eq ! ( 17 , exec_ctx. exec_hugr_u64( hugr, "main" ) ) ;
3085+ }
30423086}
0 commit comments