// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t \ // RUN: -config='{CheckOptions: \ // RUN: [{key: readability-implicit-bool-conversion.AllowIntegerConditions, value: 1}, \ // RUN: {key: readability-implicit-bool-conversion.AllowPointerConditions, value: 1}]}' \ // RUN: -- -std=c++11 template void functionTaking(T); int functionReturningInt(); int* functionReturningPointer(); struct Struct { int member; }; void regularImplicitConversionIntegerToBoolIsNotIgnored() { int integer = 0; functionTaking(integer); // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'int' -> bool [readability-implicit-bool-conversion] // CHECK-FIXES: functionTaking(integer != 0); } void implicitConversionIntegerToBoolInConditionalsIsAllowed() { if (functionReturningInt()) {} if (!functionReturningInt()) {} if (functionReturningInt() && functionReturningPointer()) {} if (!functionReturningInt() && !functionReturningPointer()) {} for (; functionReturningInt(); ) {} for (; functionReturningPointer(); ) {} for (; functionReturningInt() && !functionReturningPointer() || (!functionReturningInt() && functionReturningPointer()); ) {} while (functionReturningInt()) {} while (functionReturningPointer()) {} while (functionReturningInt() && !functionReturningPointer() || (!functionReturningInt() && functionReturningPointer())) {} int value1 = functionReturningInt() ? 1 : 2; int value2 = !functionReturningInt() ? 1 : 2; int value3 = (functionReturningInt() && functionReturningPointer() || !functionReturningInt()) ? 1 : 2; int value4 = functionReturningInt() ?: value3; int *p1 = functionReturningPointer() ?: &value3; } void regularImplicitConversionPointerToBoolIsNotIgnored() { int* pointer = nullptr; functionTaking(pointer); // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'int *' -> bool // CHECK-FIXES: functionTaking(pointer != nullptr); int Struct::* memberPointer = &Struct::member; functionTaking(memberPointer); // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'int Struct::*' -> bool // CHECK-FIXES: functionTaking(memberPointer != nullptr); } void implicitConversionPointerToBoolInConditionalsIsAllowed() { 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; }