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