forked from OSchip/llvm-project
[libclang] Fix a crash when serializing a preprocessing record that contains
an #include entry that did not resolve to header file. Part of rdar://11007039 llvm-svn: 152275
This commit is contained in:
parent
0cf55e99c6
commit
8dbcfc39cd
|
@ -3447,9 +3447,10 @@ PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
|
||||||
|
|
||||||
case PPD_INCLUSION_DIRECTIVE: {
|
case PPD_INCLUSION_DIRECTIVE: {
|
||||||
const char *FullFileNameStart = BlobStart + Record[0];
|
const char *FullFileNameStart = BlobStart + Record[0];
|
||||||
const FileEntry *File
|
StringRef FullFileName(FullFileNameStart, BlobLen - Record[0]);
|
||||||
= PP.getFileManager().getFile(StringRef(FullFileNameStart,
|
const FileEntry *File = 0;
|
||||||
BlobLen - Record[0]));
|
if (!FullFileName.empty())
|
||||||
|
File = PP.getFileManager().getFile(FullFileName);
|
||||||
|
|
||||||
// FIXME: Stable encoding
|
// FIXME: Stable encoding
|
||||||
InclusionDirective::InclusionKind Kind
|
InclusionDirective::InclusionKind Kind
|
||||||
|
|
|
@ -1832,7 +1832,10 @@ void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec) {
|
||||||
Record.push_back(static_cast<unsigned>(ID->getKind()));
|
Record.push_back(static_cast<unsigned>(ID->getKind()));
|
||||||
SmallString<64> Buffer;
|
SmallString<64> Buffer;
|
||||||
Buffer += ID->getFileName();
|
Buffer += ID->getFileName();
|
||||||
Buffer += ID->getFile()->getName();
|
// Check that the FileEntry is not null because it was not resolved and
|
||||||
|
// we create a PCH even with compiler errors.
|
||||||
|
if (ID->getFile())
|
||||||
|
Buffer += ID->getFile()->getName();
|
||||||
Stream.EmitRecordWithBlob(InclusionAbbrev, Record, Buffer);
|
Stream.EmitRecordWithBlob(InclusionAbbrev, Record, Buffer);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
#ifndef HEADER
|
#ifndef HEADER
|
||||||
#define HEADER
|
#define HEADER
|
||||||
|
|
||||||
|
#include "blahblah.h"
|
||||||
void erroneous(int);
|
void erroneous(int);
|
||||||
void erroneous(float);
|
void erroneous(float);
|
||||||
|
|
||||||
|
@ -13,9 +13,9 @@ void foo(void) {
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// RUN: c-index-test -write-pch %t.h.pch %s
|
// RUN: c-index-test -write-pch %t.h.pch %s -Xclang -detailed-preprocessing-record
|
||||||
// RUN: c-index-test -test-load-source local %s -include %t.h | FileCheck -check-prefix=CHECK-PARSE %s
|
// RUN: c-index-test -test-load-source local %s -include %t.h -Xclang -detailed-preprocessing-record | FileCheck -check-prefix=CHECK-PARSE %s
|
||||||
// RUN: c-index-test -index-file %s -include %t.h | FileCheck -check-prefix=CHECK-INDEX %s
|
// RUN: c-index-test -index-file %s -include %t.h -Xclang -detailed-preprocessing-record | FileCheck -check-prefix=CHECK-INDEX %s
|
||||||
|
|
||||||
// CHECK-PARSE: pch-with-errors.c:10:6: FunctionDecl=foo:10:6 (Definition) Extent=[10:1 - 12:2]
|
// CHECK-PARSE: pch-with-errors.c:10:6: FunctionDecl=foo:10:6 (Definition) Extent=[10:1 - 12:2]
|
||||||
// CHECK-PARSE: pch-with-errors.c:11:3: CallExpr=erroneous:5:6 Extent=[11:3 - 11:15]
|
// CHECK-PARSE: pch-with-errors.c:11:3: CallExpr=erroneous:5:6 Extent=[11:3 - 11:15]
|
||||||
|
|
Loading…
Reference in New Issue