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