Анализ возврата метода не анализирует условие if
, чтобы определить, всегда ли оно истинно или ложно, так как обычно это не будет константа времени компиляции (иначе вы не будете писать if
в первое место). Он просто видит, что существует if
, которое может или не может быть взято, и если оно не взято, то метод не возвращает значение, отсюда и ошибка.
Анализ мертвого кода выполняется в отдельном проходе к анализу возврата метода, который выполняет более углубленный анализ, который рассматривает условия ветвления.
Мое совершенно неосведомленное предположение, что это поведение - артефакт того, как был разработан компилятор; анализ возврата метода является жизненно важной частью компиляции, чтобы в конце вы получили действительную программу, как и одна из основных функций, реализованных в первую очередь. Анализ мертвого кода «приятно иметь», и поэтому он был реализован позже с использованием более сложных алгоритмов (поскольку биты компилятора ядра были закончены на этом этапе)