[Reland][Runtimes] Merge 'compile_commands.json' files from runtimes build (#116303)
[llvm-project.git] / clang / test / Sema / warn-bitwise-and-bool.c
blobc30498e2bd8d1ab52fcdf5eb6540cd6c38db79c9
1 // RUN: %clang_cc1 -x c -fsyntax-only -verify -Wbool-operation %s
2 // RUN: %clang_cc1 -x c -fsyntax-only -verify -Wall %s
3 // RUN: %clang_cc1 -x c -fsyntax-only -Wbitwise-instead-of-logical -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
4 // RUN: %clang_cc1 -x c -fsyntax-only -Wbool-operation -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
5 // RUN: %clang_cc1 -x c++ -fsyntax-only -verify -Wbool-operation %s
6 // RUN: %clang_cc1 -x c++ -fsyntax-only -verify -Wall %s
7 // RUN: %clang_cc1 -x c++ -fsyntax-only -Wbitwise-instead-of-logical -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
8 // RUN: %clang_cc1 -x c++ -fsyntax-only -Wbool-operation -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
10 #ifdef __cplusplus
11 typedef bool boolean;
12 #else
13 typedef _Bool boolean;
14 #endif
16 boolean foo(void);
17 boolean bar(void);
18 boolean baz(void) __attribute__((const));
19 void sink(boolean);
21 #define FOO foo()
22 #define MY_AND &
23 #define My_BITAND bitand
25 void test(boolean a, boolean b, int *p, volatile int *q, int i) {
26 b = a & b;
27 b = foo() & a;
28 b = (p != 0) & (*p == 42); // FIXME: also warn for a non-volatile pointer dereference
29 b = foo() & (*q == 42); // expected-warning {{use of bitwise '&' with boolean operands}}
30 // expected-note@-1 {{cast one or both operands to int to silence this warning}}
31 b = foo() & (int)(*q == 42); // OK, no warning expected
32 b = a & foo();
33 b = (int)a & foo(); // OK, no warning expected
34 b = foo() & bar(); // expected-warning {{use of bitwise '&' with boolean operands}}
35 // expected-note@-1 {{cast one or both operands to int to silence this warning}}
36 // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:13-[[@LINE-2]]:14}:"&&"
37 b = foo() & (int)bar(); // OK, no warning expected
38 b = foo() & !bar(); // expected-warning {{use of bitwise '&' with boolean operands}}
39 // expected-note@-1 {{cast one or both operands to int to silence this warning}}
40 // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:13-[[@LINE-2]]:14}:"&&"
41 b = a & baz();
42 b = bar() & FOO; // expected-warning {{use of bitwise '&' with boolean operands}}
43 // expected-note@-1 {{cast one or both operands to int to silence this warning}}
44 // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:13-[[@LINE-2]]:14}:"&&"
45 b = foo() & (int)FOO; // OK, no warning expected
46 b = b & foo();
47 b = bar() & (i > 4);
48 b = (i == 7) & foo();
49 b = b MY_AND foo(); // OK, no warning expected
51 #ifdef __cplusplus
52 b = foo() bitand bar(); // Ok, no warning expected
53 b = foo() My_BITAND bar(); // Ok, no warning expected
55 #endif
57 if (foo() & bar()) // expected-warning {{use of bitwise '&' with boolean operands}}
58 // expected-note@-1 {{cast one or both operands to int to silence this warning}}
61 sink(a & b);
62 sink(a & foo());
63 sink(foo() & bar()); // expected-warning {{use of bitwise '&' with boolean operands}}
64 // expected-note@-1 {{cast one or both operands to int to silence this warning}}
66 int n = i + 10;
67 b = (n & (n - 1));