1// RUN: %check_clang_tidy %s android-cloexec-pipe2 %t
2
3#define O_NONBLOCK 1
4#define __O_CLOEXEC 3
5#define O_CLOEXEC __O_CLOEXEC
6#define TEMP_FAILURE_RETRY(exp) \
7 ({ \
8 int _rc; \
9 do { \
10 _rc = (exp); \
11 } while (_rc == -1); \
12 })
13#define NULL 0
14
15extern "C" int pipe2(int pipefd[2], int flags);
16
17void warning() {
18 int pipefd[2];
19 pipe2(pipefd, O_NONBLOCK);
20 // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: 'pipe2'
21 // CHECK-FIXES: pipe2(pipefd, O_NONBLOCK | O_CLOEXEC);
22 TEMP_FAILURE_RETRY(pipe2(pipefd, O_NONBLOCK));
23 // CHECK-MESSAGES: :[[@LINE-1]]:46: warning: 'pipe2'
24 // CHECK-FIXES: TEMP_FAILURE_RETRY(pipe2(pipefd, O_NONBLOCK | O_CLOEXEC));
25}
26
27void warningInMacroArugment() {
28 int pipefd[2];
29 pipe2(pipefd, flags: 3);
30 // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: 'pipe2'
31 // CHECK-FIXES: pipe2(pipefd, 3 | O_CLOEXEC);
32 TEMP_FAILURE_RETRY(pipe2(pipefd, 3));
33 // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: 'pipe2'
34 // CHECK-FIXES: TEMP_FAILURE_RETRY(pipe2(pipefd, 3 | O_CLOEXEC));
35
36 int flag = O_NONBLOCK;
37 pipe2(pipefd, flags: flag);
38 TEMP_FAILURE_RETRY(pipe2(pipefd, flag));
39}
40
41namespace i {
42int pipe2(int pipefd[2], int flags);
43
44void noWarning() {
45 int pipefd[2];
46 pipe2(pipefd, O_NONBLOCK);
47 TEMP_FAILURE_RETRY(pipe2(pipefd, O_NONBLOCK));
48}
49
50} // namespace i
51
52void noWarning() {
53 int pipefd[2];
54 pipe2(pipefd, O_CLOEXEC);
55 TEMP_FAILURE_RETRY(pipe2(pipefd, O_CLOEXEC));
56 pipe2(pipefd, O_NONBLOCK | O_CLOEXEC);
57 TEMP_FAILURE_RETRY(pipe2(pipefd, O_NONBLOCK | O_CLOEXEC));
58}
59
60class G {
61public:
62 int pipe2(int pipefd[2], int flags);
63 void noWarning() {
64 int pipefd[2];
65 pipe2(pipefd, O_NONBLOCK);
66 TEMP_FAILURE_RETRY(pipe2(pipefd, O_NONBLOCK));
67 }
68};
69

source code of clang-tools-extra/test/clang-tidy/checkers/android/cloexec-pipe2.cpp