Fold in genarray fails for struct
In the type inference, the following program gives error No definition found for a function "sacprelude_d::zero" that accepts an argument of type _MAIN::_struct_Body" as parameter no 1. Full argument types are "(_MAIN::_struct_Body)"
struct Body {
double x;
double y;
double z;
};
struct Body add(struct Body a, struct Body b)
{
res = Body {_add_SxS_(a.x, b.x),
_add_SxS_(a.y, b.y),
_add_SxS_(a.z, b.z)};
return res;
}
struct Body[N]
acc_v(struct Body[N] px, struct Body[N] pxs, double[N] ms)
{
return {iv -> with {
([0] <= jv < [N]): px[iv];
}: fold(add, Body {0d, 0d, 0d})
| iv < [N]};
}
int main()
{
return 0;
}
Sac version
sac2c 1.3.3-MijasCosta-1208-g8c73d
build-type: DEBUG
built-by: "thomas" at 2024-04-26T09:16:25
no compile options. The output of sac2c_d -btc:esp -printfun acc_v
is
/*-----------------------------------------------*/
/*
* SAC-Program test.sac :
*/
/****************************************************************************
* _MAIN::acc_v(...) [ body ]
****************************************************************************/
#34: in [ --, _MAIN::_struct_Body[*]] le <> ge <> _MAIN::acc_v( _MAIN::_struct_Body[.] px { ,NN } , _MAIN::_struct_Body[.] pxs { ,NN } , double[.] ms { ,NN } )
/*
* acc_v :: ---
*/
{
unknown[*] _flat_31__SSA0_1 { , NN } ;
unknown[*] _mose_6__SSA0_1 { , NN } ;
unknown[*] jv__SSA0_1 { , NN } ;
unknown[*] iv { , NN } ;
unknown[*] _hse_7 { , NN } ;
unknown[*] _mose_6 { , NN } ;
unknown[*] jv { , NN } ;
unknown[*] N { , NN } ;
unknown[*] _flat_52 { , NN } ;
unknown[*] _flat_51 { , NN } ;
unknown[*] _flat_50 { , NN } ;
unknown[*] _flat_49 { , NN } ;
unknown[*] _flat_48 { , NN } ;
unknown[*] _flat_47 { , NN } ;
unknown[*] _flat_46 { , NN } ;
unknown[*] _flat_45 { , NN } ;
unknown[*] _flat_44 { , NN } ;
unknown[*] _flat_43 { , NN } ;
unknown[*] _flat_42 { , NN } ;
unknown[*] _flat_41 { , NN } ;
unknown[*] _flat_40 { , NN } ;
unknown[*] _flat_39 { , NN } ;
unknown[*] _flat_38 { , NN } ;
unknown[*] _flat_37 { , NN } ;
unknown[*] _flat_36 { , NN } ;
unknown[*] _flat_35 { , NN } ;
unknown[*] _flat_34 { , NN } ;
unknown[*] _flat_33 { , NN } ;
unknown[*] _flat_32 { , NN } ;
unknown[*] _flat_31 { , NN } ;
unknown[*] _flat_30 { , NN } ;
unknown[*] _flat_29 { , NN } ;
unknown[*] _flat_28 { , NN } ;
unknown[*] _flat_27 { , NN } ;
unknown[*] _flat_26 { , NN } ;
unknown[*] _flat_25 { , NN } ;
unknown[*] _flat_24 { , NN } ;
unknown[*] _flat_23 { , NN } ;
unknown[*] _flat_22 { , NN } ;
unknown[*] _flat_21 { , NN } ;
unknown[*] _flat_20 { , NN } ;
unknown[*] _flat_19 { , NN } ;
unknown[*] _flat_18 { , NN } ;
unknown[*] _flat_17 { , NN } ;
_flat_19 = _shape_A_( px);
_flat_18 = 0;
_flat_17 = [ _flat_18 ];
N = _sel_VxA_( _flat_17, _flat_19);
_flat_26 = [ N ];
_flat_25 = 0;
_flat_24 = [ _flat_25 ];
_flat_23 = 0.0;
_flat_22 = 0.0;
_flat_21 = 0.0;
_flat_20 = wrapper:_MAIN::_struct_con_Body( _flat_21, _flat_22, _flat_23) ;
_mose_6 = with {
/* Partn */
(_flat_24 <= jv < _flat_26)
{
_flat_30 = [ N ];
_flat_29 = 0;
_flat_28 = _mul_SxV_( _flat_29, _flat_30);
_flat_27 = wrapper:_MAIN::sel( _flat_28, px) ;
} : _flat_27 ;
} :
fold( _MAIN::add(), _flat_20);
_flat_44 = [ N ];
_flat_43 = [ N ];
_flat_42 = 0;
_flat_41 = _mul_SxV_( _flat_42, _flat_43);
_flat_39 = _shape_A_( _mose_6);
_flat_38 = _shape_A_( _mose_6);
_flat_37 = 0;
_flat_36 = _mul_SxV_( _flat_37, _flat_38);
_flat_35 = wrapper:sacprelude_d::zero( _mose_6) ;
_flat_34 = _shape_A_( _mose_6);
_flat_33 = with {
/* Partn */
(_flat_36 <= _hse_7 < _flat_39)
{
_flat_40 = wrapper:sacprelude_d::zero( _mose_6) ;
} : _flat_40 ;
} :
genarray( _flat_34, _flat_35);
_flat_32 = [ N ];
_flat_31 = with {
/* Partn */
(_flat_41 <= iv < _flat_44)
{
_flat_51 = [ N ];
_flat_50 = 0;
_flat_49 = [ _flat_50 ];
_flat_48 = 0.0;
_flat_47 = 0.0;
_flat_46 = 0.0;
_flat_45 = wrapper:_MAIN::_struct_con_Body( _flat_46, _flat_47, _flat_48) ;
_mose_6__SSA0_1 = with {
/* Partn */
(_flat_49 <= jv__SSA0_1 < _flat_51)
{
_flat_52 = wrapper:_MAIN::sel( iv, px) ;
} : _flat_52 ;
} :
fold( _MAIN::add(), _flat_45);
} : _mose_6__SSA0_1 ;
} :
genarray( _flat_32, _flat_33);
_flat_31__SSA0_1 = _type_conv_( _MAIN::_struct_Body[.], _flat_31);
return( _flat_31__SSA0_1);
}
/*-----------------------------------------------*/