https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121097
Bug ID: 121097 Summary: hypot uses __promoted_t even when __cpp_fold_expressions is not defined Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: arthur.j.odwyer at gmail dot com Target Milestone: --- libstdc++'s <ext/type_traits.h> defines __gnu_cxx::__promoted_t if and only if __cpp_fold_expressions is defined by the compiler: #if __cpp_fold_expressions template<typename... _Tp> using __promoted_t = decltype((typename __promote<_Tp>::__type(0) + ...)); But libstdc++'s <cmath> tries to use that functionality on all compilers whose __cplusplus claims C++17 support: #ifdef __cpp_lib_hypot // C++ >= 17 && HOSTED [...] template<typename _Tp, typename _Up, typename _Vp> __gnu_cxx::__promoted_t<_Tp, _Up, _Vp> hypot(_Tp __x, _Up __y, _Vp __z) Therefore there is an obscure subset of compiler implementations -- those that set __cplusplus to 201703 but don't define __cpp_fold_expressions -- for which libstdc++'s <cmath> produces this error spew: /usr/include/c++/11/cmath:1880 error 5649: no template named '__promoted_t' in namespace '__gnu_cxx' /usr/include/c++/11/cmath:1883 error 5649: no template named '__promoted_t' in namespace '__gnu_cxx' /usr/include/c++/11/cmath:1884 error 40: undeclared identifier '__type' The example in front of me right now is PCLint 2.0 (November 2022). Now, we're also stuck on libstdc++ 11.4, so we're going to have to work around this on our end anyway (by manually -D__cpp_fold_expressions=201603 on our PC-Lint command line). But IMHO you should still want to harmonize these macros on your end: either define your __promoted_t more liberally in <ext/type_traits.h>, or else define the three-argument hypot() more conservatively in <cmath>.