<div dir="ltr">Hello there,<div><br></div><div>I'm having a hard time building a simple AST at runtime. I think that only small pieces are missing, but it's rather difficult for me to find which ones and where.</div>
<div><br></div><div>The code I have has been created by trial and error regarding the CompilerInstance initialization and the ASTDumpAction.</div><div>The sema-part was inspired by what happens in <a href="https://github.com/tritao/clang/blob/master/lib/Sema/SemaCLI.cpp">https://github.com/tritao/clang/blob/master/lib/Sema/SemaCLI.cpp</a>.</div>
<div><br></div><div>I'm first trying to create a namespace, for a start.</div><div><br></div><div>I get the following error mesage from the code: </div><div>> error: unknown target triple '', please use -triple or -arch</div>
<div><br></div><div>I thought I provided the required triple in the call to clang::TargetInfo::CreateTargetInfo, passing targetOptions, which "Triple" member has been set to "i386-pc-win32" (which was only a guess, since I did not find a reference for the string syntax of a target triple).</div>
<div><br></div><div>Here's the code:</div><div><br></div><div><div>#include <clang/Frontend/ASTConsumers.h><br></div><div>#include <clang/Frontend/CompilerInstance.h></div><div>#include <clang/Frontend/FrontendActions.h></div>
<div>#include <clang/CodeGen/CodeGenAction.h></div><div>#include <clang/Tooling/Tooling.h></div><div>#include <clang/Sema/Sema.h></div><div>#include <clang/Lex/Preprocessor.h></div><div>#include <clang/AST/Decl.h></div>
<div>#include <clang/AST/ASTContext.h></div><div>#include <clang/Basic/FileManager.h></div><div>#include <clang/Basic/TargetInfo.h></div><div>#include <clang/Basic/IdentifierTable.h></div><div>#include <clang/Basic/SourceLocation.h></div>
<div>#include <llvm/Support/raw_os_ostream.h></div><div>#include <iostream></div><div>#include <string></div><div><br></div><div>void clang_sandbox ()</div><div>{</div><div>    clang::FileManager fileManager = clang::FileManager (clang::FileSystemOptions ());</div>
<div>    auto targetOptions = new clang::TargetOptions ();</div><div>    targetOptions->Triple = "i386-pc-win32";</div><div><br></div><div>    clang::CompilerInstance instance;</div><div>    instance.createDiagnostics ();</div>
<div>    clang::TargetInfo * target (clang::TargetInfo::CreateTargetInfo (instance.getDiagnostics (), targetOptions));</div><div>    instance.setTarget (target);</div><div>    instance.createFileManager ();</div><div>    instance.createSourceManager (fileManager);</div>
<div>    instance.createPreprocessor ();</div><div>    instance.setASTConsumer (clang::CreateASTPrinter (nullptr, llvm::StringRef ()));</div><div>    instance.createASTContext ();</div><div><br></div><div>    auto sema = new clang::Sema (instance.getPreprocessor (), instance.getASTContext (), instance.getASTConsumer (), clang::TU_Complete);</div>
<div><br></div><div>    clang::IdentifierTable & identifierTable = sema->getPreprocessor ().getIdentifierTable ();</div><div>    clang::IdentifierInfo & identifier = identifierTable.get ("blubb");</div>
<div><br></div><div>    clang::TranslationUnitDecl* tu = sema->getASTContext().getTranslationUnitDecl();</div><div>    clang::DeclContext* declContext = tu->getPrimaryContext();</div><div><br></div><div>    clang::SourceLocation declSourceLocation;</div>
<div>    clang::NamespaceDecl::Create (sema->getASTContext (), declContext, false, declSourceLocation, declSourceLocation, & identifier, nullptr);</div><div><br></div><div>    instance.setSema (sema);</div><div>    clang::ASTDumpAction action;</div>
<div>    instance.ExecuteAction (action);</div><div><br></div><div>    std::cout << "\nEnd CLang Sandbox!\n";</div><div>}</div></div><div><br></div><div>Greetings,</div><div>Daniel Albuschat<br></div><div>
<br></div><div>P.S.: Yes, I have been recommended to create C++ code instead of trying to build an AST. But I'd still like to try the AST approach, since I'd like to skip the (time consuming) parsing of the C++ code.</div>
<div><br></div></div>