boostorg / asio

Boost.org asio module
http://boost.org/libs/asio
1.25k stars 416 forks source link

boost 1.77.0 and newer conflicts with Qt5 #393

Open hauihau opened 2 years ago

hauihau commented 2 years ago

We have a self-written program which compiled without any issues until 1.75.0. I had some spare time and tried to find out, why the compiler reports syntax errors since 1.76.0.

In file included from/software/libs/boost/1.79.0/include/boost/asio/associated_cancellation_slot.hpp(20), from /software/libs/boost/1.79.0/include/boost/asio.hpp(22), from src/mainwindow.h(47), from src/main.cpp(7): /software/libs/boost/1.79.0/include/boost/asio/cancellation_signal.hpp(116): error: expected a ")" void emit(cancellation_type_t type)

There are other source files, which also include asio.hpp which do not show this error. I added --save-temps (GCC)/-P (ICC) to the compiler flags and compared the resulting .ii/.i files.

The working source files contain:

  void emit(cancellation_type_t type)
  {
    if (handler_)
      handler_->call(type);
  }

The non working source files:

  void (cancellation_type_t type)
  {
    if (handler_)
      handler_->call(type);
  }

The issue is caused by Qt5 which has a line # define emit in https://github.com/qt/qtbase/blob/5.15.2/src/corelib/kernel/qobjectdefs.h#L97 (/usr/include/qt5/QtCore/qobjectdefs.h)

Would it be possible to rename the function so that we can use a current Boost together with Qt5?

Note: https://github.com/boostorg/asio/commit/3521da0834fd20a520dc33e5b256c59b20827842 introduced that function.

jcmonnin commented 2 years ago

The headers should work around that with pop_macro /push_macro, however this doesn't work properly in boost version 1.77.0 on windows: https://github.com/chriskohlhoff/asio/issues/895 Updating boost to a more recent version or appying the referenced patch is likely to fix the issue.

hauihau commented 2 years ago

I forgot to mention, that we use the classic Intel Compiler. Looks like pop_options.hpp lacks the pop_macro calls in the section for the intel compilers.

jcmonnin commented 2 years ago

I missed the ICC in the original message and the fact you are already using 1.79.0. Intel seems to support pop_macro/push_macro: https://www.intel.com/content/www/us/en/develop/documentation/cpp-compiler-developer-guide-and-reference/top/compiler-reference/pragmas/intel-supported-pragma-reference.html I would suggest you modify asio/detail/pop_options.hpp and for the Intel compiler, and if it works send a pull request.