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

            Bug ID: 118230
           Summary: `std::is_invocable` gives wrong result when the tested
                    function returns `auto`
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: one.last.kiss at outlook dot com
  Target Milestone: ---

A very easy-to-understand single file:

    #include <utility>
    #include <type_traits>
    struct A {
        struct B {
            auto operator()(const auto& i) const /* -> std::size_t */ {
                return std::hash<int>{}(i);
            }
        };
        static_assert(
            std::is_invocable_v<const B&, const int&>
        );  // FAILED!!!
    };
    int main() { A{}; }

Just use `g++ -std=c++26 a.cpp -o a.exe` to compile it.
The error message is:

    a.cpp:10:12: error: static assertion failed
       10 |       std::is_invocable_v<const B&, const int&>
          |       ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The workaround is to un-comment the "/* -> std::size_t */".
(Thanks to 康桓瑋 in his comment:
 <https://stackoverflow.com/questions/79302550/#comment139842516_79302550>.)

Here is a read-world case: <https://stackoverflow.com/q/79302550>.

However, `g++` sometimes works well.  E.g.,
<https://github.com/shynur/ipcator/blob/d0740607bdc8ba45c7a88f3023374c81a797daf8/include/ipcator.hpp#L637>.
Clone this repo (commit d07406) then run
`g++ -std=c++26 -Iinclude src/main.cpp -o main.exe`; there's no error or
warning.  I don't know why it can pass the compilation check, and it's
difficult for me to cut it down to a minimal reproducible example; I'm sorry.

Output of `g++ -v`:

    Using built-in specs.
    COLLECT_GCC=g++
   
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/15.0.0/lto-wrapper
    Target: x86_64-pc-linux-gnu
    Configured with: ../gcc/configure --enable-languages=c++ --disable-multilib
--enable-checking=release --disable-bootstrap
    Thread model: posix
    Supported LTO compression algorithms: zlib
    gcc version 15.0.0 20241224 (experimental) (GCC)

--
shynur

Reply via email to