いつも引数付きでyield()してるから勘違いしてた。
普通はlua_gettop(L) == 0だけじゃだめだ。

int main(int argc, char *argv[])
{
  lua_State *L;

  L = lua_open();
  luaopen_base(L); lua_settop(L, 0);
  luaL_loadfile(L, "test.lua");
  for (;;) {
    lua_Debug ar;
    int i, n;
    
    if (lua_resume(L, 0) != 0) {
      fprintf(stderr, "%s\n", lua_tostring(L, -1));
      break;
    }
    if (lua_getstack(L, 0, &ar) == 0 && lua_gettop(L) == 0) break;
    fputs("yield(", stdout);
    n = lua_gettop(L);
    for (i = 0; i < n; i ++) {
      if (i > 0) fputs(", ", stdout);
      fputs(lua_tostring(L, 1 + i), stdout);
    }
    fputs(")\n", stdout);
  }
  lua_close(L);
  return 0;
}