1

次のように、clang API (バージョン 3.1 - トランク 153913) を使用して非常に単純なコードをコンパイルしています。

class MyClass
{
   ~MyClass() ;

};

MyClass::~MyClass()
{

}

int main()
{
   return 0;
}

私の問題は、次のエラー メッセージが表示されることです。 MyClass::~MyClass()

誰かが私を正しい方向に向けることができれば、それは素晴らしいことです. デストラクタがクラスにインラインで定義されている場合、問題なくコンパイルされます。

clang++ でコンパイルすることもできることに注意してください: -bash-4.1$ clang++ test.cpp

したがって、clang API の使用法に欠けている設定があるはずです。誰でもそれが何であるかを示すことができますか. 不足しているオプション/構成を探しています。

私のclang APIの使用法は次のとおりです。

// Include appropriate headers. 
int main()
{
    clang::DiagnosticOptions diagnosticOptions;
    diagnosticOptions.ShowColors=1;
    diagnosticOptions.ShowOptionNames=1;
    clang::TextDiagnosticPrinter *pTextDiagnosticPrinter =
       new clang::TextDiagnosticPrinter(
           llvm::outs(),
           diagnosticOptions);
    llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> pDiagIDs;
    clang::DiagnosticsEngine *pDiagnosticsEngine =
       new clang::DiagnosticsEngine(pDiagIDs, pTextDiagnosticPrinter);

    clang::LangOptions languageOptions;
    languageOptions.GNUMode = 1;
    languageOptions.CXXExceptions = 1;
    languageOptions.RTTI = 1;
    languageOptions.Bool = 1;
    languageOptions.CPlusPlus = 1;
    clang::FileSystemOptions fileSystemOptions;
    clang::FileManager fileManager(fileSystemOptions);

    clang::SourceManager sourceManager(
      *pDiagnosticsEngine,
      fileManager);


    clang::TargetOptions targetOptions;
     targetOptions.Triple = "x86_64-unknown-linux-gnu";
    targetOptions.CPU = "x86-64";

    clang::TargetInfo *pTargetInfo =
    clang::TargetInfo::CreateTargetInfo(
        *pDiagnosticsEngine,
        targetOptions);

    clang::HeaderSearch headerSearch(fileManager,
                                 *pDiagnosticsEngine,
                                 languageOptions,
                                 pTargetInfo);
    clang::CompilerInstance compInst;
    compInst.getTargetOpts() = targetOptions;
    compInst.getLangOpts().CPlusPlus = 1;
    compInst.getLangOpts().Bool = 1;

    clang::HeaderSearchOptions &headerSearchOpts = compInst.getHeaderSearchOpts();
    headerSearchOpts = headerSearchOptions;

    clang::CompilerInvocation &compInvocation = compInst.getInvocation();

    clang::FrontendOptions & frontendOpts = compInvocation.getFrontendOpts();
    frontendOpts.ProgramAction = clang::frontend::EmitObj;

    clang::CodeGenOptions & codeGenOpts = compInvocation.getCodeGenOpts ();

    codeGenOpts.RelaxAll = 1;
    codeGenOpts.DebugInfo = 1;
    codeGenOpts.RelocationModel = "static";
    codeGenOpts.DisableFPElim = 1;
    codeGenOpts.AsmVerbose = 1;
    codeGenOpts.CXXCtorDtorAliases= 1;
    codeGenOpts.UnwindTables = 1;
    codeGenOpts.OmitLeafFramePointer = 1;
    codeGenOpts.StackRealignment = 1;

    std::vector<std::string> res;
    compInvocation.toArgs (res);

    std::vector<std::string>::iterator it;

   std::cout << "Arguments: " << std::endl;
   for (it = res.begin(); it != res.end(); it++)
   {
      std::string arg = *it;
      std::cout << "Arg: " << arg << std::endl;
   }

   clang::Preprocessor preprocessor(
    *pDiagnosticsEngine,
    languageOptions,
    pTargetInfo,
    sourceManager,
    headerSearch,
    compInst);

   preprocessor.getBuiltinInfo().InitializeBuiltins
    (preprocessor.getIdentifierTable(),
     languageOptions);

   clang::PreprocessorOptions preprocessorOptions;

   clang::FrontendOptions frontendOptions;
   frontendOptions.DisableFree=1;
   clang::InitializePreprocessor(
    preprocessor,
    preprocessorOptions,
    headerSearchOptions,
    frontendOptions);

   const clang::FileEntry *pFile = fileManager.getFile(
    "test.cpp");
   sourceManager.createMainFileID(pFile);
   const clang::TargetInfo &targetInfo = *pTargetInfo;

   clang::IdentifierTable identifierTable(languageOptions);
   clang::SelectorTable selectorTable;

   clang::Builtin::Context builtinContext;
   builtinContext.InitializeTarget(targetInfo);
   builtinContext.InitializeBuiltins(identifierTable, languageOptions);

   clang::ASTContext astContext(
    languageOptions,
    sourceManager,
    pTargetInfo,
    identifierTable,
    selectorTable,
    builtinContext,
    0 /* size_reserve*/);
    MyASTConsumer astConsumer;

    clang::Sema sema(
    preprocessor,
    astContext,
    astConsumer);

    pTextDiagnosticPrinter->BeginSourceFile(languageOptions, &preprocessor);
    clang::ParseAST (preprocessor, &astConsumer, astContext);
    pTextDiagnosticPrinter->EndSourceFile();

    return 0;
}
4

2 に答える 2

7

あなたが行方不明です

languageOptions.ImplicitInt = 0;

この構成がないと、明示的な戻り値の型を持たない関数は int 戻り値の型に設定され、デストラクターの戻り値の型がチェックされるとエラーが発生し、エラーが発生します。上記の構成では、デストラクタの戻り値の型が未定義のままになるため、Sema フェーズでエラーが発生しません。

于 2012-11-20T07:49:10.750 に答える
1

ほぼ確実に、元のコード (削減前) にセミコロンがありませんでした。

class MyClass
{
   ~MyClass() ;

}  // right here

MyClass::~MyClass()
{

}

int main()
{
   return 0;
}

これにより、クラスの型定義が、後続の関数定義の戻り値の型として扱われました。

于 2012-10-05T00:22:06.040 に答える