189a1d03eSRichard // RUN: %check_clang_tidy -std=c++98 %s readability-implicit-bool-conversion %t 289a1d03eSRichard 389a1d03eSRichard // We need NULL macro, but some buildbots don't like including <cstddef> header 489a1d03eSRichard // This is a portable way of getting it to work 589a1d03eSRichard #undef NULL 689a1d03eSRichard #define NULL 0L 789a1d03eSRichard 889a1d03eSRichard template<typename T> 989a1d03eSRichard void functionTaking(T); 1089a1d03eSRichard 1189a1d03eSRichard struct Struct { 1289a1d03eSRichard int member; 1389a1d03eSRichard }; 1489a1d03eSRichard useOldNullMacroInReplacements()1589a1d03eSRichardvoid useOldNullMacroInReplacements() { 1689a1d03eSRichard int* pointer = NULL; 1789a1d03eSRichard functionTaking<bool>(pointer); 18*fd0e06d1SPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'int *' -> 'bool' [readability-implicit-bool-conversion] 1989a1d03eSRichard // CHECK-FIXES: functionTaking<bool>(pointer != 0); 2089a1d03eSRichard 2189a1d03eSRichard int Struct::* memberPointer = NULL; 2289a1d03eSRichard functionTaking<bool>(!memberPointer); 23*fd0e06d1SPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: implicit conversion 'int Struct::*' -> 'bool' 2489a1d03eSRichard // CHECK-FIXES: functionTaking<bool>(memberPointer == 0); 2589a1d03eSRichard } 2689a1d03eSRichard fixFalseLiteralConvertingToNullPointer()2789a1d03eSRichardvoid fixFalseLiteralConvertingToNullPointer() { 2889a1d03eSRichard functionTaking<int*>(false); 29*fd0e06d1SPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'bool' -> 'int *' 3089a1d03eSRichard // CHECK-FIXES: functionTaking<int*>(0); 3189a1d03eSRichard 3289a1d03eSRichard int* pointer = NULL; 3389a1d03eSRichard if (pointer == false) {} 34*fd0e06d1SPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: implicit conversion 'bool' -> 'int *' 3589a1d03eSRichard // CHECK-FIXES: if (pointer == 0) {} 3689a1d03eSRichard 3789a1d03eSRichard functionTaking<int Struct::*>(false); 38*fd0e06d1SPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: implicit conversion 'bool' -> 'int Struct::*' 3989a1d03eSRichard // CHECK-FIXES: functionTaking<int Struct::*>(0); 4089a1d03eSRichard 4189a1d03eSRichard int Struct::* memberPointer = NULL; 4289a1d03eSRichard if (memberPointer != false) {} 43*fd0e06d1SPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'bool' -> 'int Struct::*' 4489a1d03eSRichard // CHECK-FIXES: if (memberPointer != 0) {} 4589a1d03eSRichard } 46