Почему нет ошибки ... при компиляции такой функции?
Потому что программа правильно сформирована. Компиляторы необходимы для успешной компиляции всех правильно сформированных программ.
Почему при компиляции такой функции нет ... предупреждения?
Стандарт не требует предупреждения. Старые версии G CC предупреждают об ошибках, подобных этой, только если вы попросите компилятор сделать это. G CC 8 включил это конкретное предупреждение по умолчанию.
и функция вернет неизвестное значение
Не совсем. Поведение программы не определено, если выполнение достигает конца функции без void без возврата, так что это может произойти или не произойти.
Обратите внимание, что функция на самом деле будет иметь хорошо определенное поведение в случае, если Оператор вставки потока случайно выбросил или завершил работу программы. Мы знаем, что вставка потока не гарантирует, что она выбрасывает или завершает работу программы, и что это на самом деле было бы довольно удивительно. Но компилятор не может сделать такого рода обобщения.