// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s #include "Inputs/std-coroutine.h" struct resumable { struct promise_type { resumable get_return_object() { return {}; } auto initial_suspend() { return std::suspend_always(); } auto final_suspend() noexcept { return std::suspend_always(); } void unhandled_exception() {} void return_void(){}; }; }; resumable f1(int &out, int *inst) { static void* dispatch_table[] = {&&inc, // expected-error {{the GNU address of label extension is not allowed in coroutines.}} &&suspend, // expected-error {{the GNU address of label extension is not allowed in coroutines.}} &&stop}; // expected-error {{the GNU address of label extension is not allowed in coroutines.}} #define DISPATCH() goto *dispatch_table[*inst++] inc: out++; DISPATCH(); suspend: co_await std::suspend_always{}; DISPATCH(); stop: co_return; } resumable f2(int &out, int *inst) { void* dispatch_table[] = {nullptr, nullptr, nullptr}; dispatch_table[0] = &&inc; // expected-error {{the GNU address of label extension is not allowed in coroutines.}} dispatch_table[1] = &&suspend; // expected-error {{the GNU address of label extension is not allowed in coroutines.}} dispatch_table[2] = &&stop; // expected-error {{the GNU address of label extension is not allowed in coroutines.}} #define DISPATCH() goto *dispatch_table[*inst++] inc: out++; DISPATCH(); suspend: co_await std::suspend_always{}; DISPATCH(); stop: co_return; } resumable f3(int &out, int *inst) { void* dispatch_table[] = {nullptr, nullptr, nullptr}; [&]() -> resumable { dispatch_table[0] = &&inc; // expected-error {{the GNU address of label extension is not allowed in coroutines.}} dispatch_table[1] = &&suspend; // expected-error {{the GNU address of label extension is not allowed in coroutines.}} dispatch_table[2] = &&stop; // expected-error {{the GNU address of label extension is not allowed in coroutines.}} #define DISPATCH() goto *dispatch_table[*inst++] inc: out++; DISPATCH(); suspend: co_await std::suspend_always{}; DISPATCH(); stop: co_return; }(); co_return; }