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