1 // RUN: clang-cc -fsyntax-only -verify -std=c++0x %s
2 #include <stdint.h>
3 
4 // Don't have decltype yet.
5 typedef __typeof__(nullptr) nullptr_t;
6 
7 struct A {};
8 
9 int o1(char*);
10 void o1(uintptr_t);
11 void o2(char*); // expected-note {{candidate}}
12 void o2(int A::*); // expected-note {{candidate}}
13 
14 nullptr_t f(nullptr_t null)
15 {
16   // Implicit conversions.
17   null = nullptr;
18   void *p = nullptr;
19   p = null;
20   int *pi = nullptr;
21   pi = null;
22   null = 0;
23   int A::*pm = nullptr;
24   pm = null;
25   void (*pf)() = nullptr;
26   pf = null;
27   void (A::*pmf)() = nullptr;
28   pmf = null;
29   bool b = nullptr;
30 
31   // Can't convert nullptr to integral implicitly.
32   uintptr_t i = nullptr; // expected-error {{incompatible type initializing}}
33 
34   // Operators
35   (void)(null == nullptr);
36   (void)(null <= nullptr);
37   (void)(null == (void*)0);
38   (void)((void*)0 == nullptr);
39   (void)(null <= (void*)0);
40   (void)((void*)0 <= nullptr);
41   (void)(1 > nullptr); // expected-error {{invalid operands to binary expression}}
42   (void)(1 != nullptr); // expected-error {{invalid operands to binary expression}}
43   (void)(1 + nullptr); // expected-error {{invalid operands to binary expression}}
44   (void)(0 ? nullptr : 0); // expected-error {{incompatible operand types}}
45   (void)(0 ? nullptr : (void*)0);
46 
47   // Overloading
48   int t = o1(nullptr);
49   t = o1(null);
50   o2(nullptr); // expected-error {{ambiguous}}
51 
52   // nullptr is an rvalue, null is an lvalue
53   (void)&nullptr; // expected-error {{address expression must be an lvalue}}
54   nullptr_t *pn = &null;
55 
56   // You can reinterpret_cast nullptr to an integer.
57   (void)reinterpret_cast<uintptr_t>(nullptr);
58 
59   // You can throw nullptr.
60   throw nullptr;
61 }
62 
63 // Template arguments can be nullptr.
64 template <int *PI, void (*PF)(), int A::*PM, void (A::*PMF)()>
65 struct T {};
66 
67 typedef T<nullptr, nullptr, nullptr, nullptr> NT;
68