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
13 typedef _Bool boolean
;
18 boolean
baz(void) __attribute__((const));
23 #define My_BITOR bitor
25 void test(boolean a
, boolean b
, int *p
, volatile int *q
, int i
) {
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
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() | !bar(); // expected-warning {{use of bitwise '|' with boolean operands}}
38 // expected-note@-1 {{cast one or both operands to int to silence this warning}}
39 // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:13-[[@LINE-2]]:14}:"||"
40 b
= foo() | (int)bar(); // OK, no warning expected
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
49 b
= b MY_OR
foo(); // OK, no warning expected
51 b
= foo() bitor bar(); //Ok, no warning expected
52 b
= foo() My_BITOR
bar(); // Ok, no warning expected
56 if (foo() | bar()) // expected-warning {{use of bitwise '|' with boolean operands}}
57 // expected-note@-1 {{cast one or both operands to int to silence this warning}}
62 sink(foo() | bar()); // expected-warning {{use of bitwise '|' with boolean operands}}
63 // expected-note@-1 {{cast one or both operands to int to silence this warning}}