iains added a comment.

In D128328#3602646 <https://reviews.llvm.org/D128328#3602646>, @iains wrote:

> In D128328#3601080 <https://reviews.llvm.org/D128328#3601080>, @ChuanqiXu 
> wrote:
>
>> It looks like we need to handle inline variable as well to match the 
>> intention.
>
> can you construct a test-case, where this would apply and which is not 
> already diagnosed as incorrect?

Did you have some ideas here?

In D128328#3603781 <https://reviews.llvm.org/D128328#3603781>, @vsapsai wrote:

> From the perspective of handling `err_export_inline_not_defined` error as a 
> developer what about the following option?
>
>   export inline void fn_e(); // note: function 'fn_e' exported as 'inline' 
> here
>   
>   // ...
>   module :private;
>   void fn_e() {}  // error: definition of function 'fn_e' can not be inlined 
> because it is private
>
> My suggestion isn't about specific wording but about emitting an error for 
> the definition and mention declaration in the note. Will it make easier to 
> explain the situation? Because I'm not a fan of "must be defined within the 
> module purview" and don't know how digestible it will be for others. Please 
> note that the suggestion is purely from user perspective, I haven't checked 
> how it might affect the implementation.

I agree my error message is kinda "implementor-speak" really, there's a tension 
between using something that will allow the user to find the source of the 
problem with a google search and and avoiding that.

We could implement what you suggest (pending a resolution of what we're 
actually supposed to be implementing) - I guess - but we'd need to defer the 
check until the end of the TU - i.e. after any potential PMF.  I think we can 
differentiate the case that @ChuanqiXu noted (definition local to the PMF) 
because that would not have an entry in the PendingInlineExports table.

As for transitive cases, I agree we need to defer consideration of that until 
we can discuss with core - otherwise this patch will become a rabbit hole ;)



================
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">;
----------------
ChuanqiXu wrote:
> 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.
Yes, that was what I found - maybe we are  missing something about the export 
that changes those rules.
.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D128328

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

Reply via email to