nullptr.cpp revision 0c8209e40b405fd32f047e95aafdc94054406a58
1c79f767941fdfedb02d20296a042ad951a593890Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x -ffreestanding %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); 410c8209e40b405fd32f047e95aafdc94054406a58Anders Carlsson (void)(0 == nullptr); 420c8209e40b405fd32f047e95aafdc94054406a58Anders Carlsson (void)(nullptr == 0); 430c8209e40b405fd32f047e95aafdc94054406a58Anders Carlsson (void)(nullptr <= 0); 440c8209e40b405fd32f047e95aafdc94054406a58Anders Carlsson (void)(0 <= nullptr); 456e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)(1 > nullptr); // expected-error {{invalid operands to binary expression}} 466e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)(1 != nullptr); // expected-error {{invalid operands to binary expression}} 476e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)(1 + nullptr); // expected-error {{invalid operands to binary expression}} 486e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)(0 ? nullptr : 0); // expected-error {{incompatible operand types}} 496e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)(0 ? nullptr : (void*)0); 506e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 516e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // Overloading 526e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl int t = o1(nullptr); 536e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl t = o1(null); 546e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl o2(nullptr); // expected-error {{ambiguous}} 556e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 566e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // nullptr is an rvalue, null is an lvalue 576e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)&nullptr; // expected-error {{address expression must be an lvalue}} 586e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl nullptr_t *pn = &null; 596e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 606e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // You can reinterpret_cast nullptr to an integer. 616e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)reinterpret_cast<uintptr_t>(nullptr); 626e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 636e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // You can throw nullptr. 646e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl throw nullptr; 656e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl} 666e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 676e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl// Template arguments can be nullptr. 686e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redltemplate <int *PI, void (*PF)(), int A::*PM, void (A::*PMF)()> 696e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlstruct T {}; 706e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 716e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redltypedef T<nullptr, nullptr, nullptr, nullptr> NT; 72