// RUN: %check_clang_tidy %s android-cloexec-fopen %t #define FILE_OPEN_RO "r" typedef int FILE; extern "C" FILE *fopen(const char *filename, const char *mode, ...); extern "C" FILE *open(const char *filename, const char *mode, ...); void f() { fopen("filename", "r"); // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: use 'fopen' mode 'e' to set O_CLOEXEC [android-cloexec-fopen] // CHECK-FIXES: fopen("filename", "re"); fopen("filename", FILE_OPEN_RO); // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: use 'fopen' mode 'e' // CHECK-FIXES: fopen("filename", FILE_OPEN_RO "e"); fopen("filename", "er"); // CHECK-MESSAGES-NOT: warning: fopen("filename", "re"); // CHECK-MESSAGES-NOT: warning: fopen("filename", "e"); // CHECK-MESSAGES-NOT: warning: open("filename", "e"); // CHECK-MESSAGES-NOT: warning: char *str = "r"; fopen("filename", str); // CHECK-MESSAGES-NOT: warning: str = "re"; fopen("filename", str); // CHECK-MESSAGES-NOT: warning: char arr[2] = "r"; fopen("filename", arr); // CHECK-MESSAGES-NOT: warning: char arr2[3] = "re"; fopen("filename", arr2); // CHECK-MESSAGES-NOT: warning: } namespace i { int *fopen(const char *filename, const char *mode, ...); void g() { fopen("filename", "e"); // CHECK-MESSAGES-NOT: warning: } } // namespace i class C { public: int *fopen(const char *filename, const char *mode, ...); void h() { fopen("filename", "e"); // CHECK-MESSAGES-NOT: warning: } };