一回で test が通るのはどうもおかしいと思ってたら、svn up 後にもう一度 build しようとしたら通らん。どうやら二つ config.h があった方の override される側を編集してた (?) か何かでぜーんぜん compact でない状態で build されてたらしい。
で、問題だらけ。

(0 ? (*(type*)NULL) = (x) : (x))

で type check を追加してたところ、左辺値でなくなるので error が出ることがわかった。もうめんどくさい…
追記: あ、でもちょっと良いこと思いついた。

#define SCM_TYPESAFE_CALL(macro, rettype, args, types)  \
    (0 ? (*(rettype (*)types)0)args                     \
       : macro args)

#define SAL(a, b, c)  (*a = b + c)
#define MAC(a, b, c)  SCM_TYPESAFE_CALL(SAL, int, (a, b, c), (int*, int, int))
int
main()
{
    int x = 0, y = 8, z = -8;

    MAC(x, y, z);
    return MAC(&x, y, z);
}