Compiler Warning (level 4) C4770

partially validated enum 'symbol' used as index

The compiler warns if an enum value is cast or aliased to an integer type, but the result isn't checked for non-negative or excessive values.

Remarks

This warning is new in Visual Studio 2013. It's not enabled by default. To enable it as a level 1 warning, use /w14770. For information on how to disable warnings by compiler version, see Compiler warnings by compiler version.

Example

The following code produces warning C4770:

// c4770.cpp
// compile by using: cl /GL /w14770 c4770.cpp

enum E { a  0, b, c, E_MAX };

int main(int argc, char *argv[])
{
    const E e1 = E(argc); // value unknown at compile time

    if ((int)(e1) >= E_MAX)
        return 0;

    const int n = e1 + e1;  // C4770 partially validated enum used as index

    return argv[n][n];
}

To fix the warning, you could cast the value in the check to unsigned int, which implicitly forces a non-negative value:

    if ((unsigned int)(e1) >= E_MAX) 
        return 0;

Or, explicitly check for a non-negative value:

    if ((int)(e1) >= E_MAX || (int)(e1) < 0)
        return 0;