19a5c6f17SCongcong Cai // RUN: %check_clang_tidy %s bugprone-casting-through-void %t 29a5c6f17SCongcong Cai 39a5c6f17SCongcong Cai using V = void*; 49a5c6f17SCongcong Cai using CV = const void*; 59a5c6f17SCongcong Cai 69a5c6f17SCongcong Cai int i = 100; 79a5c6f17SCongcong Cai double d = 100; 89a5c6f17SCongcong Cai const int ci = 100; 99a5c6f17SCongcong Cai const double cd = 100; 109a5c6f17SCongcong Cai 119a5c6f17SCongcong Cai void normal_test() { 129a5c6f17SCongcong Cai static_cast<int *>(static_cast<void *>(&d)); 13*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void] 149a5c6f17SCongcong Cai static_cast<int *>(static_cast<V>(&d)); 15*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: do not cast 'double *' to 'int *' through 'V' (aka 'void *'); use reinterpret_cast instead [bugprone-casting-through-void] 169a5c6f17SCongcong Cai static_cast<int *>(static_cast<void *>(&i)); 17*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: do not cast 'int *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void] 189a5c6f17SCongcong Cai 199a5c6f17SCongcong Cai static_cast<void *>(static_cast<void *>(&i)); 209a5c6f17SCongcong Cai } 219a5c6f17SCongcong Cai 229a5c6f17SCongcong Cai void const_pointer_test() { 239a5c6f17SCongcong Cai static_cast<int *const>(static_cast<void *>(&d)); 24*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not cast 'double *' to 'int *const' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void] 259a5c6f17SCongcong Cai static_cast<int *const>(static_cast<V>(&d)); 26*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not cast 'double *' to 'int *const' through 'V' (aka 'void *'); use reinterpret_cast instead [bugprone-casting-through-void] 279a5c6f17SCongcong Cai static_cast<int *const>(static_cast<void *>(&i)); 28*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not cast 'int *' to 'int *const' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void] 299a5c6f17SCongcong Cai 309a5c6f17SCongcong Cai static_cast<void *const>(static_cast<void *>(&i)); 319a5c6f17SCongcong Cai } 329a5c6f17SCongcong Cai 339a5c6f17SCongcong Cai void const_test() { 349a5c6f17SCongcong Cai static_cast<const int *>(static_cast<const void *>(&d)); 35*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not cast 'double *' to 'const int *' through 'const void *'; use reinterpret_cast instead [bugprone-casting-through-void] 369a5c6f17SCongcong Cai static_cast<const int *>(static_cast<const V>(&d)); 37*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not cast 'double *' to 'const int *' through 'const V' (aka 'void *const'); use reinterpret_cast instead [bugprone-casting-through-void] 389a5c6f17SCongcong Cai static_cast<const int *>(static_cast<const void *>(&i)); 39*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not cast 'int *' to 'const int *' through 'const void *'; use reinterpret_cast instead [bugprone-casting-through-void] 409a5c6f17SCongcong Cai 419a5c6f17SCongcong Cai static_cast<const void *>(static_cast<const void *>(&i)); 429a5c6f17SCongcong Cai 439a5c6f17SCongcong Cai static_cast<const int *>(static_cast<const void *>(&cd)); 44*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not cast 'const double *' to 'const int *' through 'const void *'; use reinterpret_cast instead [bugprone-casting-through-void] 459a5c6f17SCongcong Cai static_cast<const int *>(static_cast<const CV>(&cd)); 46*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not cast 'const double *' to 'const int *' through 'const CV' (aka 'const void *const'); use reinterpret_cast instead [bugprone-casting-through-void] 479a5c6f17SCongcong Cai static_cast<const int *>(static_cast<const void *>(&ci)); 48*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not cast 'const int *' to 'const int *' through 'const void *'; use reinterpret_cast instead [bugprone-casting-through-void] 499a5c6f17SCongcong Cai 509a5c6f17SCongcong Cai static_cast<const void *>(static_cast<const void *>(&ci)); 519a5c6f17SCongcong Cai } 529a5c6f17SCongcong Cai 539a5c6f17SCongcong Cai 549a5c6f17SCongcong Cai void reinterpret_cast_test() { 559a5c6f17SCongcong Cai static_cast<int *>(reinterpret_cast<void *>(&d)); 56*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void] 579a5c6f17SCongcong Cai reinterpret_cast<int *>(static_cast<void *>(&d)); 58*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void] 599a5c6f17SCongcong Cai reinterpret_cast<int *>(reinterpret_cast<void *>(&d)); 60*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void] 619a5c6f17SCongcong Cai 629a5c6f17SCongcong Cai static_cast<void *>(reinterpret_cast<void *>(&i)); 639a5c6f17SCongcong Cai reinterpret_cast<void *>(reinterpret_cast<void *>(&i)); 649a5c6f17SCongcong Cai reinterpret_cast<void *>(static_cast<void *>(&i)); 659a5c6f17SCongcong Cai } 669a5c6f17SCongcong Cai 679a5c6f17SCongcong Cai void c_style_cast_test() { 689a5c6f17SCongcong Cai static_cast<int *>((void *)&d); 69*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void] 709a5c6f17SCongcong Cai (int *)(void *)&d; 71*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void] 729a5c6f17SCongcong Cai static_cast<int *>((void *)&d); 73*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void] 749a5c6f17SCongcong Cai 759a5c6f17SCongcong Cai static_cast<void *>((void *)&i); 769a5c6f17SCongcong Cai } 779a5c6f17SCongcong Cai 789a5c6f17SCongcong Cai struct A { 799a5c6f17SCongcong Cai A(void*); 809a5c6f17SCongcong Cai }; 819a5c6f17SCongcong Cai using I = int *; 829a5c6f17SCongcong Cai void cxx_functional_cast() { 839a5c6f17SCongcong Cai A(static_cast<void*>(&d)); 849a5c6f17SCongcong Cai I(static_cast<void*>(&d)); 85*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not cast 'double *' to 'I' (aka 'int *') through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void] 869a5c6f17SCongcong Cai } 879a5c6f17SCongcong Cai 889a5c6f17SCongcong Cai void bit_cast() { 899a5c6f17SCongcong Cai __builtin_bit_cast(int *, static_cast<void *>(&d)); 90*d25e24a0SCarlos Galvez // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void] 919a5c6f17SCongcong Cai } 92889e60dbSPiotr Zegar 93889e60dbSPiotr Zegar namespace PR87069 { 94889e60dbSPiotr Zegar void castconstVoidToVoid() { 95889e60dbSPiotr Zegar const void* ptr = nullptr; 96889e60dbSPiotr Zegar int* numberPtr = static_cast<int*>(const_cast<void*>(ptr)); 97889e60dbSPiotr Zegar } 98889e60dbSPiotr Zegar } 99