//===- unittests/CodeGen/BufferSourceTest.cpp - MemoryBuffer source tests -===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/Basic/TargetInfo.h" #include "clang/CodeGen/ModuleBuilder.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Lex/Preprocessor.h" #include "clang/Parse/ParseAST.h" #include "clang/Sema/Sema.h" #include "llvm/ADT/Triple.h" #include "llvm/IR/LLVMContext.h" #include "llvm/Support/Host.h" #include "llvm/Support/MemoryBuffer.h" #include "gtest/gtest.h" using namespace llvm; using namespace clang; namespace { // Emitting constructors for global objects involves looking // at the source file name. This makes sure that we don't crash // if the source file is a memory buffer. const char TestProgram[] = "class EmitCXXGlobalInitFunc " "{ " "public: " " EmitCXXGlobalInitFunc() {} " "}; " "EmitCXXGlobalInitFunc test; "; TEST(BufferSourceTest, EmitCXXGlobalInitFunc) { LLVMContext Context; CompilerInstance compiler; compiler.createDiagnostics(); compiler.getLangOpts().CPlusPlus = 1; compiler.getLangOpts().CPlusPlus11 = 1; compiler.getTargetOpts().Triple = llvm::Triple::normalize( llvm::sys::getProcessTriple()); compiler.setTarget(clang::TargetInfo::CreateTargetInfo( compiler.getDiagnostics(), std::make_shared( compiler.getTargetOpts()))); compiler.createFileManager(); compiler.createSourceManager(compiler.getFileManager()); compiler.createPreprocessor(clang::TU_Prefix); compiler.createASTContext(); compiler.setASTConsumer(std::unique_ptr( CreateLLVMCodeGen( compiler.getDiagnostics(), "EmitCXXGlobalInitFuncTest", compiler.getHeaderSearchOpts(), compiler.getPreprocessorOpts(), compiler.getCodeGenOpts(), Context))); compiler.createSema(clang::TU_Prefix, nullptr); clang::SourceManager &sm = compiler.getSourceManager(); sm.setMainFileID(sm.createFileID( llvm::MemoryBuffer::getMemBuffer(TestProgram), clang::SrcMgr::C_User)); clang::ParseAST(compiler.getSema(), false, false); } } // end anonymous namespace