1 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-constant-conversion %s 2 3 void choice(int); 4 int choice(bool); 5 6 void test() { 7 // Result of ! must be type bool. 8 int i = choice(!1); 9 } 10 11 // rdar://8018252 12 void f0() { 13 extern void f0_1(int*); 14 register int x; 15 f0_1(&x); 16 } 17 18 namespace test1 { 19 template <class T> void bar(T &x) { T::fail(); } 20 template <class T> void bar(volatile T &x) {} 21 22 void test_ints() { 23 volatile int x; 24 bar(x = 5); 25 bar(x += 5); 26 } 27 28 enum E { E_zero }; 29 void test_enums() { 30 volatile E x; 31 bar(x = E_zero); 32 bar(x += E_zero); // expected-error {{incompatible type}} 33 } 34 } 35 36 int test2(int x) { 37 return x && 4; // expected-warning {{use of logical '&&' with constant operand}} \ 38 // expected-note {{use '&' for a bitwise operation}} \ 39 // expected-note {{remove constant to silence this warning}} 40 41 return x && sizeof(int) == 4; // no warning, RHS is logical op. 42 return x && true; 43 return x && false; 44 return x || true; 45 return x || false; 46 47 return x && (unsigned)0; // expected-warning {{use of logical '&&' with constant operand}} \ 48 // expected-note {{use '&' for a bitwise operation}} \ 49 // expected-note {{remove constant to silence this warning}} 50 51 return x || (unsigned)1; // expected-warning {{use of logical '||' with constant operand}} \ 52 // expected-note {{use '|' for a bitwise operation}} 53 54 return x || 0; // expected-warning {{use of logical '||' with constant operand}} \ 55 // expected-note {{use '|' for a bitwise operation}} 56 return x || 1; // expected-warning {{use of logical '||' with constant operand}} \ 57 // expected-note {{use '|' for a bitwise operation}} 58 return x || -1; // expected-warning {{use of logical '||' with constant operand}} \ 59 // expected-note {{use '|' for a bitwise operation}} 60 return x || 5; // expected-warning {{use of logical '||' with constant operand}} \ 61 // expected-note {{use '|' for a bitwise operation}} 62 return x && 0; // expected-warning {{use of logical '&&' with constant operand}} \ 63 // expected-note {{use '&' for a bitwise operation}} \ 64 // expected-note {{remove constant to silence this warning}} 65 return x && 1; // expected-warning {{use of logical '&&' with constant operand}} \ 66 // expected-note {{use '&' for a bitwise operation}} \ 67 // expected-note {{remove constant to silence this warning}} 68 return x && -1; // expected-warning {{use of logical '&&' with constant operand}} \ 69 // expected-note {{use '&' for a bitwise operation}} \ 70 // expected-note {{remove constant to silence this warning}} 71 return x && 5; // expected-warning {{use of logical '&&' with constant operand}} \ 72 // expected-note {{use '&' for a bitwise operation}} \ 73 // expected-note {{remove constant to silence this warning}} 74 return x || (0); // expected-warning {{use of logical '||' with constant operand}} \ 75 // expected-note {{use '|' for a bitwise operation}} 76 return x || (1); // expected-warning {{use of logical '||' with constant operand}} \ 77 // expected-note {{use '|' for a bitwise operation}} 78 return x || (-1); // expected-warning {{use of logical '||' with constant operand}} \ 79 // expected-note {{use '|' for a bitwise operation}} 80 return x || (5); // expected-warning {{use of logical '||' with constant operand}} \ 81 // expected-note {{use '|' for a bitwise operation}} 82 return x && (0); // expected-warning {{use of logical '&&' with constant operand}} \ 83 // expected-note {{use '&' for a bitwise operation}} \ 84 // expected-note {{remove constant to silence this warning}} 85 return x && (1); // expected-warning {{use of logical '&&' with constant operand}} \ 86 // expected-note {{use '&' for a bitwise operation}} \ 87 // expected-note {{remove constant to silence this warning}} 88 return x && (-1); // expected-warning {{use of logical '&&' with constant operand}} \ 89 // expected-note {{use '&' for a bitwise operation}} \ 90 // expected-note {{remove constant to silence this warning}} 91 return x && (5); // expected-warning {{use of logical '&&' with constant operand}} \ 92 // expected-note {{use '&' for a bitwise operation}} \ 93 // expected-note {{remove constant to silence this warning}} 94 } 95 96 template<unsigned int A, unsigned int B> struct S 97 { 98 enum { 99 e1 = A && B, 100 e2 = A && 7 // expected-warning {{use of logical '&&' with constant operand}} \ 101 // expected-note {{use '&' for a bitwise operation}} \ 102 // expected-note {{remove constant to silence this warning}} 103 }; 104 105 int foo() { 106 int x = A && B; 107 int y = B && 3; // expected-warning {{use of logical '&&' with constant operand}} \ 108 // expected-note {{use '&' for a bitwise operation}} \ 109 // expected-note {{remove constant to silence this warning}} 110 111 return x + y; 112 } 113 }; 114 115 void test3() { 116 S<5, 8> s1; 117 S<2, 7> s2; 118 (void)s1.foo(); 119 (void)s2.foo(); 120 } 121 122 namespace pr16992 { 123 typedef int T; 124 unsigned getsz() { 125 return (sizeof T()); 126 } 127 } 128 129 void test4() { 130 #define X 0 131 #define Y 1 132 bool r1 = X || Y; 133 134 #define Y2 2 135 bool r2 = X || Y2; // expected-warning {{use of logical '||' with constant operand}} \ 136 // expected-note {{use '|' for a bitwise operation}} 137 } 138