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

Martin Hořeňovský <martin.horenovsky+gccbugzilla at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |martin.horenovsky+gccbugzil
                   |                            |la at gmail dot com

--- Comment #5 from Martin Hořeňovský <martin.horenovsky+gccbugzilla at gmail 
dot com> ---
Another reproducer is short-circuiting after a comma operator

```
#include <iostream>
#include <coroutine>

struct promise;

struct coroutine : std::coroutine_handle<promise> {
    using promise_type = ::promise;
};

struct promise {
    coroutine get_return_object() { return {coroutine::from_promise(*this)}; }
    std::suspend_never initial_suspend() noexcept { return {}; }
    std::suspend_never final_suspend() noexcept { return {}; }

    void return_void() {
    }

    void unhandled_exception() {
    }
};

struct Awaitable {
    bool await_ready() {
        static int counter{};
        std::cout << ++counter << std::endl;
        return true;
    }

    void await_suspend(std::coroutine_handle<>) {
    }

    bool await_resume() {
        return true;
    }
};

coroutine f() {
    Awaitable a{};
    // Ignored
    bool b = false && static_cast<const bool &>(!!(co_await a));
    // Evaluates
    (0, false && static_cast<const bool &>(!!(co_await a)));
}

int main() {
    f();
}


------

Prints "1". Interestingly, the simple short-circuiting expression works
properly, but the one after comma operator does not.

Reply via email to