[libclang] In lazyCreateDiags, recreate the diagnostic set if the number of diagnostics

in the ASTUnit changed.

llvm-svn: 144762
This commit is contained in:
Argyrios Kyrtzidis 2011-11-16 02:34:55 +00:00
parent aa9512c484
commit f03e734876
2 changed files with 29 additions and 3 deletions

View File

@ -0,0 +1,13 @@
#include "targeted-top.h"
// This tests that we will correctly error out on the deserialized decl.
// RUN: c-index-test -write-pch %t.h.pch %S/targeted-top.h
// RUN: env CINDEXTEST_FAILONERROR=1 not c-index-test -cursor-at=%S/targeted-nested1.h:2:16 %s -include %t.h \
// RUN: -Xclang -error-on-deserialized-decl=NestedVar1
// RUN: env CINDEXTEST_FAILONERROR=1 c-index-test -cursor-at=%S/targeted-nested1.h:2:16 %s -include %t.h \
// RUN: -Xclang -error-on-deserialized-decl=NestedVar1 2>&1 \
// RUN: | FileCheck %s
// CHECK: error: NestedVar1 was deserialized

View File

@ -39,9 +39,22 @@ CXDiagnosticSetImpl::~CXDiagnosticSetImpl() {
CXDiagnosticImpl::~CXDiagnosticImpl() {}
static CXDiagnosticSetImpl *lazyCreateDiags(CXTranslationUnit TU) {
static CXDiagnosticSetImpl *lazyCreateDiags(CXTranslationUnit TU,
bool checkIfChanged = false) {
ASTUnit *AU = static_cast<ASTUnit *>(TU->TUData);
if (TU->Diagnostics && checkIfChanged) {
CXDiagnosticSetImpl *
Set = static_cast<CXDiagnosticSetImpl*>(TU->Diagnostics);
if (AU->stored_diag_size() != Set->getNumDiagnostics()) {
// Diagnostics in the ASTUnit were updated, reset the associated
// diagnostics.
delete Set;
TU->Diagnostics = 0;
}
}
if (!TU->Diagnostics) {
ASTUnit *AU = static_cast<ASTUnit *>(TU->TUData);
CXDiagnosticSetImpl *Set = new CXDiagnosticSetImpl();
TU->Diagnostics = Set;
@ -63,7 +76,7 @@ extern "C" {
unsigned clang_getNumDiagnostics(CXTranslationUnit Unit) {
if (!Unit->TUData)
return 0;
return lazyCreateDiags(Unit)->getNumDiagnostics();
return lazyCreateDiags(Unit, /*checkIfChanged=*/true)->getNumDiagnostics();
}
CXDiagnostic clang_getDiagnostic(CXTranslationUnit Unit, unsigned Index) {