// RUN: %clang_cc1 -fblocks -fsyntax-only -Wunused-but-set-variable -verify %s struct S { int i; }; int f0(void) { int y; // expected-warning{{variable 'y' set but not used}} y = 0; int z __attribute__((unused)); z = 0; struct S s; // expected-warning{{variable 's' set but not used}} struct S t; s = t; // Don't warn for an extern variable. extern int w; w = 0; // Following gcc, this should not warn. int a; w = (a = 0); int j = 0; // expected-warning{{variable 'j' set but not used}} for (int i = 0; i < 1000; i++) j += 1; // Following gcc, warn for a volatile variable. volatile int b; // expected-warning{{variable 'b' set but not used}} b = 0; // volatile variable k is used, no warning. volatile int k = 0; for (int i = 0; i < 1000; i++) k += 1; // typedef of volatile type, no warning. typedef volatile int volint; volint l = 0; l += 1; int x; x = 0; return x; } void f1(void) { (void)^() { int y; // expected-warning{{variable 'y' set but not used}} y = 0; int x; x = 0; return x; }; } void f2 (void) { // Don't warn, even if it's only used in a non-ODR context. int x; x = 0; (void) sizeof(x); } void for_cleanup(int *x) { *x = 0; } void f3(void) { // Don't warn if the __cleanup__ attribute is used. __attribute__((__cleanup__(for_cleanup))) int x; x = 5; } void f4(void) { int x1 = 0; // expected-warning{{variable 'x1' set but not used}} x1++; int x2 = 0; // expected-warning{{variable 'x2' set but not used}} x2--; int x3 = 0; // expected-warning{{variable 'x3' set but not used}} ++x3; int x4 = 0; // expected-warning{{variable 'x4' set but not used}} --x4; static int counter = 0; // expected-warning{{variable 'counter' set but not used}} counter += 1; volatile int v1 = 0; ++v1; typedef volatile int volint; volint v2 = 0; v2++; }