forall(otype T)
struct wrapper
{
    T val;
};

forall(otype T)
void ctor(wrapper(T)* this)
{
    this->val = 0;
}

forall(otype T)
wrapper(T) gcmalloc()
{
    wrapper(T) w;
    ctor(&w);
    return w;
}

forall(otype T)
wrapper(T)* ?=? (wrapper(T)* lhs, wrapper(T)* rhs)
{
    lhs->val = rhs->val;
    return lhs;
}

int main(int argc, char *argv[])
{
    wrapper(int) test;
    test = gcmalloc();
    return 0;
}
