1ef3f4760SArtem Dergachev// RUN: %clang_cc1 -fsyntax-only -fblocks %s -verify 2ef3f4760SArtem Dergachev 3ef3f4760SArtem Dergachev#define SUPPRESS1 __attribute__((suppress)) 4ef3f4760SArtem Dergachev#define SUPPRESS2(...) __attribute__((suppress(__VA_ARGS__))) 5ef3f4760SArtem Dergachev 6ef3f4760SArtem DergachevSUPPRESS1 int global = 42; 7ef3f4760SArtem Dergachev 8ef3f4760SArtem DergachevSUPPRESS1 void foo() { 9*017675ffSArtem Dergachev SUPPRESS1 int *p; // no-warning 10ef3f4760SArtem Dergachev 11ef3f4760SArtem Dergachev SUPPRESS1 int a = 0; // no-warning 12ef3f4760SArtem Dergachev SUPPRESS2() 13ef3f4760SArtem Dergachev int b = 1; // no-warning 14ef3f4760SArtem Dergachev SUPPRESS2("a") 15ef3f4760SArtem Dergachev int c = a + b; // no-warning 16ef3f4760SArtem Dergachev SUPPRESS2("a", "b") { b = c - a; } // no-warning 17ef3f4760SArtem Dergachev 18ef3f4760SArtem Dergachev SUPPRESS2("a", "b") 19ef3f4760SArtem Dergachev if (b == 10) 20ef3f4760SArtem Dergachev a += 4; // no-warning 21ef3f4760SArtem Dergachev SUPPRESS1 while (1) {} // no-warning 22ef3f4760SArtem Dergachev SUPPRESS1 switch (a) { // no-warning 23ef3f4760SArtem Dergachev default: 24ef3f4760SArtem Dergachev c -= 10; 25ef3f4760SArtem Dergachev } 26ef3f4760SArtem Dergachev 27ef3f4760SArtem Dergachev // GNU-style attributes and C++11 attributes apply to different things when 28ef3f4760SArtem Dergachev // written like this. GNU attribute gets attached to the declaration, while 29ef3f4760SArtem Dergachev // C++11 attribute ends up on the type. 30*017675ffSArtem Dergachev int SUPPRESS2("r") z; // no-warning 31*017675ffSArtem Dergachev SUPPRESS2(foo) // no-warning 32ef3f4760SArtem Dergachev float f; 33ef3f4760SArtem Dergachev // expected-error@-2 {{expected string literal as argument of 'suppress' attribute}} 34ef3f4760SArtem Dergachev} 35ef3f4760SArtem Dergachev 36*017675ffSArtem Dergachevunion SUPPRESS2("type.1") U { // no-warning 37ef3f4760SArtem Dergachev int i; 38ef3f4760SArtem Dergachev float f; 39ef3f4760SArtem Dergachev}; 40ef3f4760SArtem Dergachev 41*017675ffSArtem DergachevSUPPRESS1 @interface Test { // no-warning 42ef3f4760SArtem Dergachev} 43*017675ffSArtem Dergachev@property SUPPRESS2("prop") int *prop; // no-warning 44*017675ffSArtem Dergachev- (void)bar:(int)x SUPPRESS1; // no-warning 45ef3f4760SArtem Dergachev@end 46