C6220

warning C6220 - Implicit cast between semantically different integer types: comparing HRESULT to -1. Consider using SUCCEEDED or FAILED macro instead

This warning indicates that an HRESULT is being compared with an explicit, non-HRESULT value of -1, which is not a well-formed HRESULT. A failure in HRESULT (E_FAIL) is not represented by a -1. Therefore, an implicit cast of an HRESULT to an integer will generate an incorrect value and is likely to lead to the wrong result.

Example

In most cases, this warning is caused by the code mistakenly expecting that a function that should return an HRESULT instead returns an integer, by using –1 as a failure value. The following code sample generates this warning:

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;
  
  hr = CoGetMalloc(1, &pMalloc);
  if (hr == -1)
  {
    // failure code ...
    return E_FAIL;
  }
  else
  {
    // success code ...
    return S_OK;
  }
}

It is best to use the SUCCEEDED or FAILED macro to test the value of an HRESULT. To correct this warning, use the following code:

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;
  
  hr = CoGetMalloc(1, &pMalloc);
  if (FAILED(hr))
  {
    // failure code ...
    return E_FAIL;
  }
  else
  {
    // success code ...
    return S_OK;
  }
}

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

Explicit comparison is appropriate to check for specific HRESULT values, such as, E_FAIL. Otherwise, use the SUCCEEDED or FAILED macros.

See Also

Other Resources

SUCCEEDED

FAILED