From aa265b0578282910841ffec01fda724af6cd1cc7 Mon Sep 17 00:00:00 2001 From: Manman Ren Date: Fri, 21 Oct 2016 23:35:03 +0000 Subject: [PATCH] Module: correctly set the module file kind when emitting file_modified. rdar://28503343 Differential Revision: http://reviews.llvm.org/D25806 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@284899 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticSerializationKinds.td | 6 ++++++ lib/Serialization/ASTReader.cpp | 9 ++++++++- test/Modules/module-file-modified.c | 11 +++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 test/Modules/module-file-modified.c diff --git a/include/clang/Basic/DiagnosticSerializationKinds.td b/include/clang/Basic/DiagnosticSerializationKinds.td index 16c7743555..066a1f5fa6 100644 --- a/include/clang/Basic/DiagnosticSerializationKinds.td +++ b/include/clang/Basic/DiagnosticSerializationKinds.td @@ -21,6 +21,12 @@ def err_fe_pch_malformed_block : Error< def err_fe_pch_file_modified : Error< "file '%0' has been modified since the precompiled header '%1' was built">, DefaultFatal; +def err_fe_module_file_modified : Error< + "file '%0' has been modified since the module file '%1' was built">, + DefaultFatal; +def err_fe_ast_file_modified : Error< + "file '%0' has been modified since the AST file '%1' was built">, + DefaultFatal; def err_fe_pch_file_overridden : Error< "file '%0' from the precompiled header has been overridden">; def note_pch_required_by : Note<"'%0' required by '%1'">; diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 8ce118ce71..57de217078 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -1983,6 +1983,7 @@ ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { return R; } +static unsigned moduleKindForDiagnostic(ModuleKind Kind); InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { // If this ID is bogus, just return an empty input file. if (ID == 0 || ID > F.InputFilesLoaded.size()) @@ -2079,7 +2080,13 @@ InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { // The top-level PCH is stale. StringRef TopLevelPCHName(ImportStack.back()->FileName); - Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName); + unsigned DiagnosticKind = moduleKindForDiagnostic(ImportStack.back()->Kind); + if (DiagnosticKind == 0) + Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName); + else if (DiagnosticKind == 1) + Error(diag::err_fe_module_file_modified, Filename, TopLevelPCHName); + else + Error(diag::err_fe_ast_file_modified, Filename, TopLevelPCHName); // Print the import stack. if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) { diff --git a/test/Modules/module-file-modified.c b/test/Modules/module-file-modified.c new file mode 100644 index 0000000000..85018b521e --- /dev/null +++ b/test/Modules/module-file-modified.c @@ -0,0 +1,11 @@ +// RUN: rm -rf %t +// RUN: mkdir %t +// RUN: echo 'int foo = 0;' > %t/a.h +// RUN: echo 'module A { header "a.h" }' > %t/m.modulemap +// RUN: %clang_cc1 -fmodules -emit-module -fmodule-name=A -x c %t/m.modulemap -o %t/m.pcm +// RUN: echo 'int bar;' > %t/a.h +// RUN: not %clang_cc1 -fmodules -fmodule-file=%t/m.pcm -fmodule-map-file=%t/m.modulemap -x c %s -I%t -fsyntax-only 2>&1 | FileCheck %s +#include "a.h" +int foo = 0; // redefinition of 'foo' +// CHECK: fatal error: file {{.*}} has been modified since the module file {{.*}} was built +// REQUIRES: shell -- 2.40.0