Почему не нужно , чтобы вызвать предупреждение, из-за раздела стандарта, в котором это происходит - 6.7.6.3p7 :
Семантика
[...]
Объявление параметра как «массива типа» должно быть скорректировано на «квалифицированный указатель на тип», где квалификаторы типа (если таковые имеются) - это те, которые указаны в [и] при выводе типа массива,Если ключевое слово static также присутствует в [и] деривации типа массива, то для каждого вызова функции значение соответствующего фактического аргумента должно обеспечивать доступ к первому элементу массива с atкак минимум столько же элементов, сколько указано в выражении размера.
Появляется в разделе семантика .Соответствующая реализация требуется только для диагностики тех, которые появляются в ограничениях .Даже когда он не диагностирует нарушение здесь, он может использовать знание ключевого слова static
, чтобы сделать вывод, что аргумент не равен нулю, и что при циклическом развертывании и других оптимизациях может ожидаться массив, который будет иметь по крайней мере столько же элементов.
Также обратите внимание, что пример 5 там говорит, что
void f(double (* restrict a)[5]);
void f(double a[restrict][5]);
void f(double a[restrict 3][5]);
void f(double a[restrict static 3][5]);
все совместимы , то есть вы можете смешивать исопоставляйте их в назначениях указателей на функции без приведения, даже если у вас есть измерение static
!
Кажется, что clang (возможно, это правильно) теряет способность что-либо диагностировать, если вызов осуществляется через указатель функции:
void (*f)(double a[restrict static 3]);
int main(void) {
double a[1] = {0};
f(a);
}
(в Clang 7.0 нет диагностики - удалите *
и вы их получите).