[PATCH] D132779: Enforce module decl-use restrictions and private header restrictions in textual headers

Jan Svoboda via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 21 13:56:33 PDT 2023


jansvoboda11 added a comment.

Hi @rsmith, this commit makes it possible for `HeaderInfo::LookupFile()` to be called with different `RequestingModule` within single `CompilerInstance`. This is problematic, since some modules may see headers other modules can't (due to `[no_undeclared_includes]`). This can permanently mess up contents of the lookup cache (`HeaderSearch::LookupFileCache`) that uses only the lookup name as the key. You can see the minimal reproducer below. On our side, we can work around this by using `-fno-modules-validate-textual-header-includes`, but I think this will need to be fixed before that options goes away.

  // RUN: rm -rf %t
  // RUN: split-file %s %t
  
  //--- include/module.modulemap
  module A [no_undeclared_includes] { textual header "A.h" }
  module B { header "B.h" }
  //--- include/A.h
  #if __has_include(<B.h>)
  #error Even textual headers within module A now inherit [no_undeclared_includes] \
         and thus do not have that include.
  #endif
  //--- include/B.h
  
  //--- tu.c
  #if !__has_include(<B.h>)
  #error Main TU does have that include.
  #endif
  
  #include "A.h"
  
  #if !__has_include(<B.h>)
  #error Main TU still has that include.
  // We hit the above because the unsuccessful __has_include check in A.h taints
  // lookup cache (HeaderSearch::LookupFileCache) of this CompilerInstance.
  #endif
  
  // RUN: %clang_cc1 -I %t/include -fmodules -fimplicit-module-maps \
  // RUN:   -fmodules-cache-path=%t/cache -fsyntax-only %t/tu.c


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D132779/new/

https://reviews.llvm.org/D132779



More information about the cfe-commits mailing list