Prepone callback initialization in cling.

We should setup our callbacks for ExternalASTSource/ExternalSemaSource
before we parse *any* code to prevent that any part of the code
stores a reference to a non-cling external sources. If this happens,
then the clang data structures such redecl chain could go out of
sync if they reference different sources and produce errors like failing
to merge declarations correctly or creating invalid redecl chains.

To fix this, we move this initalization before the initalization of
the incremental parser which is the first part that can generate
any AST nodes.
This commit is contained in:
Raphael Isemann 2017-11-01 10:17:56 +01:00 committed by sftnight
parent 0f16f1ac15
commit 1ebf53715c

View File

@ -226,6 +226,17 @@ namespace cling {
DiagnosticConsumer& DClient = getCI()->getDiagnosticClient(); DiagnosticConsumer& DClient = getCI()->getDiagnosticClient();
DClient.BeginSourceFile(getCI()->getLangOpts(), &PP); DClient.BeginSourceFile(getCI()->getLangOpts(), &PP);
// Disable suggestions for ROOT
bool showSuggestions =
!llvm::StringRef(ClingStringify(CLING_VERSION)).startswith("ROOT");
// We need InterpreterCallbacks only if it is a parent Interpreter.
if (!parentInterp) {
std::unique_ptr<InterpreterCallbacks> AutoLoadCB(
new AutoloadCallback(this, showSuggestions));
setCallbacks(std::move(AutoLoadCB));
}
llvm::SmallVector<IncrementalParser::ParseResultTransaction, 2> llvm::SmallVector<IncrementalParser::ParseResultTransaction, 2>
IncrParserTransactions; IncrParserTransactions;
if (!m_IncrParser->Initialize(IncrParserTransactions, parentInterp)) { if (!m_IncrParser->Initialize(IncrParserTransactions, parentInterp)) {
@ -269,16 +280,6 @@ namespace cling {
} }
} }
// Disable suggestions for ROOT
bool showSuggestions = !llvm::StringRef(ClingStringify(CLING_VERSION)).startswith("ROOT");
// We need InterpreterCallbacks only if it is a parent Interpreter.
if (!parentInterp) {
std::unique_ptr<InterpreterCallbacks>
AutoLoadCB(new AutoloadCallback(this, showSuggestions));
setCallbacks(std::move(AutoLoadCB));
}
m_IncrParser->SetTransformers(parentInterp); m_IncrParser->SetTransformers(parentInterp);
if (!m_LLVMContext) { if (!m_LLVMContext) {