I've managed to reproduce this issue on two different machines, one amd64 and the other ppc64le. Both were using g++-11 (Ubuntu 11.1.0-1ubuntu1~21.04) 11.1.0.
Here is a minimal:
using namespace std;
vector<long int> Container(3'000'000);
iota(begin(Container), end(Container), 1);
sort(execution::par, begin(Container), end(Container));
Compiling raises the following pragma in header generated warning:
$ g++-11 test.cpp -o test -Wall -Werror -std=c++17 -ltbb && ./test
In file included from /usr/include/c++/11/pstl/parallel_backend_tbb.h:26,
/usr/include/tbb/task.h:21:139: note: ‘#pragma message: TBB Warning: tbb/task.h is deprecated. For details, please see Deprecated Features appendix in the TBB reference manual.’
21 | ("TBB Warning: tbb/task.h is deprecated. For details, please see Deprecated Features appendix in the TBB reference manual.")
Compiling again with #define TBB_SUPPRESS_DEPRECATED_MESSAGES 1 prepended to the beginning and the warning disappears.
This appears to have crept in some how with the 11 series. The <execution> header is indirectly including some deprecated Intel header from the TBB library.
Suggestion: Maybe a unit test that includes all the standard STL headers, does nothing with them, and that's expected to emit no warnings would mitigate problems like this occurring in the future.
tbb/task.h just got deprecated last year and after parallel_backend_tbb.h was added to GCC.
It depends on the version of TBB that is installed really. Looks like Ubuntu 11.1.0 is using a much newer version. You really should file a bug with Ubuntu about this issue since you are getting both GCC and TBB from them. We won't fixing Ubuntu's compiler even with this bug filed by the way.
Thanks Andrew. I've opened an issue downstream:
<execution> requires TBB, as documented:
"Note 3: The Parallel Algorithms have an external dependency on Intel TBB 2018 or later. If the <execution> header is included then -ltbb must be used to link to TBB."
If you use the parallel algos (or just include their headers) then the TBB headers are included. That's by design, they don't work otherwise. We can't do anythign about the fact that Intel deprecated their own API shortly after using contributing the PSTL headers to GCC, which depend on that API.
No, the gcc packages don't depend on any tbb package. Probably tbb needs an update to a new upstream version in the distro.
There's no easy solution. Intel contributed the PSTL headers with a dependency on TBB task.h header, then deprecated that header in a later TBB release. You need to either use an older TBB, or suppress the warning.
There is a plan to add an OpenMP backend to PSTL, which will remove the TBB dependency, but it's not ready yet.
This appears to be fixed upstream: https://reviews.llvm.org/D87380
Tom, it looks like that fix landed upstream after our last sync. Should we use it?
Yes (I already reviewed it when it arrived upstream). It is probably also safe to backport to GCC-11 since there's no ABI or ABI stability concerns. I will have a go at applying *just* this patch (I don't want to commit to trying a full rebase against upstream at this point).