[PATCH] D25806: Module: correctly set the module file kind when emitting diagnostics for file_modified

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 19 17:18:18 PDT 2016


On Wed, Oct 19, 2016 at 5:05 PM, Manman Ren <manman.ren at gmail.com> wrote:

> manmanren created this revision.
> manmanren added reviewers: bruno, rsmith, benlangmuir.
> manmanren added a subscriber: cfe-commits.
>
> I don't quite like the if statement in the patch, but given that
> ASTReader::Error and DelayedDiagnostic only take strings, it is hard to
> just change err_fe_pch_file_modified to take a %select that depends on an
> integer.
>
> On the other hard, it seems impossible to have another diagnostics in
> flight when emitting err_fe_pch_file_modified. Is it okay to just use Diag
> instead of Error?
>

No, this diagnostic can be produced lazily when first trying to emit a
diagnostic that points into the modified file.


> Unfortunately I was not able to come up with a test that outputs this
> diagnostics for a module file.
>

Try something like this:

// RUN: rm -rf %t
// RUN: mkdir %t
// RUN: echo 'int foo = 0;' > %t/a
// RUN: echo 'module A { header "a" }' > %t/m
// RUN: %clang_cc1 -fmodules -emit-module -fmodule-name=A -x c %t/m -o
%t/pcm
// RUN: echo 'int bar;' > %t/a
// RUN: %clang_cc1 -fmodules -fmodule-file=%t/pcm -fmodule-map-file=%t/m -x
c %s -I%t
#include "a"
int foo = 0;

https://reviews.llvm.org/D25806
>
> Files:
>   include/clang/Basic/DiagnosticSerializationKinds.td
>   lib/Serialization/ASTReader.cpp
>
>
> Index: lib/Serialization/ASTReader.cpp
> ===================================================================
> --- lib/Serialization/ASTReader.cpp
> +++ lib/Serialization/ASTReader.cpp
> @@ -1983,6 +1983,7 @@
>    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 @@
>
>        // The top-level PCH is stale.
>        StringRef TopLevelPCHName(ImportStack.back()->FileName);
> -      Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
> +      unsigned DiagnosticKind = moduleKindForDiagnostic(Import
> Stack.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()) {
> Index: include/clang/Basic/DiagnosticSerializationKinds.td
> ===================================================================
> --- include/clang/Basic/DiagnosticSerializationKinds.td
> +++ include/clang/Basic/DiagnosticSerializationKinds.td
> @@ -21,6 +21,12 @@
>  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'">;
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161019/02e8e597/attachment-0001.html>


More information about the cfe-commits mailing list