From b86238d2f0a93ce91717906f9211927f48a7121a Mon Sep 17 00:00:00 2001 From: Sebastian Redl Date: Wed, 28 Jul 2010 21:07:02 +0000 Subject: [PATCH] Add a test case for tentative definitions in chained PCH. Fix a bug that completely messed up source locations and thus caused a crash whenever a diagnostic was emitted in chained PCH files. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109660 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Basic/SourceManager.cpp | 5 ++- test/PCH/Inputs/chain-external-defs1.h | 13 +++++++ test/PCH/Inputs/chain-external-defs2.h | 11 ++++++ test/PCH/chain-external-defs.c | 54 ++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 test/PCH/Inputs/chain-external-defs1.h create mode 100644 test/PCH/Inputs/chain-external-defs2.h create mode 100644 test/PCH/chain-external-defs.c diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp index 4a1eb3096d..0a6ce4c03e 100644 --- a/lib/Basic/SourceManager.cpp +++ b/lib/Basic/SourceManager.cpp @@ -424,9 +424,12 @@ void SourceManager::PreallocateSLocEntries(ExternalSLocEntrySource *Source, unsigned NextOffset) { ExternalSLocEntries = Source; this->NextOffset = NextOffset; + unsigned CurPrealloc = SLocEntryLoaded.size(); + // If we've ever preallocated, we must not count the dummy entry. + if (CurPrealloc) --CurPrealloc; SLocEntryLoaded.resize(NumSLocEntries + 1); SLocEntryLoaded[0] = true; - SLocEntryTable.resize(SLocEntryTable.size() + NumSLocEntries); + SLocEntryTable.resize(SLocEntryTable.size() + NumSLocEntries - CurPrealloc); } void SourceManager::ClearPreallocatedSLocEntries() { diff --git a/test/PCH/Inputs/chain-external-defs1.h b/test/PCH/Inputs/chain-external-defs1.h new file mode 100644 index 0000000000..36a2653f5f --- /dev/null +++ b/test/PCH/Inputs/chain-external-defs1.h @@ -0,0 +1,13 @@ +// Helper 1 for chain-external-defs.c test + +// Tentative definitions +int x; +int x2; + +// Should not show up +static int z; + +int incomplete_array[]; +int incomplete_array2[]; + +struct S s; diff --git a/test/PCH/Inputs/chain-external-defs2.h b/test/PCH/Inputs/chain-external-defs2.h new file mode 100644 index 0000000000..72af92f1a3 --- /dev/null +++ b/test/PCH/Inputs/chain-external-defs2.h @@ -0,0 +1,11 @@ +// Helper 2 for chain-external-defs.c test + +// Tentative definitions +int y; +int y2; + +// Should still not show up +static int z; + +int incomplete_array[]; +int incomplete_array3[]; diff --git a/test/PCH/chain-external-defs.c b/test/PCH/chain-external-defs.c new file mode 100644 index 0000000000..dd92d8e63a --- /dev/null +++ b/test/PCH/chain-external-defs.c @@ -0,0 +1,54 @@ +// Test with pch. +// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -emit-pch -o %t1.pch %S/Inputs/chain-external-defs1.h +// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -emit-pch -o %t2.pch %S/Inputs/chain-external-defs2.h -include-pch %t1.pch -chained-pch +// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -include-pch %t2.pch -emit-llvm -o %t %s +// RUN: echo FINI >> %t +// RUN: FileCheck -input-file=%t -check-prefix=Z %s +// RUN: FileCheck -input-file=%t -check-prefix=XA %s +// RUN: FileCheck -input-file=%t -check-prefix=YA %s +// RUN: FileCheck -input-file=%t -check-prefix=XB %s +// RUN: FileCheck -input-file=%t -check-prefix=YB %s +// RUN: FileCheck -input-file=%t -check-prefix=AA %s +// RUN: FileCheck -input-file=%t -check-prefix=AB %s +// RUN: FileCheck -input-file=%t -check-prefix=AC %s +// RUN: FileCheck -input-file=%t -check-prefix=S %s + +// Z-NOT: @z + +// XA: @x = common global i32 0 +// XA-NOT: @x = common global i32 0 + +// YA: @y = common global i32 0 +// YA-NOT: @y = common global i32 0 + +// XB: @x2 = global i32 19 +// XB-NOT: @x2 = global i32 19 +int x2 = 19; +// YB: @y2 = global i32 18 +// YB-NOT: @y2 = global i32 18 +int y2 = 18; + +// AA: @incomplete_array = common global [1 x i32] +// AA-NOT: @incomplete_array = common global [1 x i32] +// AB: @incomplete_array2 = common global [17 x i32] +// AB-NOT: @incomplete_array2 = common global [17 x i32] +int incomplete_array2[17]; +// AC: @incomplete_array3 = common global [1 x i32] +// AC-NOT: @incomplete_array3 = common global [1 x i32] +int incomplete_array3[]; + +// S: @s = common global %struct.S +// S-NOT: @s = common global %struct.S +struct S { + int x, y; +}; + +// Z: FINI +// XA: FINI +// YA: FINI +// XB: FINI +// YB: FINI +// AA: FINI +// AB: FINI +// AC: FINI +// S: FINI -- 2.40.0