chriskohlhoff / asio

Asio C++ Library
http://think-async.com/Asio
4.97k stars 1.22k forks source link

Asio from Boost 1.86.0 fails to build with C++20 w/o concepts #1547

Open iv-m opened 1 month ago

iv-m commented 1 month ago

When porting my software to boost 1.86.0, I found a strange error that I narrowed down to the following example.

test.cpp:

#include <boost/asio.hpp>

int main() { return 0; }
$ g++ -DBOOST_ASIO_DISABLE_CONCEPTS -std=c++20 test.cpp
In file included from /usr/include/boost/asio.hpp:69,
                 from test.cpp:2:
/usr/include/boost/asio/co_composed.hpp:849:13: error: ‘async_operation’ has not been declared
  849 |   template <async_operation Op>
      |             ^~~~~~~~~~~~~~~
/usr/include/boost/asio/co_composed.hpp:850:24: error: ‘Op’ has not been declared
  850 |   auto await_transform(Op&& op
      |                        ^~
[... and a few more errors, as compiler does not now what Op is]

I'm using x86_64 linux, gcc 13.2.1.

I see a similar error with clang 18.1.8.

If I drop -DBOOST_ASIO_DISABLE_CONCEPTS or standard specification, the code compiles just fine.

FireBurn commented 2 weeks ago

I'm also seeing this in Clang 19.1.3

iv-m commented 2 weeks ago

Yeah, same with gcc 14.2.1 and calng 19.1.3.

Also I get a similar error for the current master from this repo (bb85475e13d73373fdb4928bfcb96e5ca4853018):

$ cat $TMPDIR/reproducer.cpp
#include <asio.hpp>

int main() { return 0; }
$ g++ -DASIO_DISABLE_CONCEPTS -Iasio/include  -std=c++20 "$TMPDIR/reproducer.cpp"
In file included from asio/include/asio.hpp:67,
                 from /tmp/.private/iv/reproducer.cpp:1:
asio/include/asio/co_composed.hpp:848:13: error: ‘async_operation’ has not been declared
  848 |   template <async_operation Op>
      |             ^~~~~~~~~~~~~~~
asio/include/asio/co_composed.hpp:849:24: error: ‘Op’ has not been declared
  849 |   auto await_transform(Op&& op
      |                        ^~