On 15 February 2017 at 15:53, Jason Merrill wrote:
> On Sat, Feb 11, 2017 at 4:19 PM, Jonathan Wakely <jwakely....@gmail.com> 
> wrote:
>> On 11 February 2017 at 20:36, Sandra Loosemore wrote:
>>> On 02/11/2017 06:21 AM, Jonathan Wakely wrote:
>>>>
>>>> On 11 February 2017 at 08:48, Gerald Pfeifer wrote:
>>>>>
>>>>> On Fri, 10 Feb 2017, Sandra Loosemore wrote:
>>>>>>
>>>>>> The documentation for -Wno-non-template-friend refers to
>>>>>> "non-templatized
>>>>>> friend functions" and "templatized functions".  I don't see the term
>>>>>> "templatized" used anywhere in the C++ standard.  This paragraph also
>>>>>> uses
>>>>>> "nontemplate function", which I assume refers to the same thing the C++
>>>>>> standard spells "non-template function".  So does "non-templatized
>>>>>> function"
>>>>>> also mean "non-template function"?  Or does it have some other meaning?
>>>>>
>>>>>
>>>>> I would avoid "templatized" and believe "non-template function" is
>>>>> more appropriate in your example.
>>>>
>>>>
>>>> Yes,
>>>>
>>>> s/non-templatized/non-template/
>>>> s/nontemplate/non-template/
>>>> s/templatized function/function template/
>>>>
>>>> But I wonder if that warning is even useful nowadays. The example of
>>>> "friend foo(int);" is bogus and is correctly rejected:
>>>>
>>>> fr.cc:2:17: error: ISO C++ forbids declaration of ‘foo’ with no type
>>>> [-fpermissive]
>>>>     friend foo(int);
>>>>                   ^
>>>
>>>
>>> I hadn't actually gotten that far :-) but it looks like that's an
>>> implicit-int error unrelated to the actual purpose of this option.
>>>
>>> This ended up on my todo list firstly because "templatized" didn't
>>> spell-check, and secondly because the "new compiler behavior" documented in
>>> connection with this option has existed at least since 1998 and can hardly
>>> be considered "new" any more.  Also I think the reference to section 14.5.3
>>> of the C++ standard is bit-rotten (it's 14.5.4 in the c++0x draft I have
>>> handy).
>>>
>>> I'll leave it up to the C++ experts to decide whether the option should just
>>> be removed and the warning replaced with a hard error controlled by some
>>> other flag.
>>
>> It definitely shouldn't be turned into a hard error, the warning
>> complains about valid code, such as:
>>
>> template<typename T> struct A {
>>   friend int foo(T);
>> };
>>
>> int main() {
>>   A<int> a;
>> }
>>
>> I think it warns because the meaning of that code changed, a *long*
>> time ago, so it's saying "if you wrote this code in the 1990s it might
>> do something different to what you expect."
>>
>> I'm not sure how useful that warning is now, although EDG warns for it
>> too (with a fix-it hint that I think is bogus):
>>
>> "fr.cc", line 2: warning: "int foo(T)" declares a non-template function -- 
>> add
>>           <> to refer to a template instance
>>     friend int foo(T);
>>                ^
>
> That fix-it looks fine to me;

Where should I add the <> to make it valid?

If I change the example to "friend int foo<>(T);" EDG says it's not a template:

template<typename T> struct A {
  friend int foo<>(T);
};

int main() {
  A<int> a;
}

"fr.cc", line 2: error: foo is not a template
    friend int foo<>(T);
               ^

1 error detected in the compilation of "edg.cc".

I don't think I understand what this kind of friend declarationdoes,
or what the warning is for, so if you think it's still useful I'm
happy with that :-)

Reply via email to