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);
               ^

Reply via email to