G M: Provides the _LIBCPP_WARNING macro, to be used for MSVC only, since that compiler doesn't support #warning.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@191980 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Howard Hinnant
2013-10-04 21:14:44 +00:00
parent 66a8fcecd9
commit f7555069ab
6 changed files with 78 additions and 25 deletions

View File

@@ -79,6 +79,9 @@
# endif # endif
# if defined(_MSC_VER) && !defined(__clang__) # if defined(_MSC_VER) && !defined(__clang__)
# define _LIBCPP_MSVC // Using Microsoft Visual C++ compiler # define _LIBCPP_MSVC // Using Microsoft Visual C++ compiler
# define _LIBCPP_TOSTRING2(x) #x
# define _LIBCPP_TOSTRING(x) _LIBCPP_TOSTRING2(x)
# define _LIBCPP_WARNING(x) __pragma(message(__FILE__ "(" _LIBCPP_TOSTRING(__LINE__) ") : warning note: " x))
# endif # endif
# // If mingw not explicitly detected, assume using MS C runtime only. # // If mingw not explicitly detected, assume using MS C runtime only.
# ifndef __MINGW32__ # ifndef __MINGW32__

View File

@@ -9,11 +9,19 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#ifdef min #ifdef min
#if defined(_MSC_VER) && ! defined(__clang__)
_LIBCPP_WARNING("macro min is incompatible with C++. #undefing min")
#else
#warning: macro min is incompatible with C++. #undefing min #warning: macro min is incompatible with C++. #undefing min
#endif
#undef min #undef min
#endif #endif
#ifdef max #ifdef max
#if defined(_MSC_VER) && ! defined(__clang__)
_LIBCPP_WARNING("macro max is incompatible with C++. #undefing max")
#else
#warning: macro max is incompatible with C++. #undefing max #warning: macro max is incompatible with C++. #undefing max
#endif
#undef max #undef max
#endif #endif

View File

@@ -206,7 +206,11 @@ template <class Key, class T, class Hash, class Pred, class Alloc>
#include <ext/__hash> #include <ext/__hash>
#if __DEPRECATED #if __DEPRECATED
#warning Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map> #if defined(_MSC_VER) && ! defined(__clang__)
_LIBCPP_WARNING("Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map>")
#else
# warning Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map>
#endif
#endif #endif
#pragma GCC system_header #pragma GCC system_header

View File

@@ -199,7 +199,11 @@ template <class Value, class Hash, class Pred, class Alloc>
#include <ext/__hash> #include <ext/__hash>
#if __DEPRECATED #if __DEPRECATED
#warning Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set> #if defined(_MSC_VER) && ! defined(__clang__)
_LIBCPP_WARNING("Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set>")
#else
# warning Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set>
#endif
#endif #endif
namespace __gnu_cxx { namespace __gnu_cxx {

View File

@@ -1,3 +1,5 @@
//===------------------------ exception.cpp -------------------------------===// //===------------------------ exception.cpp -------------------------------===//
// //
// The LLVM Compiler Infrastructure // The LLVM Compiler Infrastructure
@@ -39,6 +41,13 @@
static std::unexpected_handler __unexpected_handler; static std::unexpected_handler __unexpected_handler;
#endif // __has_include(<cxxabi.h>) #endif // __has_include(<cxxabi.h>)
_LIBCPP_NORETURN
static void _libcpp_abort(const char* msg)
{
printf("%s\n", msg);
abort();
}
namespace std namespace std
{ {
@@ -89,15 +98,13 @@ terminate() _NOEXCEPT
#endif // _LIBCPP_NO_EXCEPTIONS #endif // _LIBCPP_NO_EXCEPTIONS
(*get_terminate())(); (*get_terminate())();
// handler should not return // handler should not return
printf("terminate_handler unexpectedly returned\n"); _libcpp_abort("terminate_handler unexpectedly returned\n");
::abort ();
#ifndef _LIBCPP_NO_EXCEPTIONS #ifndef _LIBCPP_NO_EXCEPTIONS
} }
catch (...) catch (...)
{ {
// handler should not throw exception // handler should not throw exception
printf("terminate_handler unexpectedly threw an exception\n"); _libcpp_abort("terminate_handler unexpectedly threw an exception\n");
::abort ();
} }
#endif // _LIBCPP_NO_EXCEPTIONS #endif // _LIBCPP_NO_EXCEPTIONS
} }
@@ -111,12 +118,16 @@ bool uncaught_exception() _NOEXCEPT
// on Darwin, there is a helper function so __cxa_get_globals is private // on Darwin, there is a helper function so __cxa_get_globals is private
return __cxa_uncaught_exception(); return __cxa_uncaught_exception();
#else // __APPLE__ #else // __APPLE__
#warning uncaught_exception not yet implemented # if defined(_MSC_VER) && ! defined(__clang__)
printf("uncaught_exception not yet implemented\n"); _LIBCPP_WARNING("uncaught_exception not yet implemented")
::abort(); # else
# warning uncaught_exception not yet implemented
# endif
_libcpp_abort("uncaught_exception not yet implemented\n");
#endif // __APPLE__ #endif // __APPLE__
} }
#ifndef _LIBCPPABI_VERSION #ifndef _LIBCPPABI_VERSION
exception::~exception() _NOEXCEPT exception::~exception() _NOEXCEPT
@@ -149,9 +160,12 @@ exception_ptr::~exception_ptr() _NOEXCEPT
#if HAVE_DEPENDENT_EH_ABI #if HAVE_DEPENDENT_EH_ABI
__cxa_decrement_exception_refcount(__ptr_); __cxa_decrement_exception_refcount(__ptr_);
#else #else
#warning exception_ptr not yet implemented # if defined(_MSC_VER) && ! defined(__clang__)
printf("exception_ptr not yet implemented\n"); _LIBCPP_WARNING("exception_ptr not yet implemented")
::abort(); # else
# warning exception_ptr not yet implemented
# endif
_libcpp_abort("exception_ptr not yet implemented\n");
#endif // __APPLE__ #endif // __APPLE__
} }
@@ -161,9 +175,14 @@ exception_ptr::exception_ptr(const exception_ptr& other) _NOEXCEPT
#if HAVE_DEPENDENT_EH_ABI #if HAVE_DEPENDENT_EH_ABI
__cxa_increment_exception_refcount(__ptr_); __cxa_increment_exception_refcount(__ptr_);
#else #else
#warning exception_ptr not yet implemented
printf("exception_ptr not yet implemented\n"); # if defined(_MSC_VER) && ! defined(__clang__)
::abort(); _LIBCPP_WARNING("exception_ptr not yet implemented")
# else
# warning exception_ptr not yet implemented
# endif
_libcpp_abort("exception_ptr not yet implemented\n");
#endif // __APPLE__ #endif // __APPLE__
} }
@@ -178,9 +197,14 @@ exception_ptr& exception_ptr::operator=(const exception_ptr& other) _NOEXCEPT
} }
return *this; return *this;
#else // __APPLE__ #else // __APPLE__
#warning exception_ptr not yet implemented
printf("exception_ptr not yet implemented\n"); # if defined(_MSC_VER) && ! defined(__clang__)
::abort(); _LIBCPP_WARNING("exception_ptr not yet implemented")
# else
# warning exception_ptr not yet implemented
# endif
_libcpp_abort("exception_ptr not yet implemented\n");
#endif // __APPLE__ #endif // __APPLE__
} }
@@ -213,9 +237,12 @@ exception_ptr current_exception() _NOEXCEPT
ptr.__ptr_ = __cxa_current_primary_exception(); ptr.__ptr_ = __cxa_current_primary_exception();
return ptr; return ptr;
#else // __APPLE__ #else // __APPLE__
#warning exception_ptr not yet implemented # if defined(_MSC_VER) && ! defined(__clang__)
printf("exception_ptr not yet implemented\n"); _LIBCPP_WARNING( "exception_ptr not yet implemented" )
::abort(); # else
# warning exception_ptr not yet implemented
# endif
_libcpp_abort("exception_ptr not yet implemented\n");
#endif // __APPLE__ #endif // __APPLE__
} }
@@ -227,9 +254,12 @@ void rethrow_exception(exception_ptr p)
// if p.__ptr_ is NULL, above returns so we terminate // if p.__ptr_ is NULL, above returns so we terminate
terminate(); terminate();
#else // __APPLE__ #else // __APPLE__
#warning exception_ptr not yet implemented # if defined(_MSC_VER) && ! defined(__clang__)
printf("exception_ptr not yet implemented\n"); _LIBCPP_WARNING("exception_ptr not yet implemented")
::abort(); # else
# warning exception_ptr not yet implemented
# endif
_libcpp_abort("exception_ptr not yet implemented\n");
#endif // __APPLE__ #endif // __APPLE__
} }
} // std } // std

View File

@@ -89,7 +89,11 @@ thread::hardware_concurrency() _NOEXCEPT
#else // defined(CTL_HW) && defined(HW_NCPU) #else // defined(CTL_HW) && defined(HW_NCPU)
// TODO: grovel through /proc or check cpuid on x86 and similar // TODO: grovel through /proc or check cpuid on x86 and similar
// instructions on other architectures. // instructions on other architectures.
#warning hardware_concurrency not yet implemented # if defined(_MSC_VER) && ! defined(__clang__)
_LIBCPP_WARNING("hardware_concurrency not yet implemented")
# else
# warning hardware_concurrency not yet implemented
# endif
return 0; // Means not computable [thread.thread.static] return 0; // Means not computable [thread.thread.static]
#endif // defined(CTL_HW) && defined(HW_NCPU) #endif // defined(CTL_HW) && defined(HW_NCPU)
} }