ast-dump-decl.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  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. TestCXXConstructorDecl(A &a) : TestCXXConstructorDecl(a, 0) { }
  103. };
  104. }
  105. // CHECK: CXXConstructorDecl{{.*}} TestCXXConstructorDecl 'void {{.*}}'
  106. // CHECK-NEXT: ParmVarDecl{{.*}} a
  107. // CHECK-NEXT: ParmVarDecl{{.*}} i
  108. // CHECK-NEXT: CXXCtorInitializer{{.*}}A
  109. // CHECK-NEXT: Expr
  110. // CHECK: CXXCtorInitializer{{.*}}I
  111. // CHECK-NEXT: Expr
  112. // CHECK: CompoundStmt
  113. // CHECK: CXXConstructorDecl{{.*}} TestCXXConstructorDecl 'void {{.*}}'
  114. // CHECK-NEXT: ParmVarDecl{{.*}} a
  115. // CHECK-NEXT: CXXCtorInitializer{{.*}}TestCXXConstructorDecl
  116. // CHECK-NEXT: CXXConstructExpr{{.*}}TestCXXConstructorDecl
  117. class TestCXXDestructorDecl {
  118. ~TestCXXDestructorDecl() { }
  119. };
  120. // CHECK: CXXDestructorDecl{{.*}} ~TestCXXDestructorDecl 'void (void) noexcept'
  121. // CHECK-NEXT: CompoundStmt
  122. // Test that the range of a defaulted members is computed correctly.
  123. class TestMemberRanges {
  124. public:
  125. TestMemberRanges() = default;
  126. TestMemberRanges(const TestMemberRanges &Other) = default;
  127. TestMemberRanges(TestMemberRanges &&Other) = default;
  128. ~TestMemberRanges() = default;
  129. TestMemberRanges &operator=(const TestMemberRanges &Other) = default;
  130. TestMemberRanges &operator=(TestMemberRanges &&Other) = default;
  131. };
  132. void SomeFunction() {
  133. TestMemberRanges A;
  134. TestMemberRanges B(A);
  135. B = A;
  136. A = static_cast<TestMemberRanges &&>(B);
  137. TestMemberRanges C(static_cast<TestMemberRanges &&>(A));
  138. }
  139. // CHECK: CXXConstructorDecl{{.*}} <line:{{.*}}:3, col:30>
  140. // CHECK: CXXConstructorDecl{{.*}} <line:{{.*}}:3, col:59>
  141. // CHECK: CXXConstructorDecl{{.*}} <line:{{.*}}:3, col:54>
  142. // CHECK: CXXDestructorDecl{{.*}} <line:{{.*}}:3, col:31>
  143. // CHECK: CXXMethodDecl{{.*}} <line:{{.*}}:3, col:70>
  144. // CHECK: CXXMethodDecl{{.*}} <line:{{.*}}:3, col:65>
  145. class TestCXXConversionDecl {
  146. operator int() { return 0; }
  147. };
  148. // CHECK: CXXConversionDecl{{.*}} operator int 'int (void)'
  149. // CHECK-NEXT: CompoundStmt
  150. namespace TestStaticAssertDecl {
  151. static_assert(true, "msg");
  152. }
  153. // CHECK: NamespaceDecl{{.*}} TestStaticAssertDecl
  154. // CHECK-NEXT: StaticAssertDecl{{.*> .*$}}
  155. // CHECK-NEXT: CXXBoolLiteralExpr
  156. // CHECK-NEXT: StringLiteral
  157. namespace testFunctionTemplateDecl {
  158. class A { };
  159. class B { };
  160. class C { };
  161. class D { };
  162. template<typename T> void TestFunctionTemplate(T) { }
  163. // implicit instantiation
  164. void bar(A a) { TestFunctionTemplate(a); }
  165. // explicit specialization
  166. template<> void TestFunctionTemplate(B);
  167. // explicit instantiation declaration
  168. extern template void TestFunctionTemplate(C);
  169. // explicit instantiation definition
  170. template void TestFunctionTemplate(D);
  171. }
  172. // CHECK: FunctionTemplateDecl{{.*}} TestFunctionTemplate
  173. // CHECK-NEXT: TemplateTypeParmDecl
  174. // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'
  175. // CHECK-NEXT: ParmVarDecl{{.*}} 'T'
  176. // CHECK-NEXT: CompoundStmt
  177. // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}A
  178. // CHECK-NEXT: TemplateArgument
  179. // CHECK-NEXT: ParmVarDecl
  180. // CHECK-NEXT: CompoundStmt
  181. // CHECK-NEXT: Function{{.*}} 'TestFunctionTemplate' {{.*}}B
  182. // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}C
  183. // CHECK-NEXT: TemplateArgument
  184. // CHECK-NEXT: ParmVarDecl
  185. // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}D
  186. // CHECK-NEXT: TemplateArgument
  187. // CHECK-NEXT: ParmVarDecl
  188. // CHECK-NEXT: CompoundStmt
  189. // CHECK: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}B
  190. // CHECK-NEXT: TemplateArgument
  191. // CHECK-NEXT: ParmVarDecl
  192. namespace testClassTemplateDecl {
  193. class A { };
  194. class B { };
  195. class C { };
  196. class D { };
  197. template<typename T> class TestClassTemplate {
  198. int i;
  199. };
  200. // implicit instantiation
  201. TestClassTemplate<A> a;
  202. // explicit specialization
  203. template<> class TestClassTemplate<B> {
  204. int j;
  205. };
  206. // explicit instantiation declaration
  207. extern template class TestClassTemplate<C>;
  208. // explicit instantiation definition
  209. template class TestClassTemplate<D>;
  210. // partial explicit specialization
  211. template<typename T1, typename T2> class TestClassTemplatePartial {
  212. int i;
  213. };
  214. template<typename T1> class TestClassTemplatePartial<T1, A> {
  215. int j;
  216. };
  217. }
  218. // CHECK: ClassTemplateDecl{{.*}} TestClassTemplate
  219. // CHECK-NEXT: TemplateTypeParmDecl
  220. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  221. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  222. // CHECK-NEXT: FieldDecl{{.*}} i
  223. // CHECK-NEXT: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
  224. // CHECK-NEXT: TemplateArgument{{.*}}A
  225. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  226. // CHECK-NEXT: FieldDecl{{.*}} i
  227. // CHECK: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
  228. // CHECK-NEXT: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
  229. // CHECK-NEXT: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
  230. // CHECK: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
  231. // CHECK-NEXT: TemplateArgument{{.*}}B
  232. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  233. // CHECK-NEXT: FieldDecl{{.*}} j
  234. // CHECK: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
  235. // CHECK-NEXT: TemplateArgument{{.*}}C
  236. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  237. // CHECK-NEXT: FieldDecl{{.*}} i
  238. // CHECK: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
  239. // CHECK-NEXT: TemplateArgument{{.*}}D
  240. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  241. // CHECK-NEXT: FieldDecl{{.*}} i
  242. // CHECK: ClassTemplatePartialSpecializationDecl{{.*}} class TestClassTemplatePartial
  243. // CHECK-NEXT: TemplateArgument
  244. // CHECK-NEXT: TemplateArgument{{.*}}A
  245. // CHECK-NEXT: TemplateTypeParmDecl
  246. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplatePartial
  247. // CHECK-NEXT: FieldDecl{{.*}} j
  248. // PR15220 dump instantiation only once
  249. namespace testCanonicalTemplate {
  250. class A {};
  251. template<typename T> void TestFunctionTemplate(T);
  252. template<typename T> void TestFunctionTemplate(T);
  253. void bar(A a) { TestFunctionTemplate(a); }
  254. // CHECK: FunctionTemplateDecl{{.*}} TestFunctionTemplate
  255. // CHECK-NEXT: TemplateTypeParmDecl
  256. // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'
  257. // CHECK-NEXT: ParmVarDecl{{.*}} 'T'
  258. // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}A
  259. // CHECK-NEXT: TemplateArgument
  260. // CHECK-NEXT: ParmVarDecl
  261. // CHECK: FunctionTemplateDecl{{.*}} TestFunctionTemplate
  262. // CHECK-NEXT: TemplateTypeParmDecl
  263. // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'
  264. // CHECK-NEXT: ParmVarDecl{{.*}} 'T'
  265. // CHECK-NEXT: Function{{.*}} 'TestFunctionTemplate'
  266. // CHECK-NOT: TemplateArgument
  267. template<typename T1> class TestClassTemplate {
  268. template<typename T2> friend class TestClassTemplate;
  269. };
  270. TestClassTemplate<A> a;
  271. // CHECK: ClassTemplateDecl{{.*}} TestClassTemplate
  272. // CHECK-NEXT: TemplateTypeParmDecl
  273. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  274. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  275. // CHECK-NEXT: FriendDecl
  276. // CHECK-NEXT: ClassTemplateDecl{{.*}} TestClassTemplate
  277. // CHECK-NEXT: TemplateTypeParmDecl
  278. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  279. // CHECK-NEXT: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
  280. // CHECK-NEXT: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
  281. // CHECK-NEXT: TemplateArgument{{.*}}A
  282. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
  283. }
  284. template <class T>
  285. class TestClassScopeFunctionSpecialization {
  286. template<class U> void foo(U a) { }
  287. template<> void foo<int>(int a) { }
  288. };
  289. // CHECK: ClassScopeFunctionSpecializationDecl
  290. // CHECK-NEXT: CXXMethod{{.*}} 'foo' 'void (int)'
  291. // CHECK-NEXT: TemplateArgument{{.*}} 'int'
  292. namespace TestTemplateTypeParmDecl {
  293. template<typename ... T, class U = int> void foo();
  294. }
  295. // CHECK: NamespaceDecl{{.*}} TestTemplateTypeParmDecl
  296. // CHECK-NEXT: FunctionTemplateDecl
  297. // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename ... T
  298. // CHECK-NEXT: TemplateTypeParmDecl{{.*}} class U
  299. // CHECK-NEXT: TemplateArgument type 'int'
  300. namespace TestNonTypeTemplateParmDecl {
  301. template<int I = 1, int ... J> void foo();
  302. }
  303. // CHECK: NamespaceDecl{{.*}} TestNonTypeTemplateParmDecl
  304. // CHECK-NEXT: FunctionTemplateDecl
  305. // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' I
  306. // CHECK-NEXT: TemplateArgument expr
  307. // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
  308. // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' ... J
  309. namespace TestTemplateTemplateParmDecl {
  310. template<typename T> class A;
  311. template <template <typename> class T = A, template <typename> class ... U> void foo();
  312. }
  313. // CHECK: NamespaceDecl{{.*}} TestTemplateTemplateParmDecl
  314. // CHECK: FunctionTemplateDecl
  315. // CHECK-NEXT: TemplateTemplateParmDecl{{.*}} T
  316. // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename
  317. // CHECK-NEXT: TemplateArgument{{.*}} template A
  318. // CHECK-NEXT: TemplateTemplateParmDecl{{.*}} ... U
  319. // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename
  320. namespace TestTemplateArgument {
  321. template<typename> class A { };
  322. template<template<typename> class ...> class B { };
  323. int foo();
  324. template<typename> class testType { };
  325. template class testType<int>;
  326. // CHECK: ClassTemplateSpecializationDecl{{.*}} class testType
  327. // CHECK-NEXT: TemplateArgument{{.*}} type 'int'
  328. template<int fp(void)> class testDecl { };
  329. template class testDecl<foo>;
  330. // CHECK: ClassTemplateSpecializationDecl{{.*}} class testDecl
  331. // CHECK-NEXT: TemplateArgument{{.*}} decl
  332. // CHECK-NEXT: Function{{.*}}foo
  333. template class testDecl<nullptr>;
  334. // CHECK: ClassTemplateSpecializationDecl{{.*}} class testDecl
  335. // CHECK-NEXT: TemplateArgument{{.*}} nullptr
  336. template<int> class testIntegral { };
  337. template class testIntegral<1>;
  338. // CHECK: ClassTemplateSpecializationDecl{{.*}} class testIntegral
  339. // CHECK-NEXT: TemplateArgument{{.*}} integral 1
  340. template<template<typename> class> class testTemplate { };
  341. template class testTemplate<A>;
  342. // CHECK: ClassTemplateSpecializationDecl{{.*}} class testTemplate
  343. // CHECK-NEXT: TemplateArgument{{.*}} A
  344. template<template<typename> class ...T> class C {
  345. B<T...> testTemplateExpansion;
  346. };
  347. // FIXME: Need TemplateSpecializationType dumping to test TemplateExpansion.
  348. template<int, int = 0> class testExpr;
  349. template<int I> class testExpr<I> { };
  350. // CHECK: ClassTemplatePartialSpecializationDecl{{.*}} class testExpr
  351. // CHECK-NEXT: TemplateArgument{{.*}} expr
  352. // CHECK-NEXT: DeclRefExpr{{.*}}I
  353. template<int, int ...> class testPack { };
  354. template class testPack<0, 1, 2>;
  355. // CHECK: ClassTemplateSpecializationDecl{{.*}} class testPack
  356. // CHECK-NEXT: TemplateArgument{{.*}} integral 0
  357. // CHECK-NEXT: TemplateArgument{{.*}} pack
  358. // CHECK-NEXT: TemplateArgument{{.*}} integral 1
  359. // CHECK-NEXT: TemplateArgument{{.*}} integral 2
  360. }
  361. namespace testUsingDecl {
  362. int i;
  363. }
  364. namespace TestUsingDecl {
  365. using testUsingDecl::i;
  366. }
  367. // CHECK: NamespaceDecl{{.*}} TestUsingDecl
  368. // CHECK-NEXT: UsingDecl{{.*}} testUsingDecl::i
  369. // CHECK-NEXT: UsingShadowDecl{{.*}} Var{{.*}} 'i' 'int'
  370. namespace testUnresolvedUsing {
  371. class A { };
  372. template<class T> class B {
  373. public:
  374. A a;
  375. };
  376. template<class T> class TestUnresolvedUsing : public B<T> {
  377. using typename B<T>::a;
  378. using B<T>::a;
  379. };
  380. }
  381. // CHECK: CXXRecordDecl{{.*}} TestUnresolvedUsing
  382. // CHECK: UnresolvedUsingTypenameDecl{{.*}} B<T>::a
  383. // CHECK: UnresolvedUsingValueDecl{{.*}} B<T>::a
  384. namespace TestLinkageSpecDecl {
  385. extern "C" void test1();
  386. extern "C++" void test2();
  387. }
  388. // CHECK: NamespaceDecl{{.*}} TestLinkageSpecDecl
  389. // CHECK-NEXT: LinkageSpecDecl{{.*}} C
  390. // CHECK-NEXT: FunctionDecl
  391. // CHECK-NEXT: LinkageSpecDecl{{.*}} C++
  392. // CHECK-NEXT: FunctionDecl
  393. class TestAccessSpecDecl {
  394. public:
  395. private:
  396. protected:
  397. };
  398. // CHECK: CXXRecordDecl{{.*}} class TestAccessSpecDecl
  399. // CHECK-NEXT: CXXRecordDecl{{.*}} class TestAccessSpecDecl
  400. // CHECK-NEXT: AccessSpecDecl{{.*}} public
  401. // CHECK-NEXT: AccessSpecDecl{{.*}} private
  402. // CHECK-NEXT: AccessSpecDecl{{.*}} protected
  403. template<typename T> class TestFriendDecl {
  404. friend int foo();
  405. friend class A;
  406. friend T;
  407. };
  408. // CHECK: CXXRecord{{.*}} TestFriendDecl
  409. // CHECK-NEXT: CXXRecord{{.*}} TestFriendDecl
  410. // CHECK-NEXT: FriendDecl
  411. // CHECK-NEXT: FunctionDecl{{.*}} foo
  412. // CHECK-NEXT: FriendDecl{{.*}} 'class A':'class A'
  413. // CHECK-NEXT: FriendDecl{{.*}} 'T'
  414. namespace TestFileScopeAsmDecl {
  415. asm("ret");
  416. }
  417. // CHECK: NamespaceDecl{{.*}} TestFileScopeAsmDecl{{$}}
  418. // CHECK: FileScopeAsmDecl{{.*> .*$}}
  419. // CHECK-NEXT: StringLiteral
  420. namespace TestFriendDecl2 {
  421. void f();
  422. struct S {
  423. friend void f();
  424. };
  425. }
  426. // CHECK: NamespaceDecl [[TestFriendDecl2:0x.*]] <{{.*}}> {{.*}} TestFriendDecl2
  427. // CHECK: |-FunctionDecl [[TestFriendDecl2_f:0x.*]] <{{.*}}> {{.*}} f 'void (void)'
  428. // CHECK: `-CXXRecordDecl {{.*}} struct S
  429. // CHECK: |-CXXRecordDecl {{.*}} struct S
  430. // CHECK: `-FriendDecl
  431. // CHECK: `-FunctionDecl {{.*}} parent [[TestFriendDecl2]] prev [[TestFriendDecl2_f]] <{{.*}}> {{.*}} f 'void (void)'
  432. namespace Comment {
  433. extern int Test;
  434. /// Something here.
  435. extern int Test;
  436. extern int Test;
  437. }
  438. // CHECK: VarDecl {{.*}} Test 'int' extern
  439. // CHECK-NOT: FullComment
  440. // CHECK: VarDecl {{.*}} Test 'int' extern
  441. // CHECK: `-FullComment
  442. // CHECK: `-ParagraphComment
  443. // CHECK: `-TextComment
  444. // CHECK: VarDecl {{.*}} Test 'int' extern
  445. // CHECK-NOT: FullComment