xref: /llvm-project/clang/test/SemaObjC/attr-suppress.m (revision 017675fff116c26bef7f0a389c983c909a3141fd)
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