[clang] 85b113c - [Doc] [C++20] [Modules] Clarify the reachability of internal partition units (#102572)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 13 01:34:37 PDT 2024
Author: Chuanqi Xu
Date: 2024-08-13T16:34:32+08:00
New Revision: 85b113c381d14d69bb6f1386488308859f74feaf
URL: https://github.com/llvm/llvm-project/commit/85b113c381d14d69bb6f1386488308859f74feaf
DIFF: https://github.com/llvm/llvm-project/commit/85b113c381d14d69bb6f1386488308859f74feaf.diff
LOG: [Doc] [C++20] [Modules] Clarify the reachability of internal partition units (#102572)
Motivated by https://github.com/llvm/llvm-project/issues/101348
Although I don't want the tool's doc to explain the standard's wording,
the wording itself has some unspecified thing. So I feel it will be
helpful to make it clear. At least it may help us receive less invalid
issue reports.
Added:
Modified:
clang/docs/StandardCPlusPlusModules.rst
Removed:
################################################################################
diff --git a/clang/docs/StandardCPlusPlusModules.rst b/clang/docs/StandardCPlusPlusModules.rst
index 2478a77e7640c5..ccc0cb59f8e710 100644
--- a/clang/docs/StandardCPlusPlusModules.rst
+++ b/clang/docs/StandardCPlusPlusModules.rst
@@ -1230,6 +1230,58 @@ parsing their headers, those should be included after the import. If the
imported modules don't provide such a header, one can be made manually for
improved compile time performance.
+Reachability of internal partition units
+----------------------------------------
+
+The internal partition units are sometimes called implementation partition units in other documentation.
+However, the name may be confusing since implementation partition units are not implementation
+units.
+
+According to `[module.reach]p1 <https://eel.is/c++draft/module.reach#1>`_ and
+`[module.reach]p2 <https://eel.is/c++draft/module.reach#2>`_ (from N4986):
+
+ A translation unit U is necessarily reachable from a point P if U is a module
+ interface unit on which the translation unit containing P has an interface
+ dependency, or the translation unit containing P imports U, in either case
+ prior to P.
+
+ All translation units that are necessarily reachable are reachable. Additional
+ translation units on which the point within the program has an interface
+ dependency may be considered reachable, but it is unspecified which are and
+ under what circumstances.
+
+For example,
+
+.. code-block:: c++
+
+ // a.cpp
+ import B;
+ int main()
+ {
+ g<void>();
+ }
+
+ // b.cppm
+ export module B;
+ import :C;
+ export template <typename T> inline void g() noexcept
+ {
+ return f<T>();
+ }
+
+ // c.cppm
+ module B:C;
+ template<typename> inline void f() noexcept {}
+
+The internal partition unit ``c.cppm`` is not necessarily reachable by
+``a.cpp`` because ``c.cppm`` is not a module interface unit and ``a.cpp``
+doesn't import ``c.cppm``. This leaves it up to the compiler to decide if
+``c.cppm`` is reachable by ``a.cpp`` or not. Clang's behavior is that
+indirectly imported internal partition units are not reachable.
+
+The suggested approach for using an internal partition unit in Clang is
+to only import them in the implementation unit.
+
Known Issues
------------
More information about the cfe-commits
mailing list