On Wed, Feb 15, 2017 at 1:57 PM, Jonathan Wakely <jwakely....@gmail.com> wrote:
> 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);

Yep, you would also need to declare the foo template earlier in the TU.

Jason

Reply via email to