nullptr.cpp revision cfdc81a83467973b14e4ea5e9e9af1690f135415
1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x %s
26e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl#include <stdint.h>
36e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
46e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl// Don't have decltype yet.
56e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redltypedef __typeof__(nullptr) nullptr_t;
66e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
76e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlstruct A {};
86e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
96e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlint o1(char*);
106e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlvoid o1(uintptr_t);
116e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlvoid o2(char*); // expected-note {{candidate}}
126e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlvoid o2(int A::*); // expected-note {{candidate}}
136e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
146e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlnullptr_t f(nullptr_t null)
156e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl{
166e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  // Implicit conversions.
176e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  null = nullptr;
186e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  void *p = nullptr;
196e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  p = null;
206e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  int *pi = nullptr;
216e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  pi = null;
226e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  null = 0;
236e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  int A::*pm = nullptr;
246e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  pm = null;
256e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  void (*pf)() = nullptr;
266e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  pf = null;
276e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  void (A::*pmf)() = nullptr;
286e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  pmf = null;
296e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  bool b = nullptr;
306e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
316e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  // Can't convert nullptr to integral implicitly.
32cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman  uintptr_t i = nullptr; // expected-error {{cannot initialize}}
336e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
346e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  // Operators
356e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  (void)(null == nullptr);
366e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  (void)(null <= nullptr);
376e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  (void)(null == (void*)0);
386e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  (void)((void*)0 == nullptr);
396e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  (void)(null <= (void*)0);
406e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  (void)((void*)0 <= nullptr);
416e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  (void)(1 > nullptr); // expected-error {{invalid operands to binary expression}}
426e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  (void)(1 != nullptr); // expected-error {{invalid operands to binary expression}}
436e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  (void)(1 + nullptr); // expected-error {{invalid operands to binary expression}}
446e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  (void)(0 ? nullptr : 0); // expected-error {{incompatible operand types}}
456e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  (void)(0 ? nullptr : (void*)0);
466e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
476e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  // Overloading
486e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  int t = o1(nullptr);
496e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  t = o1(null);
506e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  o2(nullptr); // expected-error {{ambiguous}}
516e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
526e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  // nullptr is an rvalue, null is an lvalue
536e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  (void)&nullptr; // expected-error {{address expression must be an lvalue}}
546e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  nullptr_t *pn = &null;
556e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
566e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  // You can reinterpret_cast nullptr to an integer.
576e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  (void)reinterpret_cast<uintptr_t>(nullptr);
586e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
596e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  // You can throw nullptr.
606e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  throw nullptr;
616e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl}
626e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
636e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl// Template arguments can be nullptr.
646e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redltemplate <int *PI, void (*PF)(), int A::*PM, void (A::*PMF)()>
656e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlstruct T {};
666e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
676e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redltypedef T<nullptr, nullptr, nullptr, nullptr> NT;
68