Warning C6216

Compiler-inserted cast between semantically different integral types: a Boolean type to HRESULT

A Boolean type is being used as an HRESULT without being explicitly cast.

Remarks

Boolean types indicate success by a non-zero value; success (S_OK) in HRESULT is indicated by a value of 0. A Boolean false value used as an HRESULT would indicate S_OK, which is frequently a mistake.

Code analysis name: COMPILER_INSERTED_CAST_BOOL_TO_HRESULT

Example

The following code generates this warning:

#include <windows.h>
BOOL IsEqual(REFGUID, REFGUID);

HRESULT f( REFGUID riid1, REFGUID riid2 )
{
  // Oops, f() should return S_OK when the values are equal but will
  // return E_FAIL instead because IsEqual returns a c-style boolean values TRUE or FALSE
  return IsEqual(riid1, riid2);
}

To correct this warning, either add the appropriate conversion between the two types or add an explicit cast.

#include <windows.h>
BOOL IsEqual(REFGUID, REFGUID);

HRESULT f( REFGUID riid1, REFGUID riid2 )
{
  // converting because IsEqual returns a c-style TRUE or FALSE
  return IsEqual(riid1, riid2) ? S_OK : E_FAIL;
}

For this warning, the SCODE type is equivalent to HRESULT.

For more information, see SUCCEEDED Macro and FAILED Macro.