xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/bugprone/casting-through-void.cpp (revision d25e24a0eb909b7604572d28d15cbe648ecccd90)
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