https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101027

services+gccbugs at vasama dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |services+gccbugs at vasama dot 
org

--- Comment #6 from services+gccbugs at vasama dot org ---
I've just run into this bug as well. Here is another reproducer:
https://godbolt.org/z/1xbjGa7b7

```
#include <coroutine>
#include <exception>
#include <cstdio>

struct coroutine {
    struct promise_type {
        promise_type() { fprintf(stderr, "promise_type()\n"); }
        ~promise_type() { fprintf(stderr, "~promise_type()\n"); }
        coroutine get_return_object() noexcept { return {}; }
        std::suspend_never initial_suspend() noexcept { return {}; }
        std::suspend_never final_suspend() noexcept { return {}; }
        void return_void() noexcept { }
        void unhandled_exception() noexcept { std::terminate(); }
    };
};

struct awaitable {
    bool await_ready() {
        bool volatile ready_volatile = true;
        return ready_volatile;
    }

    void await_suspend(std::coroutine_handle<void> h) {
        void* volatile h_volatile;
        h_volatile = h.address();
        (void)h_volatile;
    }

    int await_resume() {
        return 1;
    }
};

int main() {
    []() -> coroutine {
        fprintf(stderr, "  enter task\n");
        #define TEST_EXPR co_await (fprintf(stderr, "      test expr\n"),
awaitable())
        do {
            fprintf(stderr, "    enter loop\n");
            TEST_EXPR;
            fprintf(stderr, "    leave loop\n");
        } while( false && static_cast<bool const&>(!!(TEST_EXPR)) );
        fprintf(stderr, "  leave task\n");
    }();
}
```

This prints:
```
promise_type()
  enter task
    enter loop
      test expr
    leave loop
      test expr
  leave task
~promise_type()
```

Note "test expr" printed twice.

Reply via email to