Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[cling] Lifetime of MetaParser is that of its input: #8041

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
[cling] Lifetime of MetaParser is that of its input:
Before, MetaParser might have pointed to a StringRef whose storage
was gone, see asan failure in roottest/cling/other/runfileClose.C below.

This was caused by recursive uses of MetaParser; see stack trace below:
the inner recursion returned, but as the same MetaParser object was used
by both frames, the objects cursor now pointed to freed memory.

Instead, create a MetaParser (and MetaLexer) object per input. That way,
their lifetime corresponds to the lifetime of their input.

=================================================================
==529104==ERROR: AddressSanitizer: stack-use-after-return on address 0x7ffff3afd82a at pc 0x7fffea18df6d bp 0x7fffffff8170 sp 0x7fffffff8168
READ of size 1 at 0x7ffff3afd82a thread T0
[Detaching after fork from child process 529183]
    #0 0x7fffea18df6c in cling::MetaLexer::Lex(cling::Token&) src/interpreter/cling/lib/MetaProcessor/MetaLexer.cpp:58:11
    #1 0x7fffea190d7c in cling::MetaParser::lookAhead(unsigned int) src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:89:15
    #2 0x7fffea190bd5 in cling::MetaParser::consumeToken() src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:49:5
    #3 0x7fffea191d4d in cling::MetaParser::isLCommand(cling::MetaSema::ActionResult&) src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:147:9
    #4 0x7fffea1914dd in cling::MetaParser::isCommand(cling::MetaSema::ActionResult&, cling::Value*) src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:123:12
    #5 0x7fffea191216 in cling::MetaParser::isMetaCommand(cling::MetaSema::ActionResult&, cling::Value*) src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:101:33
    #6 0x7fffea14e5aa in cling::MetaProcessor::process(llvm::StringRef, cling::Interpreter::CompilationResult&, cling::Value*, bool) src/interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp:317:24
    #7 0x7fffe99b67b7 in HandleInterpreterException(cling::MetaProcessor*, char const*, cling::Interpreter::CompilationResult&, cling::Value*) src/core/metacling/src/TCling.cxx:2431:29
    #8 0x7fffe99bde30 in TCling::Load(char const*, bool) src/core/metacling/src/TCling.cxx:3454:10
    #9 0x7ffff7865f11 in TSystem::Load(char const*, char const*, bool) src/core/base/src/TSystem.cxx:1941:27
    #10 0x7ffff7b8a0e3 in TUnixSystem::Load(char const*, char const*, bool) src/core/unix/src/TUnixSystem.cxx:2789:20
    #11 0x7fffd78dd08b  (<unknown module>)
    #12 0x7fffe9f8a5d9 in cling::IncrementalExecutor::executeWrapper(llvm::StringRef, cling::Value*) const src/interpreter/cling/lib/Interpreter/IncrementalExecutor.cpp:376:3
    #13 0x7fffe9d73dc2 in cling::Interpreter::RunFunction(clang::FunctionDecl const*, cling::Value*) src/interpreter/cling/lib/Interpreter/Interpreter.cpp:1141:20
    #14 0x7fffe9d6e317 in cling::Interpreter::EvaluateInternal(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cling::CompilationOptions, cling::Value*, cling::Transaction**, unsigned long) src/interpreter/cling/lib/Interpreter/Interpreter.cpp:1391:29
    #15 0x7fffe9d6c1fe in cling::Interpreter::process(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cling::Value*, cling::Transaction**, bool) src/interpreter/cling/lib/Interpreter/Interpreter.cpp:819:9
    #16 0x7fffea151826 in cling::MetaProcessor::readInputFromFile(llvm::StringRef, cling::Value*, unsigned long, bool) src/interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp:507:22
    #17 0x7fffe99b585b in TCling::ProcessLine(char const*, TInterpreter::EErrorCode*) src/core/metacling/src/TCling.cxx:2570:39
    #18 0x7fffe99bbfee in TCling::ProcessLineSynch(char const*, TInterpreter::EErrorCode*) src/core/metacling/src/TCling.cxx:3496:17
    #19 0x7ffff77203d3 in TApplication::ExecuteFile(char const*, int*, bool) src/core/base/src/TApplication.cxx:1608:30
    #20 0x7ffff771ebdf in TApplication::ProcessFile(char const*, int*, bool) src/core/base/src/TApplication.cxx:1480:11
    #21 0x7ffff771e385 in TApplication::ProcessLine(char const*, bool, int*) src/core/base/src/TApplication.cxx:1453:14
    #22 0x7ffff7f8157a in TRint::ProcessLineNr(char const*, char const*, int*) src/core/rint/src/TRint.cxx:766:11
    #23 0x7ffff7f802f0 in TRint::Run(bool) src/core/rint/src/TRint.cxx:424:22
    #24 0x4ff96d in main src/main/src/rmain.cxx:30:12
    #25 0x7ffff6e040b2 in __libc_start_main /build/glibc-YbNSs7/glibc-2.31/csu/../csu/libc-start.c:308:16
    #26 0x41f35d in _start (asan/bin/root.exe+0x41f35d)

Address 0x7ffff3afd82a is located in stack of thread T0 at offset 42 in frame
    #0 0x7fffe99b3d8f in TCling::ProcessLine(char const*, TInterpreter::EErrorCode*) src/core/metacling/src/TCling.cxx:2456

  This frame has 21 object(s):
    [32, 56) 'sLine' (line 2462) <== Memory access at offset 42 is inside this variable
    [96, 104) 'R__guard2471' (line 2471)
    [128, 136) 'R__guard2488' (line 2488)
    [160, 176) 'interpreterFlagsRAII' (line 2491)
    [192, 240) 'result' (line 2511)
    [272, 276) 'compRes' (line 2512)
    [288, 312) 'mod_line' (line 2517)
    [352, 376) 'aclicMode' (line 2518)
    [416, 440) 'arguments' (line 2519)
    [480, 504) 'io' (line 2520)
    [544, 568) 'fname' (line 2521)
    [608, 632) 'ref.tmp' (line 2547)
    [672, 696) 'ref.tmp145' (line 2547)
    [736, 768) 'code' (line 2555)
    [800, 832) 'codeline' (line 2556)
    [864, 1384) 'in' (line 2559)
    [1520, 1552) 'ref.tmp176' (line 2562)
    [1584, 1600) 'agg.tmp'
    [1616, 1624) 'ref.tmp198' (line 2568)
    [1648, 1664) 'agg.tmp207'
    [1680, 1696) 'autoParseRaii' (line 2588)
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
      (longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-use-after-return src/interpreter/cling/lib/MetaProcessor/MetaLexer.cpp:58:11 in cling::MetaLexer::Lex(cling::Token&)
Shadow bytes around the buggy address:
  0x10007e757ab0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757ac0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757ad0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757ae0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757af0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
=>0x10007e757b00: f5 f5 f5 f5 f5[f5]f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757b10: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757b20: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757b30: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757b40: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757b50: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==529104==ABORTING

    at src/interpreter/cling/lib/MetaProcessor/MetaLexer.cpp:49
    at src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:41
    compRes=@0x7ffff3afd910: cling::Interpreter::kSuccess, result=0x7ffff3afd8c0, disableValuePrinting=false)
    at src/interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp:314
    input_line=0x7ffff3afd829 "#define XYZ 21", compRes=@0x7ffff3afd910: cling::Interpreter::kSuccess,
    result=0x7ffff3afd8c0) at src/core/metacling/src/TCling.cxx:2431
    error=0x7fffd78cb0f4 <x>) at src/core/metacling/src/TCling.cxx:2591
    sync=false, err=0x7fffd78cb0f4 <x>) at src/core/base/src/TApplication.cxx:1472
    line=0x7fffd78c9000 "#define XYZ 21", error=0x7fffd78cb0f4 <x>)
    at src/core/base/src/TROOT.cxx:2328
   from asan/roottest/cling/other/fileClose_C.so
    filename=0x6070000f0fd0 "asan/roottest/cling/other/fileClose_C.so", flag=257)
    at /home/axel/build/llvm/llvm-project/compiler-rt/lib/asan/../sanitizer_common/sanitizer_common_interceptors.inc:6270
    at src/interpreter/cling/lib/Utils/PlatformPosix.cpp:118
    permanent=false, resolved=true)
    at src/interpreter/cling/lib/Interpreter/DynamicLibraryManager.cpp:184
    at src/interpreter/cling/lib/Interpreter/Interpreter.cpp:1444
    T=0x0) at src/interpreter/cling/lib/Interpreter/Interpreter.cpp:1560
    at src/interpreter/cling/lib/MetaProcessor/MetaSema.cpp:57
    actionResult=@0x7ffff39532b0: cling::MetaSema::AR_Success)
Axel-Naumann committed Apr 29, 2021

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
commit ae90e3e377287b72ff5f503a4979ab448c683e06
7 changes: 3 additions & 4 deletions interpreter/cling/include/cling/MetaProcessor/MetaParser.h
Original file line number Diff line number Diff line change
@@ -65,7 +65,7 @@ namespace cling {
class MetaParser {
private:
MetaLexer m_Lexer;
std::unique_ptr<MetaSema> m_Actions;
MetaSema &m_Actions;
llvm::SmallVector<Token, 2> m_TokenCache;
llvm::SmallVector<Token, 4> m_MetaSymbolCache;
private:
@@ -113,8 +113,7 @@ namespace cling {
bool isShellCommand(MetaSema::ActionResult& actionResult,
Value* resultValue);
public:
MetaParser(MetaSema* Actions);
void enterNewInputLine(llvm::StringRef Line);
MetaParser(MetaSema &Actions, llvm::StringRef Line);

///\brief Drives the recursive decendent parsing.
///
@@ -127,7 +126,7 @@ namespace cling {
///
bool isQuitRequested() const;

MetaSema& getActions() const { return *m_Actions.get(); }
MetaSema& getActions() const { return m_Actions; }
};
} // end namespace cling

Original file line number Diff line number Diff line change
@@ -24,7 +24,7 @@ namespace cling {

class Interpreter;
class InputValidator;
class MetaParser;
class MetaSema;
class Value;

///\brief Class that helps processing meta commands, which add extra
@@ -43,7 +43,7 @@ namespace cling {

///\brief The parser used to parse our tiny "meta" language
///
std::unique_ptr<MetaParser> m_MetaParser;
std::unique_ptr<MetaSema> m_MetaSema;

///\brief Currently executing file as passed into executeFile
///
79 changes: 37 additions & 42 deletions interpreter/cling/lib/MetaProcessor/MetaParser.cpp
Original file line number Diff line number Diff line change
@@ -24,9 +24,9 @@

namespace cling {

MetaParser::MetaParser(MetaSema* Actions) : m_Lexer("") {
m_Actions.reset(Actions);
const InvocationOptions& Opts = Actions->getInterpreter().getOptions();
MetaParser::MetaParser(MetaSema &Actions, llvm::StringRef Line) :
m_Lexer(Line), m_Actions(Actions) {
const InvocationOptions& Opts = Actions.getInterpreter().getOptions();
MetaLexer metaSymbolLexer(Opts.MetaString);
Token Tok;
while(true) {
@@ -37,11 +37,6 @@ namespace cling {
}
}

void MetaParser::enterNewInputLine(llvm::StringRef Line) {
m_Lexer.reset(Line);
m_TokenCache.clear();
}

void MetaParser::consumeToken() {
if (m_TokenCache.size())
m_TokenCache.erase(m_TokenCache.begin());
@@ -102,7 +97,7 @@ namespace cling {
}

bool MetaParser::isQuitRequested() const {
return m_Actions->isQuitRequested();
return m_Actions.isQuitRequested();
}

bool MetaParser::isCommandSymbol() {
@@ -143,11 +138,11 @@ namespace cling {
consumeAnyStringToken(tok::comment);
if (getCurTok().is(tok::raw_ident)) {
result = true;
actionResult = m_Actions->actOnLCommand(getCurTok().getIdent());
actionResult = m_Actions.actOnLCommand(getCurTok().getIdent());
consumeToken();
if (getCurTok().is(tok::comment)) {
consumeAnyStringToken(tok::eof);
m_Actions->actOnComment(getCurTok().getIdent());
m_Actions.actOnComment(getCurTok().getIdent());
}
}
}
@@ -168,7 +163,7 @@ namespace cling {
if (getCurTok().is(tok::raw_ident)) {
result = true;
std::string outputFile = getCurTok().getIdent();
actionResult = m_Actions->actOnTCommand(inputFile, outputFile);
actionResult = m_Actions.actOnTCommand(inputFile, outputFile);
}
}
}
@@ -257,9 +252,9 @@ namespace cling {
}
// Empty file means std.
actionResult =
m_Actions->actOnRedirectCommand(file/*file*/,
stream/*which stream to redirect*/,
append/*append mode*/);
m_Actions.actOnRedirectCommand(file/*file*/,
stream/*which stream to redirect*/,
append/*append mode*/);
return true;
}
return false;
@@ -316,7 +311,7 @@ namespace cling {

if (args.empty())
args = "()";
actionResult = m_Actions->actOnxCommand(file, args, resultValue);
actionResult = m_Actions.actOnxCommand(file, args, resultValue);
return true;
}

@@ -335,7 +330,7 @@ namespace cling {
bool result = false;
if (getCurTok().is(tok::ident) && getCurTok().getIdent().equals("q")) {
result = true;
m_Actions->actOnqCommand();
m_Actions.actOnqCommand();
}
return result;
}
@@ -346,7 +341,7 @@ namespace cling {
llvm::StringRef path;
if (getCurTok().is(tok::raw_ident)) {
path = getCurTok().getIdent();
actionResult = m_Actions->actOnUCommand(path);
actionResult = m_Actions.actOnUCommand(path);
return true;
}
}
@@ -361,7 +356,7 @@ namespace cling {
llvm::StringRef path;
if (getCurTok().is(tok::raw_ident))
path = getCurTok().getIdent();
m_Actions->actOnICommand(path);
m_Actions.actOnICommand(path);
return true;
}
return false;
@@ -378,7 +373,7 @@ namespace cling {
consumeAnyStringToken(tok::eof);
if (getCurTok().is(tok::raw_ident))
return false;
actionResult = m_Actions->actOnOCommand(level);
actionResult = m_Actions.actOnOCommand(level);
return true;
}
} else {
@@ -389,11 +384,11 @@ namespace cling {
int level = 0;
if (!lastStringToken.getIdent().getAsInteger(10, level)
&& level >= 0) {
actionResult = m_Actions->actOnOCommand(level);
actionResult = m_Actions.actOnOCommand(level);
return true;
}
} else {
m_Actions->actOnOCommand();
m_Actions.actOnOCommand();
actionResult = MetaSema::AR_Success;
return true;
}
@@ -409,7 +404,7 @@ namespace cling {
) {
consumeToken();
skipWhitespace();
m_Actions->actOnAtCommand();
m_Actions.actOnAtCommand();
return true;
}
return false;
@@ -423,7 +418,7 @@ namespace cling {
skipWhitespace();
if (getCurTok().is(tok::constant))
mode = (MetaSema::SwitchMode)getCurTok().getConstantAsBool();
m_Actions->actOnrawInputCommand(mode);
m_Actions.actOnrawInputCommand(mode);
return true;
}
return false;
@@ -437,7 +432,7 @@ namespace cling {
skipWhitespace();
if (getCurTok().is(tok::constant))
mode = getCurTok().getConstant();
m_Actions->actOndebugCommand(mode);
m_Actions.actOndebugCommand(mode);
return true;
}
return false;
@@ -451,7 +446,7 @@ namespace cling {
skipWhitespace();
if (getCurTok().is(tok::constant))
mode = (MetaSema::SwitchMode)getCurTok().getConstantAsBool();
m_Actions->actOnprintDebugCommand(mode);
m_Actions.actOnprintDebugCommand(mode);
return true;
}
return false;
@@ -467,7 +462,7 @@ namespace cling {
return false; // FIXME: Issue proper diagnostics
std::string ident = getCurTok().getIdentNoQuotes();
consumeToken();
m_Actions->actOnstoreStateCommand(ident);
m_Actions.actOnstoreStateCommand(ident);
return true;
}
return false;
@@ -483,7 +478,7 @@ namespace cling {
return false; // FIXME: Issue proper diagnostics
std::string ident = getCurTok().getIdentNoQuotes();
consumeToken();
m_Actions->actOncompareStateCommand(ident);
m_Actions.actOncompareStateCommand(ident);
return true;
}
return false;
@@ -500,7 +495,7 @@ namespace cling {
consumeToken();
skipWhitespace();
const Token& next = getCurTok();
m_Actions->actOnstatsCommand(what, next.is(tok::ident)
m_Actions.actOnstatsCommand(what, next.is(tok::ident)
? next.getIdent() : llvm::StringRef());
return true;
}
@@ -518,7 +513,7 @@ namespace cling {
llvm::StringRef ident = getCurTok().getIdent();
consumeToken();
skipWhitespace();
m_Actions->actOnstatsCommand(ident.equals("ast")
m_Actions.actOnstatsCommand(ident.equals("ast")
? llvm::StringRef("asttree") : ident,
getCurTok().is(tok::ident) ? getCurTok().getIdent() : llvm::StringRef());
consumeToken();
@@ -534,9 +529,9 @@ namespace cling {
skipWhitespace();
const Token& next = getCurTok();
if (next.is(tok::constant))
m_Actions->actOnUndoCommand(next.getConstant());
m_Actions.actOnUndoCommand(next.getConstant());
else
m_Actions->actOnUndoCommand();
m_Actions.actOnUndoCommand();
return true;
}
return false;
@@ -550,7 +545,7 @@ namespace cling {
skipWhitespace();
if (getCurTok().is(tok::constant))
mode = (MetaSema::SwitchMode)getCurTok().getConstantAsBool();
m_Actions->actOndynamicExtensionsCommand(mode);
m_Actions.actOndynamicExtensionsCommand(mode);
return true;
}
return false;
@@ -560,23 +555,23 @@ namespace cling {
const Token& Tok = getCurTok();
if (Tok.is(tok::quest_mark) ||
(Tok.is(tok::ident) && Tok.getIdent().equals("help"))) {
m_Actions->actOnhelpCommand();
m_Actions.actOnhelpCommand();
return true;
}
return false;
}

bool MetaParser::isfileExCommand() {
if (getCurTok().is(tok::ident) && getCurTok().getIdent().equals("fileEx")) {
m_Actions->actOnfileExCommand();
m_Actions.actOnfileExCommand();
return true;
}
return false;
}

bool MetaParser::isfilesCommand() {
if (getCurTok().is(tok::ident) && getCurTok().getIdent().equals("files")) {
m_Actions->actOnfilesCommand();
m_Actions.actOnfilesCommand();
return true;
}
return false;
@@ -591,11 +586,11 @@ namespace cling {
llvm::StringRef className;
if (NextTok.is(tok::raw_ident))
className = NextTok.getIdent();
m_Actions->actOnclassCommand(className);
m_Actions.actOnclassCommand(className);
return true;
}
else if (Tok.getIdent().equals("Class")) {
m_Actions->actOnClassCommand();
m_Actions.actOnClassCommand();
return true;
}
}
@@ -609,7 +604,7 @@ namespace cling {
consumeAnyStringToken(tok::eof);
if (getCurTok().is(tok::raw_ident))
return false;
m_Actions->actOnNamespaceCommand();
m_Actions.actOnNamespaceCommand();
return true;
}
}
@@ -623,7 +618,7 @@ namespace cling {
llvm::StringRef varName;
if (getCurTok().is(tok::ident))
varName = getCurTok().getIdent();
m_Actions->actOngCommand(varName);
m_Actions.actOngCommand(varName);
return true;
}
return false;
@@ -638,7 +633,7 @@ namespace cling {
llvm::StringRef typedefName;
if (NextTok.is(tok::raw_ident))
typedefName = NextTok.getIdent();
m_Actions->actOnTypedefCommand(typedefName);
m_Actions.actOnTypedefCommand(typedefName);
return true;
}
}
@@ -656,7 +651,7 @@ namespace cling {
if (NextTok.is(tok::raw_ident)) {
llvm::StringRef commandLine(NextTok.getIdent());
if (!commandLine.empty())
actionResult = m_Actions->actOnShellCommand(commandLine,
actionResult = m_Actions.actOnShellCommand(commandLine,
resultValue);
}
return true;
10 changes: 5 additions & 5 deletions interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp
Original file line number Diff line number Diff line change
@@ -286,7 +286,7 @@ namespace cling {
MetaProcessor::MetaProcessor(Interpreter& interp, raw_ostream& outs)
: m_Interp(interp), m_Outs(&outs) {
m_InputValidator.reset(new InputValidator());
m_MetaParser.reset(new MetaParser(new MetaSema(interp, *this)));
m_MetaSema.reset(new MetaSema(interp, *this));
}

MetaProcessor::~MetaProcessor() {
@@ -311,12 +311,12 @@ namespace cling {
}

// Check for and handle meta commands.
m_MetaParser->enterNewInputLine(input_line);
MetaParser parser(*m_MetaSema, input_line);
MetaSema::ActionResult actionResult = MetaSema::AR_Success;
if (!m_InputValidator->inBlockComment() &&
m_MetaParser->isMetaCommand(actionResult, result)) {
parser.isMetaCommand(actionResult, result)) {

if (m_MetaParser->isQuitRequested())
if (parser.isQuitRequested())
return -1;

if (actionResult != MetaSema::AR_Success)
@@ -525,7 +525,7 @@ namespace cling {

void MetaProcessor::registerUnloadPoint(const Transaction* T,
llvm::StringRef filename) {
m_MetaParser->getActions().registerUnloadPoint(T, filename);
m_MetaSema->registerUnloadPoint(T, filename);
}

} // end namespace cling