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