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) { Index: test/PCH/token-literal-data.c =================================================================== --- test/PCH/token-literal-data.c +++ test/PCH/token-literal-data.c @@ -0,0 +1,11 @@ +// RUN: rm -fr %s_tmp.h.pch +// RUN: echo '#define MACRO 42' > %s_tmp.h +// RUN: %clang_cc1 -emit-pch -o %s_tmp.h.pch %s_tmp.h +// RUN: rm %s_tmp.h +// RUN: %clang_cc1 -fno-validate-pch -include-pch %s_tmp.h.pch -fsyntax-only -verify %s + +// expected-no-diagnostics + +int f(int x) { return x; } +void g1() { f(MACRO); } +void g2() { f(12); }