LINUX.ORG.RU

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

Исправление kvpfs, (текущая версия) :

По поводу вечного цикла:

$ cat 1.cpp
#include <iostream>

[[ noreturn ]] void fn() {
#ifdef WITH_LOOP
        while (true);
#endif
}

int main() {
        fn();
}

void unreachable() {
        std::cout << "hello world" << std::endl;
}
$ clang++ -std=c++20 1.cpp -O2 -Wall
1.cpp:7:1: warning: function declared 'noreturn' should not return [-Winvalid-noreturn]
}
^
1 warning generated.
$ clang++ -std=c++20 1.cpp -O2 -Wall -DWITH_LOOP
$ ./a.out
hello world

В общем не надо рассказывать, что это норм, ну ЮБ (а стандарт то кто-нибудь видел на этот счет? может там и нет никакого ЮБ), чего ты хотел. Шланг противоречит сам себе - с noreturn атрибутом данный цикл его устраивает в качестве вечного и возврат из него не ожидается. Шланг сломан, на выходе такой бред:

fn():                                 # @fn()
main:                                   # @main
unreachable():                       # @unreachable()
pushq   %rbx
... #печать hello world

Исходная версия kvpfs, :

По поводу вечного цикла:

$ cat 1.cpp
#include <iostream>

[[ noreturn ]] void fn() {
#ifdef WITH_LOOP
        while (true);
#endif
}

int main() {
        fn();
}

void unreachable() {
        std::cout << "hello world" << std::endl;
}
$ clang++ -std=c++20 1.cpp -O2 -Wall
1.cpp:7:1: warning: function declared 'noreturn' should not return [-Winvalid-noreturn]
}
^
1 warning generated.
$ clang++ -std=c++20 1.cpp -O2 -Wall -DWITH_LOOP
$ ./a.out
hello world

В общем не надо рассказывать, что это норм, ну ЮБ (а стандарт то кто-нибудь видел на этот счет? может там и нет никакого ЮБ), чего ты хотел. Шланг противоречит сам себе - с noreturn атрибутом данный цикл его устраивает в качестве вечного и возврат из него не ожидается. Шланг сломан.