v.g.vassilev updated this revision to Diff 112835.
v.g.vassilev added a comment.

Add a test case.


https://reviews.llvm.org/D34984

Files:
  include/clang/Serialization/ASTReader.h
  lib/Serialization/ASTReader.cpp
  lib/Serialization/ASTWriter.cpp
  test/PCH/token-literal-data.c


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); }
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: 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<const RecordData &>(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: include/clang/Serialization/ASTReader.h
===================================================================
--- include/clang/Serialization/ASTReader.h
+++ include/clang/Serialization/ASTReader.h
@@ -612,6 +612,9 @@
   /// files.
   llvm::DenseSet<LoadedMacroInfo> LoadedUndefs;
 
+  /// \brief Token literal data loaded and owned by us.
+  std::vector<std::string *> TokenLiteralDataLoaded;
+
   typedef ContinuousRangeMap<serialization::MacroID, ModuleFile *, 4>
     GlobalMacroMapType;
 


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); }
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: 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<const RecordData &>(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: include/clang/Serialization/ASTReader.h
===================================================================
--- include/clang/Serialization/ASTReader.h
+++ include/clang/Serialization/ASTReader.h
@@ -612,6 +612,9 @@
   /// files.
   llvm::DenseSet<LoadedMacroInfo> LoadedUndefs;
 
+  /// \brief Token literal data loaded and owned by us.
+  std::vector<std::string *> TokenLiteralDataLoaded;
+
   typedef ContinuousRangeMap<serialization::MacroID, ModuleFile *, 4>
     GlobalMacroMapType;
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D34984: S... Vassil Vassilev via Phabricator via cfe-commits
    • [PATCH] D349... Richard Smith - zygoloid via Phabricator via cfe-commits
    • [PATCH] D349... Vassil Vassilev via Phabricator via cfe-commits

Reply via email to