[clang] Handle __declspec() attributes in using
[llvm-project.git] / clang / test / Sema / warn-int-in-bool-context.c
blob0c94ebb391f3c53e22bea72316179f9bbea2ebcf
1 // RUN: %clang_cc1 -x c -fsyntax-only -verify -Wint-in-bool-context %s
2 // RUN: %clang_cc1 -x c -fsyntax-only -verify -Wall %s
3 // RUN: %clang_cc1 -x c++ -fsyntax-only -verify -Wint-in-bool-context %s
4 // RUN: %clang_cc1 -x c++ -fsyntax-only -verify -Wall %s
6 #define ONE 1
7 #define TWO 2
9 #define SHIFT(l, r) l << r
10 #define MM a << a
11 #define AF 1 << 7
13 #ifdef __cplusplus
14 typedef bool boolean;
15 #else
16 typedef _Bool boolean;
17 #endif
19 enum num {
20 zero,
21 one,
22 two,
25 int test(int a, unsigned b, enum num n) {
26 boolean r;
27 r = a << a; // expected-warning {{converting the result of '<<' to a boolean; did you mean '(a << a) != 0'?}}
28 r = MM; // expected-warning {{converting the result of '<<' to a boolean; did you mean '(a << a) != 0'?}}
29 r = (1 << 7); // expected-warning {{converting the result of '<<' to a boolean always evaluates to true}}
30 r = 2UL << 2; // expected-warning {{converting the result of '<<' to a boolean always evaluates to true}}
31 r = 0 << a; // expected-warning {{converting the result of '<<' to a boolean always evaluates to false}}
32 r = 0 << 2; // expected-warning {{converting the result of '<<' to a boolean always evaluates to false}}
33 r = 1 << 0; // expected-warning {{converting the result of '<<' to a boolean always evaluates to true}}
34 r = 1 << 2; // expected-warning {{converting the result of '<<' to a boolean always evaluates to true}}
35 r = 1ULL << 2; // expected-warning {{converting the result of '<<' to a boolean always evaluates to true}}
36 r = 2 << b; // expected-warning {{converting the result of '<<' to a boolean; did you mean '(2 << b) != 0'?}}
37 r = (unsigned)(2 << b);
38 r = b << 7;
39 r = (1 << a); // expected-warning {{converting the result of '<<' to a boolean; did you mean '(1 << a) != 0'?}}
40 r = TWO << a; // expected-warning {{converting the result of '<<' to a boolean; did you mean '(2 << a) != 0'?}}
41 r = a << 7; // expected-warning {{converting the result of '<<' to a boolean; did you mean '(a << 7) != 0'?}}
42 r = ONE << a; // expected-warning {{converting the result of '<<' to a boolean; did you mean '(1 << a) != 0'?}}
43 if (TWO << a) // expected-warning {{converting the result of '<<' to a boolean; did you mean '(2 << a) != 0'?}}
44 return a;
46 for (a = 0; 1 << a; a++) // expected-warning {{converting the result of '<<' to a boolean; did you mean '(1 << a) != 0'?}}
49 if (a << TWO) // expected-warning {{converting the result of '<<' to a boolean; did you mean '(a << 2) != 0'?}}
50 return a;
52 if (n || two)
53 // expected-warning@-1 {{converting the enum constant to a boolean}}
54 return a;
56 if (n == one || two)
57 // expected-warning@-1 {{converting the enum constant to a boolean}}
58 return a;
60 if (r && two)
61 // expected-warning@-1 {{converting the enum constant to a boolean}}
62 return a;
64 if (two && r)
65 // expected-warning@-1 {{converting the enum constant to a boolean}}
66 return a;
68 if (n == one && two)
69 // expected-warning@-1 {{converting the enum constant to a boolean}}
70 return a;
72 // Don't warn in macros.
73 return SHIFT(1, a);