In foo().tupleof , foo() should be evaluated once. 
For that, TupleExp::e0 becomes DeclarationExp ref __tup = foo(); and TupleExp::exps becomes (__tup.field0, __tup.field1, ...).