1// RUN: %check_clang_tidy -std=c++98 %s readability-implicit-bool-conversion %t
2
3// We need NULL macro, but some buildbots don't like including <cstddef> header
4// This is a portable way of getting it to work
5#undef NULL
6#define NULL 0L
7
8template<typename T>
9void functionTaking(T);
10
11struct Struct {
12 int member;
13};
14
15void useOldNullMacroInReplacements() {
16 int* pointer = NULL;
17 functionTaking<bool>(pointer);
18 // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'int *' -> 'bool' [readability-implicit-bool-conversion]
19 // CHECK-FIXES: functionTaking<bool>(pointer != 0);
20
21 int Struct::* memberPointer = NULL;
22 functionTaking<bool>(!memberPointer);
23 // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: implicit conversion 'int Struct::*' -> 'bool'
24 // CHECK-FIXES: functionTaking<bool>(memberPointer == 0);
25}
26
27void fixFalseLiteralConvertingToNullPointer() {
28 functionTaking<int*>(false);
29 // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'bool' -> 'int *'
30 // CHECK-FIXES: functionTaking<int*>(0);
31
32 int* pointer = NULL;
33 if (pointer == false) {}
34 // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: implicit conversion 'bool' -> 'int *'
35 // CHECK-FIXES: if (pointer == 0) {}
36
37 functionTaking<int Struct::*>(false);
38 // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: implicit conversion 'bool' -> 'int Struct::*'
39 // CHECK-FIXES: functionTaking<int Struct::*>(0);
40
41 int Struct::* memberPointer = NULL;
42 if (memberPointer != false) {}
43 // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'bool' -> 'int Struct::*'
44 // CHECK-FIXES: if (memberPointer != 0) {}
45}
46

source code of clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-cxx98.cpp