From: Steve Naroff Date: Sat, 25 Apr 2009 12:07:12 +0000 (+0000) Subject: Fix a major bug in PCHReader::ReadSelectorBlock(). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=72de9219a74be47ea5aa6cf9a730d17e2366f268;p=clang Fix a major bug in PCHReader::ReadSelectorBlock(). Also simplify some syntax in PCHWriter::WritePreprocessor(), suggested by Chris. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70039 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 4c3e248c64..78be893bc7 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -1750,14 +1750,15 @@ bool PCHReader::ReadSelectorBlock() { for (unsigned SelIdx = 0; SelIdx < NumSels; SelIdx++) { unsigned NumArgs = Record[Idx++]; KeyIdents.clear(); - if (NumArgs <= 1) { + if (NumArgs == 0) { + // If the number of arguments is 0, the we must have an Identifier. IdentifierInfo *II = DecodeIdentifierInfo(Record[Idx++]); assert(II && "DecodeIdentifierInfo returned 0"); KeyIdents.push_back(II); } else { + // For keyword selectors, the Identifier is optional (::: is legal!). for (unsigned ArgIdx = 0; ArgIdx < NumArgs; ++ArgIdx) { IdentifierInfo *II = DecodeIdentifierInfo(Record[Idx++]); - assert(II && "DecodeIdentifierInfo returned 0"); KeyIdents.push_back(II); } } diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index 421c345e78..5a410b1cf8 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/lib/Frontend/PCHWriter.cpp @@ -1554,11 +1554,11 @@ void PCHWriter::WritePreprocessor(const Preprocessor &PP) { for (HeaderSearch::header_file_iterator I = HS.header_file_begin(), E = HS.header_file_end(); I != E; ++I) { - Record.push_back((*I).isImport); - Record.push_back((*I).DirInfo); - Record.push_back((*I).NumIncludes); - if ((*I).ControllingMacro) - AddIdentifierRef((*I).ControllingMacro, Record); + Record.push_back(I->isImport); + Record.push_back(I->DirInfo); + Record.push_back(I->NumIncludes); + if (I->ControllingMacro) + AddIdentifierRef(I->ControllingMacro, Record); else Record.push_back(0); Stream.EmitRecord(pch::PP_HEADER_FILE_INFO, Record);