Справочник по Ada 2005
6.5.1 Предикат No_Return
Предикат pragma No_Return указывает, что процедура не может вернуть управление обычным образом; она может распространять исключение или циклически выполняться бесконечно.
Синтаксис
Форма предиката pragma No_Return, который является предикатным описанием (см. 13.1), выглядит следующим образом:
pragma No_Return(procedure_local_name{, procedure_local_name});
Правила легальности
Каждый procedure_local_name должен обозначать одну или несколько процедур или обобщенных процедур; обозначенные сущности являются невозвращаемыми. procedure_local_name не должен обозначать процедуру без тела или экземпляр обобщенного блока.
Оператор return не должен применяться к невозвращаемой процедуре или обобщенной процедуре.
Процедура считается невозвращаемой, если она переопределяет диспетчеризованную невозвращаемую процедуру. В дополнение к местам, где обычно применяются правила легальности (см. 12.3), это правило применяется также в приватной части экземпляра обобщенного блока.
Если переименование-как-тело завершает объявление невозвращаемой процедуры, то переименованная процедура также должна быть невозвращаемой.
Статическая семантика
Если обобщенная процедура невозвращаемая, то и ее экземпляры также являются невозвращаемыми. Если процедура, объявленная внутри обобщенного блока, невозвращаемая, то соответствующие копии этой процедуры в экземплярах также являются невозвращаемыми.
Динамическая семантика
Если тело невозвращаемой процедуры завершается нормально, то в точке вызова возникает ошибка Program_Error.
Примеры
procedure Fail(Msg : String); -- вызывает исключение Fatal_Error
pragma No_Return(Fail);
-- Сообщает компилятору и читателю, что процедура никогда не возвращает управление нормально
pragma No_Return(Fail);
-- Сообщает компилятору и читателю, что процедура никогда не возвращает управление нормально