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()1589a1d03eSRichard void 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()2789a1d03eSRichard void 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