Недостаточный анализ потока управления переключателем enum в GCC

В следующем коде C ++:

typedef enum { a, b, c } Test;

int foo(Test test) {
    switch (test) {
        case a: return 0;
        case b: return 1;
        case c: return 0;
    }
}

при компиляции с -Wall выдается предупреждение, в котором говорится, что управление достигло конца непустой функции. Почему?


Править

В целом неверно говорить, что переменная test в примере может содержать любое значение.

foo (12354) не компилируется:

> test.cpp:15:14: error: invalid conversion from ‘int’ to ‘Test’
> test.cpp:15:14: error:   initializing argument 1 of ‘int foo(Test)’

потому что 12354 не является допустимым значением Test (хотя оно действительно было бы действительным в обычном C , но не в C ++).

Вы, конечно, можете явно привести произвольную целочисленную константу к типу перечисления, но разве это не считается неопределенным поведением?

10
задан ulidtko 16 June 2011 в 18:56
поделиться