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