KhronosGroup / Vulkan-Hpp

Open-Source Vulkan C++ API
Apache License 2.0
3.08k stars 304 forks source link

Including `vulkan.hpp` causes compilation error with Clang #1884

Closed Lephar closed 2 months ago

Lephar commented 3 months ago

With Vulkan Headers 1.3.285 and Clang 17.0.6 (and with CMake 3.29.3 and Ninja 1.12.1 if that makes any difference), just including vulkan.hpp is a compilation error. Everything worked as expected until last week, so it could be caused by any of them. GCC (14.1.1) compiles just fine, vulkan.h also compiles fine with both Clang and GCC. As with vulkan.hpp, vulkan_raii.hpp is also affected by this. Here is a simple test code and its error output:

#include <vulkan/vulkan.hpp>

int main()
{
    return 0;
}
[main] Building folder: Test 
[build] Starting build
[proc] Executing command: /usr/bin/cmake --build /home/arch/Test/build --config Debug --target all --
[build] [1/2  50% :: 2.698] Building CXX object CMakeFiles/Test.dir/src/Main.cpp.o
[build] FAILED: CMakeFiles/Test.dir/src/Main.cpp.o 
[build] /usr/bin/clang++ -g -std=gnu++23 -Wall -Wextra -MD -MT CMakeFiles/Test.dir/src/Main.cpp.o -MF CMakeFiles/Test.dir/src/Main.cpp.o.d -o CMakeFiles/Test.dir/src/Main.cpp.o -c /home/arch/Test/src/Main.cpp
[build] In file included from /home/arch/Test/src/Main.cpp:1:
[build] In file included from /usr/include/vulkan/vulkan.hpp:14:
[build] In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/string:67:
[build] In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/memory_resource.h:41:
[build] In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/uses_allocator_args.h:39:
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/tuple:956:36: error: no matching function for call to 'get'
[build]   956 |             return __convertible<decltype(std::get<_Is>(std::declval<_UTuple>()))...>();
[build]       |                                           ^~~~~~~~~~~~~
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/tuple:955:11: note: in instantiation of function template specialization 'std::tuple<unsigned int &&>::__convertible_from_tuple_like()::(anonymous class)::operator()<0UL>' requested here
[build]   955 |           return []<size_t... _Is>(index_sequence<_Is...>) {
[build]       |                  ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/tuple:1136:22: note: in instantiation of function template specialization 'std::tuple<unsigned int &&>::__convertible_from_tuple_like<unsigned int>' requested here
[build]  1136 |         constexpr explicit(!__convertible_from_tuple_like<_UTuple>())
[build]       |                             ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/tuple:2651:36: note: while substituting deduced template arguments into function template 'tuple' [with _UTuple = unsigned int]
[build]  2651 |     { return tuple<_Elements&&...>(std::forward<_Elements>(__args)...); }
[build]       |                                    ^
[build] /usr/include/vulkan/vulkan_funcs.hpp:18236:38: note: in instantiation of function template specialization 'std::forward_as_tuple<unsigned int>' requested here
[build]  18236 |       std::piecewise_construct, std::forward_as_tuple( timestampInfos.size() ), std::forward_as_tuple( 0 ) );
[build]        |                                      ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:122:5: note: candidate template ignored: could not match 'tuple<_Elements...>' against 'unsigned int'
[build]   122 |     get(tuple<_Elements...>& __t) noexcept;
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:126:5: note: candidate template ignored: could not match 'tuple<_Elements...>' against 'unsigned int'
[build]   126 |     get(const tuple<_Elements...>& __t) noexcept;
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:130:5: note: candidate template ignored: could not match 'tuple<_Elements...>' against 'unsigned int'
[build]   130 |     get(tuple<_Elements...>&& __t) noexcept;
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:134:5: note: candidate template ignored: could not match 'tuple<_Elements...>' against 'unsigned int'
[build]   134 |     get(const tuple<_Elements...>&& __t) noexcept;
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1250:5: note: candidate template ignored: could not match 'pair<_Tp1, _Tp2>' against 'unsigned int'
[build]  1250 |     get(pair<_Tp1, _Tp2>& __in) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1255:5: note: candidate template ignored: could not match 'pair<_Tp1, _Tp2>' against 'unsigned int'
[build]  1255 |     get(pair<_Tp1, _Tp2>&& __in) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1260:5: note: candidate template ignored: could not match 'pair<_Tp1, _Tp2>' against 'unsigned int'
[build]  1260 |     get(const pair<_Tp1, _Tp2>& __in) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1265:5: note: candidate template ignored: could not match 'pair<_Tp1, _Tp2>' against 'unsigned int'
[build]  1265 |     get(const pair<_Tp1, _Tp2>&& __in) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/ranges_util.h:444:5: note: candidate template ignored: could not match 'subrange<_It, _Sent, _Kind>' against 'unsigned int'
[build]   444 |     get(const subrange<_It, _Sent, _Kind>& __r)
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/ranges_util.h:455:5: note: candidate template ignored: could not match 'subrange<_It, _Sent, _Kind>' against 'unsigned int'
[build]   455 |     get(subrange<_It, _Sent, _Kind>&& __r)
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/array:390:5: note: candidate template ignored: could not match 'array<_Tp, _Nm>' against 'unsigned int'
[build]   390 |     get(array<_Tp, _Nm>& __arr) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/array:399:5: note: candidate template ignored: could not match 'array<_Tp, _Nm>' against 'unsigned int'
[build]   399 |     get(array<_Tp, _Nm>&& __arr) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/array:408:5: note: candidate template ignored: could not match 'array<_Tp, _Nm>' against 'unsigned int'
[build]   408 |     get(const array<_Tp, _Nm>& __arr) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/array:417:5: note: candidate template ignored: could not match 'array<_Tp, _Nm>' against 'unsigned int'
[build]   417 |     get(const array<_Tp, _Nm>&& __arr) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1272:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1272 |     get(pair<_Tp, _Up>& __p) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1277:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1277 |     get(const pair<_Tp, _Up>& __p) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1282:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1282 |     get(pair<_Tp, _Up>&& __p) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1287:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1287 |     get(const pair<_Tp, _Up>&& __p) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1292:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1292 |     get(pair<_Up, _Tp>& __p) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1297:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1297 |     get(const pair<_Up, _Tp>& __p) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1302:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1302 |     get(pair<_Up, _Tp>&& __p) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1307:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1307 |     get(const pair<_Up, _Tp>&& __p) noexcept
[build]       |     ^
[build] In file included from /home/arch/Test/src/Main.cpp:1:
[build] In file included from /usr/include/vulkan/vulkan.hpp:14:
[build] In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/string:67:
[build] In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/memory_resource.h:41:
[build] In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/uses_allocator_args.h:39:
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/tuple:956:36: error: no matching function for call to 'get'
[build]   956 |             return __convertible<decltype(std::get<_Is>(std::declval<_UTuple>()))...>();
[build]       |                                           ^~~~~~~~~~~~~
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/tuple:955:11: note: in instantiation of function template specialization 'std::tuple<int &&>::__convertible_from_tuple_like()::(anonymous class)::operator()<0UL>' requested here
[build]   955 |           return []<size_t... _Is>(index_sequence<_Is...>) {
[build]       |                  ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/tuple:1136:22: note: in instantiation of function template specialization 'std::tuple<int &&>::__convertible_from_tuple_like<int>' requested here
[build]  1136 |         constexpr explicit(!__convertible_from_tuple_like<_UTuple>())
[build]       |                             ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/tuple:2651:36: note: while substituting deduced template arguments into function template 'tuple' [with _UTuple = int]
[build]  2651 |     { return tuple<_Elements&&...>(std::forward<_Elements>(__args)...); }
[build]       |                                    ^
[build] /usr/include/vulkan/vulkan_funcs.hpp:18236:86: note: in instantiation of function template specialization 'std::forward_as_tuple<int>' requested here
[build]  18236 |       std::piecewise_construct, std::forward_as_tuple( timestampInfos.size() ), std::forward_as_tuple( 0 ) );
[build]        |                                                                                      ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:122:5: note: candidate template ignored: could not match 'tuple<_Elements...>' against 'int'
[build]   122 |     get(tuple<_Elements...>& __t) noexcept;
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:126:5: note: candidate template ignored: could not match 'tuple<_Elements...>' against 'int'
[build]   126 |     get(const tuple<_Elements...>& __t) noexcept;
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:130:5: note: candidate template ignored: could not match 'tuple<_Elements...>' against 'int'
[build]   130 |     get(tuple<_Elements...>&& __t) noexcept;
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:134:5: note: candidate template ignored: could not match 'tuple<_Elements...>' against 'int'
[build]   134 |     get(const tuple<_Elements...>&& __t) noexcept;
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1250:5: note: candidate template ignored: could not match 'pair<_Tp1, _Tp2>' against 'int'
[build]  1250 |     get(pair<_Tp1, _Tp2>& __in) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1255:5: note: candidate template ignored: could not match 'pair<_Tp1, _Tp2>' against 'int'
[build]  1255 |     get(pair<_Tp1, _Tp2>&& __in) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1260:5: note: candidate template ignored: could not match 'pair<_Tp1, _Tp2>' against 'int'
[build]  1260 |     get(const pair<_Tp1, _Tp2>& __in) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1265:5: note: candidate template ignored: could not match 'pair<_Tp1, _Tp2>' against 'int'
[build]  1265 |     get(const pair<_Tp1, _Tp2>&& __in) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/ranges_util.h:444:5: note: candidate template ignored: could not match 'subrange<_It, _Sent, _Kind>' against 'int'
[build]   444 |     get(const subrange<_It, _Sent, _Kind>& __r)
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/ranges_util.h:455:5: note: candidate template ignored: could not match 'subrange<_It, _Sent, _Kind>' against 'int'
[build]   455 |     get(subrange<_It, _Sent, _Kind>&& __r)
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/array:390:5: note: candidate template ignored: could not match 'array<_Tp, _Nm>' against 'int'
[build]   390 |     get(array<_Tp, _Nm>& __arr) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/array:399:5: note: candidate template ignored: could not match 'array<_Tp, _Nm>' against 'int'
[build]   399 |     get(array<_Tp, _Nm>&& __arr) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/array:408:5: note: candidate template ignored: could not match 'array<_Tp, _Nm>' against 'int'
[build]   408 |     get(const array<_Tp, _Nm>& __arr) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/array:417:5: note: candidate template ignored: could not match 'array<_Tp, _Nm>' against 'int'
[build]   417 |     get(const array<_Tp, _Nm>&& __arr) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1272:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1272 |     get(pair<_Tp, _Up>& __p) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1277:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1277 |     get(const pair<_Tp, _Up>& __p) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1282:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1282 |     get(pair<_Tp, _Up>&& __p) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1287:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1287 |     get(const pair<_Tp, _Up>&& __p) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1292:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1292 |     get(pair<_Up, _Tp>& __p) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1297:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1297 |     get(const pair<_Up, _Tp>& __p) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1302:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1302 |     get(pair<_Up, _Tp>&& __p) noexcept
[build]       |     ^
[build] /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.1.1/../../../../include/c++/14.1.1/bits/stl_pair.h:1307:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
[build]  1307 |     get(const pair<_Up, _Tp>&& __p) noexcept
[build]       |     ^
[build] 2 errors generated.
[build] ninja: build stopped: subcommand failed.
[proc] The command: /usr/bin/cmake --build /home/arch/Test/build --config Debug --target all -- exited with code: 1
[driver] Build completed: 00:00:02.734
[build] Build finished with exit code 1
sharadhr commented 3 months ago

I'm not sure this is a Vulkan-Hpp problem; your compilation error says as much:

[build] In file included from /home/arch/Test/src/Main.cpp:1:
[build] In file included from /usr/include/vulkan/vulkan.hpp:14:

vulkan.hpp:14 is #include <string>.

Narrowing down the problem leads to

#include <string>
int main() { return 0; }

Try to compile that and see if it works; I am guessing it won't. You say you're using Clang 17.0.6, and you have GCC 14.1.1. It is possible that Clang 17 is incompatible with libstdc++ 14.1.1 (the latter is several months newer).

As a workaround, you could compile with the LLVM C++ standard library by passing in -stdlib=libc++.

Lephar commented 3 months ago
I'm not sure this is a Vulkan-Hpp problem; your compilation error says as much: ``` [build] In file included from /home/arch/Test/src/Main.cpp:1: [build] In file included from /usr/include/vulkan/vulkan.hpp:14: ``` `vulkan.hpp:14` is `#include `. Narrowing down the problem leads to ``` #include int main() { return 0; } ``` Try to compile that and see if it works; I am guessing it won't. You say you're using Clang 17.0.6, and you have GCC 14.1.1. It is possible that Clang 17 is incompatible with libstdc++ 14.1.1 (the latter is several months newer).

I tried that before posting but forgot to mention. It actually compiles just fine, I have no idea why the compiler points to #include <string> in the vulkan.hpp.

As a workaround, you could compile with the LLVM C++ standard library by passing in -stdlib=libc++.

Your suggestion also works. It may point to an incompatibility indeed.

asuessenbach commented 3 months ago

So it seems, this issue is resolved (at least regarding Vulkan-Hpp)?

Lephar commented 3 months ago

I don't think so, it's the #include<string> one that compiles, not the #include<vulkan/vulkan.hpp>

Lephar commented 2 months ago

It's resolved after updating Clang and the toolchain to 18.1.8. It was indeed caused by incompatible standard library.