G ++ -Wshadow не предупреждает о затенении статических элементов

Я снова потерял несколько часов из-за простой глупости, которую мог бы признать компилятор. Это исходный код в вопросе:

class f {
static int mVar;
int g(int x) { int mVar=3; return x+mVar; }
};
int f::mVar = 1;

Проблема в том, что я случайно добавил int перед mVar, Когда я собираю это с: g++ -c -Wall -Wextra -Wshadow shadowtest.cpp Я не получаю никаких предупреждений о местных mVar отслеживание статического члена mVar,

Но если я не объявляю переменную-член статической, то g ++ правильно выдает предупреждение:

class f {
int mVar;
f(int rVar) : mVar(rVar) {};
int g(int x) { int mVar=3; return x+mVar; }
};

компилировать с g++ -c -Wall -Wextra -Wshadow shadowtest2.cpp получает:

shadowtest2.cpp:5:24: warning: declaration of ‘mVar’ shadows a member of ‘f’ [-Wshadow]
int g(int x) { int mVar=3; return x+mVar; }
^
shadowtest2.cpp:3:9: note: shadowed declaration is here
int mVar;
^

Протестировано с g ++ 4.9.2 и 5.2.1.

Это правильное поведение или ошибка? Зачем?

Изменить: я подал отчет об ошибке здесь: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68374

Изменить 2018-02-12: не предупреждает в следующих версиях:

g++-4.9 (Debian 4.9.4-2) 4.9.4
g++-5 (Debian 5.4.1-4) 5.4.1 20161202
g++-5 (Debian 5.5.0-8) 5.5.0 20171010
g++-6 (Debian 6.3.0-18) 6.3.0 20170516
g++-6 (Debian 6.4.0-12) 6.4.0 20180123
g++-7 (Debian 7.2.0-16) 7.2.0
g++-7 (Debian 7.3.0-3) 7.3.0

но успешно предупреждает в:

g++-8 (Debian 8-20180207-2) 8.0.1 20180207 (experimental) [trunk revision 257435]

9

Решение

Это выглядит потенциально как ошибка, учитывая описание -Wshadow в документации gcc:

Предупреждать всякий раз, когда локальная переменная или объявление типа затеняет другую переменная, параметр, тип, член класса (в C ++), или переменная экземпляра (в Objective-C) или всякий раз, когда встроенная функция затенена. Обратите внимание, что в C ++ компилятор предупреждает, скрывает ли локальная переменная явный typedef, но не затеняет struct / class / enum.

Особенно учитывая, что Clang предупреждает об этом случае. Это в основном проблема качества реализации, поскольку это не плохо сформированный код. Я бы подал отчет об ошибке. Скорее всего, они предоставят обоснование для того, чтобы не предупреждать в этом случае, или они в конечном итоге исправят предупреждения.

Похоже, что gcc используется для предупреждения об этом случае, если мы вернемся к версии 4.5.4. увидеть это в прямом эфире.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]