-Make TokenID of IdentifierInfo read-only, remove setTokenID().
-There are 2 instances that change the TokenID for GNU libstdc++ 4.2 compatibility.
  To handler those cases introduce a RevertedTokenID bitfield, RevertTokenIDToIdentifier() and hasRevertedTokenIDToIdentifier() methods.
  Store the bitfield in PCH.

llvm-svn: 110868
diff --git a/clang/lib/Frontend/PCHReader.cpp b/clang/lib/Frontend/PCHReader.cpp
index 68acbb2..a09b89d 100644
--- a/clang/lib/Frontend/PCHReader.cpp
+++ b/clang/lib/Frontend/PCHReader.cpp
@@ -657,6 +657,8 @@
     unsigned Bits = ReadUnalignedLE16(d);
     bool CPlusPlusOperatorKeyword = Bits & 0x01;
     Bits >>= 1;
+    bool HasRevertedTokenIDToIdentifier = Bits & 0x01;
+    Bits >>= 1;
     bool Poisoned = Bits & 0x01;
     Bits >>= 1;
     bool ExtensionToken = Bits & 0x01;
@@ -677,7 +679,9 @@
     Reader.SetIdentifierInfo(ID, II);
 
     // Set or check the various bits in the IdentifierInfo structure.
-    // FIXME: Load token IDs lazily, too?
+    // Token IDs are read-only.
+    if (HasRevertedTokenIDToIdentifier)
+      II->RevertTokenIDToIdentifier();
     II->setObjCOrBuiltinID(ObjCOrBuiltinID);
     assert(II->isExtensionToken() == ExtensionToken &&
            "Incorrect extension token flag");