On 21 February 2018 at 14:15, Jeffrey Walton wrote: > Hi Everyone, > > I'm trying to determine when I can use std::uncaught_exceptions(). > > $ cat test.cxx > #include <iostream> > > #ifndef __has_feature > # define __has_feature(x) 0 > #endif > > #if _MSC_VER >= 1900 > # define MY_EXCEPTIONS 1 > #elif __has_feature(cxx_exceptions) __has_feature is a Clang extension, GCC doesn't support it, so this is always false. > # define MY_EXCEPTIONS 1 > #endif > > #ifdef MY_EXCEPTIONS > # include <exception> > #endif > > int main(int argc, char* argv[]) > { > #ifdef MY_EXCEPTIONS > std::cout << std::uncaught_exceptions() << std::endl; You're assuming that if Clang's cxx_exceptions feature is present then so is the new C++17 function, which is wrong. The recommended way to test for exceptions being enabled is to test #if __cpp_exceptions (that works on Clang and GCC, but not MSVC because they don't support WG21 SD-6 feature-test macros). The recommended way to test for std::uncaught_exceptions is #if __cpp_lib_uncaught_exceptions >= 201411 (that works with libstdc++ but not MSVC or libc++ because they don't support WG21 SD-6 feature-test macros for the standard library). SD-6 can be found at https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations