SourceLocationTest.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740
  1. //===- unittest/AST/SourceLocationTest.cpp - AST source loc unit tests ----===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file contains tests for SourceLocation and SourceRange fields
  10. // in AST nodes.
  11. //
  12. // FIXME: In the long-term, when we test more than source locations, we may
  13. // want to have a unit test file for an AST node (or group of related nodes),
  14. // rather than a unit test file for source locations for all AST nodes.
  15. //
  16. //===----------------------------------------------------------------------===//
  17. #include "clang/AST/ASTContext.h"
  18. #include "MatchVerifier.h"
  19. #include "clang/ASTMatchers/ASTMatchFinder.h"
  20. #include "clang/ASTMatchers/ASTMatchers.h"
  21. #include "clang/Tooling/Tooling.h"
  22. #include "gtest/gtest.h"
  23. namespace clang {
  24. namespace ast_matchers {
  25. // FIXME: Pull the *Verifier tests into their own test file.
  26. TEST(MatchVerifier, ParseError) {
  27. LocationVerifier<VarDecl> Verifier;
  28. Verifier.expectLocation(1, 1);
  29. EXPECT_FALSE(Verifier.match("int i", varDecl()));
  30. }
  31. TEST(MatchVerifier, NoMatch) {
  32. LocationVerifier<VarDecl> Verifier;
  33. Verifier.expectLocation(1, 1);
  34. EXPECT_FALSE(Verifier.match("int i;", recordDecl()));
  35. }
  36. TEST(MatchVerifier, WrongType) {
  37. LocationVerifier<RecordDecl> Verifier;
  38. Verifier.expectLocation(1, 1);
  39. EXPECT_FALSE(Verifier.match("int i;", varDecl()));
  40. }
  41. TEST(LocationVerifier, WrongLocation) {
  42. LocationVerifier<VarDecl> Verifier;
  43. Verifier.expectLocation(1, 1);
  44. EXPECT_FALSE(Verifier.match("int i;", varDecl()));
  45. }
  46. TEST(RangeVerifier, WrongRange) {
  47. RangeVerifier<VarDecl> Verifier;
  48. Verifier.expectRange(1, 1, 1, 1);
  49. EXPECT_FALSE(Verifier.match("int i;", varDecl()));
  50. }
  51. class LabelDeclRangeVerifier : public RangeVerifier<LabelStmt> {
  52. protected:
  53. SourceRange getRange(const LabelStmt &Node) override {
  54. return Node.getDecl()->getSourceRange();
  55. }
  56. };
  57. TEST(LabelDecl, Range) {
  58. LabelDeclRangeVerifier Verifier;
  59. Verifier.expectRange(1, 12, 1, 12);
  60. EXPECT_TRUE(Verifier.match("void f() { l: return; }", labelStmt()));
  61. }
  62. TEST(LabelStmt, Range) {
  63. RangeVerifier<LabelStmt> Verifier;
  64. Verifier.expectRange(1, 12, 1, 15);
  65. EXPECT_TRUE(Verifier.match("void f() { l: return; }", labelStmt()));
  66. }
  67. TEST(ParmVarDecl, KNRLocation) {
  68. LocationVerifier<ParmVarDecl> Verifier;
  69. Verifier.expectLocation(1, 8);
  70. EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C));
  71. }
  72. TEST(ParmVarDecl, KNRRange) {
  73. RangeVerifier<ParmVarDecl> Verifier;
  74. Verifier.expectRange(1, 8, 1, 8);
  75. EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C));
  76. }
  77. TEST(CXXNewExpr, ArrayRange) {
  78. RangeVerifier<CXXNewExpr> Verifier;
  79. Verifier.expectRange(1, 12, 1, 22);
  80. EXPECT_TRUE(Verifier.match("void f() { new int[10]; }", cxxNewExpr()));
  81. }
  82. TEST(CXXNewExpr, ParenRange) {
  83. RangeVerifier<CXXNewExpr> Verifier;
  84. Verifier.expectRange(1, 12, 1, 20);
  85. EXPECT_TRUE(Verifier.match("void f() { new int(); }", cxxNewExpr()));
  86. }
  87. TEST(MemberExpr, ImplicitMemberRange) {
  88. RangeVerifier<MemberExpr> Verifier;
  89. Verifier.expectRange(2, 30, 2, 30);
  90. EXPECT_TRUE(Verifier.match("struct S { operator int() const; };\n"
  91. "int foo(const S& s) { return s; }",
  92. memberExpr()));
  93. }
  94. class MemberExprArrowLocVerifier : public RangeVerifier<MemberExpr> {
  95. protected:
  96. SourceRange getRange(const MemberExpr &Node) override {
  97. return Node.getOperatorLoc();
  98. }
  99. };
  100. TEST(MemberExpr, ArrowRange) {
  101. MemberExprArrowLocVerifier Verifier;
  102. Verifier.expectRange(2, 19, 2, 19);
  103. EXPECT_TRUE(Verifier.match("struct S { int x; };\n"
  104. "void foo(S *s) { s->x = 0; }",
  105. memberExpr()));
  106. }
  107. TEST(MemberExpr, MacroArrowRange) {
  108. MemberExprArrowLocVerifier Verifier;
  109. Verifier.expectRange(1, 24, 1, 24);
  110. EXPECT_TRUE(Verifier.match("#define MEMBER(a, b) (a->b)\n"
  111. "struct S { int x; };\n"
  112. "void foo(S *s) { MEMBER(s, x) = 0; }",
  113. memberExpr()));
  114. }
  115. TEST(MemberExpr, ImplicitArrowRange) {
  116. MemberExprArrowLocVerifier Verifier;
  117. Verifier.expectRange(0, 0, 0, 0);
  118. EXPECT_TRUE(Verifier.match("struct S { int x; void Test(); };\n"
  119. "void S::Test() { x = 1; }",
  120. memberExpr()));
  121. }
  122. TEST(VarDecl, VMTypeFixedVarDeclRange) {
  123. RangeVerifier<VarDecl> Verifier;
  124. Verifier.expectRange(1, 1, 1, 23);
  125. EXPECT_TRUE(Verifier.match("int a[(int)(void*)1234];",
  126. varDecl(), Lang_C89));
  127. }
  128. TEST(TypeLoc, IntRange) {
  129. RangeVerifier<TypeLoc> Verifier;
  130. Verifier.expectRange(1, 1, 1, 1);
  131. EXPECT_TRUE(Verifier.match("int a;", typeLoc()));
  132. }
  133. TEST(TypeLoc, LongRange) {
  134. RangeVerifier<TypeLoc> Verifier;
  135. Verifier.expectRange(1, 1, 1, 1);
  136. EXPECT_TRUE(Verifier.match("long a;", typeLoc()));
  137. }
  138. TEST(TypeLoc, LongDoubleRange) {
  139. RangeVerifier<TypeLoc> Verifier;
  140. Verifier.expectRange(1, 1, 1, 6);
  141. EXPECT_TRUE(Verifier.match("long double a;", typeLoc()));
  142. }
  143. TEST(TypeLoc, DoubleLongRange) {
  144. RangeVerifier<TypeLoc> Verifier;
  145. Verifier.expectRange(1, 1, 1, 8);
  146. EXPECT_TRUE(Verifier.match("double long a;", typeLoc()));
  147. }
  148. TEST(TypeLoc, LongIntRange) {
  149. RangeVerifier<TypeLoc> Verifier;
  150. Verifier.expectRange(1, 1, 1, 6);
  151. EXPECT_TRUE(Verifier.match("long int a;", typeLoc()));
  152. }
  153. TEST(TypeLoc, IntLongRange) {
  154. RangeVerifier<TypeLoc> Verifier;
  155. Verifier.expectRange(1, 1, 1, 5);
  156. EXPECT_TRUE(Verifier.match("int long a;", typeLoc()));
  157. }
  158. TEST(TypeLoc, UnsignedIntRange) {
  159. RangeVerifier<TypeLoc> Verifier;
  160. Verifier.expectRange(1, 1, 1, 10);
  161. EXPECT_TRUE(Verifier.match("unsigned int a;", typeLoc()));
  162. }
  163. TEST(TypeLoc, IntUnsignedRange) {
  164. RangeVerifier<TypeLoc> Verifier;
  165. Verifier.expectRange(1, 1, 1, 5);
  166. EXPECT_TRUE(Verifier.match("int unsigned a;", typeLoc()));
  167. }
  168. TEST(TypeLoc, LongLongRange) {
  169. RangeVerifier<TypeLoc> Verifier;
  170. Verifier.expectRange(1, 1, 1, 6);
  171. EXPECT_TRUE(Verifier.match("long long a;", typeLoc()));
  172. }
  173. TEST(TypeLoc, UnsignedLongLongRange) {
  174. RangeVerifier<TypeLoc> Verifier;
  175. Verifier.expectRange(1, 1, 1, 15);
  176. EXPECT_TRUE(Verifier.match("unsigned long long a;", typeLoc()));
  177. }
  178. TEST(TypeLoc, LongUnsignedLongRange) {
  179. RangeVerifier<TypeLoc> Verifier;
  180. Verifier.expectRange(1, 1, 1, 15);
  181. EXPECT_TRUE(Verifier.match("long unsigned long a;", typeLoc()));
  182. }
  183. TEST(TypeLoc, LongLongUnsignedRange) {
  184. RangeVerifier<TypeLoc> Verifier;
  185. Verifier.expectRange(1, 1, 1, 11);
  186. EXPECT_TRUE(Verifier.match("long long unsigned a;", typeLoc()));
  187. }
  188. TEST(TypeLoc, ConstLongLongRange) {
  189. RangeVerifier<TypeLoc> Verifier;
  190. Verifier.expectRange(1, 7, 1, 12);
  191. EXPECT_TRUE(Verifier.match("const long long a = 0;", typeLoc()));
  192. }
  193. TEST(TypeLoc, LongConstLongRange) {
  194. RangeVerifier<TypeLoc> Verifier;
  195. Verifier.expectRange(1, 1, 1, 12);
  196. EXPECT_TRUE(Verifier.match("long const long a = 0;", typeLoc()));
  197. }
  198. TEST(TypeLoc, LongLongConstRange) {
  199. RangeVerifier<TypeLoc> Verifier;
  200. Verifier.expectRange(1, 1, 1, 6);
  201. EXPECT_TRUE(Verifier.match("long long const a = 0;", typeLoc()));
  202. }
  203. TEST(CXXConstructorDecl, NoRetFunTypeLocRange) {
  204. RangeVerifier<CXXConstructorDecl> Verifier;
  205. Verifier.expectRange(1, 11, 1, 13);
  206. EXPECT_TRUE(Verifier.match("class C { C(); };", functionDecl()));
  207. }
  208. TEST(CXXConstructorDecl, DefaultedCtorLocRange) {
  209. RangeVerifier<CXXConstructorDecl> Verifier;
  210. Verifier.expectRange(1, 11, 1, 23);
  211. EXPECT_TRUE(Verifier.match("class C { C() = default; };", functionDecl()));
  212. }
  213. TEST(CXXConstructorDecl, DeletedCtorLocRange) {
  214. RangeVerifier<CXXConstructorDecl> Verifier;
  215. Verifier.expectRange(1, 11, 1, 22);
  216. EXPECT_TRUE(Verifier.match("class C { C() = delete; };", functionDecl()));
  217. }
  218. TEST(CompoundLiteralExpr, CompoundVectorLiteralRange) {
  219. RangeVerifier<CompoundLiteralExpr> Verifier;
  220. Verifier.expectRange(2, 11, 2, 22);
  221. EXPECT_TRUE(Verifier.match(
  222. "typedef int int2 __attribute__((ext_vector_type(2)));\n"
  223. "int2 i2 = (int2){1, 2};", compoundLiteralExpr()));
  224. }
  225. TEST(CompoundLiteralExpr, ParensCompoundVectorLiteralRange) {
  226. RangeVerifier<CompoundLiteralExpr> Verifier;
  227. Verifier.expectRange(2, 20, 2, 31);
  228. EXPECT_TRUE(Verifier.match(
  229. "typedef int int2 __attribute__((ext_vector_type(2)));\n"
  230. "constant int2 i2 = (int2)(1, 2);",
  231. compoundLiteralExpr(), Lang_OpenCL));
  232. }
  233. TEST(InitListExpr, VectorLiteralListBraceRange) {
  234. RangeVerifier<InitListExpr> Verifier;
  235. Verifier.expectRange(2, 17, 2, 22);
  236. EXPECT_TRUE(Verifier.match(
  237. "typedef int int2 __attribute__((ext_vector_type(2)));\n"
  238. "int2 i2 = (int2){1, 2};", initListExpr()));
  239. }
  240. TEST(InitListExpr, VectorLiteralInitListParens) {
  241. RangeVerifier<InitListExpr> Verifier;
  242. Verifier.expectRange(2, 26, 2, 31);
  243. EXPECT_TRUE(Verifier.match(
  244. "typedef int int2 __attribute__((ext_vector_type(2)));\n"
  245. "constant int2 i2 = (int2)(1, 2);", initListExpr(), Lang_OpenCL));
  246. }
  247. class TemplateAngleBracketLocRangeVerifier : public RangeVerifier<TypeLoc> {
  248. protected:
  249. SourceRange getRange(const TypeLoc &Node) override {
  250. TemplateSpecializationTypeLoc T =
  251. Node.getUnqualifiedLoc().castAs<TemplateSpecializationTypeLoc>();
  252. assert(!T.isNull());
  253. return SourceRange(T.getLAngleLoc(), T.getRAngleLoc());
  254. }
  255. };
  256. TEST(TemplateSpecializationTypeLoc, AngleBracketLocations) {
  257. TemplateAngleBracketLocRangeVerifier Verifier;
  258. Verifier.expectRange(2, 8, 2, 10);
  259. EXPECT_TRUE(Verifier.match(
  260. "template<typename T> struct A {}; struct B{}; void f(\n"
  261. "const A<B>&);",
  262. loc(templateSpecializationType())));
  263. }
  264. TEST(CXXNewExpr, TypeParenRange) {
  265. RangeVerifier<CXXNewExpr> Verifier;
  266. Verifier.expectRange(1, 10, 1, 18);
  267. EXPECT_TRUE(Verifier.match("int* a = new (int);", cxxNewExpr()));
  268. }
  269. class UnaryTransformTypeLocParensRangeVerifier : public RangeVerifier<TypeLoc> {
  270. protected:
  271. SourceRange getRange(const TypeLoc &Node) override {
  272. UnaryTransformTypeLoc T =
  273. Node.getUnqualifiedLoc().castAs<UnaryTransformTypeLoc>();
  274. assert(!T.isNull());
  275. return SourceRange(T.getLParenLoc(), T.getRParenLoc());
  276. }
  277. };
  278. TEST(UnaryTransformTypeLoc, ParensRange) {
  279. UnaryTransformTypeLocParensRangeVerifier Verifier;
  280. Verifier.expectRange(3, 26, 3, 28);
  281. EXPECT_TRUE(Verifier.match(
  282. "template <typename T>\n"
  283. "struct S {\n"
  284. "typedef __underlying_type(T) type;\n"
  285. "};",
  286. loc(unaryTransformType())));
  287. }
  288. TEST(CXXFunctionalCastExpr, SourceRange) {
  289. RangeVerifier<CXXFunctionalCastExpr> Verifier;
  290. Verifier.expectRange(2, 10, 2, 14);
  291. EXPECT_TRUE(Verifier.match(
  292. "int foo() {\n"
  293. " return int{};\n"
  294. "}",
  295. cxxFunctionalCastExpr(), Lang_CXX11));
  296. }
  297. TEST(CXXConstructExpr, SourceRange) {
  298. RangeVerifier<CXXConstructExpr> Verifier;
  299. Verifier.expectRange(3, 14, 3, 19);
  300. EXPECT_TRUE(Verifier.match(
  301. "struct A { A(int, int); };\n"
  302. "void f(A a);\n"
  303. "void g() { f({0, 0}); }",
  304. cxxConstructExpr(), Lang_CXX11));
  305. }
  306. TEST(CXXTemporaryObjectExpr, SourceRange) {
  307. RangeVerifier<CXXTemporaryObjectExpr> Verifier;
  308. Verifier.expectRange(2, 6, 2, 12);
  309. EXPECT_TRUE(Verifier.match(
  310. "struct A { A(int, int); };\n"
  311. "A a( A{0, 0} );",
  312. cxxTemporaryObjectExpr(), Lang_CXX11));
  313. }
  314. TEST(CXXUnresolvedConstructExpr, SourceRange) {
  315. RangeVerifier<CXXUnresolvedConstructExpr> Verifier;
  316. Verifier.expectRange(3, 10, 3, 12);
  317. std::vector<std::string> Args;
  318. Args.push_back("-fno-delayed-template-parsing");
  319. EXPECT_TRUE(Verifier.match(
  320. "template <typename U>\n"
  321. "U foo() {\n"
  322. " return U{};\n"
  323. "}",
  324. cxxUnresolvedConstructExpr(), Args, Lang_CXX11));
  325. }
  326. TEST(UsingDecl, SourceRange) {
  327. RangeVerifier<UsingDecl> Verifier;
  328. Verifier.expectRange(2, 22, 2, 25);
  329. EXPECT_TRUE(Verifier.match(
  330. "class B { protected: int i; };\n"
  331. "class D : public B { B::i; };",
  332. usingDecl()));
  333. }
  334. TEST(UnresolvedUsingValueDecl, SourceRange) {
  335. RangeVerifier<UnresolvedUsingValueDecl> Verifier;
  336. Verifier.expectRange(3, 3, 3, 6);
  337. EXPECT_TRUE(Verifier.match(
  338. "template <typename B>\n"
  339. "class D : public B {\n"
  340. " B::i;\n"
  341. "};",
  342. unresolvedUsingValueDecl()));
  343. }
  344. TEST(FriendDecl, FriendNonMemberFunctionLocation) {
  345. LocationVerifier<FriendDecl> Verifier;
  346. Verifier.expectLocation(2, 13);
  347. EXPECT_TRUE(Verifier.match("struct A {\n"
  348. "friend void f();\n"
  349. "};\n",
  350. friendDecl()));
  351. }
  352. TEST(FriendDecl, FriendNonMemberFunctionRange) {
  353. RangeVerifier<FriendDecl> Verifier;
  354. Verifier.expectRange(2, 1, 2, 15);
  355. EXPECT_TRUE(Verifier.match("struct A {\n"
  356. "friend void f();\n"
  357. "};\n",
  358. friendDecl()));
  359. }
  360. TEST(FriendDecl, FriendNonMemberFunctionDefinitionLocation) {
  361. LocationVerifier<FriendDecl> Verifier;
  362. Verifier.expectLocation(2, 12);
  363. EXPECT_TRUE(Verifier.match("struct A {\n"
  364. "friend int f() { return 0; }\n"
  365. "};\n",
  366. friendDecl()));
  367. }
  368. TEST(FriendDecl, FriendNonMemberFunctionDefinitionRange) {
  369. RangeVerifier<FriendDecl> Verifier;
  370. Verifier.expectRange(2, 1, 2, 28);
  371. EXPECT_TRUE(Verifier.match("struct A {\n"
  372. "friend int f() { return 0; }\n"
  373. "};\n",
  374. friendDecl()));
  375. }
  376. TEST(FriendDecl, FriendElaboratedTypeLocation) {
  377. LocationVerifier<FriendDecl> Verifier;
  378. Verifier.expectLocation(2, 8);
  379. EXPECT_TRUE(Verifier.match("struct A {\n"
  380. "friend class B;\n"
  381. "};\n",
  382. friendDecl()));
  383. }
  384. TEST(FriendDecl, FriendElaboratedTypeRange) {
  385. RangeVerifier<FriendDecl> Verifier;
  386. Verifier.expectRange(2, 1, 2, 14);
  387. EXPECT_TRUE(Verifier.match("struct A {\n"
  388. "friend class B;\n"
  389. "};\n",
  390. friendDecl()));
  391. }
  392. TEST(FriendDecl, FriendSimpleTypeLocation) {
  393. LocationVerifier<FriendDecl> Verifier;
  394. Verifier.expectLocation(3, 8);
  395. EXPECT_TRUE(Verifier.match("class B;\n"
  396. "struct A {\n"
  397. "friend B;\n"
  398. "};\n",
  399. friendDecl(), Lang_CXX11));
  400. }
  401. TEST(FriendDecl, FriendSimpleTypeRange) {
  402. RangeVerifier<FriendDecl> Verifier;
  403. Verifier.expectRange(3, 1, 3, 8);
  404. EXPECT_TRUE(Verifier.match("class B;\n"
  405. "struct A {\n"
  406. "friend B;\n"
  407. "};\n",
  408. friendDecl(), Lang_CXX11));
  409. }
  410. TEST(FriendDecl, FriendTemplateParameterLocation) {
  411. LocationVerifier<FriendDecl> Verifier;
  412. Verifier.expectLocation(3, 8);
  413. EXPECT_TRUE(Verifier.match("template <typename T>\n"
  414. "struct A {\n"
  415. "friend T;\n"
  416. "};\n",
  417. friendDecl(), Lang_CXX11));
  418. }
  419. TEST(FriendDecl, FriendTemplateParameterRange) {
  420. RangeVerifier<FriendDecl> Verifier;
  421. Verifier.expectRange(3, 1, 3, 8);
  422. EXPECT_TRUE(Verifier.match("template <typename T>\n"
  423. "struct A {\n"
  424. "friend T;\n"
  425. "};\n",
  426. friendDecl(), Lang_CXX11));
  427. }
  428. TEST(FriendDecl, FriendDecltypeLocation) {
  429. LocationVerifier<FriendDecl> Verifier;
  430. Verifier.expectLocation(4, 8);
  431. EXPECT_TRUE(Verifier.match("struct A;\n"
  432. "A foo();\n"
  433. "struct A {\n"
  434. "friend decltype(foo());\n"
  435. "};\n",
  436. friendDecl(), Lang_CXX11));
  437. }
  438. TEST(FriendDecl, FriendDecltypeRange) {
  439. RangeVerifier<FriendDecl> Verifier;
  440. Verifier.expectRange(4, 1, 4, 8);
  441. EXPECT_TRUE(Verifier.match("struct A;\n"
  442. "A foo();\n"
  443. "struct A {\n"
  444. "friend decltype(foo());\n"
  445. "};\n",
  446. friendDecl(), Lang_CXX11));
  447. }
  448. TEST(FriendDecl, FriendConstructorDestructorLocation) {
  449. const std::string Code = "struct B {\n"
  450. "B();\n"
  451. "~B();\n"
  452. "};\n"
  453. "struct A {\n"
  454. "friend B::B(), B::~B();\n"
  455. "};\n";
  456. LocationVerifier<FriendDecl> ConstructorVerifier;
  457. ConstructorVerifier.expectLocation(6, 11);
  458. EXPECT_TRUE(ConstructorVerifier.match(
  459. Code, friendDecl(has(cxxConstructorDecl(ofClass(hasName("B")))))));
  460. LocationVerifier<FriendDecl> DestructorVerifier;
  461. DestructorVerifier.expectLocation(6, 19);
  462. EXPECT_TRUE(DestructorVerifier.match(
  463. Code, friendDecl(has(cxxDestructorDecl(ofClass(hasName("B")))))));
  464. }
  465. TEST(FriendDecl, FriendConstructorDestructorRange) {
  466. const std::string Code = "struct B {\n"
  467. "B();\n"
  468. "~B();\n"
  469. "};\n"
  470. "struct A {\n"
  471. "friend B::B(), B::~B();\n"
  472. "};\n";
  473. RangeVerifier<FriendDecl> ConstructorVerifier;
  474. ConstructorVerifier.expectRange(6, 1, 6, 13);
  475. EXPECT_TRUE(ConstructorVerifier.match(
  476. Code, friendDecl(has(cxxConstructorDecl(ofClass(hasName("B")))))));
  477. RangeVerifier<FriendDecl> DestructorVerifier;
  478. DestructorVerifier.expectRange(6, 1, 6, 22);
  479. EXPECT_TRUE(DestructorVerifier.match(
  480. Code, friendDecl(has(cxxDestructorDecl(ofClass(hasName("B")))))));
  481. }
  482. TEST(FriendDecl, FriendTemplateFunctionLocation) {
  483. LocationVerifier<FriendDecl> Verifier;
  484. Verifier.expectLocation(3, 13);
  485. EXPECT_TRUE(Verifier.match("struct A {\n"
  486. "template <typename T>\n"
  487. "friend void f();\n"
  488. "};\n",
  489. friendDecl()));
  490. }
  491. TEST(FriendDecl, FriendTemplateFunctionRange) {
  492. RangeVerifier<FriendDecl> Verifier;
  493. Verifier.expectRange(2, 1, 3, 15);
  494. EXPECT_TRUE(Verifier.match("struct A {\n"
  495. "template <typename T>\n"
  496. "friend void f();\n"
  497. "};\n",
  498. friendDecl()));
  499. }
  500. TEST(FriendDecl, FriendTemplateClassLocation) {
  501. LocationVerifier<FriendDecl> Verifier;
  502. Verifier.expectLocation(3, 14);
  503. EXPECT_TRUE(Verifier.match("struct A {\n"
  504. "template <typename T>\n"
  505. "friend class B;\n"
  506. "};\n",
  507. friendDecl()));
  508. }
  509. TEST(FriendDecl, FriendTemplateClassRange) {
  510. RangeVerifier<FriendDecl> Verifier;
  511. Verifier.expectRange(2, 1, 3, 14);
  512. EXPECT_TRUE(Verifier.match("struct A {\n"
  513. "template <typename T>\n"
  514. "friend class B;\n"
  515. "};\n",
  516. friendDecl()));
  517. }
  518. TEST(FriendDecl, FriendInlineFunctionLocation) {
  519. LocationVerifier<FriendDecl> Verifier;
  520. Verifier.expectLocation(2, 19);
  521. EXPECT_TRUE(Verifier.match("struct A {\n"
  522. "int inline friend f() { return 0; }"
  523. "};\n",
  524. friendDecl()));
  525. }
  526. TEST(FriendDecl, FriendInlineFunctionRange) {
  527. RangeVerifier<FriendDecl> Verifier;
  528. Verifier.expectRange(2, 1, 2, 35);
  529. EXPECT_TRUE(Verifier.match("struct A {\n"
  530. "int inline friend f() { return 0; }"
  531. "};\n",
  532. friendDecl(), Lang_CXX11));
  533. }
  534. TEST(FriendDecl, InstantiationSourceRange) {
  535. RangeVerifier<FriendDecl> Verifier;
  536. Verifier.expectRange(4, 3, 4, 35);
  537. EXPECT_TRUE(Verifier.match(
  538. "template <typename T> class S;\n"
  539. "template<class T> void operator+(S<T> x);\n"
  540. "template<class T> struct S {\n"
  541. " friend void operator+<>(S<T> src);\n"
  542. "};\n"
  543. "void test(S<double> s) { +s; }",
  544. friendDecl(hasParent(cxxRecordDecl(isTemplateInstantiation())))));
  545. }
  546. TEST(ObjCMessageExpr, CXXConstructExprRange) {
  547. RangeVerifier<CXXConstructExpr> Verifier;
  548. Verifier.expectRange(5, 25, 5, 27);
  549. EXPECT_TRUE(Verifier.match(
  550. "struct A { int a; };\n"
  551. "@interface B {}\n"
  552. "+ (void) f1: (A)arg;\n"
  553. "@end\n"
  554. "void f2() { A a; [B f1: (a)]; }\n",
  555. cxxConstructExpr(), Lang_OBJCXX));
  556. }
  557. TEST(FunctionDecl, FunctionDeclWithThrowSpecification) {
  558. RangeVerifier<FunctionDecl> Verifier;
  559. Verifier.expectRange(1, 1, 1, 16);
  560. EXPECT_TRUE(Verifier.match(
  561. "void f() throw();\n",
  562. functionDecl()));
  563. }
  564. TEST(FunctionDecl, FunctionDeclWithNoExceptSpecification) {
  565. RangeVerifier<FunctionDecl> Verifier;
  566. Verifier.expectRange(1, 1, 1, 24);
  567. EXPECT_TRUE(Verifier.match(
  568. "void f() noexcept(false);\n",
  569. functionDecl(),
  570. Language::Lang_CXX11));
  571. }
  572. TEST(CXXMethodDecl, CXXMethodDeclWithThrowSpecification) {
  573. RangeVerifier<FunctionDecl> Verifier;
  574. Verifier.expectRange(2, 1, 2, 16);
  575. EXPECT_TRUE(Verifier.match(
  576. "class A {\n"
  577. "void f() throw();\n"
  578. "};\n",
  579. functionDecl()));
  580. }
  581. TEST(CXXMethodDecl, CXXMethodDeclWithNoExceptSpecification) {
  582. RangeVerifier<FunctionDecl> Verifier;
  583. Verifier.expectRange(2, 1, 2, 24);
  584. EXPECT_TRUE(Verifier.match(
  585. "class A {\n"
  586. "void f() noexcept(false);\n"
  587. "};\n",
  588. functionDecl(),
  589. Language::Lang_CXX11));
  590. }
  591. class ExceptionSpecRangeVerifier : public RangeVerifier<TypeLoc> {
  592. protected:
  593. SourceRange getRange(const TypeLoc &Node) override {
  594. auto T =
  595. Node.getUnqualifiedLoc().castAs<FunctionProtoTypeLoc>();
  596. assert(!T.isNull());
  597. return T.getExceptionSpecRange();
  598. }
  599. };
  600. class ParmVarExceptionSpecRangeVerifier : public RangeVerifier<ParmVarDecl> {
  601. protected:
  602. SourceRange getRange(const ParmVarDecl &Node) override {
  603. if (const TypeSourceInfo *TSI = Node.getTypeSourceInfo()) {
  604. TypeLoc TL = TSI->getTypeLoc();
  605. if (TL.getType()->isPointerType()) {
  606. TL = TL.getNextTypeLoc().IgnoreParens();
  607. if (auto FPTL = TL.getAs<FunctionProtoTypeLoc>()) {
  608. return FPTL.getExceptionSpecRange();
  609. }
  610. }
  611. }
  612. return SourceRange();
  613. }
  614. };
  615. TEST(FunctionDecl, ExceptionSpecifications) {
  616. ExceptionSpecRangeVerifier Verifier;
  617. Verifier.expectRange(1, 10, 1, 16);
  618. EXPECT_TRUE(Verifier.match("void f() throw();\n", loc(functionType())));
  619. Verifier.expectRange(1, 10, 1, 34);
  620. EXPECT_TRUE(Verifier.match("void f() throw(void(void) throw());\n",
  621. loc(functionType())));
  622. Verifier.expectRange(1, 10, 1, 19);
  623. std::vector<std::string> Args;
  624. Args.push_back("-fms-extensions");
  625. EXPECT_TRUE(Verifier.match("void f() throw(...);\n", loc(functionType()),
  626. Args, Language::Lang_CXX));
  627. Verifier.expectRange(1, 10, 1, 10);
  628. EXPECT_TRUE(Verifier.match("void f() noexcept;\n", loc(functionType()),
  629. Language::Lang_CXX11));
  630. Verifier.expectRange(1, 10, 1, 24);
  631. EXPECT_TRUE(Verifier.match("void f() noexcept(false);\n", loc(functionType()),
  632. Language::Lang_CXX11));
  633. Verifier.expectRange(1, 10, 1, 32);
  634. EXPECT_TRUE(Verifier.match("void f() noexcept(noexcept(1+1));\n",
  635. loc(functionType()), Language::Lang_CXX11));
  636. ParmVarExceptionSpecRangeVerifier Verifier2;
  637. Verifier2.expectRange(1, 25, 1, 31);
  638. EXPECT_TRUE(Verifier2.match("void g(void (*fp)(void) throw());\n",
  639. parmVarDecl(hasType(pointerType(pointee(
  640. parenType(innerType(functionType()))))))));
  641. Verifier2.expectRange(1, 25, 1, 38);
  642. EXPECT_TRUE(Verifier2.match("void g(void (*fp)(void) noexcept(true));\n",
  643. parmVarDecl(hasType(pointerType(pointee(
  644. parenType(innerType(functionType())))))),
  645. Language::Lang_CXX11));
  646. }
  647. } // end namespace ast_matchers
  648. } // end namespace clang