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 とでも定義するべな。