1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
// RUN: %check_clang_tidy %s bugprone-multi-level-implicit-pointer-conversion %t
using OneStar = void*;
using OneStarFancy = OneStar;
void takeFirstLevelVoidPtr(OneStar message);
void takeFirstLevelConstVoidPtr(const OneStarFancy message);
void takeFirstLevelConstVoidPtrConst(const void* const message);
void takeSecondLevelVoidPtr(void** message);
void** getSecondLevelVoidPtr();
void* getFirstLevelVoidPtr();
int** getSecondLevelIntPtr();
int* getFirstLevelIntPtr();
int table[5];
void test()
{
void** secondLevelVoidPtr;
int* firstLevelIntPtr;
// CHECK-MESSAGES: :[[@LINE+1]]:13: warning: multilevel pointer conversion from 'void **' to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
void* a = getSecondLevelVoidPtr();
void** b = getSecondLevelVoidPtr();
void* c = getFirstLevelVoidPtr();
// CHECK-MESSAGES: :[[@LINE+1]]:13: warning: multilevel pointer conversion from 'int **' to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
void* d = getSecondLevelIntPtr();
takeFirstLevelVoidPtr(&table);
takeFirstLevelVoidPtr(firstLevelIntPtr);
takeFirstLevelVoidPtr(getFirstLevelIntPtr());
// CHECK-MESSAGES: :[[@LINE+1]]:25: warning: multilevel pointer conversion from 'void **' to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
takeFirstLevelVoidPtr(secondLevelVoidPtr);
// CHECK-MESSAGES: :[[@LINE+1]]:30: warning: multilevel pointer conversion from 'void **' to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
takeFirstLevelConstVoidPtr(secondLevelVoidPtr);
// CHECK-MESSAGES: :[[@LINE+1]]:35: warning: multilevel pointer conversion from 'void **' to 'const void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
takeFirstLevelConstVoidPtrConst(secondLevelVoidPtr);
// CHECK-MESSAGES: :[[@LINE+1]]:35: warning: multilevel pointer conversion from 'void ***' to 'const void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
takeFirstLevelConstVoidPtrConst(&secondLevelVoidPtr);
takeSecondLevelVoidPtr(secondLevelVoidPtr);
// CHECK-MESSAGES: :[[@LINE+1]]:25: warning: multilevel pointer conversion from 'void **' to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
takeFirstLevelVoidPtr(getSecondLevelVoidPtr());
// CHECK-MESSAGES: :[[@LINE+1]]:30: warning: multilevel pointer conversion from 'void **' to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
takeFirstLevelConstVoidPtr(getSecondLevelVoidPtr());
// CHECK-MESSAGES: :[[@LINE+1]]:35: warning: multilevel pointer conversion from 'void **' to 'const void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
takeFirstLevelConstVoidPtrConst(getSecondLevelVoidPtr());
// CHECK-MESSAGES: :[[@LINE+1]]:25: warning: multilevel pointer conversion from 'int **' to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
takeFirstLevelVoidPtr(getSecondLevelIntPtr());
takeSecondLevelVoidPtr(getSecondLevelVoidPtr());
}
namespace PR93959 {
void free(void*);
void test() {
char **p = nullptr;
free(p);
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: multilevel pointer conversion from 'char **' to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
free((void *)p);
free(static_cast<void *>(p));
}
}
|