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