﻿# V545\. Conditional expression of 'if' statement is incorrect for the HRESULT type value 'Foo'\. The SUCCEEDED or FAILED macro should be used instead\.

The analyzer detected a potential error related to handling a variable of the HRESULT type\.

HRESULT is a 32\-bit value divided into three different fields: severity code, device code and error code\. Such special constants as S\_OK, E\_FAIL, E\_ABORT, etc\. serve to handle HRESULT\-values while the SUCCEEDED and FAILED macros are used to check HRESULT\-values\.

The V545 warning is generated if a variable of the HRESULT type is used in the 'if' operator as a bool\-variable\. Consider this sample:

```cpp
HRESULT hr;
...
if (hr)
{
}
```

'HRESULT' and 'bool' are two types absolutely different in meaning\. This sample of comparison is incorrect\. The HRESULT type can have many states including 0L \(S\_OK\), 0x80000002L \(Ran out of memory\), 0x80004005L \(unspecified failure\) and so on\. Note that the code of the state S\_OK is 0\. 

To check the HRESULT\-value, we must use macro SUCCEEDED or FAILED defined in "WinError\.h"\.  These are correct versions of code:

```cpp
if (FAILED(hr))
{
}
if (SUCCEEDED(hr))
{
}
```

References:

1. MSDN\. [Common HRESULT Values](https://docs.microsoft.com/en-us/windows/win32/seccrypto/common-hresult-values)\. 
1. Wikipedia\. [HRESULT](https://en.wikipedia.org/wiki/HRESULT)\.