# V2022. Implicit type conversion from integer type to enum type.

Данное диагностическое правило добавлено по просьбе пользователей.

Правило позволяет найти все неявные приведения целочисленных типов к типам перечислений. Это помогает выполнить рефакторинг кода и иногда выявить ошибки.

Данное правило актуально только для языка C.

Рассмотрим примеры конструкций, на которые анализатор выдаст предупреждение.

Пример N1:

    typedef enum
    {
      Horizontal = 0x1,
      Vertical = 0x2
    } Orientation;

    void foo1()
    {
      int pos = 1;
      Orientation orientation = pos;   // V2022
    }

В этом примере происходят неявные приведения целочисленного значения 'pos' к переменной типа 'Orientation'.

Пример N2:

    Orientation GetOrientation (int pos)
    {
      return pos;   // V2022
    }

Функция 'GetOrientation' возвращает значение типа 'Orientation' и неявно приводит значение 'pos' к этому типу.

Пример N3:

    Orientation GetOrientation (bool b)
    {
      int posOne = 1;
      int posTwo = 2;
      return b ? posOne : posTwo;    // V2022
    }

В этом примере функция использует условный оператор (?:) для выбора между двумя целочисленными переменными 'posOne' и 'posTwo', что также приводит к неявному приведению.

Пример N4:

    void foo2(Orientation o){}

    void foo3()
    {
      foo2(Horizontal);                 //ok
      foo2(Horizontal | Vertical);      // V2022
    }

В результате операции 'Horizontal | Vertical' получается целое число, представляющее побитовый результат. При передаче этого значения в функцию 'foo2', принимающую аргумент типа 'Orientation', происходит неявное приведение типов, что может привести к передаче недопустимого значения.