From cc218abe34eace89f1e18a13b768042b77a97283 Mon Sep 17 00:00:00 2001 From: Vassil Vassilev Date: Mon, 20 Jun 2016 15:10:40 +0000 Subject: [PATCH] [modules] Allow emission of update records for predefined __va_list_tag. Handles the cases where old __va_list_tag is coming from a module and the new is not, needing an update record. Fixes https://llvm.org/bugs/show_bug.cgi?id=27890 Patch by Cristina Cristescu, Richard Smith and me. llvm-svn: 273159 --- clang/lib/Serialization/ASTWriter.cpp | 4 ---- clang/test/Modules/Inputs/PR27890/a.h | 9 +++++++++ clang/test/Modules/Inputs/PR27890/module.modulemap | 1 + clang/test/Modules/pr27890.cpp | 9 +++++++++ 4 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 clang/test/Modules/Inputs/PR27890/a.h create mode 100644 clang/test/Modules/Inputs/PR27890/module.modulemap create mode 100644 clang/test/Modules/pr27890.cpp diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 0c9264f40324..30b4a3ebe2ef 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -5654,10 +5654,6 @@ static bool isImportedDeclContext(ASTReader *Chain, const Decl *D) { if (D->isFromASTFile()) return true; - // If we've not loaded any modules, this can't be imported. - if (!Chain || !Chain->getModuleManager().size()) - return false; - // The predefined __va_list_tag struct is imported if we imported any decls. // FIXME: This is a gross hack. return D == D->getASTContext().getVaListTagDecl(); diff --git a/clang/test/Modules/Inputs/PR27890/a.h b/clang/test/Modules/Inputs/PR27890/a.h new file mode 100644 index 000000000000..9c6e56211600 --- /dev/null +++ b/clang/test/Modules/Inputs/PR27890/a.h @@ -0,0 +1,9 @@ +template DataType values(DataType) { __builtin_va_list ValueArgs; return DataType(); } + +template +class opt { +public: + template + opt(Mods) {} +}; + diff --git a/clang/test/Modules/Inputs/PR27890/module.modulemap b/clang/test/Modules/Inputs/PR27890/module.modulemap new file mode 100644 index 000000000000..85074e807897 --- /dev/null +++ b/clang/test/Modules/Inputs/PR27890/module.modulemap @@ -0,0 +1 @@ +module A { header "a.h" export * } diff --git a/clang/test/Modules/pr27890.cpp b/clang/test/Modules/pr27890.cpp new file mode 100644 index 000000000000..8bb9a9fd5c91 --- /dev/null +++ b/clang/test/Modules/pr27890.cpp @@ -0,0 +1,9 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -std=c++11 -I%S/Inputs/PR27890 -verify %s +// RUN: %clang_cc1 -std=c++11 -fmodules -fmodule-map-file=%S/Inputs/PR27890/module.modulemap -fmodules-cache-path=%t -I%S/Inputs/PR27890 -verify %s + +#include "a.h" +enum ActionType {}; +opt a(values("")); + +// expected-no-diagnostics \ No newline at end of file