2015-11-16 11 views
9

Ponownie straciłem kilka godzin z powodu zwykłej głupoty, która mogła zostać rozpoznana przez kompilator. Jest to kod źródłowy w pytaniu:G ++ -Wshadow nie ostrzega o statycznym shadowingu członka

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

Problem polega na tym, że przypadkowo dodany int przed mVar. Kiedy kompiluję to z: g++ -c -Wall -Wextra -Wshadow shadowtest.cpp Nie otrzymuję żadnego ostrzeżenia, o lokalnym mVar cieniu statycznego członka mVar.

Ale jeśli nie zadeklarować zmienną składową być statyczny, a następnie g ++ poprawnie wysyła ostrzeżenie:

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

kompilacji z g++ -c -Wall -Wextra -Wshadow shadowtest2.cpp wystąpią:

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; 
     ^

Testowane z g ++ 4.9.2 i 5.2.1.

Czy to prawidłowe zachowanie lub błąd? Czemu?

Edit: I złożył raport o błędzie tutaj: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68374

Edycja 12.02.2018: Nie ostrzec w tych wersjach:

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 2018
g++-7 (Debian 7.2.0-16) 7.2.0 
g++-7 (Debian 7.3.0-3) 7.3.0 

ale skutecznie ostrzega:

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

Clang ostrzega. http://coliru.stacked-crooked.com/a/00a4eea04a1c5900 –

+0

Błąd oznacza, że ​​albo poprawny kod jest odrzucany, albo akceptowany jest nielegalny kod. Tak więc twój problem jest tylko niedogodny. –

+3

@ engf-010 Błąd to każde zachowanie, które różni się od udokumentowanego zachowania. Więc jeśli '-Wshadow' ma ostrzegać o tym, a nie, to jest błąd. Kompilator robi dziś więcej niż tylko standard C++. –

Odpowiedz

3

Wygląda to potencjalnie na błąd z opisem -Wshadow in the gcc documentation:

Ostrzeżenie gdy lokalna zgłoszenie zmienna lub typu cieni inny zmienny, parametr, typ członka klasy (w C++) lub wystąpienie zmienna (w celu C), lub w każdym przypadku wbudowany w funkcji jest zasłonięta. Zauważ, że w C++ kompilator ostrzega, czy zmienna lokalna cienie jawnie typedef, ale nie, jeśli cienie to struct/class/enum.

Szczególnie biorąc pod uwagę, że klang ostrzega przed tym przypadkiem. Jest to w zasadzie kwestia jakości implementacji, ponieważ nie jest to źle sformułowany kod. Zrobiłbym plik a bug report. Najprawdopodobniej będą stanowić uzasadnienie dla nie ostrzeżenia w tym przypadku lub ostatecznie naprawią ostrzeżenia.

Wygląda na to, że gcc użył ostrzeżenia o tej sprawie, jeśli cofniemy się do wersji 4.5.4 see it live.

+0

Dziękuję, nie używam klangu tak często, że nie myślałem o tym. Ale to dało mi wystarczająco dużo powodów, aby zgłosić to jako błąd. – mxmlnkn

+0

@xyzdragon huh, więc wygląda na to, że jeśli cofniemy się wystarczająco daleko, gcc użyjemy do ostrzeżenia o tej sprawie. Zastanawiam się, dlaczego się zmieniło. –

+0

Ktoś (OP Zgaduję) złożył go. https://gccnu.org/bugzilla/show_bug.cgi?id = 68374 –

Powiązane problemy