xref: /aosp_15_r20/external/clang/test/SemaCXX/expressions.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void 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 Li void 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 Li int 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 Li void 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 Li void 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