SourceLocationTest.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. //===- unittest/AST/SourceLocationTest.cpp - AST source loc unit tests ----===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file contains tests for SourceLocation and SourceRange fields
  11. // in AST nodes.
  12. //
  13. // FIXME: In the long-term, when we test more than source locations, we may
  14. // want to have a unit test file for an AST node (or group of related nodes),
  15. // rather than a unit test file for source locations for all AST nodes.
  16. //
  17. //===----------------------------------------------------------------------===//
  18. #include "clang/AST/ASTContext.h"
  19. #include "MatchVerifier.h"
  20. #include "clang/ASTMatchers/ASTMatchFinder.h"
  21. #include "clang/ASTMatchers/ASTMatchers.h"
  22. #include "clang/Tooling/Tooling.h"
  23. #include "gtest/gtest.h"
  24. namespace clang {
  25. namespace ast_matchers {
  26. // FIXME: Pull the *Verifier tests into their own test file.
  27. TEST(MatchVerifier, ParseError) {
  28. LocationVerifier<VarDecl> Verifier;
  29. Verifier.expectLocation(1, 1);
  30. EXPECT_FALSE(Verifier.match("int i", varDecl()));
  31. }
  32. TEST(MatchVerifier, NoMatch) {
  33. LocationVerifier<VarDecl> Verifier;
  34. Verifier.expectLocation(1, 1);
  35. EXPECT_FALSE(Verifier.match("int i;", recordDecl()));
  36. }
  37. TEST(MatchVerifier, WrongType) {
  38. LocationVerifier<RecordDecl> Verifier;
  39. Verifier.expectLocation(1, 1);
  40. EXPECT_FALSE(Verifier.match("int i;", varDecl()));
  41. }
  42. TEST(LocationVerifier, WrongLocation) {
  43. LocationVerifier<VarDecl> Verifier;
  44. Verifier.expectLocation(1, 1);
  45. EXPECT_FALSE(Verifier.match("int i;", varDecl()));
  46. }
  47. TEST(RangeVerifier, WrongRange) {
  48. RangeVerifier<VarDecl> Verifier;
  49. Verifier.expectRange(1, 1, 1, 1);
  50. EXPECT_FALSE(Verifier.match("int i;", varDecl()));
  51. }
  52. class LabelDeclRangeVerifier : public RangeVerifier<LabelStmt> {
  53. protected:
  54. SourceRange getRange(const LabelStmt &Node) override {
  55. return Node.getDecl()->getSourceRange();
  56. }
  57. };
  58. TEST(LabelDecl, Range) {
  59. LabelDeclRangeVerifier Verifier;
  60. Verifier.expectRange(1, 12, 1, 12);
  61. EXPECT_TRUE(Verifier.match("void f() { l: return; }", labelStmt()));
  62. }
  63. TEST(LabelStmt, Range) {
  64. RangeVerifier<LabelStmt> Verifier;
  65. Verifier.expectRange(1, 12, 1, 15);
  66. EXPECT_TRUE(Verifier.match("void f() { l: return; }", labelStmt()));
  67. }
  68. TEST(ParmVarDecl, KNRLocation) {
  69. LocationVerifier<ParmVarDecl> Verifier;
  70. Verifier.expectLocation(1, 8);
  71. EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C));
  72. }
  73. TEST(ParmVarDecl, KNRRange) {
  74. RangeVerifier<ParmVarDecl> Verifier;
  75. Verifier.expectRange(1, 8, 1, 8);
  76. EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C));
  77. }
  78. TEST(CXXNewExpr, ArrayRange) {
  79. RangeVerifier<CXXNewExpr> Verifier;
  80. Verifier.expectRange(1, 12, 1, 22);
  81. EXPECT_TRUE(Verifier.match("void f() { new int[10]; }", newExpr()));
  82. }
  83. TEST(CXXNewExpr, ParenRange) {
  84. RangeVerifier<CXXNewExpr> Verifier;
  85. Verifier.expectRange(1, 12, 1, 20);
  86. EXPECT_TRUE(Verifier.match("void f() { new int(); }", newExpr()));
  87. }
  88. TEST(MemberExpr, ImplicitMemberRange) {
  89. RangeVerifier<MemberExpr> Verifier;
  90. Verifier.expectRange(2, 30, 2, 30);
  91. EXPECT_TRUE(Verifier.match("struct S { operator int() const; };\n"
  92. "int foo(const S& s) { return s; }",
  93. memberExpr()));
  94. }
  95. class MemberExprArrowLocVerifier : public RangeVerifier<MemberExpr> {
  96. protected:
  97. SourceRange getRange(const MemberExpr &Node) override {
  98. return Node.getOperatorLoc();
  99. }
  100. };
  101. TEST(MemberExpr, ArrowRange) {
  102. MemberExprArrowLocVerifier Verifier;
  103. Verifier.expectRange(2, 19, 2, 19);
  104. EXPECT_TRUE(Verifier.match("struct S { int x; };\n"
  105. "void foo(S *s) { s->x = 0; }",
  106. memberExpr()));
  107. }
  108. TEST(MemberExpr, MacroArrowRange) {
  109. MemberExprArrowLocVerifier Verifier;
  110. Verifier.expectRange(1, 24, 1, 24);
  111. EXPECT_TRUE(Verifier.match("#define MEMBER(a, b) (a->b)\n"
  112. "struct S { int x; };\n"
  113. "void foo(S *s) { MEMBER(s, x) = 0; }",
  114. memberExpr()));
  115. }
  116. TEST(MemberExpr, ImplicitArrowRange) {
  117. MemberExprArrowLocVerifier Verifier;
  118. Verifier.expectRange(0, 0, 0, 0);
  119. EXPECT_TRUE(Verifier.match("struct S { int x; void Test(); };\n"
  120. "void S::Test() { x = 1; }",
  121. memberExpr()));
  122. }
  123. TEST(VarDecl, VMTypeFixedVarDeclRange) {
  124. RangeVerifier<VarDecl> Verifier;
  125. Verifier.expectRange(1, 1, 1, 23);
  126. EXPECT_TRUE(Verifier.match("int a[(int)(void*)1234];",
  127. varDecl(), Lang_C89));
  128. }
  129. TEST(CXXConstructorDecl, NoRetFunTypeLocRange) {
  130. RangeVerifier<CXXConstructorDecl> Verifier;
  131. Verifier.expectRange(1, 11, 1, 13);
  132. EXPECT_TRUE(Verifier.match("class C { C(); };", functionDecl()));
  133. }
  134. TEST(CXXConstructorDecl, DefaultedCtorLocRange) {
  135. RangeVerifier<CXXConstructorDecl> Verifier;
  136. Verifier.expectRange(1, 11, 1, 23);
  137. EXPECT_TRUE(Verifier.match("class C { C() = default; };", functionDecl()));
  138. }
  139. TEST(CXXConstructorDecl, DeletedCtorLocRange) {
  140. RangeVerifier<CXXConstructorDecl> Verifier;
  141. Verifier.expectRange(1, 11, 1, 22);
  142. EXPECT_TRUE(Verifier.match("class C { C() = delete; };", functionDecl()));
  143. }
  144. TEST(CompoundLiteralExpr, CompoundVectorLiteralRange) {
  145. RangeVerifier<CompoundLiteralExpr> Verifier;
  146. Verifier.expectRange(2, 11, 2, 22);
  147. EXPECT_TRUE(Verifier.match(
  148. "typedef int int2 __attribute__((ext_vector_type(2)));\n"
  149. "int2 i2 = (int2){1, 2};", compoundLiteralExpr()));
  150. }
  151. TEST(CompoundLiteralExpr, ParensCompoundVectorLiteralRange) {
  152. RangeVerifier<CompoundLiteralExpr> Verifier;
  153. Verifier.expectRange(2, 20, 2, 31);
  154. EXPECT_TRUE(Verifier.match(
  155. "typedef int int2 __attribute__((ext_vector_type(2)));\n"
  156. "constant int2 i2 = (int2)(1, 2);",
  157. compoundLiteralExpr(), Lang_OpenCL));
  158. }
  159. TEST(InitListExpr, VectorLiteralListBraceRange) {
  160. RangeVerifier<InitListExpr> Verifier;
  161. Verifier.expectRange(2, 17, 2, 22);
  162. EXPECT_TRUE(Verifier.match(
  163. "typedef int int2 __attribute__((ext_vector_type(2)));\n"
  164. "int2 i2 = (int2){1, 2};", initListExpr()));
  165. }
  166. TEST(InitListExpr, VectorLiteralInitListParens) {
  167. RangeVerifier<InitListExpr> Verifier;
  168. Verifier.expectRange(2, 26, 2, 31);
  169. EXPECT_TRUE(Verifier.match(
  170. "typedef int int2 __attribute__((ext_vector_type(2)));\n"
  171. "constant int2 i2 = (int2)(1, 2);", initListExpr(), Lang_OpenCL));
  172. }
  173. class TemplateAngleBracketLocRangeVerifier : public RangeVerifier<TypeLoc> {
  174. protected:
  175. SourceRange getRange(const TypeLoc &Node) override {
  176. TemplateSpecializationTypeLoc T =
  177. Node.getUnqualifiedLoc().castAs<TemplateSpecializationTypeLoc>();
  178. assert(!T.isNull());
  179. return SourceRange(T.getLAngleLoc(), T.getRAngleLoc());
  180. }
  181. };
  182. TEST(TemplateSpecializationTypeLoc, AngleBracketLocations) {
  183. TemplateAngleBracketLocRangeVerifier Verifier;
  184. Verifier.expectRange(2, 8, 2, 10);
  185. EXPECT_TRUE(Verifier.match(
  186. "template<typename T> struct A {}; struct B{}; void f(\n"
  187. "const A<B>&);",
  188. loc(templateSpecializationType())));
  189. }
  190. TEST(CXXNewExpr, TypeParenRange) {
  191. RangeVerifier<CXXNewExpr> Verifier;
  192. Verifier.expectRange(1, 10, 1, 18);
  193. EXPECT_TRUE(Verifier.match("int* a = new (int);", newExpr()));
  194. }
  195. class UnaryTransformTypeLocParensRangeVerifier : public RangeVerifier<TypeLoc> {
  196. protected:
  197. SourceRange getRange(const TypeLoc &Node) override {
  198. UnaryTransformTypeLoc T =
  199. Node.getUnqualifiedLoc().castAs<UnaryTransformTypeLoc>();
  200. assert(!T.isNull());
  201. return SourceRange(T.getLParenLoc(), T.getRParenLoc());
  202. }
  203. };
  204. TEST(UnaryTransformTypeLoc, ParensRange) {
  205. UnaryTransformTypeLocParensRangeVerifier Verifier;
  206. Verifier.expectRange(3, 26, 3, 28);
  207. EXPECT_TRUE(Verifier.match(
  208. "template <typename T>\n"
  209. "struct S {\n"
  210. "typedef __underlying_type(T) type;\n"
  211. "};",
  212. loc(unaryTransformType())));
  213. }
  214. TEST(CXXFunctionalCastExpr, SourceRange) {
  215. RangeVerifier<CXXFunctionalCastExpr> Verifier;
  216. Verifier.expectRange(2, 10, 2, 14);
  217. EXPECT_TRUE(Verifier.match(
  218. "int foo() {\n"
  219. " return int{};\n"
  220. "}",
  221. functionalCastExpr(), Lang_CXX11));
  222. }
  223. TEST(CXXConstructExpr, SourceRange) {
  224. RangeVerifier<CXXConstructExpr> Verifier;
  225. Verifier.expectRange(3, 14, 3, 19);
  226. EXPECT_TRUE(Verifier.match(
  227. "struct A { A(int, int); };\n"
  228. "void f(A a);\n"
  229. "void g() { f({0, 0}); }",
  230. constructExpr(), Lang_CXX11));
  231. }
  232. TEST(CXXTemporaryObjectExpr, SourceRange) {
  233. RangeVerifier<CXXTemporaryObjectExpr> Verifier;
  234. Verifier.expectRange(2, 6, 2, 12);
  235. EXPECT_TRUE(Verifier.match(
  236. "struct A { A(int, int); };\n"
  237. "A a( A{0, 0} );",
  238. temporaryObjectExpr(), Lang_CXX11));
  239. }
  240. TEST(CXXUnresolvedConstructExpr, SourceRange) {
  241. RangeVerifier<CXXUnresolvedConstructExpr> Verifier;
  242. Verifier.expectRange(3, 10, 3, 12);
  243. std::vector<std::string> Args;
  244. Args.push_back("-fno-delayed-template-parsing");
  245. EXPECT_TRUE(Verifier.match(
  246. "template <typename U>\n"
  247. "U foo() {\n"
  248. " return U{};\n"
  249. "}",
  250. unresolvedConstructExpr(), Args, Lang_CXX11));
  251. }
  252. TEST(UsingDecl, SourceRange) {
  253. RangeVerifier<UsingDecl> Verifier;
  254. Verifier.expectRange(2, 22, 2, 25);
  255. EXPECT_TRUE(Verifier.match(
  256. "class B { protected: int i; };\n"
  257. "class D : public B { B::i; };",
  258. usingDecl()));
  259. }
  260. TEST(UnresolvedUsingValueDecl, SourceRange) {
  261. RangeVerifier<UnresolvedUsingValueDecl> Verifier;
  262. Verifier.expectRange(3, 3, 3, 6);
  263. EXPECT_TRUE(Verifier.match(
  264. "template <typename B>\n"
  265. "class D : public B {\n"
  266. " B::i;\n"
  267. "};",
  268. unresolvedUsingValueDecl()));
  269. }
  270. TEST(FriendDecl, FriendNonMemberFunctionLocation) {
  271. LocationVerifier<FriendDecl> Verifier;
  272. Verifier.expectLocation(2, 13);
  273. EXPECT_TRUE(Verifier.match("struct A {\n"
  274. "friend void f();\n"
  275. "};\n",
  276. friendDecl()));
  277. }
  278. TEST(FriendDecl, FriendNonMemberFunctionRange) {
  279. RangeVerifier<FriendDecl> Verifier;
  280. Verifier.expectRange(2, 1, 2, 15);
  281. EXPECT_TRUE(Verifier.match("struct A {\n"
  282. "friend void f();\n"
  283. "};\n",
  284. friendDecl()));
  285. }
  286. TEST(FriendDecl, FriendNonMemberFunctionDefinitionLocation) {
  287. LocationVerifier<FriendDecl> Verifier;
  288. Verifier.expectLocation(2, 12);
  289. EXPECT_TRUE(Verifier.match("struct A {\n"
  290. "friend int f() { return 0; }\n"
  291. "};\n",
  292. friendDecl()));
  293. }
  294. TEST(FriendDecl, FriendNonMemberFunctionDefinitionRange) {
  295. RangeVerifier<FriendDecl> Verifier;
  296. Verifier.expectRange(2, 1, 2, 28);
  297. EXPECT_TRUE(Verifier.match("struct A {\n"
  298. "friend int f() { return 0; }\n"
  299. "};\n",
  300. friendDecl()));
  301. }
  302. TEST(FriendDecl, FriendElaboratedTypeLocation) {
  303. LocationVerifier<FriendDecl> Verifier;
  304. Verifier.expectLocation(2, 8);
  305. EXPECT_TRUE(Verifier.match("struct A {\n"
  306. "friend class B;\n"
  307. "};\n",
  308. friendDecl()));
  309. }
  310. TEST(FriendDecl, FriendElaboratedTypeRange) {
  311. RangeVerifier<FriendDecl> Verifier;
  312. Verifier.expectRange(2, 1, 2, 14);
  313. EXPECT_TRUE(Verifier.match("struct A {\n"
  314. "friend class B;\n"
  315. "};\n",
  316. friendDecl()));
  317. }
  318. TEST(FriendDecl, FriendSimpleTypeLocation) {
  319. LocationVerifier<FriendDecl> Verifier;
  320. Verifier.expectLocation(3, 8);
  321. EXPECT_TRUE(Verifier.match("class B;\n"
  322. "struct A {\n"
  323. "friend B;\n"
  324. "};\n",
  325. friendDecl(), Lang_CXX11));
  326. }
  327. TEST(FriendDecl, FriendSimpleTypeRange) {
  328. RangeVerifier<FriendDecl> Verifier;
  329. Verifier.expectRange(3, 1, 3, 8);
  330. EXPECT_TRUE(Verifier.match("class B;\n"
  331. "struct A {\n"
  332. "friend B;\n"
  333. "};\n",
  334. friendDecl(), Lang_CXX11));
  335. }
  336. TEST(FriendDecl, FriendTemplateParameterLocation) {
  337. LocationVerifier<FriendDecl> Verifier;
  338. Verifier.expectLocation(3, 8);
  339. EXPECT_TRUE(Verifier.match("template <typename T>\n"
  340. "struct A {\n"
  341. "friend T;\n"
  342. "};\n",
  343. friendDecl(), Lang_CXX11));
  344. }
  345. TEST(FriendDecl, FriendTemplateParameterRange) {
  346. RangeVerifier<FriendDecl> Verifier;
  347. Verifier.expectRange(3, 1, 3, 8);
  348. EXPECT_TRUE(Verifier.match("template <typename T>\n"
  349. "struct A {\n"
  350. "friend T;\n"
  351. "};\n",
  352. friendDecl(), Lang_CXX11));
  353. }
  354. TEST(FriendDecl, FriendDecltypeLocation) {
  355. LocationVerifier<FriendDecl> Verifier;
  356. Verifier.expectLocation(4, 8);
  357. EXPECT_TRUE(Verifier.match("struct A;\n"
  358. "A foo();\n"
  359. "struct A {\n"
  360. "friend decltype(foo());\n"
  361. "};\n",
  362. friendDecl(), Lang_CXX11));
  363. }
  364. TEST(FriendDecl, FriendDecltypeRange) {
  365. RangeVerifier<FriendDecl> Verifier;
  366. Verifier.expectRange(4, 1, 4, 8);
  367. EXPECT_TRUE(Verifier.match("struct A;\n"
  368. "A foo();\n"
  369. "struct A {\n"
  370. "friend decltype(foo());\n"
  371. "};\n",
  372. friendDecl(), Lang_CXX11));
  373. }
  374. TEST(FriendDecl, FriendConstructorDestructorLocation) {
  375. const std::string Code = "struct B {\n"
  376. "B();\n"
  377. "~B();\n"
  378. "};\n"
  379. "struct A {\n"
  380. "friend B::B(), B::~B();\n"
  381. "};\n";
  382. LocationVerifier<FriendDecl> ConstructorVerifier;
  383. ConstructorVerifier.expectLocation(6, 11);
  384. EXPECT_TRUE(ConstructorVerifier.match(
  385. Code, friendDecl(has(constructorDecl(ofClass(hasName("B")))))));
  386. LocationVerifier<FriendDecl> DestructorVerifier;
  387. DestructorVerifier.expectLocation(6, 19);
  388. EXPECT_TRUE(DestructorVerifier.match(
  389. Code, friendDecl(has(destructorDecl(ofClass(hasName("B")))))));
  390. }
  391. TEST(FriendDecl, FriendConstructorDestructorRange) {
  392. const std::string Code = "struct B {\n"
  393. "B();\n"
  394. "~B();\n"
  395. "};\n"
  396. "struct A {\n"
  397. "friend B::B(), B::~B();\n"
  398. "};\n";
  399. RangeVerifier<FriendDecl> ConstructorVerifier;
  400. ConstructorVerifier.expectRange(6, 1, 6, 13);
  401. EXPECT_TRUE(ConstructorVerifier.match(
  402. Code, friendDecl(has(constructorDecl(ofClass(hasName("B")))))));
  403. RangeVerifier<FriendDecl> DestructorVerifier;
  404. DestructorVerifier.expectRange(6, 1, 6, 22);
  405. EXPECT_TRUE(DestructorVerifier.match(
  406. Code, friendDecl(has(destructorDecl(ofClass(hasName("B")))))));
  407. }
  408. TEST(FriendDecl, FriendTemplateFunctionLocation) {
  409. LocationVerifier<FriendDecl> Verifier;
  410. Verifier.expectLocation(3, 13);
  411. EXPECT_TRUE(Verifier.match("struct A {\n"
  412. "template <typename T>\n"
  413. "friend void f();\n"
  414. "};\n",
  415. friendDecl()));
  416. }
  417. TEST(FriendDecl, FriendTemplateFunctionRange) {
  418. RangeVerifier<FriendDecl> Verifier;
  419. Verifier.expectRange(2, 1, 3, 15);
  420. EXPECT_TRUE(Verifier.match("struct A {\n"
  421. "template <typename T>\n"
  422. "friend void f();\n"
  423. "};\n",
  424. friendDecl()));
  425. }
  426. TEST(FriendDecl, FriendTemplateClassLocation) {
  427. LocationVerifier<FriendDecl> Verifier;
  428. Verifier.expectLocation(3, 14);
  429. EXPECT_TRUE(Verifier.match("struct A {\n"
  430. "template <typename T>\n"
  431. "friend class B;\n"
  432. "};\n",
  433. friendDecl()));
  434. }
  435. TEST(FriendDecl, FriendTemplateClassRange) {
  436. RangeVerifier<FriendDecl> Verifier;
  437. Verifier.expectRange(2, 1, 3, 14);
  438. EXPECT_TRUE(Verifier.match("struct A {\n"
  439. "template <typename T>\n"
  440. "friend class B;\n"
  441. "};\n",
  442. friendDecl()));
  443. }
  444. TEST(FriendDecl, FriendInlineFunctionLocation) {
  445. LocationVerifier<FriendDecl> Verifier;
  446. Verifier.expectLocation(2, 19);
  447. EXPECT_TRUE(Verifier.match("struct A {\n"
  448. "int inline friend f() { return 0; }"
  449. "};\n",
  450. friendDecl()));
  451. }
  452. TEST(FriendDecl, FriendInlineFunctionRange) {
  453. RangeVerifier<FriendDecl> Verifier;
  454. Verifier.expectRange(2, 1, 2, 35);
  455. EXPECT_TRUE(Verifier.match("struct A {\n"
  456. "int inline friend f() { return 0; }"
  457. "};\n",
  458. friendDecl(), Lang_CXX11));
  459. }
  460. TEST(FriendDecl, InstantiationSourceRange) {
  461. RangeVerifier<FriendDecl> Verifier;
  462. Verifier.expectRange(4, 3, 4, 35);
  463. EXPECT_TRUE(Verifier.match(
  464. "template <typename T> class S;\n"
  465. "template<class T> void operator+(S<T> x);\n"
  466. "template<class T> struct S {\n"
  467. " friend void operator+<>(S<T> src);\n"
  468. "};\n"
  469. "void test(S<double> s) { +s; }",
  470. friendDecl(hasParent(recordDecl(isTemplateInstantiation())))));
  471. }
  472. TEST(ObjCMessageExpr, CXXConstructExprRange) {
  473. RangeVerifier<CXXConstructExpr> Verifier;
  474. Verifier.expectRange(5, 25, 5, 27);
  475. EXPECT_TRUE(Verifier.match(
  476. "struct A { int a; };\n"
  477. "@interface B {}\n"
  478. "+ (void) f1: (A)arg;\n"
  479. "@end\n"
  480. "void f2() { A a; [B f1: (a)]; }\n",
  481. constructExpr(), Lang_OBJCXX));
  482. }
  483. } // end namespace ast_matchers
  484. } // end namespace clang