forall(dtype T | sized(T)) T * malloc(void);

forall(dtype T, ttype Params | sized(T) | { void ?{}(T *, Params); })
T * new(Params p) {
  return ((T*)malloc()){ p }; // construct result of malloc
}

struct S { int x, y; }; 
void ?{}(S *, int, int);

int main() {
  S * s = new(3, 4);
}
