nullptr.cpp revision 70488e201ccd94d4bb1ef0868cc13cca2b7d4ff6
1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 -ffreestanding %s 26e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl#include <stdint.h> 36e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 4c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlssontypedef decltype(nullptr) nullptr_t; 56e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 66e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlstruct A {}; 76e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 86e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlint o1(char*); 96e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlvoid o1(uintptr_t); 106e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlvoid o2(char*); // expected-note {{candidate}} 116e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlvoid o2(int A::*); // expected-note {{candidate}} 126e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 136e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlnullptr_t f(nullptr_t null) 146e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl{ 156e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // Implicit conversions. 166e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl null = nullptr; 176e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl void *p = nullptr; 186e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl p = null; 196e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl int *pi = nullptr; 206e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl pi = null; 216e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl null = 0; 226e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl int A::*pm = nullptr; 236e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl pm = null; 246e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl void (*pf)() = nullptr; 256e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl pf = null; 266e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl void (A::*pmf)() = nullptr; 276e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl pmf = null; 286e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl bool b = nullptr; 296e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 306e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // Can't convert nullptr to integral implicitly. 31cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman uintptr_t i = nullptr; // expected-error {{cannot initialize}} 326e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 336e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // Operators 346e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)(null == nullptr); 356e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)(null <= nullptr); 366e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)(null == (void*)0); 376e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)((void*)0 == nullptr); 386e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)(null <= (void*)0); 396e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)((void*)0 <= nullptr); 400c8209e40b405fd32f047e95aafdc94054406a58Anders Carlsson (void)(0 == nullptr); 410c8209e40b405fd32f047e95aafdc94054406a58Anders Carlsson (void)(nullptr == 0); 420c8209e40b405fd32f047e95aafdc94054406a58Anders Carlsson (void)(nullptr <= 0); 430c8209e40b405fd32f047e95aafdc94054406a58Anders Carlsson (void)(0 <= nullptr); 446e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)(1 > nullptr); // expected-error {{invalid operands to binary expression}} 456e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)(1 != nullptr); // expected-error {{invalid operands to binary expression}} 466e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)(1 + nullptr); // expected-error {{invalid operands to binary expression}} 477ef932429ed0edcc5e4bf44e516f5f4be6a8a03fChandler Carruth (void)(0 ? nullptr : 0); // expected-error {{non-pointer operand type 'int' incompatible with nullptr}} 486e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)(0 ? nullptr : (void*)0); 4982214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth (void)(0 ? nullptr : A()); // expected-error {{non-pointer operand type 'A' incompatible with nullptr}} 5082214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth (void)(0 ? A() : nullptr); // expected-error {{non-pointer operand type 'A' incompatible with nullptr}} 516e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 526e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // Overloading 536e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl int t = o1(nullptr); 546e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl t = o1(null); 556e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl o2(nullptr); // expected-error {{ambiguous}} 566e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 576e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // nullptr is an rvalue, null is an lvalue 586e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)&nullptr; // expected-error {{address expression must be an lvalue}} 596e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl nullptr_t *pn = &null; 606e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 616e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // You can reinterpret_cast nullptr to an integer. 626e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl (void)reinterpret_cast<uintptr_t>(nullptr); 6384ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor (void)reinterpret_cast<uintptr_t>(*pn); 6484ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor 6584ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor int *ip = *pn; 6684ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor if (*pn) { } 676e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 686e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // You can throw nullptr. 696e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl throw nullptr; 706e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl} 716e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 726e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl// Template arguments can be nullptr. 736e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redltemplate <int *PI, void (*PF)(), int A::*PM, void (A::*PMF)()> 746e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlstruct T {}; 756e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 766e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redltypedef T<nullptr, nullptr, nullptr, nullptr> NT; 77c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlsson 78c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlssonnamespace test1 { 79c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlssontemplate<typename T, typename U> struct is_same { 80c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlsson static const bool value = false; 81c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlsson}; 82c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlsson 83c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlssontemplate<typename T> struct is_same<T, T> { 84c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlsson static const bool value = true; 85c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlsson}; 86c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlsson 87c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlssonvoid *g(void*); 88c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlssonbool g(bool); 89c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlsson 90c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlsson// Test that we prefer g(void*) over g(bool). 91c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlssonstatic_assert(is_same<decltype(g(nullptr)), void*>::value, ""); 92c8df0b634ee5ca8573852fdc96252b8bba5a10dbAnders Carlsson} 93343e6ffa70459b1afdb488c69fb651434a5016c0Anders Carlsson 94343e6ffa70459b1afdb488c69fb651434a5016c0Anders Carlssonnamespace test2 { 95343e6ffa70459b1afdb488c69fb651434a5016c0Anders Carlsson void f(int, ...) __attribute__((sentinel)); 96343e6ffa70459b1afdb488c69fb651434a5016c0Anders Carlsson 97343e6ffa70459b1afdb488c69fb651434a5016c0Anders Carlsson void g() { 98343e6ffa70459b1afdb488c69fb651434a5016c0Anders Carlsson // nullptr can be used as the sentinel value. 99343e6ffa70459b1afdb488c69fb651434a5016c0Anders Carlsson f(10, nullptr); 100343e6ffa70459b1afdb488c69fb651434a5016c0Anders Carlsson } 101343e6ffa70459b1afdb488c69fb651434a5016c0Anders Carlsson} 102624259984448cf19f4e94b7e31c7c32e99a39ea5Anders Carlsson 103624259984448cf19f4e94b7e31c7c32e99a39ea5Anders Carlssonnamespace test3 { 104624259984448cf19f4e94b7e31c7c32e99a39ea5Anders Carlsson void f(const char*, ...) __attribute__((format(printf, 1, 2))); 105624259984448cf19f4e94b7e31c7c32e99a39ea5Anders Carlsson 106624259984448cf19f4e94b7e31c7c32e99a39ea5Anders Carlsson void g() { 107624259984448cf19f4e94b7e31c7c32e99a39ea5Anders Carlsson // Don't warn when using nullptr with %p. 108624259984448cf19f4e94b7e31c7c32e99a39ea5Anders Carlsson f("%p", nullptr); 109624259984448cf19f4e94b7e31c7c32e99a39ea5Anders Carlsson } 110624259984448cf19f4e94b7e31c7c32e99a39ea5Anders Carlsson} 11184ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor 11284ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregorint array0[__is_scalar(nullptr_t)? 1 : -1]; 11384ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregorint array1[__is_pod(nullptr_t)? 1 : -1]; 11484ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregorint array2[sizeof(nullptr_t) == sizeof(void*)? 1 : -1]; 11584ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor 11684ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor// FIXME: when we implement constexpr, this will be testable. 11784ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor#if 0 11884ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregorint relational0[nullptr < nullptr? -1 : 1]; 11984ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregorint relational1[nullptr > nullptr? -1 : 1]; 12084ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregorint relational2[nullptr <= nullptr? 1 : -1]; 12184ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregorint relational3[nullptr >= nullptr? 1 : -1]; 12284ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregorint equality[nullptr == nullptr? 1 : -1]; 12384ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregorint inequality[nullptr != nullptr? -1 : 1]; 12484ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor#endif 12584ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor 12684ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregornamespace overloading { 12784ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor int &f1(int*); 12884ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor float &f1(bool); 12984ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor 13084ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor void test_f1() { 13184ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor int &ir = (f1)(nullptr); 13284ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor } 13384ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor 13484ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor struct ConvertsToNullPtr { 13584ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor operator nullptr_t() const; 13684ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor }; 13784ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor 13884ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor void test_conversion(ConvertsToNullPtr ctn) { 13984ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor (void)(ctn == ctn); 14084ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor (void)(ctn != ctn); 14184ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor (void)(ctn <= ctn); 14284ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor (void)(ctn >= ctn); 14384ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor (void)(ctn < ctn); 14484ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor (void)(ctn > ctn); 14584ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor } 14684ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor} 14784ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor 14884ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregornamespace templates { 14984ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor template<typename T, nullptr_t Value> 15084ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor struct X { 15184ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor X() { ptr = Value; } 15284ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor 15384ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor T *ptr; 15484ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor }; 15584ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor 15684ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor X<int, nullptr> x; 15784ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor 15884ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor 15984ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor template<int (*fp)(int), int* p, int A::* pmd, int (A::*pmf)(int)> 16084ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor struct X2 {}; 16184ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor 16284ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor X2<nullptr, nullptr, nullptr, nullptr> x2; 16384ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor} 16470488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smith 16570488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smithnamespace null_pointer_constant { 16670488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smith 16770488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smith// Pending implementation of core issue 903, ensure we don't allow any of the 16870488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smith// C++11 constant evaluation semantics in null pointer constants. 16970488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smithstruct S { int n; }; 17070488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smithconstexpr int null() { return 0; } 17170488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smithvoid *p = S().n; // expected-error {{cannot initialize}} 17270488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smithvoid *q = null(); // expected-error {{cannot initialize}} 17370488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smith 17470488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smith} 175