SCM_ASSERT()

#define TRL_EXECUTE(foo) (SCM_ASSERT(bar), baz)
としていたので、非 debug 時には (, baz) と展開されてしまい、error になる。他にも
#define SCM_ENCODING_ASSERT(cond) (SCM_ASSERT(cond))
も SCM_ENCODING_ASSERT(foo); が (); と展開されてしまい、error になる。

後者は空になるかもしれない macro の呼び出しは括弧で括らない (というか () 演算子の優先度は非常に高いのでそもそも要らなそげ) ようにすれば回避できるけど、前者は厄介だな。
追記: いや、優先順位の問題じゃないな。作用する phase が他の演算子と違うので、lexically juxtaposed である限り最優先で処理されるのだ。

#if ! DEBUG
SCM_ASSERT(cond) 0
#endif

とかすると今度は "statement with no effect" の警告が邪魔だし。おおそうだ、libc の assert() を見てみようということで開いてみると (void) cast がついていた。なるほどね。空っぽは本当はいけないのか…。
移植性のほどがわからんので、SCM_VOID_EXPR とでも定義するべな。