erichkeane added a comment.

In D126818#3563376 <https://reviews.llvm.org/D126818#3563376>, @erichkeane 
wrote:

> In D126818#3562355 <https://reviews.llvm.org/D126818#3562355>, @tahonermann 
> wrote:
>
>>> Note we might be confused, the parens there aren't completely clear as to 
>>> what your intent is.
>>
>> Well, I know that I'm confused and not clear what my intent is :)
>>
>> I asked the question because there appears to be an asymmetry between 
>> (temp.friend)p9 sentence 1 <http://eel.is/c++draft/temp.friend#9.sentence-1> 
>> and (temp.friend)p9 sentence 2 
>> <http://eel.is/c++draft/temp.friend#9.sentence-2>. Sentence 1 applies to all 
>> constrained non-template friend declarations regardless of any template 
>> argument dependence while sentence 2 applies to just a subset of constrained 
>> friend function templates; those that have some amount of template 
>> dependence. The difference impacts when mangling differences are required.
>>
>> I spent some time analyzing how gcc, clang, and MSVC handle these different 
>> cases. See https://godbolt.org/z/85E5eMh3x. Search for FIXME? to find cases 
>> where I think one or more of the compilers is misbehaving or where it is 
>> unclear to me whether or how [temp.friend]p9 applies. Some highlights:
>>
>> - Some compilers diagnose some ill-formed cases when parsing the class 
>> template, others don't until the class template is instantiated. Not 
>> surprising.
>> - All of the compilers reject non-template friend function definitions with 
>> non-dependent constraints due to duplicate definitions, presumably in 
>> violation of [temp.friend]p9; see the `ff2()` example.
>> - All of the compilers reject non-template friend function definitions with 
>> dependent constraints due to duplicate definitions, presumably in violation 
>> of [temp.friend]p9; see the `ff6()` example.
>> - Name mangling is currently insufficient to differentiate (otherwise) 
>> non-dependent friend function templates with dependent constraints; see the 
>> `fft5()` and `fft6()` examples.
>> - None of the compilers reject some cases of non-definitions that should be 
>> rejected by [temp.friend]p9; see the `fft5()` and `fft7()` examples.
>
> Yes, I understand that Clang doesn't currently properly implement 
> [temp.friend]p9, and it is my belief too that none of the other compilers get 
> it right at the moment either.  Clang approximates it by just directly 
> comparing partially instantiated constraints, so it gets it MOSTLY right.
>
> I believe I have all of your test cases in my implementation of 
> [temp.friend]p9 as a part of the deferred concepts patch here: 
> https://reviews.llvm.org/D126907
>
> Aaron, my, and at least 1 other core expert's reading was:
>
> -A non template friend declaration with a requires-clause shall be a 
> definition.
>
>   >> That is, ALL non-template friends, no matter what the requires-clause 
> depends on.
>
> -A friend function template with a constraint that depends on the template 
> parameter from an enclosing template shall be a definition.
>
>   >> That is, when the declaration is a friend function template, it must be 
> a definition ONLY IF it depends on a template param from an enclosing 
> template.
>
> THOSE two sentences aren't particularly relevant, except for setting up the 
> two groups (that is, ALL constrained non-template friends and constrained 
> friend function templates where the constraint depends on an enclosing 
> template).
>
> The third sentence is the valuable one to both of these:
>
> -Such a constrained friend function or function template declaration does not 
> declare the same function or function template as a declaration in any other 
> scope.
>
>   >> That is, any friend in either of those two groups from sentence 1 and 
> sentence 2 do not conflict with the same lexical declaration in a different 
> instantiation.
>
> THIS patch attempts to implement the mangling required in that last sentence, 
> however it doesn't differentiate the "ONLY if it depends on a template param 
> from an enclosing template", which I intend to fix in a future revision, once 
> the infrastructure from my deferred concepts patch (see link above) has made 
> it into the repo.

SO I believe my 'future revision' part in the above is actually no longer 
necessary.  We prohibit that with a Sema 'redefinition error': 
https://godbolt.org/z/1r549vfK4

So the question here is whether we want 'baz' in that godbolt link to use the 
'F' mangling or not.  @rjmccall?  The 'easiest' thing to do I think (based on 
this patch) is to ALWAYS use the 'F' mangling for a friend with a constraint.

WDYT?


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

https://reviews.llvm.org/D126818

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

Reply via email to