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