//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include #include #include #include "test_macros.h" // typedef decltype(nullptr) nullptr_t; struct A { A(std::nullptr_t) {} }; template void test_conversions() { { T p = 0; assert(p == nullptr); } { T p = nullptr; assert(p == nullptr); assert(nullptr == p); assert(!(p != nullptr)); assert(!(nullptr != p)); } } template struct Voider { typedef void type; }; template struct has_less : std::false_type {}; template struct has_less() < nullptr)>::type> : std::true_type {}; template void test_comparisons() { T p = nullptr; assert(p == nullptr); assert(!(p != nullptr)); assert(nullptr == p); assert(!(nullptr != p)); } #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wnull-conversion" #endif void test_nullptr_conversions() { // GCC does not accept this due to CWG Defect #1423 // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1423 #if defined(__clang__) { bool b = nullptr; assert(!b); } #endif { bool b(nullptr); assert(!b); } } #if defined(__clang__) #pragma clang diagnostic pop #endif int main() { static_assert(sizeof(std::nullptr_t) == sizeof(void*), "sizeof(std::nullptr_t) == sizeof(void*)"); { test_conversions(); test_conversions(); test_conversions(); test_conversions(); test_conversions(); test_conversions(); } { #ifdef _LIBCPP_HAS_NO_NULLPTR static_assert(!has_less::value, ""); // FIXME: our c++03 nullptr emulation still allows for comparisons // with other pointer types by way of the conversion operator. //static_assert(!has_less::value, ""); #else // TODO Enable this assertion when all compilers implement core DR 583. // static_assert(!has_less::value, ""); #endif test_comparisons(); test_comparisons(); test_comparisons(); test_comparisons(); } test_nullptr_conversions(); }