ilya-biryukov marked 2 inline comments as done.
ilya-biryukov added a comment.

In D131258#3705503 <https://reviews.llvm.org/D131258#3705503>, @ChuanqiXu wrote:

> When I run this locally, it emits several unexpected errors:

Sorry, my bad. I was testing this with `-std=c++20` and later switched to 
`-std=c++17` as this does not have any C++20-related features.
I thought I reran the tests with `-std=c++17` before sending out the patch, but 
apparently I did not.
The reason why this worked in C++20 mode is that C++20 implies `-fcxx-modules`, 
which imply `-fmodules-local-submodule-visibility`.
Without the latter flag, all declarations inside the same TU are visible, even 
when not imported.

I have added `-fmodules-local-submodule-visibility` to the tests and also 
included a comment explaining why we need it.
While here, also switched to C++14, which seems enough here.



================
Comment at: clang/test/Modules/merge-var-template-spec-cxx-modules.cpp:18-23
+template <class T> constexpr T zero = 0; // expected-error-re 
{{declaration{{.*}}in the global module follows declaration in module var_def}}
+                                         // expected-note@* {{previous}}
+template <> constexpr Int zero<Int> = {0}; // expected-error-re 
{{declaration{{.*}}in the global module follows declaration in module var_def}}
+                                           // expected-note@* {{previous}}
+template <class T> constexpr T* zero<T*> = nullptr; // expected-error-re 
{{declaration{{.*}}in the global module follows declaration in module var_def}}
+                                                    // expected-note@* 
{{previous}}
----------------
ChuanqiXu wrote:
> BTW, these errors are not expected by me since they are not in a named 
> modules and they are in different TU with var_def.cppm.
> 
I am not sure about this one, but my understanding of the standard was that no 
two definitions are allowed if any is attached to a named module.
Am I reading the standard wrong here?
The relevant bits from my perspective are in [[ 
https://eel.is/c++draft/basic.def.odr#14.3 | {basic.def.odr}p14.3 ]]:
```
For any definable item D with definitions in multiple translation units,
...
- if the definitions in different translation units do not satisfy the 
following requirements,
the program is ill-formed; a diagnostic is required only if the definable item 
is attached to a named module and a prior definition is reachable at the point 
where a later definition occurs. 
...
  - Each such definition shall not be attached to a named module 
([module.unit]).
```
The diagnostic seems to be required by the standard when looking at a 
declaration in the named module and this example is the other way around here.
However, I don't see why we can't provide a diagnostic in that case too.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D131258

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to