Если G CC принимает C11 atomic_int, и clang отклоняет их, что является правильным? - PullRequest
5 голосов
/ 10 января 2020

Предположим, у меня есть следующая программа C11:

#include <stdatomic.h>

int
main()
{
        int x = 0; // same behaviour if `atomic_int x`, surprisingly
        atomic_int y = (atomic_int) x;
}

Если я скомпилирую это с gcc 9, я не получу ошибок. Если я скомпилирую его с Apple clang 11, я получу:

foo.c:7:17: error: used type 'atomic_int' (aka '_Atomic(int)') where arithmetic or
      pointer type is required
        atomic_int y = (atomic_int) x;

Подобных проблем предостаточно при использовании множества godbolt версий G CC, Clang и других компиляторов. которые поддерживают C11, на различных платформах. Это происходит независимо от того, установлена ​​ли --std=c11.

Краткое чтение чернового стандарта C11 говорит (в 6.5.4), что «имя типа должно указывать atomi c, квалифицированный или неквалифицированный скалярный тип, и операнд должен иметь скалярный тип. ', что говорит о том, что приведение является допустимым - я не вижу ничего, что могло бы сказать иначе.

Итак, мой вопрос таков: clang здесь не так? Другие компиляторы неправильно принимают это приведение? Это где-то, где clang и gcc могут отличаться?

(Кстати, более широкий контекст заключается в том, что я использую стороннюю программу, которая генерирует код C, который включает в себя: среди прочего, приведение от intmax_t до atomic_int. Это приведение работает на gcc, который является единственным поддерживаемым компилятором для этой программы, но не работает на clang --- и, следовательно, macOS gcc , который является псевдонимом clang. Я пытаюсь выяснить, в чем заключается ошибка --- clang для отклонения допустимого кода, программа для создания недействительного кода или macOS для притворства компилятора, который не является замена для gcc есть.)

...