Clang 14.x ornery about std::experimental::coroutine_traits
Closed this issue · 3 comments
Environment:
- Debian Bookworm x64
- Qt 6.6.1
- Android NDK 25.1.8937393
- Clang v14.0.6 AARCH64 (provided in NDK)
While compiling for Android, we get:
support for std::experimental::coroutine_traits will be removed in LLVM 15; use std::coroutine_traits instead
Which promotes from a warning to an error. Workaround is to specify in CMakeLists.txt
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
add_compile_options(-Wno-error=deprecated-experimental-coroutine)
endif()
Which gets us going, but presumably Clang 15+ that will fail. However, I see PRs in this repo which are using Clang 17. So who knows. All I know is my Android compile failed without the workaround
std::experimental
isn't used if the standard library defines __cpp_lib_coroutine
, thus I suspect something is fishy with clang/libc++ in Android NDK...I downloaded the Android NDK 25 (I downloaded 25.2.9519653, which is slightly newer than yours, but that shouldn't matter), and searching the NDK I can only find the <experimental/coroutine> header:
❯ cd android-ndk-r25c
❯ find . -name "coroutine"
./toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/experimental/coroutine
./sources/cxx-stl/llvm-libc++/include/experimental/coroutine
The reason why is most likely because the Android NDK ships clang 14, but the libc++ standard library is older:
❯ cat toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/__libcpp_version
11000
libc++ 11 indeed does not have the <coroutines>
include header, only <experimental/coroutines>
, so QCoro falls back to including that, which triggers the warning from clang.
I'll add the compile option to QCoro when building on Android....
Btw I also checked NDK 26, which ships libc++ 17 which does have full coroutine support, so QCoro should work there out of the box without any changes.
Your attention to detail is remarkable. Thank you!