#include "decaf/expr.hxx"

class Foo {
private:
    template<BinOp OP, class L, class R, class T> friend class BinExpr;
    template<UnOp OP, class R, class T> friend class UnExpr;
    template<class T> friend struct Reify;
    Foo(const NOINIT&) {}
public:
    int x;
    Foo(int x) : x(x) {}
};

namespace decaf { namespace internal {
DECLARE_BINOP(ADD,Foo,Foo,Foo,out.x = l.x+r.x)
DECLARE_BINOP(SUB,Foo,Foo,Foo,out.x = l.x-r.x)
DECLARE_BINOP(MUL,Foo,Foo,Foo,out.x = l.x*r.x)
DECLARE_BINOP(EQ,Foo,Foo,bool,out = l.x==r.x)
DECLARE_PARTIAL_UNOP(INV,Foo,Foo,out.x = 1/r.x; return (r.x!=0))
}}

Foo frobble() {
    Foo a(1);
    a = a+a+a;
    a = a*a;
    a = a/a;
    (void)(a==(a+a));
    return a;
}