[cfe-dev] CompilerInstance problems

Robert Ankeney rrankene at gmail.com
Tue Mar 3 20:07:31 PST 2015


I'm updating a project from Clang 3.4 to the latest version of Clang, and
am having problems getting it to work. It's a Qt-based project with a
RecursiveASTVisitor, running on Windows with MinGW-32. Everything seems to
go well until I get to the destructor of the CompilerInstance. The code
looks something like:
{
  CompilerInstance compiler;
  DiagnosticOptions &diagOpts = compiler.getDiagnosticOpts();
  string verr_string;
  raw_string_ostream vErr(verr_string);

  TextDiagnosticPrinter *pTextDiagnosticPrinter =
                         new TextDiagnosticPrinter(vErr, &diagOpts);
  compiler.createDiagnostics(pTextDiagnosticPrinter);

  // Create an invocation that passes any flags to preprocessor
  unique_ptr<CompilerInvocation> Invocation(new CompilerInvocation);
  CompilerInvocation::CreateFromArgs(*Invocation, argv + 1, argv + argc,
                                      compiler.getDiagnostics());

  Invocation->setLangDefaults(compiler.getLangOpts(),
                              clang::IK_CXX,
                             options.langStandard);

  compiler.setInvocation(Invocation.release());

  // Set default target triple
  shared_ptr<TargetOptions> pto( new TargetOptions());
  pto->Triple = llvm::sys::getDefaultTargetTriple();
  shared_ptr<TargetInfo>
    pti(TargetInfo::CreateTargetInfo(compiler.getDiagnostics(), pto));
  compiler.setTarget(pti.get());

  compiler.createFileManager();
  compiler.createSourceManager(compiler.getFileManager());

  compiler.createPreprocessor(TU_Module);
  compiler.getPreprocessorOpts().UsePredefines = false;

  compiler.createASTContext();

  SourceManager &sourceMgr = compiler.getSourceManager();

  // Initialize rewriter
  Rewriter Rewrite;
  Rewrite.setSourceMgr(sourceMgr, compiler.getLangOpts());

  // Get filename
  string fileName(argv[argc - 1]);

  const FileEntry *pFile = compiler.getFileManager().getFile(fileName);
  sourceMgr.setMainFileID(sourceMgr.createFileID(pFile, SourceLocation(),
SrcMgr::C_User));
  if (pFile == NULL)
  {
      // File not found
      return false;
  }

  compiler.getDiagnosticClient().BeginSourceFile(compiler.getLangOpts(),
                                           &compiler.getPreprocessor());

  MyASTConsumer astConsumer(Rewrite);

  try {
    // Parse the AST
    ParseAST(compiler.getPreprocessor(),
             &astConsumer,
             compiler.getASTContext());
  } catch(exception &e)
  {
    return false;
  }

  compiler.getDiagnosticClient().EndSourceFile();

  return true;  // Return success
}

Everything works fine till the return, when it crashes with:

libstdc++-6!_ZNSs4_Rep10_M_destroyERKSaIcE
C:\Qt\Qt5.4.1\5.4\mingw491_32\bin\libstdc++-6.dll
clang::DiagnosticsEngine::~DiagnosticsEngine
clang::CompilerInstance::~CompilerInstance

Any ideas what I did wrong? This is with:
clang version 3.7.0 (trunk 230884)
Target: i686-pc-windows-gnu
Thread model: posix

BTW, why is the current build calling itself 3.7.0? Since 3.6 was just
released, it seems it should be called 3.6.0 or something less confusing.

Thanks!
Robert
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150303/d7503bc5/attachment.html>


More information about the cfe-dev mailing list