/test/Misc/ast-dump-decl.cpp

https://gitlab.com/pranith/clang · C++ · 476 lines · 198 code · 61 blank · 217 comment · 0 complexity · f36dc1c6506c74f3d5133507e242e3e9 MD5 · raw file

  1. // RUN: %clang_cc1 -std=c++11 -triple x86_64-linux-gnu -fms-extensions -ast-dump -ast-dump-filter Test %s | FileCheck -check-prefix CHECK -strict-whitespace %s
  2. class testEnumDecl {
  3. enum class TestEnumDeclScoped;
  4. enum TestEnumDeclFixed : int;
  5. };
  6. // CHECK: EnumDecl{{.*}} class TestEnumDeclScoped 'int'
  7. // CHECK: EnumDecl{{.*}} TestEnumDeclFixed 'int'
  8. class testFieldDecl {
  9. int TestFieldDeclInit = 0;
  10. };
  11. // CHECK: FieldDecl{{.*}} TestFieldDeclInit 'int'
  12. // CHECK-NEXT: IntegerLiteral
  13. namespace testVarDeclNRVO {
  14. class A { };
  15. A foo() {
  16. A TestVarDeclNRVO;
  17. return TestVarDeclNRVO;
  18. }
  19. }
  20. // CHECK: VarDecl{{.*}} TestVarDeclNRVO 'class testVarDeclNRVO::A' nrvo
  21. void testParmVarDeclInit(int TestParmVarDeclInit = 0);
  22. // CHECK: ParmVarDecl{{.*}} TestParmVarDeclInit 'int'
  23. // CHECK-NEXT: IntegerLiteral{{.*}}
  24. namespace TestNamespaceDecl {
  25. int i;
  26. }
  27. // CHECK: NamespaceDecl{{.*}} TestNamespaceDecl
  28. // CHECK-NEXT: VarDecl
  29. namespace TestNamespaceDecl {
  30. int j;
  31. }
  32. // CHECK: NamespaceDecl{{.*}} TestNamespaceDecl
  33. // CHECK-NEXT: original Namespace
  34. // CHECK-NEXT: VarDecl
  35. inline namespace TestNamespaceDeclInline {
  36. }
  37. // CHECK: NamespaceDecl{{.*}} TestNamespaceDeclInline inline
  38. namespace testUsingDirectiveDecl {
  39. namespace A {
  40. }
  41. }
  42. namespace TestUsingDirectiveDecl {
  43. using namespace testUsingDirectiveDecl::A;
  44. }
  45. // CHECK: NamespaceDecl{{.*}} TestUsingDirectiveDecl
  46. // CHECK-NEXT: UsingDirectiveDecl{{.*}} Namespace{{.*}} 'A'
  47. namespace testNamespaceAlias {
  48. namespace A {
  49. }
  50. }
  51. namespace TestNamespaceAlias = testNamespaceAlias::A;
  52. // CHECK: NamespaceAliasDecl{{.*}} TestNamespaceAlias
  53. // CHECK-NEXT: Namespace{{.*}} 'A'
  54. using TestTypeAliasDecl = int;
  55. // CHECK: TypeAliasDecl{{.*}} TestTypeAliasDecl 'int'
  56. namespace testTypeAliasTemplateDecl {
  57. template<typename T> class A;
  58. template<typename T> using TestTypeAliasTemplateDecl = A<T>;
  59. }
  60. // CHECK: TypeAliasTemplateDecl{{.*}} TestTypeAliasTemplateDecl
  61. // CHECK-NEXT: TemplateTypeParmDecl
  62. // CHECK-NEXT: TypeAliasDecl{{.*}} TestTypeAliasTemplateDecl 'A<T>'
  63. namespace testCXXRecordDecl {
  64. class A { };
  65. class B { };
  66. class TestCXXRecordDecl : virtual A, public B {
  67. int i;
  68. };
  69. }
  70. // CHECK: CXXRecordDecl{{.*}} class TestCXXRecordDecl
  71. // CHECK-NEXT: virtual private 'class testCXXRecordDecl::A'
  72. // CHECK-NEXT: public 'class testCXXRecordDecl::B'
  73. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestCXXRecordDecl
  74. // CHECK-NEXT: FieldDecl
  75. template<class...T>
  76. class TestCXXRecordDeclPack : public T... {
  77. };
  78. // CHECK: CXXRecordDecl{{.*}} class TestCXXRecordDeclPack
  79. // CHECK-NEXT: public 'T'...
  80. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestCXXRecordDeclPack
  81. thread_local int TestThreadLocalInt;
  82. // CHECK: TestThreadLocalInt {{.*}} tls_dynamic
  83. __module_private__ class TestCXXRecordDeclPrivate;
  84. // CHECK: CXXRecordDecl{{.*}} class TestCXXRecordDeclPrivate __module_private__
  85. class testCXXMethodDecl {
  86. __module_private__ void TestCXXMethodDeclPrivate();
  87. virtual void TestCXXMethodDeclPure() = 0;
  88. void TestCXXMethodDeclDelete() = delete;
  89. void TestCXXMethodDeclThrow() throw();
  90. void TestCXXMethodDeclThrowType() throw(int);
  91. };
  92. // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclPrivate 'void (void)' __module_private__
  93. // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclPure 'void (void)' virtual pure
  94. // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclDelete 'void (void)' delete
  95. // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclThrow 'void (void) throw()'
  96. // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclThrowType 'void (void) throw(int)'
  97. namespace testCXXConstructorDecl {
  98. class A { };
  99. class TestCXXConstructorDecl : public A {
  100. int I;
  101. TestCXXConstructorDecl(A &a, int i) : A(a), I(i) { }
  102. };
  103. }
  104. // CHECK: CXXConstructorDecl{{.*}} TestCXXConstructorDecl 'void {{.*}}'
  105. // CHECK-NEXT: ParmVarDecl{{.*}} a
  106. // CHECK-NEXT: ParmVarDecl{{.*}} i
  107. // CHECK-NEXT: CXXCtorInitializer{{.*}}A
  108. // CHECK-NEXT: Expr
  109. // CHECK: CXXCtorInitializer{{.*}}I
  110. // CHECK-NEXT: Expr
  111. // CHECK: CompoundStmt
  112. class TestCXXDestructorDecl {
  113. ~TestCXXDestructorDecl() { }
  114. };
  115. // CHECK: CXXDestructorDecl{{.*}} ~TestCXXDestructorDecl 'void (void) noexcept'
  116. // CHECK-NEXT: CompoundStmt
  117. class TestCXXConversionDecl {
  118. operator int() { return 0; }
  119. };
  120. // CHECK: CXXConversionDecl{{.*}} operator int 'int (void)'
  121. // CHECK-NEXT: CompoundStmt
  122. namespace TestStaticAssertDecl {
  123. static_assert(true, "msg");
  124. }
  125. // CHECK: NamespaceDecl{{.*}} TestStaticAssertDecl
  126. // CHECK-NEXT: StaticAssertDecl{{.*>$}}
  127. // CHECK-NEXT: CXXBoolLiteralExpr
  128. // CHECK-NEXT: StringLiteral
  129. namespace testFunctionTemplateDecl {
  130. class A { };
  131. class B { };
  132. class C { };
  133. class D { };
  134. template<typename T> void TestFunctionTemplate(T) { }
  135. // implicit instantiation
  136. void bar(A a) { TestFunctionTemplate(a); }
  137. // explicit specialization
  138. template<> void TestFunctionTemplate(B);
  139. // explicit instantiation declaration
  140. extern template void TestFunctionTemplate(C);
  141. // explicit instantiation definition
  142. template void TestFunctionTemplate(D);
  143. }
  144. // CHECK: FunctionTemplateDecl{{.*}} TestFunctionTemplate
  145. // CHECK-NEXT: TemplateTypeParmDecl
  146. // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'
  147. // CHECK-NEXT: ParmVarDecl{{.*}} 'T'
  148. // CHECK-NEXT: CompoundStmt
  149. // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}A
  150. // CHECK-NEXT: TemplateArgument
  151. // CHECK-NEXT: ParmVarDecl
  152. // CHECK-NEXT: CompoundStmt
  153. // CHECK-NEXT: Function{{.*}} 'TestFunctionTemplate' {{.*}}B
  154. // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}C
  155. // CHECK-NEXT: TemplateArgument
  156. // CHECK-NEXT: ParmVarDecl
  157. // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}D
  158. // CHECK-NEXT: TemplateArgument
  159. // CHECK-NEXT: ParmVarDecl
  160. // CHECK-NEXT: CompoundStmt
  161. // CHECK: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}B
  162. // CHECK-NEXT: TemplateArgument
  163. // CHECK-NEXT: ParmVarDecl
  164. namespace testClassTemplateDecl {
  165. class A { };
  166. class B { };
  167. class C { };
  168. class D { };
  169. template<typename T> class TestClassTemplate {
  170. int i;
  171. };
  172. // implicit instantiation
  173. TestClassTemplate<A> a;
  174. // explicit specialization
  175. template<> class TestClassTemplate<B> {
  176. int j;
  177. };
  178. // explicit instantiation declaration
  179. extern template class TestClassTemplate<C>;
  180. // explicit instantiation definition
  181. template class TestClassTemplate<D>;
  182. // partial explicit specialization
  183. template<typename T1, typename T2> class TestClassTemplatePartial {
  184. int i;
  185. };
  186. template<typename T1> class TestClassTemplatePartial<T1, A> {
  187. int j;
  188. };
  189. }
  190. // CHECK: ClassTemplateDecl{{.*}} TestClassTemplate
  191. // CHECK-NEXT: TemplateTypeParmDecl
  192. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  193. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  194. // CHECK-NEXT: FieldDecl{{.*}} i
  195. // CHECK-NEXT: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
  196. // CHECK-NEXT: TemplateArgument{{.*}}A
  197. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  198. // CHECK-NEXT: FieldDecl{{.*}} i
  199. // CHECK: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
  200. // CHECK-NEXT: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
  201. // CHECK-NEXT: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
  202. // CHECK: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
  203. // CHECK-NEXT: TemplateArgument{{.*}}B
  204. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  205. // CHECK-NEXT: FieldDecl{{.*}} j
  206. // CHECK: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
  207. // CHECK-NEXT: TemplateArgument{{.*}}C
  208. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  209. // CHECK-NEXT: FieldDecl{{.*}} i
  210. // CHECK: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
  211. // CHECK-NEXT: TemplateArgument{{.*}}D
  212. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  213. // CHECK-NEXT: FieldDecl{{.*}} i
  214. // CHECK: ClassTemplatePartialSpecializationDecl{{.*}} class TestClassTemplatePartial
  215. // CHECK-NEXT: TemplateArgument
  216. // CHECK-NEXT: TemplateArgument{{.*}}A
  217. // CHECK-NEXT: TemplateTypeParmDecl
  218. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplatePartial
  219. // CHECK-NEXT: FieldDecl{{.*}} j
  220. // PR15220 dump instantiation only once
  221. namespace testCanonicalTemplate {
  222. class A {};
  223. template<typename T> void TestFunctionTemplate(T);
  224. template<typename T> void TestFunctionTemplate(T);
  225. void bar(A a) { TestFunctionTemplate(a); }
  226. // CHECK: FunctionTemplateDecl{{.*}} TestFunctionTemplate
  227. // CHECK-NEXT: TemplateTypeParmDecl
  228. // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'
  229. // CHECK-NEXT: ParmVarDecl{{.*}} 'T'
  230. // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}A
  231. // CHECK-NEXT: TemplateArgument
  232. // CHECK-NEXT: ParmVarDecl
  233. // CHECK: FunctionTemplateDecl{{.*}} TestFunctionTemplate
  234. // CHECK-NEXT: TemplateTypeParmDecl
  235. // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'
  236. // CHECK-NEXT: ParmVarDecl{{.*}} 'T'
  237. // CHECK-NEXT: Function{{.*}} 'TestFunctionTemplate'
  238. // CHECK-NEXT-NOT: TemplateArgument
  239. template<typename T1> class TestClassTemplate {
  240. template<typename T2> friend class TestClassTemplate;
  241. };
  242. TestClassTemplate<A> a;
  243. // CHECK: ClassTemplateDecl{{.*}} TestClassTemplate
  244. // CHECK-NEXT: TemplateTypeParmDecl
  245. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  246. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  247. // CHECK-NEXT: FriendDecl
  248. // CHECK-NEXT: ClassTemplateDecl{{.*}} TestClassTemplate
  249. // CHECK-NEXT: TemplateTypeParmDecl
  250. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  251. // CHECK-NEXT: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
  252. // CHECK-NEXT: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
  253. // CHECK-NEXT: TemplateArgument{{.*}}A
  254. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  255. }
  256. template <class T>
  257. class TestClassScopeFunctionSpecialization {
  258. template<class U> void foo(U a) { }
  259. template<> void foo<int>(int a) { }
  260. };
  261. // CHECK: ClassScopeFunctionSpecializationDecl
  262. // CHECK-NEXT: CXXMethod{{.*}} 'foo' 'void (int)'
  263. // CHECK-NEXT: TemplateArgument{{.*}} 'int'
  264. namespace TestTemplateTypeParmDecl {
  265. template<typename ... T, class U = int> void foo();
  266. }
  267. // CHECK: NamespaceDecl{{.*}} TestTemplateTypeParmDecl
  268. // CHECK-NEXT: FunctionTemplateDecl
  269. // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename ... T
  270. // CHECK-NEXT: TemplateTypeParmDecl{{.*}} class U 'int'
  271. namespace TestNonTypeTemplateParmDecl {
  272. template<int I = 1, int ... J> void foo();
  273. }
  274. // CHECK: NamespaceDecl{{.*}} TestNonTypeTemplateParmDecl
  275. // CHECK-NEXT: FunctionTemplateDecl
  276. // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' I
  277. // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
  278. // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' ... J
  279. namespace TestTemplateTemplateParmDecl {
  280. template<typename T> class A;
  281. template <template <typename> class T = A, template <typename> class ... U> void foo();
  282. }
  283. // CHECK: NamespaceDecl{{.*}} TestTemplateTemplateParmDecl
  284. // CHECK: FunctionTemplateDecl
  285. // CHECK-NEXT: TemplateTemplateParmDecl{{.*}} T
  286. // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename
  287. // CHECK-NEXT: TemplateArgument{{.*}} template A
  288. // CHECK-NEXT: TemplateTemplateParmDecl{{.*}} ... U
  289. // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename
  290. namespace TestTemplateArgument {
  291. template<typename> class A { };
  292. template<template<typename> class ...> class B { };
  293. int foo();
  294. template<typename> class testType { };
  295. template class testType<int>;
  296. // CHECK: ClassTemplateSpecializationDecl{{.*}} class testType
  297. // CHECK-NEXT: TemplateArgument{{.*}} type 'int'
  298. template<int fp(void)> class testDecl { };
  299. template class testDecl<foo>;
  300. // CHECK: ClassTemplateSpecializationDecl{{.*}} class testDecl
  301. // CHECK-NEXT: TemplateArgument{{.*}} decl
  302. // CHECK-NEXT: Function{{.*}}foo
  303. template class testDecl<nullptr>;
  304. // CHECK: ClassTemplateSpecializationDecl{{.*}} class testDecl
  305. // CHECK-NEXT: TemplateArgument{{.*}} nullptr
  306. template<int> class testIntegral { };
  307. template class testIntegral<1>;
  308. // CHECK: ClassTemplateSpecializationDecl{{.*}} class testIntegral
  309. // CHECK-NEXT: TemplateArgument{{.*}} integral 1
  310. template<template<typename> class> class testTemplate { };
  311. template class testTemplate<A>;
  312. // CHECK: ClassTemplateSpecializationDecl{{.*}} class testTemplate
  313. // CHECK-NEXT: TemplateArgument{{.*}} A
  314. template<template<typename> class ...T> class C {
  315. B<T...> testTemplateExpansion;
  316. };
  317. // FIXME: Need TemplateSpecializationType dumping to test TemplateExpansion.
  318. template<int, int = 0> class testExpr;
  319. template<int I> class testExpr<I> { };
  320. // CHECK: ClassTemplatePartialSpecializationDecl{{.*}} class testExpr
  321. // CHECK-NEXT: TemplateArgument{{.*}} expr
  322. // CHECK-NEXT: DeclRefExpr{{.*}}I
  323. template<int, int ...> class testPack { };
  324. template class testPack<0, 1, 2>;
  325. // CHECK: ClassTemplateSpecializationDecl{{.*}} class testPack
  326. // CHECK-NEXT: TemplateArgument{{.*}} integral 0
  327. // CHECK-NEXT: TemplateArgument{{.*}} pack
  328. // CHECK-NEXT: TemplateArgument{{.*}} integral 1
  329. // CHECK-NEXT: TemplateArgument{{.*}} integral 2
  330. }
  331. namespace testUsingDecl {
  332. int i;
  333. }
  334. namespace TestUsingDecl {
  335. using testUsingDecl::i;
  336. }
  337. // CHECK: NamespaceDecl{{.*}} TestUsingDecl
  338. // CHECK-NEXT: UsingDecl{{.*}} testUsingDecl::i
  339. // CHECK-NEXT: UsingShadowDecl{{.*}} Var{{.*}} 'i' 'int'
  340. namespace testUnresolvedUsing {
  341. class A { };
  342. template<class T> class B {
  343. public:
  344. A a;
  345. };
  346. template<class T> class TestUnresolvedUsing : public B<T> {
  347. using typename B<T>::a;
  348. using B<T>::a;
  349. };
  350. }
  351. // CHECK: CXXRecordDecl{{.*}} TestUnresolvedUsing
  352. // CHECK: UnresolvedUsingTypenameDecl{{.*}} B<T>::a
  353. // CHECK: UnresolvedUsingValueDecl{{.*}} B<T>::a
  354. namespace TestLinkageSpecDecl {
  355. extern "C" void test1();
  356. extern "C++" void test2();
  357. }
  358. // CHECK: NamespaceDecl{{.*}} TestLinkageSpecDecl
  359. // CHECK-NEXT: LinkageSpecDecl{{.*}} C
  360. // CHECK-NEXT: FunctionDecl
  361. // CHECK-NEXT: LinkageSpecDecl{{.*}} C++
  362. // CHECK-NEXT: FunctionDecl
  363. class TestAccessSpecDecl {
  364. public:
  365. private:
  366. protected:
  367. };
  368. // CHECK: CXXRecordDecl{{.*}} class TestAccessSpecDecl
  369. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestAccessSpecDecl
  370. // CHECK-NEXT: AccessSpecDecl{{.*}} public
  371. // CHECK-NEXT: AccessSpecDecl{{.*}} private
  372. // CHECK-NEXT: AccessSpecDecl{{.*}} protected
  373. template<typename T> class TestFriendDecl {
  374. friend int foo();
  375. friend class A;
  376. friend T;
  377. };
  378. // CHECK: CXXRecord{{.*}} TestFriendDecl
  379. // CHECK-NEXT: CXXRecord{{.*}} TestFriendDecl
  380. // CHECK-NEXT: FriendDecl
  381. // CHECK-NEXT: FunctionDecl{{.*}} foo
  382. // CHECK-NEXT: FriendDecl{{.*}} 'class A':'class A'
  383. // CHECK-NEXT: FriendDecl{{.*}} 'T'
  384. namespace TestFileScopeAsmDecl {
  385. asm("ret");
  386. }
  387. // CHECK: NamespaceDecl{{.*}} TestFileScopeAsmDecl{{$}}
  388. // CHECK: FileScopeAsmDecl{{.*>$}}
  389. // CHECK-NEXT: StringLiteral
  390. namespace TestFriendDecl2 {
  391. void f();
  392. struct S {
  393. friend void f();
  394. };
  395. }
  396. // CHECK: NamespaceDecl [[TestFriendDecl2:0x.*]] <{{.*}}> TestFriendDecl2
  397. // CHECK: |-FunctionDecl [[TestFriendDecl2_f:0x.*]] <{{.*}}> f 'void (void)'
  398. // CHECK: `-CXXRecordDecl {{.*}} struct S
  399. // CHECK: |-CXXRecordDecl {{.*}} struct S
  400. // CHECK: `-FriendDecl
  401. // CHECK: `-FunctionDecl {{.*}} parent [[TestFriendDecl2]] prev [[TestFriendDecl2_f]] <{{.*}}> f 'void (void)'
  402. namespace Comment {
  403. extern int Test;
  404. /// Something here.
  405. extern int Test;
  406. extern int Test;
  407. }
  408. // CHECK: VarDecl {{.*}} Test 'int' extern
  409. // CHECK-NOT: FullComment
  410. // CHECK: VarDecl {{.*}} Test 'int' extern
  411. // CHECK: `-FullComment
  412. // CHECK: `-ParagraphComment
  413. // CHECK: `-TextComment
  414. // CHECK: VarDecl {{.*}} Test 'int' extern
  415. // CHECK-NOT: FullComment