Clang Project

clang_source_code/test/AST/ast-dump-attr.cpp
1// RUN: %clang_cc1 -triple x86_64-pc-linux -std=c++11 -Wno-deprecated-declarations -ast-dump -ast-dump-filter Test %s | FileCheck --strict-whitespace %s
2
3int TestLocation
4__attribute__((unused));
5// CHECK:      VarDecl{{.*}}TestLocation
6// CHECK-NEXT:   UnusedAttr 0x{{[^ ]*}} <line:[[@LINE-2]]:16>
7
8int TestIndent
9__attribute__((unused));
10// CHECK:      {{^}}VarDecl{{.*TestIndent[^()]*$}}
11// CHECK-NEXT: {{^}}`-UnusedAttr{{[^()]*$}}
12
13void TestAttributedStmt() {
14  switch (1) {
15  case 1:
16    [[clang::fallthrough]];
17  case 2:
18    ;
19  }
20}
21// CHECK:      FunctionDecl{{.*}}TestAttributedStmt
22// CHECK:      AttributedStmt
23// CHECK-NEXT:   FallThroughAttr
24// CHECK-NEXT:   NullStmt
25
26[[clang::warn_unused_result]] int TestCXX11DeclAttr();
27// CHECK:      FunctionDecl{{.*}}TestCXX11DeclAttr
28// CHECK-NEXT:   WarnUnusedResultAttr
29
30int TestAlignedNull __attribute__((aligned));
31// CHECK:      VarDecl{{.*}}TestAlignedNull
32// CHECK-NEXT:   AlignedAttr {{.*}} aligned
33// CHECK-NEXT:     <<<NULL>>>
34
35int TestAlignedExpr __attribute__((aligned(4)));
36// CHECK:      VarDecl{{.*}}TestAlignedExpr
37// CHECK-NEXT:   AlignedAttr {{.*}} aligned
38// CHECK-NEXT:     ConstantExpr
39// CHECK-NEXT:       IntegerLiteral
40
41int TestEnum __attribute__((visibility("default")));
42// CHECK:      VarDecl{{.*}}TestEnum
43// CHECK-NEXT:   VisibilityAttr{{.*}} Default
44
45class __attribute__((lockable)) Mutex {
46} mu1, mu2;
47int TestExpr __attribute__((guarded_by(mu1)));
48// CHECK:      VarDecl{{.*}}TestExpr
49// CHECK-NEXT:   GuardedByAttr
50// CHECK-NEXT:     DeclRefExpr{{.*}}mu1
51
52class Mutex TestVariadicExpr __attribute__((acquired_after(mu1, mu2)));
53// CHECK:      VarDecl{{.*}}TestVariadicExpr
54// CHECK:        AcquiredAfterAttr
55// CHECK-NEXT:     DeclRefExpr{{.*}}mu1
56// CHECK-NEXT:     DeclRefExpr{{.*}}mu2
57
58void function1(void *) {
59  int TestFunction __attribute__((cleanup(function1)));
60}
61// CHECK:      VarDecl{{.*}}TestFunction
62// CHECK-NEXT:   CleanupAttr{{.*}} Function{{.*}}function1
63
64void TestIdentifier(void *, int)
65__attribute__((pointer_with_type_tag(ident1,1,2)));
66// CHECK: FunctionDecl{{.*}}TestIdentifier
67// CHECK:   ArgumentWithTypeTagAttr{{.*}} pointer_with_type_tag ident1
68
69void TestBool(void *, int)
70__attribute__((pointer_with_type_tag(bool1,1,2)));
71// CHECK: FunctionDecl{{.*}}TestBool
72// CHECK:   ArgumentWithTypeTagAttr{{.*}}pointer_with_type_tag bool1 1 2 IsPointer
73
74void TestUnsigned(void *, int)
75__attribute__((pointer_with_type_tag(unsigned1,1,2)));
76// CHECK: FunctionDecl{{.*}}TestUnsigned
77// CHECK:   ArgumentWithTypeTagAttr{{.*}} pointer_with_type_tag unsigned1 1 2
78
79void TestInt(void) __attribute__((constructor(123)));
80// CHECK:      FunctionDecl{{.*}}TestInt
81// CHECK-NEXT:   ConstructorAttr{{.*}} 123
82
83static int TestString __attribute__((alias("alias1")));
84// CHECK:      VarDecl{{.*}}TestString
85// CHECK-NEXT:   AliasAttr{{.*}} "alias1"
86
87extern struct s1 TestType
88__attribute__((type_tag_for_datatype(ident1,int)));
89// CHECK:      VarDecl{{.*}}TestType
90// CHECK-NEXT:   TypeTagForDatatypeAttr{{.*}} int
91
92void TestLabel() {
93L: __attribute__((unused)) int i;
94// CHECK: LabelStmt{{.*}}'L'
95// CHECK: VarDecl{{.*}}i 'int'
96// CHECK-NEXT: UnusedAttr{{.*}}
97
98M: __attribute(()) int j;
99// CHECK: LabelStmt {{.*}} 'M'
100// CHECK-NEXT: DeclStmt
101// CHECK-NEXT: VarDecl {{.*}} j 'int'
102
103N: __attribute(()) ;
104// CHECK: LabelStmt {{.*}} 'N'
105// CHECK-NEXT: NullStmt
106}
107
108namespace Test {
109extern "C" int printf(const char *format, ...);
110// CHECK: FunctionDecl{{.*}}printf
111// CHECK-NEXT: ParmVarDecl{{.*}}format{{.*}}'const char *'
112// CHECK-NEXT: FormatAttr{{.*}}Implicit printf 1 2
113
114alignas(8) extern int x;
115extern int x;
116// CHECK: VarDecl{{.*}} x 'int'
117// CHECK: VarDecl{{.*}} x 'int'
118// CHECK-NEXT: AlignedAttr{{.*}} Inherited
119}
120
121int __attribute__((cdecl)) TestOne(void), TestTwo(void);
122// CHECK: FunctionDecl{{.*}}TestOne{{.*}}__attribute__((cdecl))
123// CHECK: FunctionDecl{{.*}}TestTwo{{.*}}__attribute__((cdecl))
124
125void func() {
126  auto Test = []() __attribute__((no_thread_safety_analysis)) {};
127  // CHECK: CXXMethodDecl{{.*}}operator() 'void () const'
128  // CHECK: NoThreadSafetyAnalysisAttr
129
130  // Because GNU's noreturn applies to the function type, and this lambda does
131  // not have a capture list, the call operator and the function pointer
132  // conversion should both be noreturn, but the method should not contain a
133  // NoReturnAttr because the attribute applied to the type.
134  auto Test2 = []() __attribute__((noreturn)) { while(1); };
135  // CHECK: CXXMethodDecl{{.*}}operator() 'void () __attribute__((noreturn)) const'
136  // CHECK-NOT: NoReturnAttr
137  // CHECK: CXXConversionDecl{{.*}}operator void (*)() __attribute__((noreturn))
138}
139
140namespace PR20930 {
141struct S {
142  struct { int Test __attribute__((deprecated)); };
143  // CHECK: FieldDecl{{.*}}Test 'int'
144  // CHECK-NEXT: DeprecatedAttr
145};
146
147void f() {
148  S s;
149  s.Test = 1;
150  // CHECK: IndirectFieldDecl{{.*}}Test 'int'
151  // CHECK: DeprecatedAttr
152}
153}
154
155struct __attribute__((objc_bridge_related(NSParagraphStyle,,))) TestBridgedRef;
156// CHECK: CXXRecordDecl{{.*}} struct TestBridgedRef
157// CHECK-NEXT: ObjCBridgeRelatedAttr{{.*}} NSParagraphStyle
158
159void TestExternalSourceSymbolAttr1()
160__attribute__((external_source_symbol(language="Swift", defined_in="module", generated_declaration)));
161// CHECK: FunctionDecl{{.*}} TestExternalSourceSymbolAttr1
162// CHECK-NEXT: ExternalSourceSymbolAttr{{.*}} "Swift" "module" GeneratedDeclaration
163
164void TestExternalSourceSymbolAttr2()
165__attribute__((external_source_symbol(defined_in="module", language="Swift")));
166// CHECK: FunctionDecl{{.*}} TestExternalSourceSymbolAttr2
167// CHECK-NEXT: ExternalSourceSymbolAttr{{.*}} "Swift" "module"{{$}}
168
169void TestExternalSourceSymbolAttr3()
170__attribute__((external_source_symbol(generated_declaration, language="Objective-C++", defined_in="module")));
171// CHECK: FunctionDecl{{.*}} TestExternalSourceSymbolAttr3
172// CHECK-NEXT: ExternalSourceSymbolAttr{{.*}} "Objective-C++" "module" GeneratedDeclaration
173
174void TestExternalSourceSymbolAttr4()
175__attribute__((external_source_symbol(defined_in="Some external file.cs", generated_declaration, language="C Sharp")));
176// CHECK: FunctionDecl{{.*}} TestExternalSourceSymbolAttr4
177// CHECK-NEXT: ExternalSourceSymbolAttr{{.*}} "C Sharp" "Some external file.cs" GeneratedDeclaration
178
179void TestExternalSourceSymbolAttr5()
180__attribute__((external_source_symbol(generated_declaration, defined_in="module", language="Swift")));
181// CHECK: FunctionDecl{{.*}} TestExternalSourceSymbolAttr5
182// CHECK-NEXT: ExternalSourceSymbolAttr{{.*}} "Swift" "module" GeneratedDeclaration
183
184namespace TestNoEscape {
185  void noescapeFunc(int *p0, __attribute__((noescape)) int *p1) {}
186  // CHECK: `-FunctionDecl{{.*}} noescapeFunc 'void (int *, __attribute__((noescape)) int *)'
187  // CHECK-NEXT: ParmVarDecl
188  // CHECK-NEXT: ParmVarDecl
189  // CHECK-NEXT: NoEscapeAttr
190}
191
192namespace TestSuppress {
193  [[gsl::suppress("at-namespace")]];
194  // CHECK: NamespaceDecl{{.*}} TestSuppress
195  // CHECK-NEXT: EmptyDecl{{.*}}
196  // CHECK-NEXT: SuppressAttr{{.*}} at-namespace
197  [[gsl::suppress("on-decl")]]
198  void TestSuppressFunction();
199  // CHECK: FunctionDecl{{.*}} TestSuppressFunction
200  // CHECK-NEXT: SuppressAttr{{.*}} on-decl
201
202  void f() {
203      int *i;
204
205      [[gsl::suppress("on-stmt")]] {
206      // CHECK: AttributedStmt
207      // CHECK-NEXT: SuppressAttr{{.*}} on-stmt
208      // CHECK-NEXT: CompoundStmt
209        i = reinterpret_cast<int*>(7);
210      }
211    }
212}
213
214// Verify the order of attributes in the Ast. It must reflect the order
215// in the parsed source.
216int mergeAttrTest() __attribute__((deprecated)) __attribute__((warn_unused_result));
217int mergeAttrTest() __attribute__((annotate("test")));
218int mergeAttrTest() __attribute__((unused,no_thread_safety_analysis));
219// CHECK: FunctionDecl{{.*}} mergeAttrTest
220// CHECK-NEXT: DeprecatedAttr
221// CHECK-NEXT: WarnUnusedResultAttr
222
223// CHECK: FunctionDecl{{.*}} mergeAttrTest
224// CHECK-NEXT: DeprecatedAttr{{.*}} Inherited
225// CHECK-NEXT: WarnUnusedResultAttr{{.*}} Inherited
226// CHECK-NEXT: AnnotateAttr{{.*}}
227
228// CHECK: FunctionDecl{{.*}} mergeAttrTest
229// CHECK-NEXT: DeprecatedAttr{{.*}} Inherited
230// CHECK-NEXT: WarnUnusedResultAttr{{.*}} Inherited
231// CHECK-NEXT: AnnotateAttr{{.*}} Inherited
232// CHECK-NEXT: UnusedAttr
233// CHECK-NEXT: NoThreadSafetyAnalysisAttr
234