Index: include/clang/Serialization/ASTReader.h =================================================================== --- include/clang/Serialization/ASTReader.h +++ include/clang/Serialization/ASTReader.h @@ -612,6 +612,9 @@ /// files. llvm::DenseSet LoadedUndefs; + /// \brief Token literal data loaded and owned by us. + std::vector TokenLiteralDataLoaded; + typedef ContinuousRangeMap GlobalMacroMapType; Index: lib/Serialization/ASTReader.cpp =================================================================== --- lib/Serialization/ASTReader.cpp +++ lib/Serialization/ASTReader.cpp @@ -1508,6 +1508,12 @@ Tok.setIdentifierInfo(II); Tok.setKind((tok::TokenKind)Record[Idx++]); Tok.setFlag((Token::TokenFlags)Record[Idx++]); + if (Tok.isLiteral()) { + const RecordData &RD = reinterpret_cast(Record); + std::string *Lit = new std::string(ReadString(RD, Idx)); + TokenLiteralDataLoaded.push_back(Lit); + Tok.setLiteralData(Lit->c_str()); + } return Tok; } @@ -10372,6 +10378,9 @@ ASTReader::~ASTReader() { if (OwnsDeserializationListener) delete DeserializationListener; + for (auto PStr : TokenLiteralDataLoaded) { + delete PStr; + } } IdentifierResolver &ASTReader::getIdResolver() { Index: lib/Serialization/ASTWriter.cpp =================================================================== --- lib/Serialization/ASTWriter.cpp +++ lib/Serialization/ASTWriter.cpp @@ -4364,6 +4364,8 @@ Record.push_back(Tok.getKind()); // FIXME: Should translate token flags to a stable encoding. Record.push_back(Tok.getFlags()); + if (Tok.isLiteral()) + AddString(StringRef(Tok.getLiteralData(), Tok.getLength()), Record); } void ASTWriter::AddString(StringRef Str, RecordDataImpl &Record) {