113 lines · c
1// RUN: %clang_cc1 -std=c11 -fsyntax-only -verify -Wunused-value -Wunused-label %s2// RUN: %clang_cc1 -std=c11 -fsyntax-only -verify -Wunused %s3// RUN: %clang_cc1 -std=c11 -fsyntax-only -verify -Wall %s4 5int i = 0;6int j = 0;7 8void foo(void);9 10// PR480611void pr4806(void) {12 1,foo(); // expected-warning {{left operand of comma operator has no effect}}13 14 // other15 foo();16 i; // expected-warning {{expression result unused}}17 18 i,foo(); // expected-warning {{left operand of comma operator has no effect}}19 foo(),i; // expected-warning {{expression result unused}}20 21 i,j,foo(); // expected-warning 2{{left operand of comma operator has no effect}}22 i,foo(),j; // expected-warning {{left operand of comma operator has no effect}} expected-warning {{expression result unused}}23 foo(),i,j; // expected-warning {{expression result unused}} expected-warning {{left operand of comma operator has no effect}}24 25 i++;26 27 i++,foo();28 foo(),i++;29 30 i++,j,foo(); // expected-warning {{left operand of comma operator has no effect}}31 i++,foo(),j; // expected-warning {{expression result unused}}32 foo(),i++,j; // expected-warning {{expression result unused}}33 34 i,j++,foo(); // expected-warning {{left operand of comma operator has no effect}}35 i,foo(),j++; // expected-warning {{left operand of comma operator has no effect}}36 foo(),i,j++; // expected-warning {{left operand of comma operator has no effect}}37 38 i++,j++,foo();39 i++,foo(),j++;40 foo(),i++,j++;41 42 {};43 ({});44 ({}),foo();45 foo(),({});46 47 (int)1U; // expected-warning {{expression result unused}}48 (void)1U;49 50 // pointer to volatile has side effect (thus no warning)51 int* pi = &i;52 volatile int* pj = &j;53 *pi; // expected-warning {{expression result unused}}54 *pj;55 56 foo_label: // expected-warning {{unused label}}57 i; // expected-warning {{expression result unused}}58}59 60// Don't warn about unused '||', '&&' expressions that contain assignments.61int test_logical_foo1(void);62int test_logical_foo2(void);63int test_logical_foo3(void);64int test_logical_bar(void) {65 int x = 0;66 (x = test_logical_foo1()) || // no-warning67 (x = test_logical_foo2()) || // no-warning68 (x = test_logical_foo3()); // no-warning69 70 x || test_logical_foo1(); // no-warning71 72 return x;73}74 75// PR828276void conditional_for_control_flow(int cond, int x, int y)77{78 cond? y++ : x; // no-warning79 cond? y : ++x; // no-warning80 cond? (x |= y) : ++x; // no-warning81 cond? y : x; // expected-warning {{expression result unused}}82}83 84struct s0 { int f0; };85 86void f0(int a);87void f1(struct s0 *a) {88 f0((int)(a->f0 + 1, 10)); // expected-warning {{left operand of comma operator has no effect}}89}90 91void blah(int a);92#define GenTest(x) _Generic(x, default : blah)(x)93 94void unevaluated_operands(void) {95 int val = 0;96 97 (void)sizeof(++val); // expected-warning {{expression with side effects has no effect in an unevaluated context}}98 (void)_Generic(val++, default : 0); // expected-warning {{expression with side effects has no effect in an unevaluated context}}99 (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}}100 101 // VLAs can have side effects so long as it's part of the type and not an102 // expression, except for sizeof() where it can also have a side effect if103 // the operand is of VLA type.104 (void)sizeof(int[++val]); // Ok105 (void)_Alignof(int[++val]); // Ok106 107 int GH48010[val];108 (void)sizeof(*(val = 1, &GH48010)); // Ok109 110 // Side effects as part of macro expansion are ok.111 GenTest(val++);112}113