Предположим, у меня есть следующая программа 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
есть.)