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