17a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin//===- unittests/Frontend/FrontendActionTest.cpp - FrontendAction tests ---===// 27a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin// 37a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin// The LLVM Compiler Infrastructure 47a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin// 57a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin// This file is distributed under the University of Illinois Open Source 67a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin// License. See LICENSE.TXT for details. 77a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin// 87a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin//===----------------------------------------------------------------------===// 97a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin 101050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include "clang/Frontend/FrontendAction.h" 117a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin#include "clang/AST/ASTConsumer.h" 121050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include "clang/AST/ASTContext.h" 137cc315ccf80382fab7674735fbfda95990d28f8eChandler Carruth#include "clang/AST/RecursiveASTVisitor.h" 147a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin#include "clang/Frontend/CompilerInstance.h" 157a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin#include "clang/Frontend/CompilerInvocation.h" 167a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin#include "llvm/ADT/Triple.h" 177a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin#include "llvm/Support/MemoryBuffer.h" 187a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin#include "gtest/gtest.h" 197a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin 207a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskinusing namespace llvm; 217a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskinusing namespace clang; 227a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin 237a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskinnamespace { 247a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin 257a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskinclass TestASTFrontendAction : public ASTFrontendAction { 267a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskinpublic: 277a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin std::vector<std::string> decl_names; 287a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin 297a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 307a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin StringRef InFile) { 317a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin return new Visitor(decl_names); 327a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin } 337a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin 347a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskinprivate: 357a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin class Visitor : public ASTConsumer, public RecursiveASTVisitor<Visitor> { 367a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin public: 377a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin Visitor(std::vector<std::string> &decl_names) : decl_names_(decl_names) {} 387a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin 397a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin virtual void HandleTranslationUnit(ASTContext &context) { 407a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin TraverseDecl(context.getTranslationUnitDecl()); 417a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin } 427a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin 437a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin virtual bool VisitNamedDecl(NamedDecl *Decl) { 447a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin decl_names_.push_back(Decl->getQualifiedNameAsString()); 457a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin return true; 467a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin } 477a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin 487a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin private: 497a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin std::vector<std::string> &decl_names_; 507a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin }; 517a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin}; 527a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin 537a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey YasskinTEST(ASTFrontendAction, Sanity) { 547a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin CompilerInvocation *invocation = new CompilerInvocation; 557a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin invocation->getPreprocessorOpts().addRemappedFile( 567a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin "test.cc", MemoryBuffer::getMemBuffer("int main() { float x; }")); 57eabcf7e1d4c2be34653a936cff93d0872fe929ddDouglas Gregor invocation->getFrontendOpts().Inputs.push_back(FrontendInputFile("test.cc", 58eabcf7e1d4c2be34653a936cff93d0872fe929ddDouglas Gregor IK_CXX)); 597a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin invocation->getFrontendOpts().ProgramAction = frontend::ParseSyntaxOnly; 607a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin invocation->getTargetOpts().Triple = "i386-unknown-linux-gnu"; 617a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin CompilerInstance compiler; 627a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin compiler.setInvocation(invocation); 63d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silva compiler.createDiagnostics(); 647a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin 657a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin TestASTFrontendAction test_action; 667a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin ASSERT_TRUE(compiler.ExecuteAction(test_action)); 677a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin ASSERT_EQ(3U, test_action.decl_names.size()); 687a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin EXPECT_EQ("__builtin_va_list", test_action.decl_names[0]); 697a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin EXPECT_EQ("main", test_action.decl_names[1]); 707a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin EXPECT_EQ("x", test_action.decl_names[2]); 717a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin} 727a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin 737a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin} // anonymous namespace 74