1 //===- unittests/Frontend/FrontendActionTest.cpp - FrontendAction tests ---===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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"
16 #include "llvm/ADT/Triple.h"
17 #include "llvm/LLVMContext.h"
18 #include "llvm/Support/MemoryBuffer.h"
20 #include "gtest/gtest.h"
23 using namespace clang
;
27 class TestASTFrontendAction
: public ASTFrontendAction
{
29 std::vector
<std::string
> decl_names
;
31 virtual ASTConsumer
*CreateASTConsumer(CompilerInstance
&CI
,
33 return new Visitor(decl_names
);
37 class Visitor
: public ASTConsumer
, public RecursiveASTVisitor
<Visitor
> {
39 Visitor(std::vector
<std::string
> &decl_names
) : decl_names_(decl_names
) {}
41 virtual void HandleTranslationUnit(ASTContext
&context
) {
42 TraverseDecl(context
.getTranslationUnitDecl());
45 virtual bool VisitNamedDecl(NamedDecl
*Decl
) {
46 decl_names_
.push_back(Decl
->getQualifiedNameAsString());
51 std::vector
<std::string
> &decl_names_
;
55 TEST(ASTFrontendAction
, Sanity
) {
56 CompilerInvocation
*invocation
= new CompilerInvocation
;
57 invocation
->getPreprocessorOpts().addRemappedFile(
58 "test.cc", MemoryBuffer::getMemBuffer("int main() { float x; }"));
59 invocation
->getFrontendOpts().Inputs
.push_back(
60 std::make_pair(IK_CXX
, "test.cc"));
61 invocation
->getFrontendOpts().ProgramAction
= frontend::ParseSyntaxOnly
;
62 invocation
->getTargetOpts().Triple
= "i386-unknown-linux-gnu";
63 CompilerInstance compiler
;
64 compiler
.setLLVMContext(new LLVMContext
);
65 compiler
.setInvocation(invocation
);
66 compiler
.createDiagnostics(0, NULL
);
68 TestASTFrontendAction test_action
;
69 ASSERT_TRUE(compiler
.ExecuteAction(test_action
));
70 ASSERT_EQ(3U, test_action
.decl_names
.size());
71 EXPECT_EQ("__builtin_va_list", test_action
.decl_names
[0]);
72 EXPECT_EQ("main", test_action
.decl_names
[1]);
73 EXPECT_EQ("x", test_action
.decl_names
[2]);
76 } // anonymous namespace