xref: /aosp_15_r20/external/clang/test/Sema/warn-unused-value.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c11 -fsyntax-only -verify -Wunused-value -Wunused-label %s
2*67e74705SXin Li // RUN: %clang_cc1 -std=c11 -fsyntax-only -verify -Wunused %s
3*67e74705SXin Li // RUN: %clang_cc1 -std=c11 -fsyntax-only -verify -Wall %s
4*67e74705SXin Li 
5*67e74705SXin Li int i = 0;
6*67e74705SXin Li int j = 0;
7*67e74705SXin Li 
8*67e74705SXin Li void foo();
9*67e74705SXin Li 
10*67e74705SXin Li // PR4806
pr4806()11*67e74705SXin Li void pr4806() {
12*67e74705SXin Li   1,foo();          // expected-warning {{expression result unused}}
13*67e74705SXin Li 
14*67e74705SXin Li   // other
15*67e74705SXin Li   foo();
16*67e74705SXin Li   i;                // expected-warning {{expression result unused}}
17*67e74705SXin Li 
18*67e74705SXin Li   i,foo();          // expected-warning {{expression result unused}}
19*67e74705SXin Li   foo(),i;          // expected-warning {{expression result unused}}
20*67e74705SXin Li 
21*67e74705SXin Li   i,j,foo();        // expected-warning {{expression result unused}} expected-warning {{expression result unused}}
22*67e74705SXin Li   i,foo(),j;        // expected-warning {{expression result unused}} expected-warning {{expression result unused}}
23*67e74705SXin Li   foo(),i,j;        // expected-warning {{expression result unused}} expected-warning {{expression result unused}}
24*67e74705SXin Li 
25*67e74705SXin Li   i++;
26*67e74705SXin Li 
27*67e74705SXin Li   i++,foo();
28*67e74705SXin Li   foo(),i++;
29*67e74705SXin Li 
30*67e74705SXin Li   i++,j,foo();      // expected-warning {{expression result unused}}
31*67e74705SXin Li   i++,foo(),j;      // expected-warning {{expression result unused}}
32*67e74705SXin Li   foo(),i++,j;      // expected-warning {{expression result unused}}
33*67e74705SXin Li 
34*67e74705SXin Li   i,j++,foo();      // expected-warning {{expression result unused}}
35*67e74705SXin Li   i,foo(),j++;      // expected-warning {{expression result unused}}
36*67e74705SXin Li   foo(),i,j++;      // expected-warning {{expression result unused}}
37*67e74705SXin Li 
38*67e74705SXin Li   i++,j++,foo();
39*67e74705SXin Li   i++,foo(),j++;
40*67e74705SXin Li   foo(),i++,j++;
41*67e74705SXin Li 
42*67e74705SXin Li   {};
43*67e74705SXin Li   ({});
44*67e74705SXin Li   ({}),foo();
45*67e74705SXin Li   foo(),({});
46*67e74705SXin Li 
47*67e74705SXin Li   (int)1U;          // expected-warning {{expression result unused}}
48*67e74705SXin Li   (void)1U;
49*67e74705SXin Li 
50*67e74705SXin Li   // pointer to volatile has side effect (thus no warning)
51*67e74705SXin Li   int* pi = &i;
52*67e74705SXin Li   volatile int* pj = &j;
53*67e74705SXin Li   *pi;              // expected-warning {{expression result unused}}
54*67e74705SXin Li   *pj;
55*67e74705SXin Li 
56*67e74705SXin Li   foo_label:        // expected-warning {{unused label}}
57*67e74705SXin Li   i;                // expected-warning {{expression result unused}}
58*67e74705SXin Li }
59*67e74705SXin Li 
60*67e74705SXin Li // Don't warn about unused '||', '&&' expressions that contain assignments.
61*67e74705SXin Li int test_logical_foo1();
62*67e74705SXin Li int test_logical_foo2();
63*67e74705SXin Li int test_logical_foo3();
test_logical_bar()64*67e74705SXin Li int test_logical_bar() {
65*67e74705SXin Li   int x = 0;
66*67e74705SXin Li   (x = test_logical_foo1()) ||  // no-warning
67*67e74705SXin Li   (x = test_logical_foo2()) ||  // no-warning
68*67e74705SXin Li   (x = test_logical_foo3());    // no-warning
69*67e74705SXin Li 
70*67e74705SXin Li   x || test_logical_foo1();     // no-warning
71*67e74705SXin Li 
72*67e74705SXin Li   return x;
73*67e74705SXin Li }
74*67e74705SXin Li 
75*67e74705SXin Li // PR8282
conditional_for_control_flow(int cond,int x,int y)76*67e74705SXin Li void conditional_for_control_flow(int cond, int x, int y)
77*67e74705SXin Li {
78*67e74705SXin Li     cond? y++ : x; // no-warning
79*67e74705SXin Li     cond? y : ++x; // no-warning
80*67e74705SXin Li     cond? (x |= y) : ++x; // no-warning
81*67e74705SXin Li     cond? y : x; // expected-warning {{expression result unused}}
82*67e74705SXin Li }
83*67e74705SXin Li 
84*67e74705SXin Li struct s0 { int f0; };
85*67e74705SXin Li 
86*67e74705SXin Li void f0(int a);
f1(struct s0 * a)87*67e74705SXin Li void f1(struct s0 *a) {
88*67e74705SXin Li   // rdar://8139785
89*67e74705SXin Li   f0((int)(a->f0 + 1, 10)); // expected-warning {{expression result unused}}
90*67e74705SXin Li }
91*67e74705SXin Li 
92*67e74705SXin Li void blah(int a);
93*67e74705SXin Li #define GenTest(x) _Generic(x, default : blah)(x)
94*67e74705SXin Li 
unevaluated_operands(void)95*67e74705SXin Li void unevaluated_operands(void) {
96*67e74705SXin Li   int val = 0;
97*67e74705SXin Li 
98*67e74705SXin Li   (void)sizeof(++val); // expected-warning {{expression with side effects has no effect in an unevaluated context}}
99*67e74705SXin Li   (void)_Generic(val++, default : 0); // expected-warning {{expression with side effects has no effect in an unevaluated context}}
100*67e74705SXin Li   (void)_Alignof(val++);  // expected-warning {{expression with side effects has no effect in an unevaluated context}} expected-warning {{'_Alignof' applied to an expression is a GNU extension}}
101*67e74705SXin Li 
102*67e74705SXin Li   // VLAs can have side effects so long as it's part of the type and not
103*67e74705SXin Li   // an expression.
104*67e74705SXin Li   (void)sizeof(int[++val]); // Ok
105*67e74705SXin Li   (void)_Alignof(int[++val]); // Ok
106*67e74705SXin Li 
107*67e74705SXin Li   // Side effects as part of macro expansion are ok.
108*67e74705SXin Li   GenTest(val++);
109*67e74705SXin Li }
110