iains added inline comments.

================
Comment at: clang/include/clang/Sema/Sema.h:2978-2980
+  /// The parser has begun a translation unit to be compiled as a C++20
+  /// Header Unit.
+  void ActOnStartOfHeaderUnit();
----------------
ChuanqiXu wrote:
> From the implementation, I think it should be called only in 
> `ActOnStartOfTranslationUnit`. So it would be better to move this function to 
> private section to avoid accident calls. We should add such constraint as 
> assumption or at least comment to tell it should be called by 
> `ActOnStartOfTranslationUnit`.
> 
> ---
> 
> The name `ActOnStartOf*` implies there should be a corresponding 
> `ActOnEndOf*`  methods. But there isn't one. So I would suggest to give 
> another name to avoid ambiguity.
> From the implementation, I think it should be called only in 
> `ActOnStartOfTranslationUnit`. So it would be better to move this function to 
> private section to avoid accident calls. We should add such constraint as 
> assumption or at least comment to tell it should be called by 
> `ActOnStartOfTranslationUnit`.

OK, I've made this private and updated the comment to note that this is a 
helper for ActOnStartOfTranslationUnit

> ---
> 
> The name `ActOnStartOf*` implies there should be a corresponding 
> `ActOnEndOf*`  methods. But there isn't one. So I would suggest to give 
> another name to avoid ambiguity.

Is this a rule?

I think that the name `ActOnStartOfHeaderUnit()` says exactly what we are 
doing, of course, at some time we might need an `ActOnEndOfHeaderUnit()` - but 
we should not add an empty function for that reason.

(this is not a sticking point; if consensus is that the name is confusing, I 
will change it).



================
Comment at: clang/lib/AST/Decl.cpp:1573-1574
       InternalLinkage = isInAnonymousNamespace();
-    return InternalLinkage ? M->Parent : nullptr;
+    return InternalLinkage ? M->Kind == Module::ModuleHeaderUnit ? M : 
M->Parent
+                           : nullptr;
   }
----------------
ChuanqiXu wrote:
> How about
> ```
> return InternalLinkage ? M->getTopLevelModule() : nullptr; 
> ```
that would alter the behaviour of the existing code.

getTopLevelModule() will return the ultimate parent:
```
  const Module *Result = this;
  while (Result->Parent)
    Result = Result->Parent;
```
where the existing code only returns the immediate parent (perhaps that is 
unintended, but it should be fixed separately if so).



================
Comment at: clang/lib/Parse/Parser.cpp:2476
     // We can only have pre-processor directives in the global module
     // fragment.  We can, however have a header unit import here.
+    if (!HeaderUnit || HeaderUnit->Kind != 
Module::ModuleKind::ModuleHeaderUnit)
----------------
ChuanqiXu wrote:
> The comment is not accurate. `header unit import` is pre-processor too. 
> http://eel.is/c++draft/cpp.import
> The comment is not accurate. `header unit import` is pre-processor too. 

the pre-processor 'import' is a pre-processor directive. 

https://eel.is/c++draft/cpp.pre#1

I amended to clarify that we cannot import a named module in this position - 
only a header unit.


================
Comment at: clang/lib/Sema/SemaModule.cpp:519
+             (ModuleScopes.back().ModuleInterface ||
+              ModuleScopes.back().Module->isGlobalModule())) {
     // Re-export the module if the imported module is exported.
----------------
ChuanqiXu wrote:
> I would feel better if we add an assertion below to assert 
> `ModuleScopes.back().Module->isGlobalModule()` is true only if Mod is Header 
> Unit.
> 
OK, done.
I also added a check for CPlusPlus modules, since modules-ts has an implicit 
GMF and slightly different rules.



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D121095

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

Reply via email to