Author: Chuanqi Xu Date: 2023-09-08T16:53:12+08:00 New Revision: 96122b5b717c2b1a291d7298ac50b1daf02bd97c
URL: https://github.com/llvm/llvm-project/commit/96122b5b717c2b1a291d7298ac50b1daf02bd97c DIFF: https://github.com/llvm/llvm-project/commit/96122b5b717c2b1a291d7298ac50b1daf02bd97c.diff LOG: [C++20] [Modules] Introduce ForceCheckCXX20ModulesInputFiles options for C++20 modules Previously, we banned the check for input files from C++20 modules since we thought the BMI from C++20 modules should be a standalone artifact. However, during the recent experiment with clangd for modules, I find it is necessary to tell whether or not a BMI is out-of-date by checking the input files especially for language servers. So this patch brings a header search option ForceCheckCXX20ModulesInputFiles to allow the tools (concretly, clangd) to check the input files from BMI. Added: clang/test/Modules/cxx20-force-check-input.cppm Modified: clang/include/clang/Driver/Options.td clang/include/clang/Lex/HeaderSearchOptions.h clang/lib/Frontend/ASTUnit.cpp clang/lib/Serialization/ASTReader.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index b29e2e53f938544..4bc292c1fa1620c 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2906,6 +2906,11 @@ def fvalidate_ast_input_files_content: " Files with mismatching mtime's are considered valid" " if both contents is identical">, MarshallingInfoFlag<HeaderSearchOpts<"ValidateASTInputFilesContent">>; +def fforce_check_cxx20_modules_input_files: + Flag <["-"], "fforce-check-cxx20-modules-input-files">, + Group<f_Group>, Visibility<[ClangOption, CC1Option]>, + HelpText<"Check the input source files from C++20 modules explicitly">, + MarshallingInfoFlag<HeaderSearchOpts<"ForceCheckCXX20ModulesInputFiles">>; def fmodules_validate_input_files_content: Flag <["-"], "fmodules-validate-input-files-content">, Group<f_Group>, Flags<[NoXarchOption]>, diff --git a/clang/include/clang/Lex/HeaderSearchOptions.h b/clang/include/clang/Lex/HeaderSearchOptions.h index 6436a9b3bde20a2..126659f3ac00223 100644 --- a/clang/include/clang/Lex/HeaderSearchOptions.h +++ b/clang/include/clang/Lex/HeaderSearchOptions.h @@ -211,6 +211,9 @@ class HeaderSearchOptions { // validate consistency. unsigned ValidateASTInputFilesContent : 1; + // Whether the input files from C++20 Modules should be checked. + unsigned ForceCheckCXX20ModulesInputFiles : 1; + /// Whether the module includes debug information (-gmodules). unsigned UseDebugInfo : 1; @@ -233,7 +236,8 @@ class HeaderSearchOptions { UseStandardCXXIncludes(true), UseLibcxx(false), Verbose(false), ModulesValidateOncePerBuildSession(false), ModulesValidateSystemHeaders(false), - ValidateASTInputFilesContent(false), UseDebugInfo(false), + ValidateASTInputFilesContent(false), + ForceCheckCXX20ModulesInputFiles(false), UseDebugInfo(false), ModulesValidateDiagnosticOptions(true), ModulesHashContent(false), ModulesStrictContextHash(false) {} diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index a4753f525d9de2d..167db521a890cd9 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -550,12 +550,16 @@ class ASTInfoCollector : public ASTReaderListener { bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, bool Complain) override { - // Preserve previously set header search paths. + // llvm::SaveAndRestore doesn't support bit field. + auto ForceCheckCXX20ModulesInputFiles = + this->HSOpts.ForceCheckCXX20ModulesInputFiles; llvm::SaveAndRestore X(this->HSOpts.UserEntries); llvm::SaveAndRestore Y(this->HSOpts.SystemHeaderPrefixes); llvm::SaveAndRestore Z(this->HSOpts.VFSOverlayFiles); this->HSOpts = HSOpts; + this->HSOpts.ForceCheckCXX20ModulesInputFiles = + ForceCheckCXX20ModulesInputFiles; return false; } diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 8ece979f2408e4d..576da09095002b0 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -2428,6 +2428,16 @@ InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { // For standard C++ modules, we don't need to check the inputs. bool SkipChecks = F.StandardCXXModule; + const HeaderSearchOptions &HSOpts = + PP.getHeaderSearchInfo().getHeaderSearchOpts(); + + // The option ForceCheckCXX20ModulesInputFiles is only meaningful for C++20 + // modules. + if (F.StandardCXXModule && HSOpts.ForceCheckCXX20ModulesInputFiles) { + SkipChecks = false; + Overridden = false; + } + OptionalFileEntryRefDegradesToFileEntryPtr File = OptionalFileEntryRef( expectedToOptional(FileMgr.getFileRef(Filename, /*OpenFile=*/false))); diff --git a/clang/test/Modules/cxx20-force-check-input.cppm b/clang/test/Modules/cxx20-force-check-input.cppm new file mode 100644 index 000000000000000..4611f8f7cafa17e --- /dev/null +++ b/clang/test/Modules/cxx20-force-check-input.cppm @@ -0,0 +1,33 @@ +// RUN: rm -rf %t +// RUN: split-file %s %t +// +// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple \ +// RUN: %t/a.cppm -emit-module-interface -o %t/a.pcm +// +// RUN: echo "inline int bar = 46;" >> %t/foo.h +// RUNX: %clang_cc1 -std=c++20 -triple %itanium_abi_triple \ +// RUNX: %t/use.cpp -fmodule-file=a=%t/a.pcm -verify -fsyntax-only +// RUNX: %clang_cc1 -std=c++20 -triple %itanium_abi_triple \ +// RUNX: %t/a.pcm -emit-llvm -o - | FileCheck %t/a.ll +// +// RUN: echo "export int var = 43;" >> %t/a.cppm +// RUNX: %clang_cc1 -std=c++20 -triple %itanium_abi_triple \ +// RUNX: %t/use.cpp -fmodule-file=a=%t/a.pcm -verify -fsyntax-only +// RUNX: %clang_cc1 -std=c++20 -triple %itanium_abi_triple \ +// RUNX: %t/a.pcm -emit-llvm -o - | FileCheck %t/a.ll +// +// RUN: not %clang_cc1 -std=c++20 -triple %itanium_abi_triple \ +// RUN: -fforce-check-cxx20-modules-input-files %t/a.pcm \ +// RUN: -emit-llvm -o - 2>&1 | FileCheck %t/a.cppm -check-prefix=CHECK-FAILURE + +//--- foo.h +inline int foo = 43; + +//--- a.cppm +// expected-no-diagnostics +module; +#include "foo.h" +export module a; +export using ::foo; + +// CHECK-FAILURE: fatal error:{{.*}}a.cppm' has been modified since the AST file {{.*}}was built _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits