Home | History | Annotate | Download | only in Frontend
      1 //===- unittests/Frontend/FrontendActionTest.cpp - FrontendAction 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 #include "clang/Frontend/FrontendAction.h"
     11 #include "clang/AST/ASTConsumer.h"
     12 #include "clang/AST/ASTContext.h"
     13 #include "clang/AST/RecursiveASTVisitor.h"
     14 #include "clang/Frontend/CompilerInstance.h"
     15 #include "clang/Frontend/CompilerInvocation.h"
     16 #include "llvm/ADT/Triple.h"
     17 #include "llvm/Support/MemoryBuffer.h"
     18 #include "gtest/gtest.h"
     19 
     20 using namespace llvm;
     21 using namespace clang;
     22 
     23 namespace {
     24 
     25 class TestASTFrontendAction : public ASTFrontendAction {
     26 public:
     27   std::vector<std::string> decl_names;
     28 
     29   virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
     30                                          StringRef InFile) {
     31     return new Visitor(decl_names);
     32   }
     33 
     34 private:
     35   class Visitor : public ASTConsumer, public RecursiveASTVisitor<Visitor> {
     36   public:
     37     Visitor(std::vector<std::string> &decl_names) : decl_names_(decl_names) {}
     38 
     39     virtual void HandleTranslationUnit(ASTContext &context) {
     40       TraverseDecl(context.getTranslationUnitDecl());
     41     }
     42 
     43     virtual bool VisitNamedDecl(NamedDecl *Decl) {
     44       decl_names_.push_back(Decl->getQualifiedNameAsString());
     45       return true;
     46     }
     47 
     48   private:
     49     std::vector<std::string> &decl_names_;
     50   };
     51 };
     52 
     53 TEST(ASTFrontendAction, Sanity) {
     54   CompilerInvocation *invocation = new CompilerInvocation;
     55   invocation->getPreprocessorOpts().addRemappedFile(
     56     "test.cc", MemoryBuffer::getMemBuffer("int main() { float x; }"));
     57   invocation->getFrontendOpts().Inputs.push_back(FrontendInputFile("test.cc",
     58                                                                    IK_CXX));
     59   invocation->getFrontendOpts().ProgramAction = frontend::ParseSyntaxOnly;
     60   invocation->getTargetOpts().Triple = "i386-unknown-linux-gnu";
     61   CompilerInstance compiler;
     62   compiler.setInvocation(invocation);
     63   compiler.createDiagnostics();
     64 
     65   TestASTFrontendAction test_action;
     66   ASSERT_TRUE(compiler.ExecuteAction(test_action));
     67   ASSERT_EQ(3U, test_action.decl_names.size());
     68   EXPECT_EQ("__builtin_va_list", test_action.decl_names[0]);
     69   EXPECT_EQ("main", test_action.decl_names[1]);
     70   EXPECT_EQ("x", test_action.decl_names[2]);
     71 }
     72 
     73 } // anonymous namespace
     74