[clang] Revert "[Modules] [HeaderSearch] Don't reenter headers if it is pragm… (PR #79396)

via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 24 17:55:01 PST 2024


https://github.com/gulfemsavrun created https://github.com/llvm/llvm-project/pull/79396

…a once  (#76119)"

This reverts commit f0c387038854d61a632520a4073d1b6ebf4997ed because it causes an lldb test to fail on a missing import on Mac.
https://logs.chromium.org/logs/fuchsia/buildbucket/cr-buildbucket/8758053465398947297/+/u/lldb/test/stdout

>From ca8fadb2e771c115f877cda15c70ac52ce06440e Mon Sep 17 00:00:00 2001
From: Gulfem Savrun Yeniceri <gulfem at google.com>
Date: Thu, 25 Jan 2024 01:44:23 +0000
Subject: [PATCH] Revert "[Modules] [HeaderSearch] Don't reenter headers if it
 is pragma once  (#76119)"

This reverts commit f0c387038854d61a632520a4073d1b6ebf4997ed
because it causes an lldb test to fail because of a missing import on
Mac.
https://logs.chromium.org/logs/fuchsia/buildbucket/cr-buildbucket/8758053465398947297/+/u/lldb/test/stdout
---
 clang/lib/Lex/HeaderSearch.cpp | 78 +++++++++++++++++-----------------
 clang/test/Modules/pr73023.cpp | 19 ---------
 2 files changed, 39 insertions(+), 58 deletions(-)
 delete mode 100644 clang/test/Modules/pr73023.cpp

diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp
index dfa974e9a67ede3..0f1090187734ff2 100644
--- a/clang/lib/Lex/HeaderSearch.cpp
+++ b/clang/lib/Lex/HeaderSearch.cpp
@@ -1408,57 +1408,57 @@ bool HeaderSearch::ShouldEnterIncludeFile(Preprocessor &PP,
   // Get information about this file.
   HeaderFileInfo &FileInfo = getFileInfo(File);
 
+  // FIXME: this is a workaround for the lack of proper modules-aware support
+  // for #import / #pragma once
+  auto TryEnterImported = [&]() -> bool {
+    if (!ModulesEnabled)
+      return false;
+    // Ensure FileInfo bits are up to date.
+    ModMap.resolveHeaderDirectives(File);
+    // Modules with builtins are special; multiple modules use builtins as
+    // modular headers, example:
+    //
+    //    module stddef { header "stddef.h" export * }
+    //
+    // After module map parsing, this expands to:
+    //
+    //    module stddef {
+    //      header "/path_to_builtin_dirs/stddef.h"
+    //      textual "stddef.h"
+    //    }
+    //
+    // It's common that libc++ and system modules will both define such
+    // submodules. Make sure cached results for a builtin header won't
+    // prevent other builtin modules from potentially entering the builtin
+    // header. Note that builtins are header guarded and the decision to
+    // actually enter them is postponed to the controlling macros logic below.
+    bool TryEnterHdr = false;
+    if (FileInfo.isCompilingModuleHeader && FileInfo.isModuleHeader)
+      TryEnterHdr = ModMap.isBuiltinHeader(File);
+
+    // Textual headers can be #imported from different modules. Since ObjC
+    // headers find in the wild might rely only on #import and do not contain
+    // controlling macros, be conservative and only try to enter textual headers
+    // if such macro is present.
+    if (!FileInfo.isModuleHeader &&
+        FileInfo.getControllingMacro(ExternalLookup))
+      TryEnterHdr = true;
+    return TryEnterHdr;
+  };
+
   // If this is a #import directive, check that we have not already imported
   // this header.
   if (isImport) {
     // If this has already been imported, don't import it again.
     FileInfo.isImport = true;
 
-    // FIXME: this is a workaround for the lack of proper modules-aware support
-    // for #import / #pragma once
-    auto TryEnterImported = [&]() -> bool {
-      if (!ModulesEnabled)
-        return false;
-      // Ensure FileInfo bits are up to date.
-      ModMap.resolveHeaderDirectives(File);
-      // Modules with builtins are special; multiple modules use builtins as
-      // modular headers, example:
-      //
-      //    module stddef { header "stddef.h" export * }
-      //
-      // After module map parsing, this expands to:
-      //
-      //    module stddef {
-      //      header "/path_to_builtin_dirs/stddef.h"
-      //      textual "stddef.h"
-      //    }
-      //
-      // It's common that libc++ and system modules will both define such
-      // submodules. Make sure cached results for a builtin header won't
-      // prevent other builtin modules from potentially entering the builtin
-      // header. Note that builtins are header guarded and the decision to
-      // actually enter them is postponed to the controlling macros logic below.
-      bool TryEnterHdr = false;
-      if (FileInfo.isCompilingModuleHeader && FileInfo.isModuleHeader)
-        TryEnterHdr = ModMap.isBuiltinHeader(File);
-
-      // Textual headers can be #imported from different modules. Since ObjC
-      // headers find in the wild might rely only on #import and do not contain
-      // controlling macros, be conservative and only try to enter textual
-      // headers if such macro is present.
-      if (!FileInfo.isModuleHeader &&
-          FileInfo.getControllingMacro(ExternalLookup))
-        TryEnterHdr = true;
-      return TryEnterHdr;
-    };
-
     // Has this already been #import'ed or #include'd?
     if (PP.alreadyIncluded(File) && !TryEnterImported())
       return false;
   } else {
     // Otherwise, if this is a #include of a file that was previously #import'd
     // or if this is the second #include of a #pragma once file, ignore it.
-    if (FileInfo.isPragmaOnce || FileInfo.isImport)
+    if ((FileInfo.isPragmaOnce || FileInfo.isImport) && !TryEnterImported())
       return false;
   }
 
diff --git a/clang/test/Modules/pr73023.cpp b/clang/test/Modules/pr73023.cpp
deleted file mode 100644
index 19d7df6ce8a4ce9..000000000000000
--- a/clang/test/Modules/pr73023.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// RUN: rm -rf %t
-// RUN: mkdir -p %t
-// RUN: split-file %s %t
-//
-// RUN: %clang_cc1 -std=c++20 %t/test.cpp -fsyntax-only -verify
-
-//--- i.h
-#ifndef I_H
-#pragma once
-struct S{};
-#endif
-
-//--- test.cpp
-// expected-no-diagnostics
-#include "i.h"
-
-int foo() {
-    return sizeof(S);
-}



More information about the cfe-commits mailing list