https://github.com/vsapsai created 
https://github.com/llvm/llvm-project/pull/138227

According to the documentation
> A header declaration that does not contain `exclude` nor `textual` specifies 
> a header that contributes to the enclosing module.

Which means that `exclude` and `textual` header don't contribute to the 
enclosing module and their presence isn't required to build such a module. The 
keywords tell clang how a header should be treated in a context of the module 
but they don't add headers to the module.

When a textual header *is* used, clang still emits "file not found" error 
pointing to the location where the missing file is included.

>From d974d5e49406f02b37e9606e15e0d829ae3a5637 Mon Sep 17 00:00:00 2001
From: Volodymyr Sapsai <vsap...@apple.com>
Date: Thu, 1 May 2025 20:39:36 -0700
Subject: [PATCH] [Modules] Don't fail when an unused textual header is
 missing.

According to the documentation
> A header declaration that does not contain `exclude` nor `textual` specifies 
> a header that contributes to the enclosing module.

Which means that `exclude` and `textual` header don't contribute to the
enclosing module and their presence isn't required to build such a module.
The keywords tell clang how a header should be treated in a context of
the module but they don't add headers to the module.

When a textual header *is* used, clang still emits "file not found" error
pointing to the location where the missing file is included.
---
 clang/lib/Lex/ModuleMap.cpp                           | 6 ++++--
 clang/test/Modules/Inputs/submodules/module.modulemap | 4 ++++
 clang/test/Modules/missing-header.m                   | 3 +++
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp
index c2f13fa48d464..1ba02b919a22a 100644
--- a/clang/lib/Lex/ModuleMap.cpp
+++ b/clang/lib/Lex/ModuleMap.cpp
@@ -310,8 +310,10 @@ void ModuleMap::resolveHeader(Module *Mod,
   } else if (Header.HasBuiltinHeader && !Header.Size && !Header.ModTime) {
     // There's a builtin header but no corresponding on-disk header. Assume
     // this was supposed to modularize the builtin header alone.
-  } else if (Header.Kind == Module::HK_Excluded) {
-    // Ignore missing excluded header files. They're optional anyway.
+  } else if ((Header.Kind == Module::HK_Excluded) ||
+             (Header.Kind == Module::HK_Textual)) {
+    // Ignore excluded and textual header files as a module can be built with
+    // such headers missing.
   } else {
     // If we find a module that has a missing header, we mark this module as
     // unavailable and store the header directive for displaying diagnostics.
diff --git a/clang/test/Modules/Inputs/submodules/module.modulemap 
b/clang/test/Modules/Inputs/submodules/module.modulemap
index 1c1b76a08969e..9e8143b8101de 100644
--- a/clang/test/Modules/Inputs/submodules/module.modulemap
+++ b/clang/test/Modules/Inputs/submodules/module.modulemap
@@ -30,3 +30,7 @@ module missing_umbrella_with_inferred_submodules {
   module * { export * }
   export *
 }
+
+module missing_textual_header {
+  textual header "missing_textual.h"
+}
diff --git a/clang/test/Modules/missing-header.m 
b/clang/test/Modules/missing-header.m
index c162e1b5f08b3..84d82e5ceda32 100644
--- a/clang/test/Modules/missing-header.m
+++ b/clang/test/Modules/missing-header.m
@@ -8,6 +8,9 @@
 @import missing_unavailable_headers.not_missing; // OK
 // CHECK-NOT: missing_unavailable_headers
 
+@import missing_textual_header; // OK
+// CHECK-NOT: missing_textual_header
+
 @import missing_headers;
 // CHECK: module.modulemap:15:27: error: header 'missing.h' not found
 // CHECK: could not build module 'missing_headers'

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to