https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121016
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- I think you could just use do { } while(0) instead of a statement expression here. That is: #define COTHREAD_PROTOTHREAD(f) do { \ using namespace Glow::Cothreads; \ int result = Completed; \ do { \ int v = f; \ result = Completed; \ if (v & THREAD_READY) result = Yielded; \ if (v & THREAD_BLOCKED) result = Blocked; \ if (v & THREAD_SLEEPING) result = Sleeping; \ if (result != Completed) \ co_yield cothread_result{result}; \ } while (result != Completed); } while (false)