SourceLocationTest.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  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 "clang/ASTMatchers/ASTMatchFinder.h"
  20. #include "clang/ASTMatchers/ASTMatchers.h"
  21. #include "clang/Tooling/Tooling.h"
  22. #include "gtest/gtest.h"
  23. #include "MatchVerifier.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. virtual SourceRange getRange(const LabelStmt &Node) {
  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. TEST(VarDecl, VMTypeFixedVarDeclRange) {
  96. RangeVerifier<VarDecl> Verifier;
  97. Verifier.expectRange(1, 1, 1, 23);
  98. EXPECT_TRUE(Verifier.match("int a[(int)(void*)1234];",
  99. varDecl(), Lang_C89));
  100. }
  101. TEST(CXXConstructorDecl, NoRetFunTypeLocRange) {
  102. RangeVerifier<CXXConstructorDecl> Verifier;
  103. Verifier.expectRange(1, 11, 1, 13);
  104. EXPECT_TRUE(Verifier.match("class C { C(); };", functionDecl()));
  105. }
  106. TEST(CompoundLiteralExpr, CompoundVectorLiteralRange) {
  107. RangeVerifier<CompoundLiteralExpr> Verifier;
  108. Verifier.expectRange(2, 11, 2, 22);
  109. EXPECT_TRUE(Verifier.match(
  110. "typedef int int2 __attribute__((ext_vector_type(2)));\n"
  111. "int2 i2 = (int2){1, 2};", compoundLiteralExpr()));
  112. }
  113. TEST(CompoundLiteralExpr, ParensCompoundVectorLiteralRange) {
  114. RangeVerifier<CompoundLiteralExpr> Verifier;
  115. Verifier.expectRange(2, 20, 2, 31);
  116. EXPECT_TRUE(Verifier.match(
  117. "typedef int int2 __attribute__((ext_vector_type(2)));\n"
  118. "constant int2 i2 = (int2)(1, 2);",
  119. compoundLiteralExpr(), Lang_OpenCL));
  120. }
  121. TEST(InitListExpr, VectorLiteralListBraceRange) {
  122. RangeVerifier<InitListExpr> Verifier;
  123. Verifier.expectRange(2, 17, 2, 22);
  124. EXPECT_TRUE(Verifier.match(
  125. "typedef int int2 __attribute__((ext_vector_type(2)));\n"
  126. "int2 i2 = (int2){1, 2};", initListExpr()));
  127. }
  128. TEST(InitListExpr, VectorLiteralInitListParens) {
  129. RangeVerifier<InitListExpr> Verifier;
  130. Verifier.expectRange(2, 26, 2, 31);
  131. EXPECT_TRUE(Verifier.match(
  132. "typedef int int2 __attribute__((ext_vector_type(2)));\n"
  133. "constant int2 i2 = (int2)(1, 2);", initListExpr(), Lang_OpenCL));
  134. }
  135. class TemplateAngleBracketLocRangeVerifier : public RangeVerifier<TypeLoc> {
  136. protected:
  137. virtual SourceRange getRange(const TypeLoc &Node) {
  138. TemplateSpecializationTypeLoc T =
  139. Node.getUnqualifiedLoc().castAs<TemplateSpecializationTypeLoc>();
  140. assert(!T.isNull());
  141. return SourceRange(T.getLAngleLoc(), T.getRAngleLoc());
  142. }
  143. };
  144. TEST(TemplateSpecializationTypeLoc, AngleBracketLocations) {
  145. TemplateAngleBracketLocRangeVerifier Verifier;
  146. Verifier.expectRange(2, 8, 2, 10);
  147. EXPECT_TRUE(Verifier.match(
  148. "template<typename T> struct A {}; struct B{}; void f(\n"
  149. "const A<B>&);",
  150. loc(templateSpecializationType())));
  151. }
  152. TEST(CXXNewExpr, TypeParenRange) {
  153. RangeVerifier<CXXNewExpr> Verifier;
  154. Verifier.expectRange(1, 10, 1, 18);
  155. EXPECT_TRUE(Verifier.match("int* a = new (int);", newExpr()));
  156. }
  157. class UnaryTransformTypeLocParensRangeVerifier : public RangeVerifier<TypeLoc> {
  158. protected:
  159. virtual SourceRange getRange(const TypeLoc &Node) {
  160. UnaryTransformTypeLoc T =
  161. Node.getUnqualifiedLoc().castAs<UnaryTransformTypeLoc>();
  162. assert(!T.isNull());
  163. return SourceRange(T.getLParenLoc(), T.getRParenLoc());
  164. }
  165. };
  166. TEST(UnaryTransformTypeLoc, ParensRange) {
  167. UnaryTransformTypeLocParensRangeVerifier Verifier;
  168. Verifier.expectRange(3, 26, 3, 28);
  169. EXPECT_TRUE(Verifier.match(
  170. "template <typename T>\n"
  171. "struct S {\n"
  172. "typedef __underlying_type(T) type;\n"
  173. "};",
  174. loc(unaryTransformType())));
  175. }
  176. TEST(CXXFunctionalCastExpr, SourceRange) {
  177. RangeVerifier<CXXFunctionalCastExpr> Verifier;
  178. Verifier.expectRange(2, 10, 2, 14);
  179. EXPECT_TRUE(Verifier.match(
  180. "int foo() {\n"
  181. " return int{};\n"
  182. "}",
  183. functionalCastExpr(), Lang_CXX11));
  184. }
  185. TEST(CXXUnresolvedConstructExpr, SourceRange) {
  186. RangeVerifier<CXXUnresolvedConstructExpr> Verifier;
  187. Verifier.expectRange(3, 10, 3, 12);
  188. std::vector<std::string> Args;
  189. Args.push_back("-fno-delayed-template-parsing");
  190. EXPECT_TRUE(Verifier.match(
  191. "template <typename U>\n"
  192. "U foo() {\n"
  193. " return U{};\n"
  194. "}",
  195. unresolvedConstructExpr(), Args, Lang_CXX11));
  196. }
  197. TEST(UsingDecl, SourceRange) {
  198. RangeVerifier<UsingDecl> Verifier;
  199. Verifier.expectRange(2, 22, 2, 25);
  200. EXPECT_TRUE(Verifier.match(
  201. "class B { protected: int i; };\n"
  202. "class D : public B { B::i; };",
  203. usingDecl()));
  204. }
  205. TEST(UnresolvedUsingValueDecl, SourceRange) {
  206. RangeVerifier<UnresolvedUsingValueDecl> Verifier;
  207. Verifier.expectRange(3, 3, 3, 6);
  208. EXPECT_TRUE(Verifier.match(
  209. "template <typename B>\n"
  210. "class D : public B {\n"
  211. " B::i;\n"
  212. "};",
  213. unresolvedUsingValueDecl()));
  214. }
  215. TEST(FriendDecl, InstantiationSourceRange) {
  216. RangeVerifier<FriendDecl> Verifier;
  217. Verifier.expectRange(4, 3, 4, 35);
  218. EXPECT_TRUE(Verifier.match(
  219. "template <typename T> class S;\n"
  220. "template<class T> void operator+(S<T> x);\n"
  221. "template<class T> struct S {\n"
  222. " friend void operator+<>(S<T> src);\n"
  223. "};\n"
  224. "void test(S<double> s) { +s; }",
  225. friendDecl(hasParent(recordDecl(isTemplateInstantiation())))));
  226. }
  227. } // end namespace ast_matchers
  228. } // end namespace clang