// RUN: %check_clang_tidy %s readability-implicit-bool-cast %t \ // RUN: -config='{CheckOptions: \ // RUN: [{key: readability-implicit-bool-cast.AllowConditionalIntegerCasts, value: 1}, \ // RUN: {key: readability-implicit-bool-cast.AllowConditionalPointerCasts, value: 1}]}' \ // RUN: -- -std=c++11 template void functionTaking(T); int functionReturningInt(); int* functionReturningPointer(); struct Struct { int member; }; void regularImplicitCastIntegerToBoolIsNotIgnored() { int integer = 0; functionTaking(integer); // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit cast 'int' -> bool [readability-implicit-bool-cast] // CHECK-FIXES: functionTaking(integer != 0); } void implicitCastIntegerToBoolInConditionalsIsAllowed() { if (functionReturningInt()) {} if (!functionReturningInt()) {} int value1 = functionReturningInt() ? 1 : 2; int value2 = ! functionReturningInt() ? 1 : 2; } void regularImplicitCastPointerToBoolIsNotIgnored() { int* pointer = nullptr; functionTaking(pointer); // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit cast 'int *' -> bool // CHECK-FIXES: functionTaking(pointer != nullptr); int Struct::* memberPointer = &Struct::member; functionTaking(memberPointer); // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit cast 'int struct Struct::*' -> bool // CHECK-FIXES: functionTaking(memberPointer != nullptr); } void implicitCastPointerToBoolInConditionalsIsAllowed() { if (functionReturningPointer()) {} if (not functionReturningPointer()) {} int value1 = functionReturningPointer() ? 1 : 2; int value2 = (not functionReturningPointer()) ? 1 : 2; int Struct::* memberPointer = &Struct::member; if (memberPointer) {} if (memberPointer) {} int value3 = memberPointer ? 1 : 2; int value4 = (not memberPointer) ? 1 : 2; }