[clang] [clang] Allow generating module interfaces with parsing errors (PR #121485)
Alejandro Álvarez Ayllón via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 2 07:34:48 PST 2025
https://github.com/alejandro-alvarez-sonarsource created https://github.com/llvm/llvm-project/pull/121485
Fixes a regression introduced in commit da00c60dae0040185dc45039c4397f6e746548e9
This functionality was originally added in commit 5834996fefc937d6211dc8c8a5b200068753391a
>From dcdc88688d95383d3373f5b27660a39e49650eaa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alejandro=20=C3=81lvarez=20Ayll=C3=B3n?=
<alejandro.alvarez at sonarsource.com>
Date: Thu, 2 Jan 2025 16:31:03 +0100
Subject: [PATCH] [clang] Allow generating module interfaces with parsing
errors
Fixes a regression introduced by da00c60dae0040185dc45039c4397f6e746548e9
Co-authored-by: Tomasz Kaminski <tomasz.kaminski at sonarsource.com>
---
clang/include/clang/Serialization/ASTWriter.h | 13 ++++++----
clang/lib/Frontend/FrontendActions.cpp | 6 +++--
clang/lib/Serialization/GeneratePCH.cpp | 5 ++--
clang/test/Modules/pcm-with-errors.cpp | 26 +++++++++++++++++++
4 files changed, 41 insertions(+), 9 deletions(-)
create mode 100644 clang/test/Modules/pcm-with-errors.cpp
diff --git a/clang/include/clang/Serialization/ASTWriter.h b/clang/include/clang/Serialization/ASTWriter.h
index cb972f01064028..adb7cce522a803 100644
--- a/clang/include/clang/Serialization/ASTWriter.h
+++ b/clang/include/clang/Serialization/ASTWriter.h
@@ -997,13 +997,15 @@ class CXX20ModulesGenerator : public PCHGenerator {
virtual Module *getEmittingModule(ASTContext &Ctx) override;
CXX20ModulesGenerator(Preprocessor &PP, InMemoryModuleCache &ModuleCache,
- StringRef OutputFile, bool GeneratingReducedBMI);
+ StringRef OutputFile, bool GeneratingReducedBMI,
+ bool AllowASTWithErrors);
public:
CXX20ModulesGenerator(Preprocessor &PP, InMemoryModuleCache &ModuleCache,
- StringRef OutputFile)
+ StringRef OutputFile, bool AllowASTWithErrors = false)
: CXX20ModulesGenerator(PP, ModuleCache, OutputFile,
- /*GeneratingReducedBMI=*/false) {}
+ /*GeneratingReducedBMI=*/false,
+ AllowASTWithErrors) {}
void HandleTranslationUnit(ASTContext &Ctx) override;
};
@@ -1013,9 +1015,10 @@ class ReducedBMIGenerator : public CXX20ModulesGenerator {
public:
ReducedBMIGenerator(Preprocessor &PP, InMemoryModuleCache &ModuleCache,
- StringRef OutputFile)
+ StringRef OutputFile, bool AllowASTWithErrors = false)
: CXX20ModulesGenerator(PP, ModuleCache, OutputFile,
- /*GeneratingReducedBMI=*/true) {}
+ /*GeneratingReducedBMI=*/true,
+ AllowASTWithErrors) {}
};
/// If we can elide the definition of \param D in reduced BMI.
diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp
index e943f143d4c158..30dfa5481d070a 100644
--- a/clang/lib/Frontend/FrontendActions.cpp
+++ b/clang/lib/Frontend/FrontendActions.cpp
@@ -279,12 +279,14 @@ GenerateModuleInterfaceAction::CreateASTConsumer(CompilerInstance &CI,
!CI.getFrontendOpts().ModuleOutputPath.empty()) {
Consumers.push_back(std::make_unique<ReducedBMIGenerator>(
CI.getPreprocessor(), CI.getModuleCache(),
- CI.getFrontendOpts().ModuleOutputPath));
+ CI.getFrontendOpts().ModuleOutputPath,
+ +CI.getFrontendOpts().AllowPCMWithCompilerErrors));
}
Consumers.push_back(std::make_unique<CXX20ModulesGenerator>(
CI.getPreprocessor(), CI.getModuleCache(),
- CI.getFrontendOpts().OutputFile));
+ CI.getFrontendOpts().OutputFile,
+ +CI.getFrontendOpts().AllowPCMWithCompilerErrors));
return std::make_unique<MultiplexConsumer>(std::move(Consumers));
}
diff --git a/clang/lib/Serialization/GeneratePCH.cpp b/clang/lib/Serialization/GeneratePCH.cpp
index 7a8a951b34f251..a3189bb40b1912 100644
--- a/clang/lib/Serialization/GeneratePCH.cpp
+++ b/clang/lib/Serialization/GeneratePCH.cpp
@@ -102,12 +102,13 @@ void PCHGenerator::anchor() {}
CXX20ModulesGenerator::CXX20ModulesGenerator(Preprocessor &PP,
InMemoryModuleCache &ModuleCache,
StringRef OutputFile,
- bool GeneratingReducedBMI)
+ bool GeneratingReducedBMI,
+ bool AllowASTWithErrors)
: PCHGenerator(
PP, ModuleCache, OutputFile, llvm::StringRef(),
std::make_shared<PCHBuffer>(),
/*Extensions=*/ArrayRef<std::shared_ptr<ModuleFileExtension>>(),
- /*AllowASTWithErrors*/ false, /*IncludeTimestamps=*/false,
+ AllowASTWithErrors, /*IncludeTimestamps=*/false,
/*BuildingImplicitModule=*/false, /*ShouldCacheASTInMemory=*/false,
GeneratingReducedBMI) {}
diff --git a/clang/test/Modules/pcm-with-errors.cpp b/clang/test/Modules/pcm-with-errors.cpp
new file mode 100644
index 00000000000000..1bbc3865ee3ee9
--- /dev/null
+++ b/clang/test/Modules/pcm-with-errors.cpp
@@ -0,0 +1,26 @@
+// RUN: rm -rf %t
+// RUN: split-file %s %t
+// RUN: cd %t
+
+// RUN: %clang_cc1 -std=c++23 m.cppm -emit-module-interface -o m.pcm -fallow-pcm-with-compiler-errors -verify
+// RUN: %clang_cc1 -std=c++23 main.cpp -fmodule-file=m=m.pcm -verify -fallow-pcm-with-compiler-errors -verify
+
+// RUN: %clang_cc1 -std=c++23 m.cppm -fmodules-reduced-bmi -emit-module-interface -o m.pcm -fallow-pcm-with-compiler-errors -verify
+// RUN: %clang_cc1 -std=c++23 main.cpp -fmodule-file=m=m.pcm -verify -fallow-pcm-with-compiler-errors -verify
+
+//--- m.cppm
+export module m;
+
+export int f() {
+ return 0;
+}
+
+export struct Foo {
+ __Int bar; // expected-error {{unknown type name '__Int'}}
+};
+
+//--- main.cpp
+// expected-no-diagnostics
+import m; // ok
+
+static_assert(__is_same(decltype(f), int())); // ok
More information about the cfe-commits
mailing list