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 :-)