Ints, floats and bools are passed by value. For floats it will require sth like this:
float x,y,r; ... r = tan2(x,y*2);
to be translated to:
{ double _1, _2; _1 = x; _2 = y*2; r = *(double*)tan2(&_1,&_2); }
Value returned from tan2() has to be stored in GC_malloc'ed() area, otherwise it wouldn't typeof(tan2) would be not a subtype of *('a,'a)->'a.
Other datatypes (unions, structures, tuples and objects) are passed by reference.
There can be confusion with:
f(*[int,int] a) { let [x,y] = a in { x = 10; y = 20 } } g() { int x, y; x = 5; f([x,y]); // whatever here x is still 5, or 10? }
It is 5. However this more due to implementation, then to anything else, because it is inconsitent with:
[x, y] = [10, 20];
after which x is 10 and y is 20. But this is general problem with treating variables as addresses on the left side of `='.