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; it does seem odd for a template to
declare as friend an open-ended family of overloaded functions.  But I
also am unsure how much of a problem this is for real code nowadays.

Jason

Reply via email to