Home | History | Annotate | Download | only in AST
      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 
     19 #include "clang/AST/ASTContext.h"
     20 #include "MatchVerifier.h"
     21 #include "clang/ASTMatchers/ASTMatchFinder.h"
     22 #include "clang/ASTMatchers/ASTMatchers.h"
     23 #include "clang/Tooling/Tooling.h"
     24 #include "gtest/gtest.h"
     25 
     26 namespace clang {
     27 namespace ast_matchers {
     28 
     29 // FIXME: Pull the *Verifier tests into their own test file.
     30 
     31 TEST(MatchVerifier, ParseError) {
     32   LocationVerifier<VarDecl> Verifier;
     33   Verifier.expectLocation(1, 1);
     34   EXPECT_FALSE(Verifier.match("int i", varDecl()));
     35 }
     36 
     37 TEST(MatchVerifier, NoMatch) {
     38   LocationVerifier<VarDecl> Verifier;
     39   Verifier.expectLocation(1, 1);
     40   EXPECT_FALSE(Verifier.match("int i;", recordDecl()));
     41 }
     42 
     43 TEST(MatchVerifier, WrongType) {
     44   LocationVerifier<RecordDecl> Verifier;
     45   Verifier.expectLocation(1, 1);
     46   EXPECT_FALSE(Verifier.match("int i;", varDecl()));
     47 }
     48 
     49 TEST(LocationVerifier, WrongLocation) {
     50   LocationVerifier<VarDecl> Verifier;
     51   Verifier.expectLocation(1, 1);
     52   EXPECT_FALSE(Verifier.match("int i;", varDecl()));
     53 }
     54 
     55 TEST(RangeVerifier, WrongRange) {
     56   RangeVerifier<VarDecl> Verifier;
     57   Verifier.expectRange(1, 1, 1, 1);
     58   EXPECT_FALSE(Verifier.match("int i;", varDecl()));
     59 }
     60 
     61 class LabelDeclRangeVerifier : public RangeVerifier<LabelStmt> {
     62 protected:
     63   virtual SourceRange getRange(const LabelStmt &Node) {
     64     return Node.getDecl()->getSourceRange();
     65   }
     66 };
     67 
     68 TEST(LabelDecl, Range) {
     69   LabelDeclRangeVerifier Verifier;
     70   Verifier.expectRange(1, 12, 1, 12);
     71   EXPECT_TRUE(Verifier.match("void f() { l: return; }", labelStmt()));
     72 }
     73 
     74 TEST(LabelStmt, Range) {
     75   RangeVerifier<LabelStmt> Verifier;
     76   Verifier.expectRange(1, 12, 1, 15);
     77   EXPECT_TRUE(Verifier.match("void f() { l: return; }", labelStmt()));
     78 }
     79 
     80 TEST(ParmVarDecl, KNRLocation) {
     81   LocationVerifier<ParmVarDecl> Verifier;
     82   Verifier.expectLocation(1, 8);
     83   EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C));
     84 }
     85 
     86 TEST(ParmVarDecl, KNRRange) {
     87   RangeVerifier<ParmVarDecl> Verifier;
     88   Verifier.expectRange(1, 8, 1, 8);
     89   EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C));
     90 }
     91 
     92 TEST(CXXNewExpr, ArrayRange) {
     93   RangeVerifier<CXXNewExpr> Verifier;
     94   Verifier.expectRange(1, 12, 1, 22);
     95   EXPECT_TRUE(Verifier.match("void f() { new int[10]; }", newExpr()));
     96 }
     97 
     98 TEST(CXXNewExpr, ParenRange) {
     99   RangeVerifier<CXXNewExpr> Verifier;
    100   Verifier.expectRange(1, 12, 1, 20);
    101   EXPECT_TRUE(Verifier.match("void f() { new int(); }", newExpr()));
    102 }
    103 
    104 TEST(MemberExpr, ImplicitMemberRange) {
    105   RangeVerifier<MemberExpr> Verifier;
    106   Verifier.expectRange(2, 30, 2, 30);
    107   EXPECT_TRUE(Verifier.match("struct S { operator int() const; };\n"
    108                              "int foo(const S& s) { return s; }",
    109                              memberExpr()));
    110 }
    111 
    112 TEST(VarDecl, VMTypeFixedVarDeclRange) {
    113   RangeVerifier<VarDecl> Verifier;
    114   Verifier.expectRange(1, 1, 1, 23);
    115   EXPECT_TRUE(Verifier.match("int a[(int)(void*)1234];",
    116                              varDecl(), Lang_C89));
    117 }
    118 
    119 TEST(CXXConstructorDecl, NoRetFunTypeLocRange) {
    120   RangeVerifier<CXXConstructorDecl> Verifier;
    121   Verifier.expectRange(1, 11, 1, 13);
    122   EXPECT_TRUE(Verifier.match("class C { C(); };", functionDecl()));
    123 }
    124 
    125 TEST(CompoundLiteralExpr, CompoundVectorLiteralRange) {
    126   RangeVerifier<CompoundLiteralExpr> Verifier;
    127   Verifier.expectRange(2, 11, 2, 22);
    128   EXPECT_TRUE(Verifier.match(
    129                   "typedef int int2 __attribute__((ext_vector_type(2)));\n"
    130                   "int2 i2 = (int2){1, 2};", compoundLiteralExpr()));
    131 }
    132 
    133 TEST(CompoundLiteralExpr, ParensCompoundVectorLiteralRange) {
    134   RangeVerifier<CompoundLiteralExpr> Verifier;
    135   Verifier.expectRange(2, 20, 2, 31);
    136   EXPECT_TRUE(Verifier.match(
    137                   "typedef int int2 __attribute__((ext_vector_type(2)));\n"
    138                   "constant int2 i2 = (int2)(1, 2);",
    139                   compoundLiteralExpr(), Lang_OpenCL));
    140 }
    141 
    142 TEST(InitListExpr, VectorLiteralListBraceRange) {
    143   RangeVerifier<InitListExpr> Verifier;
    144   Verifier.expectRange(2, 17, 2, 22);
    145   EXPECT_TRUE(Verifier.match(
    146                   "typedef int int2 __attribute__((ext_vector_type(2)));\n"
    147                   "int2 i2 = (int2){1, 2};", initListExpr()));
    148 }
    149 
    150 TEST(InitListExpr, VectorLiteralInitListParens) {
    151   RangeVerifier<InitListExpr> Verifier;
    152   Verifier.expectRange(2, 26, 2, 31);
    153   EXPECT_TRUE(Verifier.match(
    154                   "typedef int int2 __attribute__((ext_vector_type(2)));\n"
    155                   "constant int2 i2 = (int2)(1, 2);", initListExpr(), Lang_OpenCL));
    156 }
    157 
    158 class TemplateAngleBracketLocRangeVerifier : public RangeVerifier<TypeLoc> {
    159 protected:
    160   virtual SourceRange getRange(const TypeLoc &Node) {
    161     TemplateSpecializationTypeLoc T =
    162         Node.getUnqualifiedLoc().castAs<TemplateSpecializationTypeLoc>();
    163     assert(!T.isNull());
    164     return SourceRange(T.getLAngleLoc(), T.getRAngleLoc());
    165   }
    166 };
    167 
    168 TEST(TemplateSpecializationTypeLoc, AngleBracketLocations) {
    169   TemplateAngleBracketLocRangeVerifier Verifier;
    170   Verifier.expectRange(2, 8, 2, 10);
    171   EXPECT_TRUE(Verifier.match(
    172       "template<typename T> struct A {}; struct B{}; void f(\n"
    173       "const A<B>&);",
    174       loc(templateSpecializationType())));
    175 }
    176 
    177 TEST(CXXNewExpr, TypeParenRange) {
    178   RangeVerifier<CXXNewExpr> Verifier;
    179   Verifier.expectRange(1, 10, 1, 18);
    180   EXPECT_TRUE(Verifier.match("int* a = new (int);", newExpr()));
    181 }
    182 
    183 class UnaryTransformTypeLocParensRangeVerifier : public RangeVerifier<TypeLoc> {
    184 protected:
    185   virtual SourceRange getRange(const TypeLoc &Node) {
    186     UnaryTransformTypeLoc T =
    187         Node.getUnqualifiedLoc().castAs<UnaryTransformTypeLoc>();
    188     assert(!T.isNull());
    189     return SourceRange(T.getLParenLoc(), T.getRParenLoc());
    190   }
    191 };
    192 
    193 TEST(UnaryTransformTypeLoc, ParensRange) {
    194   UnaryTransformTypeLocParensRangeVerifier Verifier;
    195   Verifier.expectRange(3, 26, 3, 28);
    196   EXPECT_TRUE(Verifier.match(
    197       "template <typename T>\n"
    198       "struct S {\n"
    199       "typedef __underlying_type(T) type;\n"
    200       "};",
    201       loc(unaryTransformType())));
    202 }
    203 
    204 TEST(CXXFunctionalCastExpr, SourceRange) {
    205   RangeVerifier<CXXFunctionalCastExpr> Verifier;
    206   Verifier.expectRange(2, 10, 2, 14);
    207   EXPECT_TRUE(Verifier.match(
    208       "int foo() {\n"
    209       "  return int{};\n"
    210       "}",
    211       functionalCastExpr(), Lang_CXX11));
    212 }
    213 
    214 TEST(CXXConstructExpr, SourceRange) {
    215   RangeVerifier<CXXConstructExpr> Verifier;
    216   Verifier.expectRange(3, 14, 3, 19);
    217   EXPECT_TRUE(Verifier.match(
    218       "struct A { A(int, int); };\n"
    219       "void f(A a);\n"
    220       "void g() { f({0, 0}); }",
    221       constructExpr(), Lang_CXX11));
    222 }
    223 
    224 TEST(CXXTemporaryObjectExpr, SourceRange) {
    225   RangeVerifier<CXXTemporaryObjectExpr> Verifier;
    226   Verifier.expectRange(2, 6, 2, 12);
    227   EXPECT_TRUE(Verifier.match(
    228       "struct A { A(int, int); };\n"
    229       "A a( A{0, 0} );",
    230       temporaryObjectExpr(), Lang_CXX11));
    231 }
    232 
    233 TEST(CXXUnresolvedConstructExpr, SourceRange) {
    234   RangeVerifier<CXXUnresolvedConstructExpr> Verifier;
    235   Verifier.expectRange(3, 10, 3, 12);
    236   std::vector<std::string> Args;
    237   Args.push_back("-fno-delayed-template-parsing");
    238   EXPECT_TRUE(Verifier.match(
    239       "template <typename U>\n"
    240       "U foo() {\n"
    241       "  return U{};\n"
    242       "}",
    243       unresolvedConstructExpr(), Args, Lang_CXX11));
    244 }
    245 
    246 TEST(UsingDecl, SourceRange) {
    247   RangeVerifier<UsingDecl> Verifier;
    248   Verifier.expectRange(2, 22, 2, 25);
    249   EXPECT_TRUE(Verifier.match(
    250       "class B { protected: int i; };\n"
    251       "class D : public B { B::i; };",
    252       usingDecl()));
    253 }
    254 
    255 TEST(UnresolvedUsingValueDecl, SourceRange) {
    256   RangeVerifier<UnresolvedUsingValueDecl> Verifier;
    257   Verifier.expectRange(3, 3, 3, 6);
    258   EXPECT_TRUE(Verifier.match(
    259       "template <typename B>\n"
    260       "class D : public B {\n"
    261       "  B::i;\n"
    262       "};",
    263       unresolvedUsingValueDecl()));
    264 }
    265 
    266 TEST(FriendDecl, FriendFunctionLocation) {
    267   LocationVerifier<FriendDecl> Verifier;
    268   Verifier.expectLocation(2, 13);
    269   EXPECT_TRUE(Verifier.match("struct A {\n"
    270                              "friend void f();\n"
    271                              "};\n",
    272                              friendDecl()));
    273 }
    274 
    275 TEST(FriendDecl, FriendFunctionRange) {
    276   RangeVerifier<FriendDecl> Verifier;
    277   Verifier.expectRange(2, 1, 2, 15);
    278   EXPECT_TRUE(Verifier.match("struct A {\n"
    279                              "friend void f();\n"
    280                              "};\n",
    281                              friendDecl()));
    282 }
    283 
    284 TEST(FriendDecl, FriendClassLocation) {
    285   LocationVerifier<FriendDecl> Verifier;
    286   Verifier.expectLocation(2, 8);
    287   EXPECT_TRUE(Verifier.match("struct A {\n"
    288                              "friend class B;\n"
    289                              "};\n",
    290                              friendDecl()));
    291 }
    292 
    293 TEST(FriendDecl, FriendClassRange) {
    294   RangeVerifier<FriendDecl> Verifier;
    295   Verifier.expectRange(2, 1, 2, 14);
    296   EXPECT_TRUE(Verifier.match("struct A {\n"
    297                              "friend class B;\n"
    298                              "};\n",
    299                              friendDecl()));
    300 }
    301 
    302 TEST(FriendDecl, FriendTemplateParameterLocation) {
    303   LocationVerifier<FriendDecl> Verifier;
    304   Verifier.expectLocation(3, 8);
    305   EXPECT_TRUE(Verifier.match("template <typename T>\n"
    306                              "struct A {\n"
    307                              "friend T;\n"
    308                              "};\n",
    309                              friendDecl(), Lang_CXX11));
    310 }
    311 
    312 TEST(FriendDecl, FriendTemplateParameterRange) {
    313   RangeVerifier<FriendDecl> Verifier;
    314   Verifier.expectRange(3, 1, 3, 8);
    315   EXPECT_TRUE(Verifier.match("template <typename T>\n"
    316                              "struct A {\n"
    317                              "friend T;\n"
    318                              "};\n",
    319                              friendDecl(), Lang_CXX11));
    320 }
    321 
    322 TEST(FriendDecl, FriendDecltypeLocation) {
    323   LocationVerifier<FriendDecl> Verifier;
    324   Verifier.expectLocation(4, 8);
    325   EXPECT_TRUE(Verifier.match("struct A;\n"
    326                              "A foo();\n"
    327                              "struct A {\n"
    328                              "friend decltype(foo());\n"
    329                              "};\n",
    330                              friendDecl(), Lang_CXX11));
    331 }
    332 
    333 TEST(FriendDecl, FriendDecltypeRange) {
    334   RangeVerifier<FriendDecl> Verifier;
    335   Verifier.expectRange(4, 1, 4, 8);
    336   EXPECT_TRUE(Verifier.match("struct A;\n"
    337                              "A foo();\n"
    338                              "struct A {\n"
    339                              "friend decltype(foo());\n"
    340                              "};\n",
    341                              friendDecl(), Lang_CXX11));
    342 }
    343 
    344 TEST(FriendDecl, InstantiationSourceRange) {
    345   RangeVerifier<FriendDecl> Verifier;
    346   Verifier.expectRange(4, 3, 4, 35);
    347   EXPECT_TRUE(Verifier.match(
    348       "template <typename T> class S;\n"
    349       "template<class T> void operator+(S<T> x);\n"
    350       "template<class T> struct S {\n"
    351       "  friend void operator+<>(S<T> src);\n"
    352       "};\n"
    353       "void test(S<double> s) { +s; }",
    354       friendDecl(hasParent(recordDecl(isTemplateInstantiation())))));
    355 }
    356 
    357 } // end namespace ast_matchers
    358 } // end namespace clang
    359