История изменений
Исправление wandrien, (текущая версия) :
Кстати сказать, в отличие от Си, где отсутствие return
в функции, которая возвращает не-void значение, является UB, у меня в языке это является ошибкой типов.
Компилятор гарантированно проходит по ветвям и смотрит, чтобы пути исполнения приводили к возврату значения.
Примеры:
/* Так не компилируется, ошибка:
"Функция должна возвращать значение" */
int f(int x)
if x == 0 then
return 10;
end
end
/* Так компилируется. */
int f(int x)
if x == 0 then
return 10;
else
return 20;
end
end
/* Так тоже компилируется, для const expr в условиях гарантирована их оптимизация компилятором. */
int f(int x)
if x == 0 then
return 10;
end
if true then
return 10;
end
end
/* Так тоже компилируется + функция будет отмечена как noreturn-функция.
(Возможна выдача предупреждения или ошибки в зависимости от директив pragma.)
*/
int f(int x)
while true do
pass;
end:while
end
noreturn
также может быть указан явно как тип:
/* Так не компилируется, ошибка:
"Управление достигает конца noreturn функции" */
noreturn halt(word code);
noreturn nr1(word a, s)
switch s of
case 1:
if a < 10 then
put_word(a + 1); puts(" ");
halt(0);
else
put_word(a); puts(" ");
end:if
default:
halt(0);
end:switch
end
/* А так компилируется. */
noreturn halt(word code);
noreturn nr1(word a, s)
switch s of
case 1:
if a < 10 then
put_word(a + 1); puts(" ");
halt(0);
else
put_word(a); puts(" ");
halt(0);
end:if
default:
halt(0);
end:switch
end
Исправление wandrien, :
Кстати сказать, в отличие от Си, где отсутствие return
в функции, которая возвращает не-void значение, является UB, у меня в языке это является ошибкой типов.
Компилятор гарантированно проходит по ветвям и смотрит, чтобы пути исполнения приводили к возврату значения.
Примеры:
/* Так не компилируется, ошибка:
"Функция должна возвращать значение" */
int f(int x)
if x == 0 then
return 10;
end
end
/* Так компилируется. */
int f(int x)
if x == 0 then
return 10;
else
return 20;
end
end
/* Так тоже компилируется, для const expr в условиях гарантирована их оптимизация компилятором. */
int f(int x)
if x == 0 then
return 10;
end
if true then
return 10;
end
end
/* Так тоже компилируется + функция будет отмечена как noreturn-функция.
(Возможна выдача предупреждения или ошибки в зависимости от директив pragma.)
*/
int f(int x)
while true do
pass;
end:while
end
noreturn
также может быть указан явно как тип:
/* Так не компилируется, ошибка:
"Управление достигает конца noreturn функции" */
noreturn nr1(word a, s)
switch s of
case 1:
if a < 10 then
put_word(a + 1); puts(" ");
halt(0);
else
put_word(a); puts(" ");
end:if
default:
halt(0);
end:switch
end
/* А так компилируется. */
noreturn nr1(word a, s)
switch s of
case 1:
if a < 10 then
put_word(a + 1); puts(" ");
halt(0);
else
put_word(a); puts(" ");
halt(0);
end:if
default:
halt(0);
end:switch
end
Исходная версия wandrien, :
Кстати сказать, в отличие от Си, где отсутствие return
в функции, которая возвращает не-void значение, является UB, у меня в языке это является ошибкой типов.
Компилятор гарантированно проходит по ветвям и смотрит, чтобы пути исполнения приводили к возврату значения.
Примеры:
/* Так не компилируется, ошибка:
"Функция должна возвращать значение" */
int f(int x)
if x == 0 then
return 10;
end
end
/* Так компилируется. */
int f(int x)
if x == 0 then
return 10;
else
return 20;
end
end
/* Так тоже компилируется, для const expr в условиях гарантирована их оптимизация компилятором. */
int f(int x)
if x == 0 then
return 10;
end
if true then
return 10;
end
end
/* Так тоже компилируется + функция будет отмечена как noreturn-функция.
(Возможна выдача предупреждения или ошибки в зависимости от директив pragma.)
*/
int f(int x)
while true do
pass;
end:while
end
noreturn
также может быть указан явно как тип:
/* Так не компилируется, ошибка:
"Управление достигает конца noreturn функции" */
noreturn nr1(word a)
switch s of
case 1:
if a < 10 then
put_word(a + 1); puts(" ");
halt(0);
else
put_word(a); puts(" ");
end:if
default:
halt(0);
end:switch
end
/* А так компилируется. */
noreturn nr1(word a)
switch s of
case 1:
if a < 10 then
put_word(a + 1); puts(" ");
halt(0);
else
put_word(a); puts(" ");
halt(0);
end:if
default:
halt(0);
end:switch
end