Является ли предупреждение GCC относительно квалификатора const правильным? - PullRequest
0 голосов
/ 04 февраля 2019

Рассмотрим следующий код, который возник из "> этого вопроса :

const int (*foo(const char *a))[1]
    { return (const int (*)[1]) a; }

Когда скомпилировано с GCC 8.2 (и более ранними версиями) с использованием -Wcast-qual,GCC предупреждает:

source>:2:15: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]
      { return (const int (*)[1]) a; }
               ^

Правильно ли это предупреждение?Ясно, что тип назначения содержит спецификатор const.

Он относится к типу элемента, а не к объекту, на который непосредственно указывает указатель, который является типом массива.Однако предупреждение остается, даже если мы используем typedef int T[1]; и заменяем приведение на (const T *).Кроме того, согласно C 2018 6.7.3 10 квалификаторы для типа массива применяются к типу элемента, а не к типу массива, поэтому тип одинаков в любом случае.

Clang не показывает это предупреждение.

Если мы изменим приведение на (const void *):

const int (*foo(const char *a))[1]
    { return (const void *) a; }

, предупреждение исчезнет.Если мы добавим -pedantic к ключам компиляции, мы получим другое предупреждение о const:

source>:2:15: warning: return discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
      { return (const void *) a; }
               ^~~~~~~~~~~~~~~~

Это похоже на то же предупреждение, за исключением того, что речь идет о подразумеваемом преобразовании из выражения возврата в функциютип возврата, тогда как предыдущее предупреждение касалось явного преобразования в приведении.Но этот появляется только с -pedantic.Почему?

1 Ответ

0 голосов
/ 05 февраля 2019

Это ошибка GCC 81631 .GCC не может распознать приведение к указателю на массив и сохраняет квалификатор const из-за сложностей с квалификаторами, примененными к массиву, которые фактически применяются к элементам массива.

...