Является ли это ошибкой в Clang? Следующий код:Clang не может вызывать ошибку при инициализаторах непостоянного массива в режиме C89
#include <stdio.h>
int main(void)
{
int foo = 42;
int bar[1] = { foo };
printf("%d\n", bar[0]);
return 0;
}
отлично компилируется с помощью:
clang -Wall -Wextra -Werror -pedantic -pedantic-errors -std=c89 -o foo foo.c
Я не думаю, что он должен составить, так как список инициализатора bar[]
содержит выражение, foo
, что не во время компиляции постоянная. В самом деле, если я использую gcc
вместо clang
я получить ожидаемые результаты:
$ gcc -Wall -Wextra -Werror -pedantic -pedantic-errors -std=c89 -o foo foo.c
foo.c: In function ‘main’:
foo.c:6: error: initializer element is not computable at load time
This question and its accepted answer, наряду с экстрактами this C89 description предполагают, что GCC является правильным и Clang является неправильным:
Выражения в инициализаторе для статического объекта или для агрегата или объединения должны быть постоянными выражениями.
Моя версия лязгом является:
$ clang -v
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin11.4.2
Одна вещь, которую я заметил, что последняя версия звоном, который присутствует на opensource.apple.com, я. е. clang 425.0.24, является только 4-ю субминионными версиями старше моего clang, и у него есть модульные тесты для инициализаторов массива. Однако, если я не пропущу что-то, не существует теста для инициализации автоматических массивов с объемной областью с неконстантными выражениями (тестируются только массивы с объемной областью и глобальные массивы). Here's the test file I found.
Итак, в чем заключена сделка?
clang on coliru говорит 'предупреждение: инициализатор для агрегата не является константой времени компиляции [-Wc99-extensions]' –
@ShafikYaghmour Приятно и правильно. Тогда это просто моя обреченная установка/версия компилятора, у которой есть эта проблема? –
Почему downvote? –