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