On Fri, Jun 9, 2017 at 11:28 PM, David Blaikie <dblai...@gmail.com> wrote: > Looks all good OK, thank you.
> please commit whenever you're ready - if you don't have > commit access, I (or anyone else with commit access) can commit this for > you. Will re-test and commit in +~12 hours. > On Tue, Jun 6, 2017 at 1:57 PM Roman Lebedev <lebedev...@gmail.com> wrote: >> >> On Tue, Jun 6, 2017 at 8:52 PM, David Blaikie <dblai...@gmail.com> wrote: >> > >> > >> > On Tue, Jun 6, 2017 at 3:59 AM Roman Lebedev via Phabricator >> > <revi...@reviews.llvm.org> wrote: >> >> >> >> lebedev.ri added a comment. >> >> >> >> In https://reviews.llvm.org/D33102#773296, @dblaikie wrote: >> >> >> >> > I still feel like that's more testing than would be ideal (does the >> >> > context of the cast matter? Wether it's dereferenced, a struct member >> >> > access, assigned, initialized, etc - it doesn't look like it from the >> >> > code, >> >> > etc). >> >> >> >> >> >> Looking at the `CastsAwayConstness()` function in >> >> lib/Sema/SemaCast.cpp: >> >> >> >> https://github.com/llvm-mirror/clang/blob/432ed0e4a6d58f7dda8992a167aad43bc91f76c6/lib/Sema/SemaCast.cpp#L505-L510 >> >> You can see that it asserts that the pointer is one of three types. So >> >> i >> >> think it it is best to have maybe slightly overlapping test coverage >> >> here, >> >> rather than be surprised one day that such trivial cases no longer >> >> warn... >> >> >> >> > But sure. Could you also (manually, I guess) confirm that this >> >> > matches >> >> > GCC's cast-qual behavior (insofar as the warning fires in the same >> >> > situations). If there are any deviations, let's chat about them. >> >> >> >> Sure. >> >> >> >> 1. Gcc produces the same //count// of the warnings: >> >> >> >> $ pwd >> >> llvm/tools/clang/test >> >> $ grep -o "expected-warning" Sema/warn-cast-qual.c | wc -l >> >> 14 >> >> $ gcc -x c -fsyntax-only -Wcast-qual -c Sema/warn-cast-qual.c 2>&1 | >> >> grep ": warning: " | wc -l >> >> 14 >> >> $ gcc -x c++ -fsyntax-only -Wcast-qual -c Sema/warn-cast-qual.c 2>&1 >> >> | >> >> grep ": warning: " | wc -l >> >> 14 >> >> $ grep -o "expected-warning" SemaCXX/warn-cast-qual.cpp | wc -l >> >> 39 >> >> $ gcc -x c++ -fsyntax-only -Wcast-qual -c SemaCXX/warn-cast-qual.cpp >> >> 2>&1 | grep ": warning: " | wc -l >> >> 39 >> >> >> >> 2. I'm not quite sure how to non-manually compare the warnings, so i'll >> >> just show the gcc output on these three cases. Since the clang warnings >> >> are >> >> appended as comments at the end of the each line that should warn, >> >> visual >> >> comparison is possible: >> >> > Works for the positive cases, not the negative ones. (though if the >> > counts >> > are exactly the same, then so long as there are no false positives there >> > aren't any false negatives either) >> Yes, fair enough, i do not have anything to add here. >> >> >> >> >> >> >> 2.1. >> >> >> >> $ gcc -x c -fsyntax-only -Wcast-qual -c Sema/warn-cast-qual.c >> >> Sema/warn-cast-qual.c: In function ‘foo’: >> >> Sema/warn-cast-qual.c:9:13: warning: cast discards ‘const’ qualifier >> >> from pointer target type [-Wcast-qual] >> >> char *y = (char *)ptr; // expected-warning {{cast from 'const char >> >> *' >> >> to 'char *' drops const qualifier}} >> >> ^ >> >> Sema/warn-cast-qual.c:10:15: warning: cast discards ‘const’ qualifier >> >> from pointer target type [-Wcast-qual] >> >> char **y1 = (char **)ptrptr; // expected-warning {{cast from >> >> 'const >> >> char *const' to 'char *' drops const qualifier}} >> >> ^ >> >> Sema/warn-cast-qual.c:11:21: warning: cast discards ‘const’ qualifier >> >> from pointer target type [-Wcast-qual] >> >> const char **y2 = (const char **)ptrptr; // expected-warning >> >> {{cast >> >> from 'const char *const *' to 'const char **' drops const qualifier}} >> >> ^ >> >> Sema/warn-cast-qual.c:14:14: warning: cast discards ‘const’ qualifier >> >> from pointer target type [-Wcast-qual] >> >> char *z1 = (char *)(const void *)ptr; // expected-warning {{cast >> >> from >> >> 'const void *' to 'char *' drops const qualifier}} >> >> ^ >> >> Sema/warn-cast-qual.c:17:16: warning: cast discards ‘volatile’ >> >> qualifier >> >> from pointer target type [-Wcast-qual] >> >> char *vol2 = (char *)vol; // expected-warning {{cast from >> >> 'volatile >> >> char *' to 'char *' drops volatile qualifier}} >> >> ^ >> >> Sema/warn-cast-qual.c:19:17: warning: cast discards ‘const volatile’ >> >> qualifier from pointer target type [-Wcast-qual] >> >> char *volc2 = (char *)volc; // expected-warning {{cast from 'const >> >> volatile char *' to 'char *' drops const and volatile qualifiers}} >> >> ^ >> >> Sema/warn-cast-qual.c:22:28: warning: to be safe all intermediate >> >> pointers in cast from ‘int **’ to ‘const int **’ must be ‘const’ >> >> qualified >> >> [-Wcast-qual] >> >> const int **intptrptrc = (const int **)intptrptr; // >> >> expected-warning >> >> {{cast from 'int **' to 'const int **' must have all intermediate >> >> pointers >> >> const qualified}} >> >> ^ >> >> Sema/warn-cast-qual.c:23:31: warning: to be safe all intermediate >> >> pointers in cast from ‘int **’ to ‘volatile int **’ must be ‘const’ >> >> qualified [-Wcast-qual] >> >> volatile int **intptrptrv = (volatile int **)intptrptr; // >> >> expected-warning {{cast from 'int **' to 'volatile int **' must have >> >> all >> >> intermediate pointers const qualified}} >> >> ^ >> >> Sema/warn-cast-qual.c:29:23: warning: cast discards ‘const’ qualifier >> >> from pointer target type [-Wcast-qual] >> >> char **charptrptr = (char **)charptrptrc; // expected-warning >> >> {{cast >> >> from 'const char *' to 'char *' drops const qualifier}} >> >> ^ >> >> Sema/warn-cast-qual.c:32:19: warning: cast discards ‘const’ qualifier >> >> from pointer target type [-Wcast-qual] >> >> char *charptr = (char *)constcharptr; // expected-warning {{cast >> >> from >> >> 'const char *' to 'char *' drops const qualifier}} >> >> ^ >> >> Sema/warn-cast-qual.c:33:31: warning: cast discards ‘const’ qualifier >> >> from pointer target type [-Wcast-qual] >> >> const char *constcharptr2 = (char *)constcharptr; // >> >> expected-warning >> >> {{cast from 'const char *' to 'char *' drops const qualifier}} >> >> ^ >> >> Sema/warn-cast-qual.c: In function ‘bar_0’: >> >> Sema/warn-cast-qual.c:45:4: warning: cast discards ‘const’ qualifier >> >> from pointer target type [-Wcast-qual] >> >> *(int *)(&S.a) = 0; // expected-warning {{cast from 'const int *' >> >> to >> >> 'int *' drops const qualifier}} >> >> ^ >> >> Sema/warn-cast-qual.c:46:4: warning: cast discards ‘const’ qualifier >> >> from pointer target type [-Wcast-qual] >> >> *(int *)(&S.b) = 0; // expected-warning {{cast from 'const int *' >> >> to >> >> 'int *' drops const qualifier}} >> >> ^ >> >> Sema/warn-cast-qual.c: In function ‘bar_1’: >> >> Sema/warn-cast-qual.c:58:4: warning: cast discards ‘const’ qualifier >> >> from pointer target type [-Wcast-qual] >> >> *(int *)(&S.a) = 0; // expected-warning {{cast from 'const int *' >> >> to >> >> 'int *' drops const qualifier}} >> >> ^ >> >> >> >> One thing to note: >> >> >> >> Sema/warn-cast-qual.c:23:31: warning: to be safe all intermediate >> >> pointers in cast from ‘int **’ to ‘volatile int **’ must be ‘const’ >> >> qualified [-Wcast-qual] >> >> volatile int **intptrptrv = (volatile int **)intptrptr; // >> >> expected-warning {{cast from 'int **' to 'volatile int **' must have >> >> all >> >> intermediate pointers const qualified}} >> >> ^ >> >> >> >> ^ both compilers talk about `const qualified`, even though the >> >> `volatile` >> >> is dropped. >> > >> > >> > Fair enough - 'cv qualified' (or detecting which qualifier was being >> > dropped) would probably be more technically correct. (detecting's >> > probably >> > better because 'cv qualifeid' might be confusing to the average user >> > that's >> > more likely to hit this over const than volatile) >> > >> >> >> >> 2.2. >> >> >> >> $ gcc -x c++ -fsyntax-only -Wcast-qual -c Sema/warn-cast-qual.c >> >> Sema/warn-cast-qual.c: In function ‘void foo()’: >> >> Sema/warn-cast-qual.c:9:21: warning: cast from type ‘const char* >> >> const’ >> >> to type ‘char*’ casts away qualifiers [-Wcast-qual] >> >> char *y = (char *)ptr; // expected-warning {{cast from 'const char >> >> *' >> >> to 'char *' drops const qualifier}} >> >> ^~~ >> >> Sema/warn-cast-qual.c:10:24: warning: cast from type ‘const char* >> >> const*’ to type ‘char**’ casts away qualifiers [-Wcast-qual] >> >> char **y1 = (char **)ptrptr; // expected-warning {{cast from >> >> 'const >> >> char *const' to 'char *' drops const qualifier}} >> >> ^~~~~~ >> >> Sema/warn-cast-qual.c:11:36: warning: cast from type ‘const char* >> >> const*’ to type ‘const char**’ casts away qualifiers [-Wcast-qual] >> >> const char **y2 = (const char **)ptrptr; // expected-warning >> >> {{cast >> >> from 'const char *const *' to 'const char **' drops const qualifier}} >> >> ^~~~~~ >> >> Sema/warn-cast-qual.c:14:36: warning: cast from type ‘const void*’ to >> >> type ‘char*’ casts away qualifiers [-Wcast-qual] >> >> char *z1 = (char *)(const void *)ptr; // expected-warning {{cast >> >> from >> >> 'const void *' to 'char *' drops const qualifier}} >> >> ^~~ >> >> Sema/warn-cast-qual.c:17:24: warning: cast from type ‘volatile char*’ >> >> to >> >> type ‘char*’ casts away qualifiers [-Wcast-qual] >> >> char *vol2 = (char *)vol; // expected-warning {{cast from >> >> 'volatile >> >> char *' to 'char *' drops volatile qualifier}} >> >> ^~~ >> >> Sema/warn-cast-qual.c:19:25: warning: cast from type ‘const volatile >> >> char*’ to type ‘char*’ casts away qualifiers [-Wcast-qual] >> >> char *volc2 = (char *)volc; // expected-warning {{cast from 'const >> >> volatile char *' to 'char *' drops const and volatile qualifiers}} >> >> ^~~~ >> >> Sema/warn-cast-qual.c:22:42: warning: cast from type ‘int**’ to type >> >> ‘const int**’ casts away qualifiers [-Wcast-qual] >> >> const int **intptrptrc = (const int **)intptrptr; // >> >> expected-warning >> >> {{cast from 'int **' to 'const int **' must have all intermediate >> >> pointers >> >> const qualified}} >> >> ^~~~~~~~~ >> >> Sema/warn-cast-qual.c:23:48: warning: cast from type ‘int**’ to type >> >> ‘volatile int**’ casts away qualifiers [-Wcast-qual] >> >> volatile int **intptrptrv = (volatile int **)intptrptr; // >> >> expected-warning {{cast from 'int **' to 'volatile int **' must have >> >> all >> >> intermediate pointers const qualified}} >> >> ^~~~~~~~~ >> >> Sema/warn-cast-qual.c:29:32: warning: cast from type ‘const char**’ >> >> to >> >> type ‘char**’ casts away qualifiers [-Wcast-qual] >> >> char **charptrptr = (char **)charptrptrc; // expected-warning >> >> {{cast >> >> from 'const char *' to 'char *' drops const qualifier}} >> >> ^~~~~~~~~~~ >> >> Sema/warn-cast-qual.c:32:27: warning: cast from type ‘const char*’ to >> >> type ‘char*’ casts away qualifiers [-Wcast-qual] >> >> char *charptr = (char *)constcharptr; // expected-warning {{cast >> >> from >> >> 'const char *' to 'char *' drops const qualifier}} >> >> ^~~~~~~~~~~~ >> >> Sema/warn-cast-qual.c:33:39: warning: cast from type ‘const char*’ to >> >> type ‘char*’ casts away qualifiers [-Wcast-qual] >> >> const char *constcharptr2 = (char *)constcharptr; // >> >> expected-warning >> >> {{cast from 'const char *' to 'char *' drops const qualifier}} >> >> ^~~~~~~~~~~~ >> >> Sema/warn-cast-qual.c: In function ‘void bar_0()’: >> >> Sema/warn-cast-qual.c:45:16: warning: cast from type ‘const int*’ to >> >> type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> *(int *)(&S.a) = 0; // expected-warning {{cast from 'const int *' >> >> to >> >> 'int *' drops const qualifier}} >> >> ^ >> >> Sema/warn-cast-qual.c:46:16: warning: cast from type ‘const int*’ to >> >> type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> *(int *)(&S.b) = 0; // expected-warning {{cast from 'const int *' >> >> to >> >> 'int *' drops const qualifier}} >> >> ^ >> >> Sema/warn-cast-qual.c: In function ‘void bar_1()’: >> >> Sema/warn-cast-qual.c:58:16: warning: cast from type ‘const int*’ to >> >> type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> *(int *)(&S.a) = 0; // expected-warning {{cast from 'const int *' >> >> to >> >> 'int *' drops const qualifier}} >> >> ^ >> >> >> >> 2.3. >> >> And here are the C++ reference warnings. As you can see, gcc warnings >> >> are >> >> rather broken i'd say... >> > >> > >> > There's a lot to read through - what sort of brokenness were you >> > referring >> > to? >> >> > The fact that the error messages talk about pointers when the code is >> > about references? Fair. >> Yes, only that >> >> > Anything else? >> Not as far as i can tell. >> One thing to note is that for complicated, multi-pointer variables like: >> >> >> SemaCXX/warn-cast-qual.cpp: In function ‘void bar_0()’: >> >> SemaCXX/warn-cast-qual.cpp:67:38: warning: cast from type ‘const >> >> int**’ >> >> to type ‘int**’ casts away qualifiers [-Wcast-qual] >> >> int **a0 = (int **)((const int **)a); // expected-warning {{cast >> >> from >> >> 'const int *' to 'int *' drops const qualifier}} >> >> ^ >> the gcc outputs full types, and clang dissects them, and outputs only >> invalid part. >> But i'm pretty sure this isn't new. >> >> >> >> >> >> >> $ gcc -x c++ -fsyntax-only -Wcast-qual -c SemaCXX/warn-cast-qual.cpp >> >> SemaCXX/warn-cast-qual.cpp: In function ‘void foo_0()’: >> >> SemaCXX/warn-cast-qual.cpp:24:20: warning: cast from type ‘const >> >> int*’ >> >> to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> int &a2 = (int &)a; // expected-warning >> >> {{cast >> >> from 'const int' to 'int &' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:25:26: warning: cast from type ‘const >> >> int*’ >> >> to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> const int &a3 = (int &)a; // expected-warning >> >> {{cast >> >> from 'const int' to 'int &' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:26:35: warning: cast from type ‘const >> >> int*’ >> >> to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> int &a4 = (int &)((const int &)a); // expected-warning >> >> {{cast >> >> from 'const int' to 'int &' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:27:28: warning: cast from type ‘const >> >> int*’ >> >> to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> int &a5 = (int &)((int &)a); // expected-warning >> >> {{cast >> >> from 'const int' to 'int &' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:28:34: warning: cast from type ‘const >> >> int*’ >> >> to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> const int &a6 = (int &)((int &)a); // expected-warning >> >> {{cast >> >> from 'const int' to 'int &' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:29:41: warning: cast from type ‘const >> >> int*’ >> >> to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> const int &a7 = (int &)((const int &)a); // expected-warning >> >> {{cast >> >> from 'const int' to 'int &' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:30:40: warning: cast from type ‘const >> >> int*’ >> >> to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> const int &a8 = (const int &)((int &)a); // expected-warning >> >> {{cast >> >> from 'const int' to 'int &' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp: In function ‘void foo_1()’: >> >> SemaCXX/warn-cast-qual.cpp:39:20: warning: cast from type ‘volatile >> >> int*’ to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> int &a2 = (int &)a; // expected-warning >> >> {{cast from 'volatile int' to 'int &' drops volatile qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:40:29: warning: cast from type ‘volatile >> >> int*’ to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> volatile int &a3 = (int &)a; // expected-warning >> >> {{cast from 'volatile int' to 'int &' drops volatile qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:41:38: warning: cast from type ‘volatile >> >> int*’ to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> int &a4 = (int &)((volatile int &)a); // expected-warning >> >> {{cast from 'volatile int' to 'int &' drops volatile qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:42:28: warning: cast from type ‘volatile >> >> int*’ to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> int &a5 = (int &)((int &)a); // expected-warning >> >> {{cast from 'volatile int' to 'int &' drops volatile qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:43:37: warning: cast from type ‘volatile >> >> int*’ to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> volatile int &a6 = (int &)((int &)a); // expected-warning >> >> {{cast from 'volatile int' to 'int &' drops volatile qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:44:47: warning: cast from type ‘volatile >> >> int*’ to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> volatile int &a7 = (int &)((volatile int &)a); // expected-warning >> >> {{cast from 'volatile int' to 'int &' drops volatile qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:45:46: warning: cast from type ‘volatile >> >> int*’ to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> volatile int &a8 = (volatile int &)((int &)a); // expected-warning >> >> {{cast from 'volatile int' to 'int &' drops volatile qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp: In function ‘void foo_2()’: >> >> SemaCXX/warn-cast-qual.cpp:54:20: warning: cast from type ‘const >> >> volatile int*’ to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> int &a2 = (int &)a; // >> >> expected-warning {{cast from 'const volatile int' to 'int &' drops >> >> const and >> >> volatile qualifiers}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:55:35: warning: cast from type ‘const >> >> volatile int*’ to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> const volatile int &a3 = (int &)a; // >> >> expected-warning {{cast from 'const volatile int' to 'int &' drops >> >> const and >> >> volatile qualifiers}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:56:44: warning: cast from type ‘const >> >> volatile int*’ to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> int &a4 = (int &)((const volatile int &)a); // >> >> expected-warning {{cast from 'const volatile int' to 'int &' drops >> >> const and >> >> volatile qualifiers}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:57:28: warning: cast from type ‘const >> >> volatile int*’ to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> int &a5 = (int &)((int &)a); // >> >> expected-warning {{cast from 'const volatile int' to 'int &' drops >> >> const and >> >> volatile qualifiers}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:58:43: warning: cast from type ‘const >> >> volatile int*’ to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> const volatile int &a6 = (int &)((int &)a); // >> >> expected-warning {{cast from 'const volatile int' to 'int &' drops >> >> const and >> >> volatile qualifiers}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:59:59: warning: cast from type ‘const >> >> volatile int*’ to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> const volatile int &a7 = (int &)((const volatile int &)a); // >> >> expected-warning {{cast from 'const volatile int' to 'int &' drops >> >> const and >> >> volatile qualifiers}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:60:58: warning: cast from type ‘const >> >> volatile int*’ to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> const volatile int &a8 = (const volatile int &)((int &)a); // >> >> expected-warning {{cast from 'const volatile int' to 'int &' drops >> >> const and >> >> volatile qualifiers}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp: In function ‘void bar_0()’: >> >> SemaCXX/warn-cast-qual.cpp:67:38: warning: cast from type ‘const >> >> int**’ >> >> to type ‘int**’ casts away qualifiers [-Wcast-qual] >> >> int **a0 = (int **)((const int **)a); // expected-warning {{cast >> >> from >> >> 'const int *' to 'int *' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:68:31: warning: cast from type ‘const >> >> int**’ >> >> to type ‘int**’ casts away qualifiers [-Wcast-qual] >> >> int **a1 = (int **)((int **)a); // expected-warning {{cast >> >> from >> >> 'const int *' to 'int *' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:73:43: warning: cast from type ‘const >> >> int**’ >> >> to type ‘int**’ casts away qualifiers [-Wcast-qual] >> >> const int **a4 = (const int **)((int **)a); // >> >> expected-warning {{cast from 'const int *' to 'int *' drops const >> >> qualifier}} expected-warning {{cast from 'int **' to 'const int **' >> >> must >> >> have all intermediate pointers const qualified to be safe}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:73:44: warning: cast from type ‘int**’ to >> >> type ‘const int**’ casts away qualifiers [-Wcast-qual] >> >> const int **a4 = (const int **)((int **)a); // >> >> expected-warning {{cast from 'const int *' to 'int *' drops const >> >> qualifier}} expected-warning {{cast from 'int **' to 'const int **' >> >> must >> >> have all intermediate pointers const qualified to be safe}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp: In function ‘void bar_1()’: >> >> SemaCXX/warn-cast-qual.cpp:81:38: warning: cast from type ‘const >> >> int**’ >> >> to type ‘int**’ casts away qualifiers [-Wcast-qual] >> >> int *&a0 = (int *&)((const int *&)a); // expected-warning {{cast >> >> from >> >> 'const int *' to 'int *' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:82:31: warning: cast from type ‘const >> >> int**’ >> >> to type ‘int**’ casts away qualifiers [-Wcast-qual] >> >> int *&a1 = (int *&)((int *&)a); // expected-warning {{cast >> >> from >> >> 'const int *' to 'int *' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:87:43: warning: cast from type ‘const >> >> int**’ >> >> to type ‘int**’ casts away qualifiers [-Wcast-qual] >> >> const int *&a4 = (const int *&)((int *&)a); // >> >> expected-warning {{cast from 'const int *' to 'int *' drops const >> >> qualifier}} expected-warning {{cast from 'int *' to 'const int *&' must >> >> have >> >> all intermediate pointers const qualified to be safe}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:87:44: warning: cast from type ‘int**’ to >> >> type ‘const int**’ casts away qualifiers [-Wcast-qual] >> >> const int *&a4 = (const int *&)((int *&)a); // >> >> expected-warning {{cast from 'const int *' to 'int *' drops const >> >> qualifier}} expected-warning {{cast from 'int *' to 'const int *&' must >> >> have >> >> all intermediate pointers const qualified to be safe}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp: In function ‘void baz_0()’: >> >> SemaCXX/warn-cast-qual.cpp:100:9: warning: cast from type ‘const >> >> baz_0()::C*’ to type ‘baz_0()::C*’ casts away qualifiers [-Wcast-qual] >> >> ((C &)S).B(); // expected-warning {{cast from 'const C' to 'C &' >> >> drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:101:9: warning: cast from type ‘const >> >> baz_0()::C*’ to type ‘baz_0()::C*’ casts away qualifiers [-Wcast-qual] >> >> ((C &)S).A(); // expected-warning {{cast from 'const C' to 'C &' >> >> drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:103:10: warning: cast from type ‘const >> >> baz_0()::C*’ to type ‘baz_0()::C*’ casts away qualifiers [-Wcast-qual] >> >> ((C *)&S)->B(); // expected-warning {{cast from 'const C *' to 'C >> >> *' >> >> drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:104:10: warning: cast from type ‘const >> >> baz_0()::C*’ to type ‘baz_0()::C*’ casts away qualifiers [-Wcast-qual] >> >> ((C *)&S)->A(); // expected-warning {{cast from 'const C *' to 'C >> >> *' >> >> drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp: In function ‘void baz_1()’: >> >> SemaCXX/warn-cast-qual.cpp:119:16: warning: cast from type ‘const >> >> int*’ >> >> to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> (int &)(S.a) = 0; // expected-warning {{cast from 'const int' to >> >> 'int &' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:122:18: warning: cast from type ‘const >> >> int*’ >> >> to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> *(int *)(&S.a) = 0; // expected-warning {{cast from 'const int >> >> *' >> >> to 'int *' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:128:16: warning: cast from type ‘const >> >> int*’ >> >> to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> (int &)(S.a) = 0; // expected-warning {{cast from 'const int' to >> >> 'int &' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:129:16: warning: cast from type ‘const >> >> int*’ >> >> to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> (int &)(S.b) = 0; // expected-warning {{cast from 'const int' to >> >> 'int &' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:131:18: warning: cast from type ‘const >> >> int*’ >> >> to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> *(int *)(&S.a) = 0; // expected-warning {{cast from 'const int >> >> *' >> >> to 'int *' drops const qualifier}} >> >> ^ >> >> SemaCXX/warn-cast-qual.cpp:132:18: warning: cast from type ‘const >> >> int*’ >> >> to type ‘int*’ casts away qualifiers [-Wcast-qual] >> >> *(int *)(&S.b) = 0; // expected-warning {{cast from 'const int >> >> *' >> >> to 'int *' drops const qualifier}} >> >> ^ >> >> >> >> So to me it seems that for our clang's testcases, both compilers >> >> produce >> >> the compatible set of warnings... >> >> >> >> >> >> Repository: >> >> rL LLVM >> >> >> >> https://reviews.llvm.org/D33102 >> >> >> >> >> >> >> > >> >> Roman. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits