Home | History | Annotate | Download | only in Tooling
      1 //===- unittest/Tooling/RecursiveASTVisitorTestTypeLocVisitor.cpp ---------===//
      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 #include "TestVisitor.h"
     11 #include <stack>
     12 
     13 using namespace clang;
     14 
     15 namespace {
     16 
     17 class TypeLocVisitor : public ExpectedLocationVisitor<TypeLocVisitor> {
     18 public:
     19   bool VisitTypeLoc(TypeLoc TypeLocation) {
     20     Match(TypeLocation.getType().getAsString(), TypeLocation.getBeginLoc());
     21     return true;
     22   }
     23 };
     24 
     25 TEST(RecursiveASTVisitor, VisitsBaseClassDeclarations) {
     26   TypeLocVisitor Visitor;
     27   Visitor.ExpectMatch("class X", 1, 30);
     28   EXPECT_TRUE(Visitor.runOver("class X {}; class Y : public X {};"));
     29 }
     30 
     31 TEST(RecursiveASTVisitor, VisitsCXXBaseSpecifiersOfForwardDeclaredClass) {
     32   TypeLocVisitor Visitor;
     33   Visitor.ExpectMatch("class X", 3, 18);
     34   EXPECT_TRUE(Visitor.runOver(
     35     "class Y;\n"
     36     "class X {};\n"
     37     "class Y : public X {};"));
     38 }
     39 
     40 TEST(RecursiveASTVisitor, VisitsCXXBaseSpecifiersWithIncompleteInnerClass) {
     41   TypeLocVisitor Visitor;
     42   Visitor.ExpectMatch("class X", 2, 18);
     43   EXPECT_TRUE(Visitor.runOver(
     44     "class X {};\n"
     45     "class Y : public X { class Z; };"));
     46 }
     47 
     48 TEST(RecursiveASTVisitor, VisitsCXXBaseSpecifiersOfSelfReferentialType) {
     49   TypeLocVisitor Visitor;
     50   Visitor.ExpectMatch("X<class Y>", 2, 18);
     51   EXPECT_TRUE(Visitor.runOver(
     52     "template<typename T> class X {};\n"
     53     "class Y : public X<Y> {};"));
     54 }
     55 
     56 TEST(RecursiveASTVisitor, VisitsClassTemplateTypeParmDefaultArgument) {
     57   TypeLocVisitor Visitor;
     58   Visitor.ExpectMatch("class X", 2, 23);
     59   EXPECT_TRUE(Visitor.runOver(
     60     "class X;\n"
     61     "template<typename T = X> class Y;\n"
     62     "template<typename T> class Y {};\n"));
     63 }
     64 
     65 TEST(RecursiveASTVisitor, VisitsCompoundLiteralType) {
     66   TypeLocVisitor Visitor;
     67   Visitor.ExpectMatch("struct S", 1, 26);
     68   EXPECT_TRUE(Visitor.runOver(
     69       "int f() { return (struct S { int a; }){.a = 0}.a; }",
     70       TypeLocVisitor::Lang_C));
     71 }
     72 
     73 TEST(RecursiveASTVisitor, VisitsObjCPropertyType) {
     74   TypeLocVisitor Visitor;
     75   Visitor.ExpectMatch("NSNumber", 2, 33);
     76   EXPECT_TRUE(Visitor.runOver(
     77       "@class NSNumber; \n"
     78       "@interface A @property (retain) NSNumber *x; @end\n",
     79       TypeLocVisitor::Lang_OBJC));
     80 }
     81 
     82 TEST(RecursiveASTVisitor, VisitInvalidType) {
     83   TypeLocVisitor Visitor;
     84   // FIXME: It would be nice to have information about subtypes of invalid type
     85   //Visitor.ExpectMatch("typeof(struct F *) []", 1, 1);
     86   // Even if the full type is invalid, it should still find sub types
     87   //Visitor.ExpectMatch("struct F", 1, 19);
     88   EXPECT_FALSE(Visitor.runOver(
     89       "__typeof__(struct F*) var[invalid];\n",
     90       TypeLocVisitor::Lang_C));
     91 }
     92 
     93 } // end anonymous namespace
     94