https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79996
Eric Gallager <egallager at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |diagnostic Status|UNCONFIRMED |NEW Last reconfirmed| |2017-08-23 CC| |egallager at gcc dot gnu.org See Also| |https://gcc.gnu.org/bugzill | |a/show_bug.cgi?id=80140 Ever confirmed|0 |1 --- Comment #2 from Eric Gallager <egallager at gcc dot gnu.org> --- (In reply to Martin Sebor from comment #0) > With bug 79967 fixed GCC accepts non-type template parameters of function > type declared noreturn. C++ doesn't seem to allow the attribute in this > context and it's unclear what the expected of such an attribute should be. > Even though it accepts it, GCC appears to not only silently ignore the > attribute on the template parameter, it also loses the attribute if the > template argument is decorated with it. That leads to warnings such in the > test case below where intuitively none would be expected. > > If the attribute is to be accepted (perhaps as an extension) but ignored > here GCC should issue a -Wignored-attributes warning. That's bug 80140. > If accepting is, in fact an extension (i.e., C++ doesn't allow it here), > GCC should also issue a warning with -Wpedantic. > > $ cat t.c && gcc -S -Wall -Wextra -Wpedantic -xc++ t.c > [[noreturn]] void g (); > > struct A > { > int foo (); > }; > > int foo () > { > g (); > } > > template <void f [[noreturn]]() = g> > struct B > { > int foo (); > }; > > template <void f ()> > int B<f>::foo () > { > f (); > } > > int i = (B<>().foo (), 0); > t.c: In member function ‘int B<f>::foo()’: > t.c:23:1: warning: no return statement in function returning non-void > [-Wreturn-type] > } > ^ Confirming as a separate bug since the testcase is different.