1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include <cstddef>
11#include <type_traits>
12#include <cassert>
13
14// typedef decltype(nullptr) nullptr_t;
15
16struct A
17{
18    A(std::nullptr_t) {}
19};
20
21int main()
22{
23    static_assert(sizeof(std::nullptr_t) == sizeof(void*),
24                  "sizeof(std::nullptr_t) == sizeof(void*)");
25    A* p = 0;
26    assert(p == nullptr);
27    void (A::*pmf)() = 0;
28#ifdef __clang__
29    // GCC 4.2 can't handle this
30    assert(pmf == nullptr);
31#endif
32    int A::*pmd = 0;
33    assert(pmd == nullptr);
34    A a1(nullptr);
35    A a2(0);
36    bool b = nullptr;
37    assert(!b);
38    assert(nullptr == nullptr);
39    assert(nullptr <= nullptr);
40    assert(nullptr >= nullptr);
41    assert(!(nullptr != nullptr));
42    assert(!(nullptr < nullptr));
43    assert(!(nullptr > nullptr));
44    A* a = nullptr;
45    assert(a == nullptr);
46    assert(a <= nullptr);
47    assert(a >= nullptr);
48    assert(!(a != nullptr));
49    assert(!(a < nullptr));
50    assert(!(a > nullptr));
51    assert(nullptr == a);
52    assert(nullptr <= a);
53    assert(nullptr >= a);
54    assert(!(nullptr != a));
55    assert(!(nullptr < a));
56    assert(!(nullptr > a));
57    std::ptrdiff_t i = reinterpret_cast<std::ptrdiff_t>(nullptr);
58    assert(i == 0);
59}
60