Skip to content

Commit

Permalink
[docs] [C++20] [Modules] Remove the section 'Source content consistency'
Browse files Browse the repository at this point in the history
Since the C++20 named modules won't check source files consistency after
5b388f8, it would be better to remove this section in the document.
  • Loading branch information
ChuanqiXu9 committed May 10, 2023
1 parent 7ab9478 commit 7adf384
Showing 1 changed file with 0 additions and 103 deletions.
103 changes: 0 additions & 103 deletions clang/docs/StandardCPlusPlusModules.rst
Original file line number Diff line number Diff line change
Expand Up @@ -461,109 +461,6 @@ Note that **currently** the compiler doesn't consider inconsistent macro definit
Currently Clang would accept the above example. But it may produce surprising results if the
debugging code depends on consistent use of ``NDEBUG`` also in other translation units.

Source content consistency
^^^^^^^^^^^^^^^^^^^^^^^^^^

When the compiler reads a BMI, the compiler will check the consistency of the corresponding
source files. For example:

.. code-block:: c++

// M.cppm
export module M;
export template <class T>
T foo(T t) {
return t;
}

// Use.cpp
import M;
void bar() {
foo(5);
}

.. code-block:: console
$ clang++ -std=c++20 M.cppm --precompile -o M.pcm
$ rm M.cppm
$ clang++ -std=c++20 Use.cpp -fmodule-file=M=M.pcm
The compiler would reject the example since the compiler failed to find the source file to check the consistency.
So the following example would be rejected too.

.. code-block:: console
$ clang++ -std=c++20 M.cppm --precompile -o M.pcm
$ echo "int i=0;" >> M.cppm
$ clang++ -std=c++20 Use.cpp -fmodule-file=M=M.pcm
The compiler would reject it too since the compiler detected the file was changed.

But it is OK to move the BMI as long as the source files remain:

.. code-block:: console
$ clang++ -std=c++20 M.cppm --precompile -o M.pcm
$ mkdir -p tmp
$ mv M.pcm tmp/M.pcm
$ clang++ -std=c++20 Use.cpp -fmodule-file=M=tmp/M.pcm
The above example would be accepted.

If the user doesn't want to follow the consistency requirement due to some reasons (e.g., distributing BMI),
the user could try to use ``-Xclang -fmodules-embed-all-files`` when producing BMI. For example:

.. code-block:: console
$ clang++ -std=c++20 M.cppm --precompile -Xclang -fmodules-embed-all-files -o M.pcm
$ rm M.cppm
$ clang++ -std=c++20 Use.cpp -fmodule-file=M=M.pcm
Now the compiler would accept the above example.
Important note: Xclang options are intended to be used by compiler internally and its semantics
are not guaranteed to be preserved in future versions.

Also the compiler will record the path to the header files included in the global module fragment and compare the
headers when imported. For example,

.. code-block:: c++

// foo.h
#include <iostream>
void Hello() {
std::cout << "Hello World.\n";
}

// foo.cppm
module;
#include "foo.h"
export module foo;
export using ::Hello;

// Use.cpp
import foo;
int main() {
Hello();
}

Then it is problematic if we remove ``foo.h`` before import `foo` module.

.. code-block:: console
$ clang++ -std=c++20 foo.cppm --precompile -o foo.pcm
$ mv foo.h foo.orig.h
# The following one is rejected
$ clang++ -std=c++20 Use.cpp -fmodule-file=foo=foo.pcm -c
The above case will rejected. And we're still able to workaround it by ``-Xclang -fmodules-embed-all-files`` option:

.. code-block:: console
$ clang++ -std=c++20 foo.cppm --precompile -Xclang -fmodules-embed-all-files -o foo.pcm
$ mv foo.h foo.orig.h
$ clang++ -std=c++20 Use.cpp -fmodule-file=foo=foo.pcm -c -o Use.o
$ clang++ Use.o foo.pcm
ABI Impacts
-----------

Expand Down

0 comments on commit 7adf384

Please sign in to comment.