Issue 163652
Summary Clang modules does not handle visibility vs. reachability the same way as C++ named modules.
Labels clang:modules
Assignees
Reporter Bigcheese
    Clang modules allow controlling the visibility of names using `export` in module maps. This long predates standard C++ modules and so has somewhat ad hoc semantics. A major difference is that in C++ 20 modules, `export` only controls the visibility of the name of an entity, while in Clang modules it also (kind of) controls if it is considered reachable.

Some examples:

```
module A {
  header "A.h"
}

module B {
  header "B.h"
}
```

```cpp
/// A.h
struct A0 {};

/// B.h
#include "A.h"
struct B0 {
  A0 a0{};
};

using B1 = A0;

struct B2 : A0 {};

/// test.cpp - clang++ -fmodules -fsyntax-only test.cpp
#include "B.h"
B0 b0{}; // ok, but needs A0
const auto sizeB0 = sizeof(B0); // ok, but needs A0
B1 b1{}; // error: missing '#include "A.h"'; 'A0' must be defined before it is used
B2 b2{}; // error: missing '#include "A.h"'; 'A0' must be defined before it is used
decltype(B0::a0) a0{}; // error: missing '#include "A.h"'; 'A0' must be defined before it is used
```

With C++20 named modules:

```cpp
/// A.cppm
export module A;
export struct A0 {};

/// B.cppm
export module B;
import A;
export struct B0 {
  A0 a0{};
};

export using B1 = A0;

export struct B2 : A0 {};

/// test.cpp
import B;
B0 b0{}; // ok
const auto sizeB0 = sizeof(B0); // ok
B1 b1{}; // ok
B2 b2{}; // ok
decltype(B0::a0) a0{}; // ok
```

We should model export in Clang modules the same way as it is in C++ named modules. Clang's current behavior allows a somewhat arbitrary set of things that require the definition of `A0` to be reachable.

We should also allow macros to reference non-exported macros with a similar set of rules to templates. If the expansion chain contains a source location where such a macro is visible then it should be. For example:

```cpp
// same module map as above

/// A.h
#define Anum 5

/// B.h
#include "A.h"
#define B(x) x##num

/// test.cpp
#include "B.h"
int i = B(A);
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to