lebedev.ri added a comment. So i'm trying to analyze that stage2 warning. The testcase //seems// to be: (autogenerated all the variants)
void test_nop() { unsigned char **ptr1 = 0; void **ptr2 = (void **)ptr1; } void test_bad() { unsigned char **ptr1 = 0; const void **ptr2 = (const void **)ptr1; // expected-warning {{cast from 'unsigned char **' to 'const void **' must have all intermediate pointers const qualified to be safe}} } void test_good0() { unsigned char **ptr1 = 0; void *const *ptr2 = (void *const *)ptr1; } void test_good1() { unsigned char **ptr1 = 0; const void *const *ptr2 = (const void *const *)ptr1; } void test_good2() { unsigned char *const *ptr1 = 0; void *const *ptr2 = (void *const *)ptr1; } void test_good3() { unsigned char *const *ptr1 = 0; const void *const *ptr2 = (const void *const *)ptr1; } void test_good4() { const unsigned char **ptr1 = 0; const void **ptr2 = (const void **)ptr1; } void test_good5() { const unsigned char **ptr1 = 0; const void *const *ptr2 = (const void *const *)ptr1; } void test_good6() { const unsigned char *const *ptr1 = 0; const void *const *ptr2 = (const void *const *)ptr1; } GCC does not warn about such code at all, clang in C mode does warn about only one combination: $ gcc -c /tmp/test.c -Wcast-qual $ echo $? 0 $ clang -c /tmp/test.c -Wcast-qual /tmp/test.c:7:38: warning: cast from 'unsigned char **' to 'const void **' must have all intermediate pointers const qualified to be safe [-Wcast-qual] const void **ptr2 = (const void **)ptr1; // expected-warning {{cast from 'unsigned char **' to 'const void **' must have all intermediate pointers const qualified to be safe}} ^ 1 warning generated. David, you reviewed the original `-Wcast-qual` patch, does all that ^ make sense? F3429854: gen.cpp <https://reviews.llvm.org/F3429854> Repository: rL LLVM https://reviews.llvm.org/D33102 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits