summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/Sema.cpp6
-rw-r--r--clang/test/Modules/Inputs/va_list/module.modulemap5
-rw-r--r--clang/test/Modules/Inputs/va_list/va_list_a.h2
-rw-r--r--clang/test/Modules/Inputs/va_list/va_list_b.h2
-rw-r--r--clang/test/Modules/va_list.m27
5 files changed, 40 insertions, 2 deletions
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
index 205081b656a..c762d5fdacb 100644
--- a/clang/lib/Sema/Sema.cpp
+++ b/clang/lib/Sema/Sema.cpp
@@ -69,8 +69,6 @@ PrintingPolicy Sema::getPrintingPolicy(const ASTContext &Context,
void Sema::ActOnTranslationUnitScope(Scope *S) {
TUScope = S;
PushDeclContext(S, Context.getTranslationUnitDecl());
-
- VAListTagName = PP.getIdentifierInfo("__va_list_tag");
}
Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
@@ -155,6 +153,10 @@ void Sema::Initialize() {
= dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))
ExternalSema->InitializeSema(*this);
+ // This needs to happen after ExternalSemaSource::InitializeSema(this) or we
+ // will not be able to merge any duplicate __va_list_tag decls correctly.
+ VAListTagName = PP.getIdentifierInfo("__va_list_tag");
+
// Initialize predefined 128-bit integer types, if needed.
if (Context.getTargetInfo().hasInt128Type()) {
// If either of the 128-bit integer types are unavailable to name lookup,
diff --git a/clang/test/Modules/Inputs/va_list/module.modulemap b/clang/test/Modules/Inputs/va_list/module.modulemap
new file mode 100644
index 00000000000..a1a6f7d4e07
--- /dev/null
+++ b/clang/test/Modules/Inputs/va_list/module.modulemap
@@ -0,0 +1,5 @@
+module stdarg [system] {
+ header "stdarg.h" // note: supplied by the compiler
+}
+module va_list_a { header "va_list_a.h" }
+module va_list_b { header "va_list_b.h" }
diff --git a/clang/test/Modules/Inputs/va_list/va_list_a.h b/clang/test/Modules/Inputs/va_list/va_list_a.h
new file mode 100644
index 00000000000..c1e0f978184
--- /dev/null
+++ b/clang/test/Modules/Inputs/va_list/va_list_a.h
@@ -0,0 +1,2 @@
+@import stdarg;
+int vprintf(const char * __restrict, va_list);
diff --git a/clang/test/Modules/Inputs/va_list/va_list_b.h b/clang/test/Modules/Inputs/va_list/va_list_b.h
new file mode 100644
index 00000000000..b7f9b3d367c
--- /dev/null
+++ b/clang/test/Modules/Inputs/va_list/va_list_b.h
@@ -0,0 +1,2 @@
+@import va_list_a;
+void NSLogv(id, va_list);
diff --git a/clang/test/Modules/va_list.m b/clang/test/Modules/va_list.m
new file mode 100644
index 00000000000..5a305180fcf
--- /dev/null
+++ b/clang/test/Modules/va_list.m
@@ -0,0 +1,27 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -triple x86_64-apple-macosx10 -fmodules -fmodules-cache-path=%t \
+// RUN: -fmodules-ignore-macro=PREFIX -DPREFIX -I %S/Inputs/va_list \
+// RUN: -x objective-c-header %s -o %t.pch -emit-pch
+
+// Include the pch, as a sanity check.
+// RUN: %clang_cc1 -triple x86_64-apple-macosx10 -fmodules -fmodules-cache-path=%t \
+// RUN: -fmodules-ignore-macro=PREFIX -I %S/Inputs/va_list -include-pch %t.pch \
+// RUN: -x objective-c %s -fsyntax-only
+
+// Repeat the previous emit-pch, but not we will have a global module index.
+// For some reason, this results in an identifier for __va_list_tag being
+// emitted into the pch.
+// RUN: %clang_cc1 -triple x86_64-apple-macosx10 -fmodules -fmodules-cache-path=%t \
+// RUN: -fmodules-ignore-macro=PREFIX -DPREFIX -I %S/Inputs/va_list \
+// RUN: -x objective-c-header %s -o %t.pch -emit-pch
+
+// Include the pch, which now has __va_list_tag in it, which needs to be merged.
+// RUN: %clang_cc1 -triple x86_64-apple-macosx10 -fmodules -fmodules-cache-path=%t \
+// RUN: -fmodules-ignore-macro=PREFIX -I %S/Inputs/va_list -include-pch %t.pch \
+// RUN: -x objective-c %s -fsyntax-only
+
+// rdar://18039719
+
+#ifdef PREFIX
+@import va_list_b;
+#endif
OpenPOWER on IntegriCloud