[PATCH] D128328: [C++20][Modules] Improve handing of Private Module Fragment diagnostics.

Chuanqi Xu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 22 20:10:40 PDT 2022


ChuanqiXu added inline comments.


================
Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:11155
+def err_export_inline_not_defined : Error<
+  "exported inline functions must be defined within the module purview"
+  " and before any private module fragment">;
----------------
iains wrote:
> iains wrote:
> > ChuanqiXu wrote:
> > > From my reading, 'exported' is not emphasized.
> > it is here:
> > https://eel.is/c++draft/module#private.frag-2.1
> > ( I agree it is somewhat confusing, but the export makes the linkage external, which the example treats differently from the fn_m() case which has module linkage).
> > 
> > It is possible that we might need to pull together several pieces of the std and maybe ask core for clarification?
> > it is here:
> > https://eel.is/c++draft/module#private.frag-2.1
> > ( I agree it is somewhat confusing, but the export makes the linkage external, which the example treats differently from the fn_m() case which has module linkage).
> 
> hmm... my linkage comment is wrong - however the distinction between exported and odr-used seems to be made here (fn_m() and fn_e()).
> > 
> > It is possible that we might need to pull together several pieces of the std and maybe ask core for clarification?
> 
> 
What I read is:
> [dcl.inline]p7: https://eel.is/c++draft/dcl.inline#7
>     If an inline function or variable that is attached to a named module is declared in a definition domain, it shall be defined in that domain.

and the definition of `definition domain` is:
> [basic.def.odr]p12: https://eel.is/c++draft/basic#def.odr-12
>       A definition domain is a private-module-fragment or the portion of a translation unit excluding its private-module-fragment (if any).

The definition of "attached to a named module" is:
> [module.unit]p7: https://eel.is/c++draft/module.unit#7
>      A module is either a named module or the global module. A declaration is attached to a module as follows: ...

So it is clearly not consistency with [module.private.frag]p2.1. I would send this to WG21.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D128328



More information about the cfe-commits mailing list