LINUX.ORG.RU

История изменений

Исправление 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