Clang API разбор деструктора

Я использую API Clang (версия 3.1 — магистраль 153913), чтобы скомпилировать очень простой код следующим образом:

class MyClass
{
~MyClass() ;

};

MyClass::~MyClass()
{

}

int main()
{
return 0;
}

Моя проблема в том, что я получаю сообщение об ошибке:
test.cpp: 20: 10: ошибка: деструктор не может иметь тип возврата
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;
}

1

Решение

Вам не хватает

languageOptions.ImplicitInt = 0;

без этой конфигурации любая функция, не имеющая явного возвращаемого типа, будет установлена ​​на тип возвращаемого значения int и выдает ошибку, когда проверяется возвращаемый тип десктруктора, тем самым повышая ошибку
В описанной выше конфигурации фаза Sema не вызовет ошибку, так как тип возвращаемого деструктора останется неопределенным.

7

Другие решения

Почти наверняка в вашем исходном коде (до того, как вы его сократили) не было точки с запятой.

class MyClass
{
~MyClass() ;

}  // right here

MyClass::~MyClass()
{

}

int main()
{
return 0;
}

Это привело к тому, что определение типа класса было обработано как возвращаемый тип для определения функции, которое последовало.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector