diff options
| -rw-r--r-- | clang/lib/Sema/Sema.cpp | 6 | ||||
| -rw-r--r-- | clang/test/Modules/Inputs/va_list/module.modulemap | 5 | ||||
| -rw-r--r-- | clang/test/Modules/Inputs/va_list/va_list_a.h | 2 | ||||
| -rw-r--r-- | clang/test/Modules/Inputs/va_list/va_list_b.h | 2 | ||||
| -rw-r--r-- | clang/test/Modules/va_list.m | 27 |
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 |

